> ## Documentation Index
> Fetch the complete documentation index at: https://docs.bonx.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Rattacher un document

> Téléverser un fichier et le rattacher à une fiche Bonx.

Le rattachement d'un document nécessite trois appels :

1. demander une URL de téléversement ;
2. envoyer le fichier vers cette URL ;
3. rattacher le fichier à une fiche Bonx.

Le document apparaît ensuite dans l'onglet Fichiers de la fiche.

## 1. Demandez une URL de téléversement

Envoyez le nom et le type MIME du fichier à `generatePresignedUrlUpload`.

```graphql theme={null}
mutation Upload($fileName: String!, $contentType: String) {
  generatePresignedUrlUpload(fileName: $fileName, contentType: $contentType) {
    uploadUrl
    fileName
    contentType
  }
}
```

```json Variables theme={null}
{ "fileName": "bon-de-reception-REC-0412.pdf", "contentType": "application/pdf" }
```

La réponse contient :

* `uploadUrl`, l'URL vers laquelle envoyer le fichier. Elle expire après 10
  minutes ;
* `fileName`, le nom de stockage créé par Bonx. Conservez cette valeur pour
  l'étape 3.

## 2. Envoyez le fichier

Envoyez le contenu du fichier avec une requête `PUT` vers `uploadUrl`. Utilisez
le même en-tête `Content-Type` qu'à l'étape 1.

```bash theme={null}
curl -X PUT "$UPLOAD_URL" \
  -H "Content-Type: application/pdf" \
  --data-binary "@bon-de-reception-REC-0412.pdf"
```

N'ajoutez pas le jeton Bonx à cet appel. L'URL de téléversement contient déjà une
autorisation temporaire.

<Warning>Le stockage refuse le fichier si le `Content-Type` est différent de celui utilisé à l'étape 1.</Warning>

## 3. Rattachez le fichier à la fiche

Utilisez `insertFilesOne` pour créer le lien entre le fichier et la fiche.

```graphql theme={null}
mutation AttachFile(
  $fileId: String!
  $name: String!
  $contentType: String
  $size: Int!
  $recordId: Int!
  $recordType: String!
) {
  insertFilesOne(
    object: {
      fileId: $fileId
      name: $name
      contentType: $contentType
      size: $size
      recordId: $recordId
      recordType: $recordType
    }
  ) {
    id
  }
}
```

```json Variables theme={null}
{
  "fileId": "9f2c…-bon-de-reception-rec-0412.pdf",
  "name": "Bon de réception REC-0412.pdf",
  "contentType": "application/pdf",
  "size": 284119,
  "recordId": 412,
  "recordType": "receivings"
}
```

Renseignez les variables comme suit :

* `fileId` : utilisez le `fileName` reçu à l'étape 1 ;
* `name` : indiquez le nom visible dans Bonx ;
* `size` : indiquez la taille du fichier en octets ;
* `recordId` : indiquez l'identifiant interne de la fiche ;
* `recordType` : indiquez le type technique de la fiche.

## Types de fiches disponibles

`recordType` contient le nom technique de l'entité au pluriel.

| Fiche | `recordType` |
| - | - |
| Réception | `receivings` |
| Expédition | `shipments` |
| Commande de vente | `salesOrders` |
| Commande d'achat | `purchaseOrders` |
| Ordre de fabrication | `manufacturingOrders` |
| Article | `articles` |
| Lot | `lots` |
| Non-conformité | `defects` |

## Trouver l'identifiant d'une fiche

Un document contient souvent le numéro visible de la fiche, par exemple
`REC-0412`. Utilisez ce numéro pour obtenir l'identifiant interne `id`.

```graphql theme={null}
query FindReceiving($reference: String!) {
  receivings(where: { name: { _eq: $reference } }) {
    id
    name
  }
}
```

Arrêtez le traitement si la requête ne renvoie aucun résultat. Dans ce cas, le
numéro du document ne correspond à aucune réception.

<Tip>
  Consultez l'[exemple JavaScript complet](/fr/examples/attach-scan-to-receiving) pour automatiser ces trois appels.
</Tip>
