mirror of
https://github.com/R0m1k3/LogiFlow.git
synced 2026-10-22 14:38:19 +02:00
4 files changed
+103
-9
No files matched your search
Binary file not shown.
|
After Width: | Height: | Size: 427 KiB |
@@ -242,23 +242,57 @@ export default function BLReconciliation() {
|
|||||||
console.log('🔄 Déclenchement vérifications automatiques...');
|
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) => {
|
deliveriesWithBL.forEach((delivery: any) => {
|
||||||
// Vérifier seulement si on a une référence de facture ou un BL et pas déjà de résultat
|
// 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) => {
|
||||||
|
// ⛔ EXCLURE COMPLÈTEMENT les livraisons déjà réconciliées
|
||||||
|
// Une fois validées avec coche verte, on ne contrôle plus JAMAIS
|
||||||
|
if (delivery.reconciled) {
|
||||||
|
return; // Livraison déjà validée = AUCUNE vérification nécessaire
|
||||||
|
}
|
||||||
|
|
||||||
|
// Vérifier seulement les livraisons NON validées
|
||||||
const hasVerifiableData = delivery.invoiceReference || delivery.blNumber;
|
const hasVerifiableData = delivery.invoiceReference || delivery.blNumber;
|
||||||
const notAlreadyProcessed = !verificationResults[delivery.id] && !verifyingDeliveries.has(delivery.id);
|
const notAlreadyProcessed = !verificationResults[delivery.id] && !verifyingDeliveries.has(delivery.id);
|
||||||
|
|
||||||
if (hasVerifiableData && notAlreadyProcessed) {
|
if (hasVerifiableData && notAlreadyProcessed) {
|
||||||
if (import.meta.env.DEV) {
|
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,
|
invoiceRef: delivery.invoiceReference,
|
||||||
blNumber: delivery.blNumber
|
blNumber: delivery.blNumber,
|
||||||
|
reconciled: delivery.reconciled
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
// Délai pour éviter de surcharger le serveur - le cache évitera les appels inutiles
|
// Délai pour éviter de surcharger le serveur
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
handleVerifyInvoice(delivery, false); // Pas de force refresh, utilise le cache
|
handleVerifyInvoice(delivery, false);
|
||||||
}, Math.random() * 1000); // Délai aléatoire entre 0 et 1 seconde
|
}, Math.random() * 1000);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}, [deliveriesWithBL, suppliers, verificationResults, verifyingDeliveries]);
|
}, [deliveriesWithBL, suppliers, verificationResults, verifyingDeliveries]);
|
||||||
|
|||||||
@@ -30,9 +30,13 @@ export class InvoiceVerificationService {
|
|||||||
currentTime: new Date().toISOString()
|
currentTime: new Date().toISOString()
|
||||||
});
|
});
|
||||||
|
|
||||||
// Cache permanent si facture validée (isReconciled = true)
|
// ✅ CACHE PERMANENT : Facture validée avec coche verte = JAMAIS re-vérifier
|
||||||
if (cached && cached.isReconciled) {
|
if (cached && cached.isReconciled && cached.exists) {
|
||||||
console.log('✅ [CACHE] Cache PERMANENT pour facture validée:', { invoiceReference, groupId, exists: cached.exists });
|
console.log('🛡️ [CACHE] PERMANENT - Facture validée avec coche verte, AUCUNE vérification:', {
|
||||||
|
invoiceReference,
|
||||||
|
groupId,
|
||||||
|
exists: cached.exists
|
||||||
|
});
|
||||||
return {
|
return {
|
||||||
exists: cached.exists,
|
exists: cached.exists,
|
||||||
matchType: cached.matchType,
|
matchType: cached.matchType,
|
||||||
|
|||||||
@@ -1156,6 +1156,62 @@ export async function registerRoutes(app: Express): Promise<Server> {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// 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
|
// Route pour mettre à jour les caches existants des livraisons validées
|
||||||
app.post('/api/cache/update-reconciled', isAuthenticated, async (req: any, res) => {
|
app.post('/api/cache/update-reconciled', isAuthenticated, async (req: any, res) => {
|
||||||
try {
|
try {
|
||||||
|
|||||||
Reference in new issue
Block a user