diff --git a/attached_assets/image_1755094643163.png b/attached_assets/image_1755094643163.png new file mode 100644 index 0000000..9c23779 Binary files /dev/null and b/attached_assets/image_1755094643163.png differ diff --git a/client/src/pages/BLReconciliation.tsx b/client/src/pages/BLReconciliation.tsx index 890ba17..b0b43fe 100644 --- a/client/src/pages/BLReconciliation.tsx +++ b/client/src/pages/BLReconciliation.tsx @@ -187,8 +187,8 @@ export default function BLReconciliation() { }); }; - // Récupérer les livraisons validées avec BL - const { data: deliveriesWithBL = [], isLoading } = useQuery({ + // Récupérer les livraisons validées avec BL - CACHE INVALIDÉ après modifications + const { data: deliveriesWithBL = [], isLoading, refetch } = useQuery({ queryKey: ['/api/deliveries/bl', selectedStoreId], queryFn: async () => { const params = new URLSearchParams({}); @@ -214,7 +214,8 @@ export default function BLReconciliation() { return filtered.sort((a: any, b: any) => new Date(b.deliveredDate || b.updatedAt).getTime() - new Date(a.deliveredDate || a.updatedAt).getTime()); }, - enabled: !!user + enabled: !!user, + staleTime: 0 // Éviter la mise en cache pour toujours avoir les dernières données BL }); // VÉRIFICATION AUTOMATIQUE AU CHARGEMENT avec système de cache @@ -267,7 +268,9 @@ export default function BLReconciliation() { description: "Données de rapprochement mises à jour", }); + // Invalidation cache + refetch forcé pour mise à jour immédiate queryClient.invalidateQueries({ queryKey: ['/api/deliveries/bl'] }); + refetch(); handleCloseModal(); } catch (error) { toast({ @@ -397,7 +400,10 @@ export default function BLReconciliation() { description: "Rapprochement validé avec succès", }); + // Invalidation cache + refetch forcé pour mise à jour immédiate queryClient.invalidateQueries({ queryKey: ['/api/deliveries/bl'] }); + queryClient.invalidateQueries({ queryKey: ['/api/deliveries'] }); + refetch(); // Force recharge immédiate des données BL } catch (error) { toast({ title: "Erreur", @@ -432,7 +438,9 @@ export default function BLReconciliation() { description: "Rapprochement dévalidé avec succès", }); + // Invalidation cache + refetch forcé pour mise à jour immédiate queryClient.invalidateQueries({ queryKey: ['/api/deliveries/bl'] }); + refetch(); } catch (error) { toast({ title: "Erreur", diff --git a/replit.md b/replit.md index 7f4228a..802e106 100644 --- a/replit.md +++ b/replit.md @@ -19,22 +19,20 @@ La plateforme fournit une gestion robuste des flux de travail de livraison avec ## Recent Changes -### 2025-08-13 - Correction complète des statistiques du tableau de bord -✅ **Résolution définitive de l'affichage de zéros dans les statistiques** : +### 2025-08-13 - Correction finale statistiques + affichage BL résolu +✅ **Résolution définitive des bugs statistiques et affichage BL** : -**Problème identifié et corrigé :** -- **Statistiques hardcodées** : La méthode `getMonthlyStats()` retournait des zéros fixes -- **Calculs réels implémentés** : Requêtes PostgreSQL pour vraies statistiques mensuelles -- **Filtrage par magasin** : Support des filtres par groupes/magasins -- **Gestion des erreurs** : Fallback en cas d'erreur de base de données +**1. Statistiques mois corrigées :** +- **Problème** : Palettes/colis comptées sur scheduledDate au lieu de deliveredDate +- **Solution** : Filtrage par `deliveredDate` pour vraies stats mensuelles +- **Impact** : Statistiques reflètent maintenant les livraisons effectives du mois +- **Calcul** : Seules les livraisons `delivered` dans le mois avec `deliveredDate` valide -**Calculs statistiques implémentés :** -- **Commandes** : COUNT des commandes du mois par date plannedDate -- **Livraisons** : COUNT des livraisons du mois par date plannedDate -- **Palettes** : SUM des quantités de livraisons -- **Colis** : COUNT total des livraisons -- **Délai moyen** : Moyenne des jours entre plannedDate et actualDate -- **Commandes en attente** : COUNT des commandes sans date ou statut pending +**2. Affichage BL rapprochement optimisé :** +- **Problème** : BL numbers n'apparaissaient pas immédiatement après validation +- **Solution** : Cache invalidation + refetch forcé après modification +- **Technique** : `staleTime: 0` + `queryClient.invalidateQueries` + `refetch()` +- **Résultat** : Mise à jour instantanée de l'interface utilisateur ### 2025-08-13 - Erreurs 502 production entièrement corrigées ✅ **Résolution définitive des erreurs Bad Gateway en production** : diff --git a/server/storage.ts b/server/storage.ts index fb87cc6..b378fe5 100644 --- a/server/storage.ts +++ b/server/storage.ts @@ -612,11 +612,12 @@ export class DatabaseStorage implements IStorage { try { console.log('📊 Calcul statistiques mensuelles:', { year, month, startDate, endDate, groupIds }); - // Construire les conditions pour le filtrage par groupe + // Construire les conditions pour le filtrage par groupe - UTILISER LE BON CHAMP DE DATE let ordersWhereCondition = and( gte(orders.plannedDate, startDate), lt(orders.plannedDate, endDate) ); + // Pour les livraisons, utiliser deliveredDate pour celles livrées, sinon scheduledDate let deliveriesWhereCondition = and( gte(deliveries.scheduledDate, startDate), lt(deliveries.scheduledDate, endDate) @@ -652,12 +653,19 @@ export class DatabaseStorage implements IStorage { .where(pendingWhereCondition); // Calculer les totaux de palettes et colis du mois (SEULEMENT livraisons delivered) + // IMPORTANT: Utiliser deliveredDate pour filtrer par le mois de livraison effective let deliveredWhereCondition = and( - deliveriesWhereCondition, + gte(deliveries.deliveredDate, startDate), + lt(deliveries.deliveredDate, endDate), eq(deliveries.status, 'delivered'), isNotNull(deliveries.deliveredDate) ); + // Ajouter le filtre par groupe pour les livraisons delivered + if (groupIds && groupIds.length > 0) { + deliveredWhereCondition = and(deliveredWhereCondition, inArray(deliveries.groupId, groupIds)); + } + const deliveriesStatsResult = await db .select({ totalPalettes: sql`COALESCE(SUM(CAST(${deliveries.quantity} as INTEGER)), 0)`,