mirror of
https://github.com/R0m1k3/LogiFlow.git
synced 2026-10-20 13:38:15 +02:00
Merge pull request #297 from R0m1k3/1.1
Improve task management by optimizing cache updates for reconciled in…
This commit is contained in:
2 files changed
+128
-3
No files matched your search
@@ -146,6 +146,88 @@ export class InvoiceVerificationService {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Met à jour le cache pour marquer une facture comme réconciliée (cache permanent)
|
||||||
|
*/
|
||||||
|
async updateCacheAsReconciled(invoiceReference: string, groupId: number): Promise<void> {
|
||||||
|
try {
|
||||||
|
const cacheKey = this.generateCacheKey(invoiceReference, groupId);
|
||||||
|
console.log('🔄 [CACHE] Mise à jour cache comme réconcilié:', { invoiceReference, groupId, cacheKey });
|
||||||
|
|
||||||
|
// Récupérer le cache existant
|
||||||
|
const cached = await storage.getInvoiceVerificationCache(cacheKey);
|
||||||
|
if (!cached) {
|
||||||
|
console.log('❌ [CACHE] Aucun cache trouvé à mettre à jour');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Si déjà réconcilié, ne rien faire
|
||||||
|
if (cached.isReconciled) {
|
||||||
|
console.log('✅ [CACHE] Cache déjà marqué comme réconcilié');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Mettre à jour avec cache permanent (50 ans)
|
||||||
|
const expiresAt = new Date();
|
||||||
|
expiresAt.setFullYear(expiresAt.getFullYear() + 50);
|
||||||
|
|
||||||
|
const updatedCacheData = {
|
||||||
|
...cached,
|
||||||
|
isReconciled: true,
|
||||||
|
expiresAt
|
||||||
|
};
|
||||||
|
|
||||||
|
await storage.saveInvoiceVerificationCache(updatedCacheData);
|
||||||
|
|
||||||
|
console.log('✅ [CACHE] Cache mis à jour comme PERMANENT:', {
|
||||||
|
invoiceReference,
|
||||||
|
groupId,
|
||||||
|
cacheKey,
|
||||||
|
newExpiresAt: expiresAt.toISOString()
|
||||||
|
});
|
||||||
|
} catch (error) {
|
||||||
|
console.error('❌ [CACHE] Erreur mise à jour cache réconcilié:', error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Met à jour tous les caches des livraisons déjà validées pour les marquer comme permanents
|
||||||
|
*/
|
||||||
|
async updateExistingReconciledCaches(): Promise<void> {
|
||||||
|
try {
|
||||||
|
console.log('🔄 [CACHE] Mise à jour en lot des caches pour livraisons validées...');
|
||||||
|
|
||||||
|
// Récupérer toutes les livraisons validées (reconciled = true)
|
||||||
|
const deliveries = await storage.getDeliveries();
|
||||||
|
const reconciledDeliveries = deliveries.filter(d => d.reconciled);
|
||||||
|
|
||||||
|
console.log(`📊 [CACHE] ${reconciledDeliveries.length} livraisons validées trouvées`);
|
||||||
|
|
||||||
|
let updatedCount = 0;
|
||||||
|
for (const delivery of reconciledDeliveries) {
|
||||||
|
try {
|
||||||
|
// Mettre à jour le cache pour la référence de facture
|
||||||
|
if (delivery.invoiceReference && delivery.invoiceReference.trim()) {
|
||||||
|
await this.updateCacheAsReconciled(delivery.invoiceReference, delivery.groupId);
|
||||||
|
updatedCount++;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Mettre à jour le cache pour le numéro BL
|
||||||
|
if (delivery.blNumber && delivery.blNumber.trim()) {
|
||||||
|
await this.updateCacheAsReconciled(delivery.blNumber, delivery.groupId);
|
||||||
|
updatedCount++;
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.error(`❌ [CACHE] Erreur mise à jour cache pour livraison ${delivery.id}:`, error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log(`✅ [CACHE] Mise à jour terminée: ${updatedCount} caches mis à jour comme permanents`);
|
||||||
|
} catch (error) {
|
||||||
|
console.error('❌ [CACHE] Erreur lors de la mise à jour en lot:', error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Vérifie une référence de facture pour un groupe donné
|
* Vérifie une référence de facture pour un groupe donné
|
||||||
*/
|
*/
|
||||||
@@ -217,7 +299,7 @@ export class InvoiceVerificationService {
|
|||||||
if (invoiceReference.toLowerCase().includes('test')) {
|
if (invoiceReference.toLowerCase().includes('test')) {
|
||||||
const result = {
|
const result = {
|
||||||
exists: true,
|
exists: true,
|
||||||
matchType: 'invoice_reference',
|
matchType: 'invoice_reference' as const,
|
||||||
invoiceReference: invoiceReference,
|
invoiceReference: invoiceReference,
|
||||||
invoiceAmount: 123.45,
|
invoiceAmount: 123.45,
|
||||||
supplierName: 'Fournisseur Test'
|
supplierName: 'Fournisseur Test'
|
||||||
@@ -231,7 +313,7 @@ export class InvoiceVerificationService {
|
|||||||
if (invoiceReference.toLowerCase().includes('bl')) {
|
if (invoiceReference.toLowerCase().includes('bl')) {
|
||||||
const result = {
|
const result = {
|
||||||
exists: true,
|
exists: true,
|
||||||
matchType: 'bl_number',
|
matchType: 'bl_number' as const,
|
||||||
invoiceReference: `FACT_${invoiceReference}`,
|
invoiceReference: `FACT_${invoiceReference}`,
|
||||||
invoiceAmount: 67.89,
|
invoiceAmount: 67.89,
|
||||||
supplierName: 'Fournisseur BL'
|
supplierName: 'Fournisseur BL'
|
||||||
@@ -244,7 +326,7 @@ export class InvoiceVerificationService {
|
|||||||
|
|
||||||
const result = {
|
const result = {
|
||||||
exists: false,
|
exists: false,
|
||||||
matchType: 'none',
|
matchType: 'none' as const,
|
||||||
errorMessage: 'Facture non trouvée (mode développement)'
|
errorMessage: 'Facture non trouvée (mode développement)'
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -1124,6 +1124,20 @@ export async function registerRoutes(app: Express): Promise<Server> {
|
|||||||
|
|
||||||
await storage.validateDelivery(id, blData);
|
await storage.validateDelivery(id, blData);
|
||||||
|
|
||||||
|
// MISE À JOUR DU CACHE : Marquer le cache comme permanent pour cette livraison validée
|
||||||
|
try {
|
||||||
|
if (delivery.invoiceReference && delivery.invoiceReference.trim()) {
|
||||||
|
console.log('🔄 [CACHE] Mise à jour cache permanent après validation livraison');
|
||||||
|
await invoiceVerificationService.updateCacheAsReconciled(delivery.invoiceReference, delivery.groupId);
|
||||||
|
}
|
||||||
|
if (delivery.blNumber && delivery.blNumber.trim()) {
|
||||||
|
console.log('🔄 [CACHE] Mise à jour cache permanent BL après validation livraison');
|
||||||
|
await invoiceVerificationService.updateCacheAsReconciled(delivery.blNumber, delivery.groupId);
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.error('❌ Erreur mise à jour cache après validation:', error);
|
||||||
|
}
|
||||||
|
|
||||||
// SYNCHRONISATION AUTOMATIQUE : Quand validation, marquer la commande associée comme "delivered"
|
// SYNCHRONISATION AUTOMATIQUE : Quand validation, marquer la commande associée comme "delivered"
|
||||||
if (delivery.orderId) {
|
if (delivery.orderId) {
|
||||||
try {
|
try {
|
||||||
@@ -1142,6 +1156,35 @@ export async function registerRoutes(app: Express): Promise<Server> {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// Route pour mettre à jour les caches existants des livraisons validées
|
||||||
|
app.post('/api/cache/update-reconciled', 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" });
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log('🔧 [ADMIN] Exécution mise à jour des caches permanents...');
|
||||||
|
await invoiceVerificationService.updateExistingReconciledCaches();
|
||||||
|
|
||||||
|
res.json({
|
||||||
|
message: "Mise à jour des caches permanents terminée avec succès",
|
||||||
|
success: true
|
||||||
|
});
|
||||||
|
} catch (error) {
|
||||||
|
console.error("Erreur mise à jour caches:", error);
|
||||||
|
res.status(500).json({
|
||||||
|
message: "Erreur lors de la mise à jour des caches",
|
||||||
|
error: error instanceof Error ? error.message : 'Unknown error'
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
// DLC Products routes
|
// DLC Products routes
|
||||||
app.get('/api/dlc-products', isAuthenticated, async (req: any, res) => {
|
app.get('/api/dlc-products', isAuthenticated, async (req: any, res) => {
|
||||||
try {
|
try {
|
||||||
|
|||||||
Reference in new issue
Block a user