From 01c629c3e081e6ea989f4641c91d255b324104bb Mon Sep 17 00:00:00 2001 From: michaelschal <35957947-michaelschal@users.noreply.replit.com> Date: Mon, 3 Nov 2025 17:22:34 +0000 Subject: [PATCH 1/2] Fix display issues for invoice references and amounts Update frontend components to correctly render invoice reference and amount fields. Replit-Commit-Author: Agent Replit-Commit-Session-Id: 1e4433b5-47ab-464c-b663-fea2e53367dd Replit-Commit-Checkpoint-Type: full_checkpoint Replit-Commit-Event-Id: a1f333f4-0a5d-4a54-bff3-7f4bfb3e4be1 Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/1957c339-2757-4d1f-8e92-e9f71a1ce58e/1e4433b5-47ab-464c-b663-fea2e53367dd/Tx7N1IN --- attached_assets/image_1762190510735.png | Bin 0 -> 10328 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 attached_assets/image_1762190510735.png diff --git a/attached_assets/image_1762190510735.png b/attached_assets/image_1762190510735.png new file mode 100644 index 0000000000000000000000000000000000000000..27f2f4f0d334f6fd61d18b26b226269f0a2cd944 GIT binary patch literal 10328 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 literal 0 HcmV?d00001 From e32899332985455b19d2ffb4ae51d272798c9c93 Mon Sep 17 00:00:00 2001 From: michaelschal <35957947-michaelschal@users.noreply.replit.com> Date: Mon, 3 Nov 2025 17:24:23 +0000 Subject: [PATCH 2/2] Update delivery reconciliation to correctly handle invoice data and fix date field Correctly applies invoice reference, amount, and due date to delivery updates. Modifies the `dueDate` field in the schema to `timestamp` and resolves the "column 'due_date' does not exist" error in PostgreSQL. Replit-Commit-Author: Agent Replit-Commit-Session-Id: 1e4433b5-47ab-464c-b663-fea2e53367dd Replit-Commit-Checkpoint-Type: full_checkpoint Replit-Commit-Event-Id: a35a1a31-82b0-453f-aa10-f67eb24aaae3 Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/1957c339-2757-4d1f-8e92-e9f71a1ce58e/1e4433b5-47ab-464c-b663-fea2e53367dd/Tx7N1IN --- ...rName-Poly-1762190589763_1762190589763.txt | 204 ++++++++++++++++++ client/src/pages/BLReconciliation.tsx | 15 +- shared/schema.ts | 2 +- 3 files changed, 215 insertions(+), 6 deletions(-) create mode 100644 attached_assets/Pasted-ns-errorMessage-null-invoiceReference-981644-supplierName-Poly-1762190589763_1762190589763.txt diff --git a/attached_assets/Pasted-ns-errorMessage-null-invoiceReference-981644-supplierName-Poly-1762190589763_1762190589763.txt b/attached_assets/Pasted-ns-errorMessage-null-invoiceReference-981644-supplierName-Poly-1762190589763_1762190589763.txt new file mode 100644 index 0000000..acc3999 --- /dev/null +++ b/attached_assets/Pasted-ns-errorMessage-null-invoiceReference-981644-supplierName-Poly-1762190589763_1762190589763.txt @@ -0,0 +1,204 @@ +ns + + + + + errorMessage: null, + + invoiceReference: '981644', + + supplierName: 'Polyflame', + + fromCache: true, + + permanent: false + +} + +POST /api/deliveries/343/verify-invoice 200 in 256ms + +🔍 Recherche NocoDB: { tableId: 'mrr733dfb8wtt9b', column: 'Numero_BL' } + +🔍 Recherche NocoDB: { tableId: 'mrr733dfb8wtt9b', column: 'Numero_BL' } + +💾 [CACHE] Tentative sauvegarde: { + + invoiceReference: '197771', + + groupId: 1, + + cacheKey: '1_197771', + + exists: true, + + isReconciled: false, + + cacheType: 'temporaire 6h (trouvé)', + + expiresAt: '2025-11-03T23:21:35.673Z' + +} + +💾 [CACHE] Tentative sauvegarde: { + + invoiceReference: '197771', + + groupId: 1, + + cacheKey: '1_197771', + + exists: true, + + isReconciled: false, + + cacheType: 'temporaire 6h (trouvé)', + + expiresAt: '2025-11-03T23:21:35.675Z' + +} + +✅ [CACHE] Résultat sauvé en cache: { + + id: 31803, + + invoiceReference: '197771', + + groupId: 1, + + exists: true, + + isReconciled: false, + + cacheType: 'temporaire 6h (trouvé)', + + cacheKey: '1_197771' + +} + +📅 Date d'échéance récupérée et normalisée: 2025-11-29 (original: 2025-11-29) + +✅ [CACHE] Résultat sauvé en cache: { + + id: 31803, + + invoiceReference: '197771', + + groupId: 1, + + exists: true, + + isReconciled: false, + + cacheType: 'temporaire 6h (trouvé)', + + cacheKey: '1_197771' + +} + +📅 Date d'échéance récupérée et normalisée: 2025-11-29 (original: 2025-11-29) + +Error updating delivery: error: column "due_date" does not exist + + at /app/node_modules/pg-pool/index.js:45:11 + + at process.processTicksAndRejections (node:internal/process/task_queues:95:5) + + at async file:///app/node_modules/drizzle-orm/node-postgres/session.js:83:22 + + at async DatabaseStorage.updateDelivery (file:///app/dist/index.js:2142:28) + + at async file:///app/dist/index.js:14714:31 { + + length: 174, + + severity: 'ERROR', + + code: '42703', + + detail: undefined, + + hint: 'Perhaps you meant to reference the column "deliveries.dueDate".', + + position: '310', + + internalPosition: undefined, + + internalQuery: undefined, + + where: undefined, + + schema: undefined, + + table: undefined, + + column: undefined, + + dataType: undefined, + + constraint: undefined, + + file: 'parse_relation.c', + + line: '3665', + + routine: 'errorMissingColumn' + +} + +PUT /api/deliveries/427 500 in 307ms + +Error updating delivery: error: column "due_date" does not exist + + at /app/node_modules/pg-pool/index.js:45:11 + + at process.processTicksAndRejections (node:internal/process/task_queues:95:5) + + at async file:///app/node_modules/drizzle-orm/node-postgres/session.js:83:22 + + at async DatabaseStorage.updateDelivery (file:///app/dist/index.js:2142:28) + + at async file:///app/dist/index.js:14714:31 { + + length: 174, + + severity: 'ERROR', + + code: '42703', + + detail: undefined, + + hint: 'Perhaps you meant to reference the column "deliveries.dueDate".', + + position: '310', + + internalPosition: undefined, + + internalQuery: undefined, + + where: undefined, + + schema: undefined, + + table: undefined, + + column: undefined, + + dataType: undefined, + + constraint: undefined, + + file: 'parse_relation.c', + + line: '3665', + + routine: 'errorMissingColumn' + +} + +PUT /api/deliveries/427 500 in 330ms + +HEAD /api/health 200 in 1ms + +HEAD /api/health 200 in 1ms + +HEAD /api/health 200 in 1ms \ No newline at end of file diff --git a/client/src/pages/BLReconciliation.tsx b/client/src/pages/BLReconciliation.tsx index 72697d5..e3d99d0 100644 --- a/client/src/pages/BLReconciliation.tsx +++ b/client/src/pages/BLReconciliation.tsx @@ -158,31 +158,36 @@ export default function BLReconciliation() { // Auto-remplir les champs dans la livraison via API const updateData: any = {}; - // Ajouter la référence de facture si trouvée et pas déjà renseignée + // Ajouter la référence de facture SEULEMENT si trouvée via BL (pas déjà renseignée) if (result.invoiceReference && result.matchType === 'bl_number') { updateData.invoiceReference = result.invoiceReference; } - // Toujours mettre à jour le montant si disponible - if (result.invoiceAmount) { + // TOUJOURS mettre à jour le montant si disponible (peu importe le matchType) + if (result.invoiceAmount !== undefined && result.invoiceAmount !== null) { updateData.invoiceAmount = result.invoiceAmount; } - // Toujours mettre à jour la date d'échéance si disponible + // TOUJOURS mettre à jour la date d'échéance si disponible (peu importe le matchType) if (result.dueDate) { updateData.dueDate = result.dueDate; } + console.log('📝 Données à sauvegarder:', { deliveryId: variables.deliveryId, updateData, matchType: result.matchType }); + // Ne faire l'appel que si on a des données à mettre à jour if (Object.keys(updateData).length > 0) { apiRequest(`/api/deliveries/${variables.deliveryId}`, "PUT", updateData) .then(() => { + console.log('✅ Données sauvegardées avec succès'); queryClient.invalidateQueries({ queryKey: ['/api/deliveries/bl'] }); queryClient.invalidateQueries({ queryKey: ['/api/deliveries'] }); }) .catch((error) => { - console.error('Erreur auto-remplissage:', error); + console.error('❌ Erreur auto-remplissage:', error); }); + } else { + console.log('⚠️ Aucune donnée à sauvegarder'); } } diff --git a/shared/schema.ts b/shared/schema.ts index 8dd0b9e..f5028ef 100644 --- a/shared/schema.ts +++ b/shared/schema.ts @@ -119,7 +119,7 @@ export const deliveries = pgTable("deliveries", { blAmount: decimal("bl_amount", { precision: 10, scale: 2 }), // Montant BL invoiceReference: varchar("invoice_reference"), // Référence facture invoiceAmount: decimal("invoice_amount", { precision: 10, scale: 2 }), // Montant facture - dueDate: date("due_date"), // Date d'échéance de paiement (récupérée depuis NocoDB) + dueDate: timestamp("dueDate"), // Date d'échéance de paiement (récupérée depuis NocoDB) reconciled: boolean("reconciled").default(false), // Rapprochement effectué validatedAt: timestamp("validated_at"), // Date de validation de la livraison // Champs pour le contrôle des livraisons (fournisseurs nécessitant un contrôle)