diff --git a/attached_assets/image_1756626733010.png b/attached_assets/image_1756626733010.png new file mode 100644 index 0000000..efacbc4 Binary files /dev/null and b/attached_assets/image_1756626733010.png differ diff --git a/client/src/pages/BLReconciliation.tsx b/client/src/pages/BLReconciliation.tsx index 9255728..129514a 100644 --- a/client/src/pages/BLReconciliation.tsx +++ b/client/src/pages/BLReconciliation.tsx @@ -242,14 +242,46 @@ export default function BLReconciliation() { console.log('🔄 Déclenchement vérifications automatiques...'); } + // Pré-populer les résultats pour les livraisons déjà réconciliées + const newVerificationResults = { ...verificationResults }; + let hasNewReconciledResults = false; + deliveriesWithBL.forEach((delivery: any) => { + // Si la livraison est déjà réconciliée, marquer comme vérifiée avec succès + if (delivery.reconciled && !verificationResults[delivery.id]) { + newVerificationResults[delivery.id] = { + exists: true, + matchType: delivery.invoiceReference ? 'invoice_reference' : 'bl_number', + fromCache: true, + permanent: true, + reconciled: true + }; + hasNewReconciledResults = true; + + if (import.meta.env.DEV) { + console.log(`✅ Livraison ${delivery.id} déjà réconciliée, marquée comme vérifiée`); + } + } + }); + + // Mettre à jour les résultats si on a de nouvelles livraisons réconciliées + if (hasNewReconciledResults) { + setVerificationResults(newVerificationResults); + } + + deliveriesWithBL.forEach((delivery: any) => { + // EXCLUURE les livraisons déjà réconciliées de la vérification automatique + if (delivery.reconciled) { + return; // Livraison déjà validée, pas besoin de vérifier + } + // Vérifier seulement si on a une référence de facture ou un BL et pas déjà de résultat const hasVerifiableData = delivery.invoiceReference || delivery.blNumber; const notAlreadyProcessed = !verificationResults[delivery.id] && !verifyingDeliveries.has(delivery.id); if (hasVerifiableData && notAlreadyProcessed) { if (import.meta.env.DEV) { - console.log(`🔍 Vérification auto pour livraison ${delivery.id}:`, { + console.log(`🔍 Vérification auto pour livraison NON réconciliée ${delivery.id}:`, { invoiceRef: delivery.invoiceReference, blNumber: delivery.blNumber }); diff --git a/server/routes.ts b/server/routes.ts index 531edad..13fe9e1 100644 --- a/server/routes.ts +++ b/server/routes.ts @@ -1156,6 +1156,62 @@ export async function registerRoutes(app: Express): Promise { } }); + // Route pour diagnostiquer le cache des livraisons + app.get('/api/cache/diagnosis', isAuthenticated, async (req: any, res) => { + try { + const user = await storage.getUserWithGroups(req.user.claims ? req.user.claims.sub : req.user.id); + if (!user) { + return res.status(404).json({ message: "User not found" }); + } + + // Vérifier que c'est un admin + if (user.role !== 'admin') { + return res.status(403).json({ message: "Seuls les admins peuvent exécuter cette opération" }); + } + + // Récupérer des statistiques sur le cache + const deliveries = await storage.getDeliveries(); + const reconciledCount = deliveries.filter(d => d.reconciled).length; + const totalCount = deliveries.length; + + // Vérifier quelques caches + const sampleCaches = []; + const reconciledDeliveries = deliveries.filter(d => d.reconciled).slice(0, 5); // Prendre 5 exemples + + for (const delivery of reconciledDeliveries) { + if (delivery.invoiceReference) { + const cacheKey = `${delivery.invoiceReference.toLowerCase()}_${delivery.groupId}`; + const cached = await storage.getInvoiceVerificationCache(cacheKey); + sampleCaches.push({ + deliveryId: delivery.id, + invoiceRef: delivery.invoiceReference, + groupId: delivery.groupId, + reconciled: delivery.reconciled, + cacheExists: !!cached, + cacheReconciled: cached?.isReconciled || false, + cacheExpires: cached?.expiresAt + }); + } + } + + res.json({ + statistics: { + totalDeliveries: totalCount, + reconciledDeliveries: reconciledCount, + percentageReconciled: Math.round((reconciledCount / totalCount) * 100) + }, + sampleCaches, + message: "Diagnostic du cache terminé" + }); + } catch (error) { + console.error("Erreur diagnostic cache:", error); + res.status(500).json({ + message: "Erreur lors du diagnostic", + error: error instanceof Error ? error.message : 'Unknown error' + }); + } + }); + // Route pour mettre à jour les caches existants des livraisons validées app.post('/api/cache/update-reconciled', isAuthenticated, async (req: any, res) => { try {