diff --git a/docs/API-RAPPROCHEMENT.md b/docs/API-RAPPROCHEMENT.md index 2e4b180..e0073f4 100644 --- a/docs/API-RAPPROCHEMENT.md +++ b/docs/API-RAPPROCHEMENT.md @@ -82,6 +82,7 @@ Paramètre mal formé : `400` avec la liste des paramètres fautifs. "supplierId": 4, "supplierName": "Lactalis", "supplierCode": "LAC01", + "automaticReconciliation": false, "status": "delivered", "scheduledDate": "2026-10-08", "deliveredDate": "2026-10-08T07:42:00.000Z", @@ -131,6 +132,10 @@ Règles : - livraison non livrée : `409` ; - livraison déjà rapprochée : sa facture est figée (`409`). Envoyer `"reconciled": false` dans la même requête pour la dévalider et la modifier ; +- exception, fournisseur en **rapprochement automatique** + (`automaticReconciliation: true`) : la livraison est validée d'office dès la + saisie du BL, sa facture (référence, montants, échéance) se complète ensuite + directement, sans la dévalider ; elle reste validée ; - corps invalide : `400` avec le détail par champ. ## Exemple : rapprocher une facture reçue @@ -139,3 +144,17 @@ Règles : 2. `GET /deliveries?supplierId=4&blNumber=BL-4567` → récupérer l'`id` de la livraison. 3. `PATCH /deliveries/812` avec `invoiceReference` et `invoiceAmount` (ajouter `"reconciled": true` pour valider directement). + +## Exemple : compléter la facture d'un fournisseur automatique + +Les livraisons d'un fournisseur en rapprochement automatique sont déjà +validées (`reconciled: true`) ; la facture s'y ajoute sans autre champ : + +```bash +curl -X PATCH https://logiflow.example/api/ext/v1/deliveries/815 \ + -H "X-API-Key: $LOGIFLOW_API_KEY" \ + -H "Content-Type: application/json" \ + -d '{"invoiceReference":"FAC-2026-0057","invoiceAmount":"842,10","invoiceAmountTTC":"1010,52","dueDate":"2026-11-30"}' +``` + +Pour les retrouver : `GET /deliveries?supplierId=&hasInvoice=false`. diff --git a/server/externalApi.ts b/server/externalApi.ts index ecaa781..b11829b 100644 --- a/server/externalApi.ts +++ b/server/externalApi.ts @@ -2,7 +2,8 @@ // // Permet à un outil tiers (comptabilité, n8n, script...) de lire les magasins, // les fournisseurs et les livraisons livrées (numéros de BL), puis d'écrire la -// référence et le montant de la facture sur une livraison. +// référence, les montants et l'échéance de la facture sur une livraison (y +// compris déjà validée, pour les fournisseurs en rapprochement automatique). // // Authentification par clé d'API, indépendante des sessions du webUI : // - variable d'environnement EXTERNAL_API_KEYS (une ou plusieurs clés @@ -127,6 +128,7 @@ function toApiDelivery(d: any) { supplierId: d.supplierId, supplierName: d.supplier?.name ?? null, supplierCode: d.supplier?.codefou ?? null, + automaticReconciliation: !!d.supplier?.automaticReconciliation, status: d.status, scheduledDate: toIsoDate(d.scheduledDate), deliveredDate: toIsoDateTime(d.deliveredDate), @@ -304,8 +306,11 @@ export function registerExternalApi(app: Express) { const touchesInvoice = INVOICE_FIELDS.some((f) => body[f] !== undefined); // Une livraison rapprochée est figée, comme dans le webUI : il faut la - // dévalider (reconciled: false) pour modifier sa facture. - if (delivery.reconciled && touchesInvoice && body.reconciled !== false) { + // dévalider (reconciled: false) pour modifier sa facture. Exception : les + // fournisseurs en rapprochement automatique, validés d'office dès la + // saisie du BL, dont la facture arrive après et se complète sans dévalider. + const isAutomatic = !!delivery.supplier?.automaticReconciliation; + if (delivery.reconciled && !isAutomatic && touchesInvoice && body.reconciled !== false) { return res.status(409).json({ error: "Livraison déjà rapprochée : envoyer reconciled: false pour la dévalider avant de modifier la facture", });