feat(api): compléter la facture des fournisseurs en rapprochement automatique (#568)

Les livraisons d'un fournisseur en rapprochement automatique sont validées
d'office à la saisie du BL ; PATCH /api/ext/v1/deliveries/:id les refusait
donc (409) sauf à les dévalider. Pour ces fournisseurs, la référence, les
montants HT/TTC et l'échéance s'écrivent désormais directement, la livraison
restant validée.

- automaticReconciliation exposé sur chaque livraison renvoyée par l'API
- documentation mise à jour avec un exemple


Claude-Session: https://claude.ai/code/session_01LEhR8Cok79VpsxixhrKChM

Co-authored-by: Claude <noreply@anthropic.com>
This commit is contained in:
LogiFlowandClaude authored and GitHub committed 2026-10-10 09:11:08 +02:00
1 parent 6f1a39e4b2
commit bd3bb5e64a
2 files changed
+27 -3

No files matched your search

+19
View File
@@ -82,6 +82,7 @@ Paramètre mal formé : `400` avec la liste des paramètres fautifs.
"supplierId": 4, "supplierId": 4,
"supplierName": "Lactalis", "supplierName": "Lactalis",
"supplierCode": "LAC01", "supplierCode": "LAC01",
"automaticReconciliation": false,
"status": "delivered", "status": "delivered",
"scheduledDate": "2026-10-08", "scheduledDate": "2026-10-08",
"deliveredDate": "2026-10-08T07:42:00.000Z", "deliveredDate": "2026-10-08T07:42:00.000Z",
@@ -131,6 +132,10 @@ Règles :
- livraison non livrée : `409` ; - livraison non livrée : `409` ;
- livraison déjà rapprochée : sa facture est figée (`409`). Envoyer - 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 ; `"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. - corps invalide : `400` avec le détail par champ.
## Exemple : rapprocher une facture reçue ## 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. 2. `GET /deliveries?supplierId=4&blNumber=BL-4567` → récupérer l'`id` de la livraison.
3. `PATCH /deliveries/812` avec `invoiceReference` et `invoiceAmount` 3. `PATCH /deliveries/812` avec `invoiceReference` et `invoiceAmount`
(ajouter `"reconciled": true` pour valider directement). (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=<id auto>&hasInvoice=false`.
+8 -3
View File
@@ -2,7 +2,8 @@
// //
// Permet à un outil tiers (comptabilité, n8n, script...) de lire les magasins, // 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 // 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 : // Authentification par clé d'API, indépendante des sessions du webUI :
// - variable d'environnement EXTERNAL_API_KEYS (une ou plusieurs clés // - variable d'environnement EXTERNAL_API_KEYS (une ou plusieurs clés
@@ -127,6 +128,7 @@ function toApiDelivery(d: any) {
supplierId: d.supplierId, supplierId: d.supplierId,
supplierName: d.supplier?.name ?? null, supplierName: d.supplier?.name ?? null,
supplierCode: d.supplier?.codefou ?? null, supplierCode: d.supplier?.codefou ?? null,
automaticReconciliation: !!d.supplier?.automaticReconciliation,
status: d.status, status: d.status,
scheduledDate: toIsoDate(d.scheduledDate), scheduledDate: toIsoDate(d.scheduledDate),
deliveredDate: toIsoDateTime(d.deliveredDate), deliveredDate: toIsoDateTime(d.deliveredDate),
@@ -304,8 +306,11 @@ export function registerExternalApi(app: Express) {
const touchesInvoice = INVOICE_FIELDS.some((f) => body[f] !== undefined); const touchesInvoice = INVOICE_FIELDS.some((f) => body[f] !== undefined);
// Une livraison rapprochée est figée, comme dans le webUI : il faut la // Une livraison rapprochée est figée, comme dans le webUI : il faut la
// dévalider (reconciled: false) pour modifier sa facture. // dévalider (reconciled: false) pour modifier sa facture. Exception : les
if (delivery.reconciled && touchesInvoice && body.reconciled !== false) { // 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({ return res.status(409).json({
error: "Livraison déjà rapprochée : envoyer reconciled: false pour la dévalider avant de modifier la facture", error: "Livraison déjà rapprochée : envoyer reconciled: false pour la dévalider avant de modifier la facture",
}); });