fix(reconciliation): auto-reconcile deliveries from automatic suppliers on validation

POST /api/deliveries/:id/validate never set reconciled=true for suppliers in
automatic reconciliation mode, so their deliveries showed in neither the
Manuels tab (auto suppliers excluded) nor Validées (reconciled=false).

- validate endpoint now marks reconciled + validatedAt for auto suppliers
- Validées tab includes all deliveries from auto suppliers
- migration backfills reconciled for existing delivered deliveries with BL

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
MichaelandClaude Opus 5.5 committed 2026-10-09 09:18:43 +02:00
1 parent 944d99733c
commit 2274c9bb4a
3 files changed
+41 -1

No files matched your search

+4 -1
View File
@@ -497,8 +497,11 @@ export default function BLReconciliation() {
return isManual && isNotValidated; return isManual && isNotValidated;
}), [deliveriesWithBL]); }), [deliveriesWithBL]);
// Fournisseurs en rapprochement automatique : toujours considérés validés,
// même si reconciled n'a pas été posé (livraisons antérieures au passage en mode auto)
const allValidatedDeliveries = useMemo(() => deliveriesWithBL.filter((delivery: any) => { const allValidatedDeliveries = useMemo(() => deliveriesWithBL.filter((delivery: any) => {
return delivery.reconciled === true || delivery.reconciled === 1; const isAutomatic = delivery.supplier?.automaticReconciliation === true;
return isAutomatic || delivery.reconciled === true || delivery.reconciled === 1;
}), [deliveriesWithBL]); }), [deliveriesWithBL]);
// Fonctions de gestion // Fonctions de gestion
@@ -0,0 +1,22 @@
-- Backfill rapprochement automatique
--
-- Contexte : l'endpoint POST /api/deliveries/:id/validate ne posait pas
-- reconciled = true pour les fournisseurs en rapprochement automatique
-- (automatic_reconciliation = true). Ces livraisons n'apparaissaient ni dans
-- l'onglet "Manuels" (exclues car fournisseur auto) ni dans "Validées"
-- (reconciled = false). Même cas pour les livraisons antérieures au passage
-- d'un fournisseur en mode automatique.
--
-- Applique le même critère que l'auto-validation côté serveur :
-- livraison livrée + numéro de BL renseigné.
UPDATE deliveries d
SET reconciled = true,
validated_at = COALESCE(d.validated_at, NOW())
FROM suppliers s
WHERE d.supplier_id = s.id
AND s.automatic_reconciliation = true
AND d.status = 'delivered'
AND d.bl_number IS NOT NULL
AND TRIM(d.bl_number) <> ''
AND (d.reconciled IS NULL OR d.reconciled = false);
+15
View File
@@ -2556,6 +2556,21 @@ export async function registerRoutes(app: Express): Promise<Server> {
await storage.validateDelivery(id, blData); await storage.validateDelivery(id, blData);
// AUTO-VALIDATION RAPPROCHEMENT : fournisseur en mode automatique → rapprochement validé directement
try {
// Fournisseur déjà joint à la livraison
const supplier = delivery.supplier;
if (supplier?.automaticReconciliation) {
await storage.updateDelivery(id, {
reconciled: true,
validatedAt: new Date()
});
console.log(`✅ Auto-reconciliation: Delivery #${id} automatically validated for supplier ${supplier.name}`);
}
} catch (error) {
console.error(`❌ Auto-reconciliation failed for delivery #${id}:`, error);
}
// MISE À JOUR DU CACHE : Marquer le cache comme permanent pour cette livraison validée // MISE À JOUR DU CACHE : Marquer le cache comme permanent pour cette livraison validée
try { try {
if (delivery.invoiceReference && delivery.invoiceReference.trim()) { if (delivery.invoiceReference && delivery.invoiceReference.trim()) {