Merge pull request #509 from R0m1k3/1.1

Improve automatic invoice verification for reconciled deliveries
This commit is contained in:
LogiFlow authored and GitHub committed 2025-11-04 14:42:21 +01:00
commit 6d80289022
1 file changed
+29 -45
+29 -45
View File
@@ -383,45 +383,25 @@ export default function BLReconciliation() {
setVerificationResults(newVerificationResults); setVerificationResults(newVerificationResults);
} }
// CAS SPÉCIAL : Livraisons réconciliées (✅) avec cellules vides
// Si reconciled=true ET (cellules vides) ET blNumber existe → auto-remplir
deliveriesWithBL.forEach((delivery: any) => { deliveriesWithBL.forEach((delivery: any) => {
// CAS SPÉCIAL : Livraisons réconciliées (✅) avec cellules vides if (!delivery.reconciled) return; // Ignorer les livraisons non réconciliées
// Si reconciled=true ET (cellules vides) ET blNumber existe → auto-remplir
if (delivery.reconciled) {
const hasEmptyCells = !delivery.invoiceReference || !delivery.invoiceAmount || !delivery.dueDate;
const hasBLNumber = delivery.blNumber?.trim();
const notAlreadyAutoVerified = !autoVerifiedDeliveries.has(delivery.id);
const notCurrentlyVerifying = !verifyingDeliveries.has(delivery.id);
if (hasEmptyCells && hasBLNumber && notAlreadyAutoVerified && notCurrentlyVerifying) {
// Livraison réconciliée avec cellules vides → vérifier pour auto-remplir (UNE SEULE FOIS)
if (import.meta.env.DEV) {
console.log(`🔄 Livraison réconciliée #${delivery.id} avec cellules vides, auto-vérification (première tentative)...`);
}
// Marquer comme auto-vérifiée AVANT de lancer pour éviter les doublons
setAutoVerifiedDeliveries(prev => new Set(prev).add(delivery.id));
// Lancer la vérification sans délai
handleVerifyInvoice(delivery, false);
}
return; // Autres livraisons réconciliées = AUCUNE vérification nécessaire
}
// Vérifier seulement les livraisons NON validées const hasEmptyCells = !delivery.invoiceReference || !delivery.invoiceAmount || !delivery.dueDate;
const hasVerifiableData = delivery.invoiceReference || delivery.blNumber; const hasBLNumber = delivery.blNumber?.trim();
const notAlreadyProcessed = !verificationResults[delivery.id] && !verifyingDeliveries.has(delivery.id); const notAlreadyAutoVerified = !autoVerifiedDeliveries.has(delivery.id);
const notCurrentlyVerifying = !verifyingDeliveries.has(delivery.id);
if (hasVerifiableData && notAlreadyProcessed) { if (hasEmptyCells && hasBLNumber && notAlreadyAutoVerified && notCurrentlyVerifying) {
// Livraison réconciliée avec cellules vides → vérifier pour auto-remplir (UNE SEULE FOIS)
if (import.meta.env.DEV) { if (import.meta.env.DEV) {
console.log(`🔍 Vérification auto pour livraison NON réconciliée ${delivery.id}:`, { console.log(`🔄 Livraison réconciliée #${delivery.id} avec cellules vides, auto-vérification (première tentative)...`);
invoiceRef: delivery.invoiceReference,
blNumber: delivery.blNumber,
reconciled: delivery.reconciled
});
} }
// Marquer comme auto-vérifiée AVANT de lancer pour éviter les doublons
// Délai pour éviter de surcharger le serveur setAutoVerifiedDeliveries(prev => new Set(prev).add(delivery.id));
setTimeout(() => { // Lancer la vérification sans délai
handleVerifyInvoice(delivery, false); handleVerifyInvoice(delivery, false);
}, Math.random() * 1000);
} }
}); });
}, [deliveriesWithBL, suppliers, verificationResults, verifyingDeliveries]); }, [deliveriesWithBL, suppliers, verificationResults, verifyingDeliveries]);
@@ -451,10 +431,9 @@ export default function BLReconciliation() {
const handleSaveReconciliation = async () => { const handleSaveReconciliation = async () => {
try { try {
// Invalidation cache + refetch forcé pour mise à jour immédiate // Force refetch immédiat pour mettre à jour l'affichage
queryClient.invalidateQueries({ queryKey: ['/api/deliveries/bl'] }); await queryClient.refetchQueries({ queryKey: ['/api/deliveries/bl'] });
queryClient.invalidateQueries({ queryKey: ['/api/deliveries'] }); await queryClient.refetchQueries({ queryKey: ['/api/deliveries'] });
refetch();
handleCloseModal(); handleCloseModal();
} catch (error) { } catch (error) {
toast({ toast({
@@ -661,10 +640,12 @@ export default function BLReconciliation() {
description: "Rapprochement validé avec succès", description: "Rapprochement validé avec succès",
}); });
// Invalidation cache + refetch forcé pour mise à jour immédiate // Force refetch immédiat pour déplacer la facture dans l'onglet validées
queryClient.invalidateQueries({ queryKey: ['/api/deliveries/bl'] }); await queryClient.refetchQueries({ queryKey: ['/api/deliveries/bl'] });
queryClient.invalidateQueries({ queryKey: ['/api/deliveries'] }); await queryClient.refetchQueries({ queryKey: ['/api/deliveries'] });
refetch(); // Force recharge immédiate des données BL
// Passer automatiquement à l'onglet "Validées" après validation
setActiveTab("validated");
} catch (error) { } catch (error) {
toast({ toast({
title: "Erreur", title: "Erreur",
@@ -699,9 +680,12 @@ export default function BLReconciliation() {
description: "Rapprochement dévalidé avec succès", description: "Rapprochement dévalidé avec succès",
}); });
// Invalidation cache + refetch forcé pour mise à jour immédiate // Force refetch immédiat pour déplacer la facture dans l'onglet manuel
queryClient.invalidateQueries({ queryKey: ['/api/deliveries/bl'] }); await queryClient.refetchQueries({ queryKey: ['/api/deliveries/bl'] });
refetch(); await queryClient.refetchQueries({ queryKey: ['/api/deliveries'] });
// Passer automatiquement à l'onglet "Manuel" après dévalidation
setActiveTab("manual");
} catch (error) { } catch (error) {
toast({ toast({
title: "Erreur", title: "Erreur",