Merge pull request #94 from R0m1k3/1.1

Improve reconciliation display and fix statistics calculations
This commit is contained in:
LogiFlow authored and GitHub committed 2025-08-13 16:24:40 +02:00
commit 4c24754b9b
4 files changed
+33 -19

No files matched your search

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

+11 -3
View File
@@ -187,8 +187,8 @@ export default function BLReconciliation() {
}); });
}; };
// Récupérer les livraisons validées avec BL // Récupérer les livraisons validées avec BL - CACHE INVALIDÉ après modifications
const { data: deliveriesWithBL = [], isLoading } = useQuery({ const { data: deliveriesWithBL = [], isLoading, refetch } = useQuery({
queryKey: ['/api/deliveries/bl', selectedStoreId], queryKey: ['/api/deliveries/bl', selectedStoreId],
queryFn: async () => { queryFn: async () => {
const params = new URLSearchParams({}); 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()); 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 // 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", description: "Données de rapprochement mises à jour",
}); });
// Invalidation cache + refetch forcé pour mise à jour immédiate
queryClient.invalidateQueries({ queryKey: ['/api/deliveries/bl'] }); queryClient.invalidateQueries({ queryKey: ['/api/deliveries/bl'] });
refetch();
handleCloseModal(); handleCloseModal();
} catch (error) { } catch (error) {
toast({ toast({
@@ -397,7 +400,10 @@ 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
queryClient.invalidateQueries({ queryKey: ['/api/deliveries/bl'] }); queryClient.invalidateQueries({ queryKey: ['/api/deliveries/bl'] });
queryClient.invalidateQueries({ queryKey: ['/api/deliveries'] });
refetch(); // Force recharge immédiate des données BL
} catch (error) { } catch (error) {
toast({ toast({
title: "Erreur", title: "Erreur",
@@ -432,7 +438,9 @@ 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
queryClient.invalidateQueries({ queryKey: ['/api/deliveries/bl'] }); queryClient.invalidateQueries({ queryKey: ['/api/deliveries/bl'] });
refetch();
} catch (error) { } catch (error) {
toast({ toast({
title: "Erreur", title: "Erreur",
+12 -14
View File
@@ -19,22 +19,20 @@ La plateforme fournit une gestion robuste des flux de travail de livraison avec
## Recent Changes ## Recent Changes
### 2025-08-13 - Correction complète des statistiques du tableau de bord ### 2025-08-13 - Correction finale statistiques + affichage BL résolu
✅ **Résolution définitive de l'affichage de zéros dans les statistiques** : ✅ **Résolution définitive des bugs statistiques et affichage BL** :
**Problème identifié et corrigé :** **1. Statistiques mois corrigées :**
- **Statistiques hardcodées** : La méthode `getMonthlyStats()` retournait des zéros fixes - **Problème** : Palettes/colis comptées sur scheduledDate au lieu de deliveredDate
- **Calculs réels implémentés** : Requêtes PostgreSQL pour vraies statistiques mensuelles - **Solution** : Filtrage par `deliveredDate` pour vraies stats mensuelles
- **Filtrage par magasin** : Support des filtres par groupes/magasins - **Impact** : Statistiques reflètent maintenant les livraisons effectives du mois
- **Gestion des erreurs** : Fallback en cas d'erreur de base de données - **Calcul** : Seules les livraisons `delivered` dans le mois avec `deliveredDate` valide
**Calculs statistiques implémentés :** **2. Affichage BL rapprochement optimisé :**
- **Commandes** : COUNT des commandes du mois par date plannedDate - **Problème** : BL numbers n'apparaissaient pas immédiatement après validation
- **Livraisons** : COUNT des livraisons du mois par date plannedDate - **Solution** : Cache invalidation + refetch forcé après modification
- **Palettes** : SUM des quantités de livraisons - **Technique** : `staleTime: 0` + `queryClient.invalidateQueries` + `refetch()`
- **Colis** : COUNT total des livraisons - **Résultat** : Mise à jour instantanée de l'interface utilisateur
- **Délai moyen** : Moyenne des jours entre plannedDate et actualDate
- **Commandes en attente** : COUNT des commandes sans date ou statut pending
### 2025-08-13 - Erreurs 502 production entièrement corrigées ### 2025-08-13 - Erreurs 502 production entièrement corrigées
✅ **Résolution définitive des erreurs Bad Gateway en production** : ✅ **Résolution définitive des erreurs Bad Gateway en production** :
+10 -2
View File
@@ -612,11 +612,12 @@ export class DatabaseStorage implements IStorage {
try { try {
console.log('📊 Calcul statistiques mensuelles:', { year, month, startDate, endDate, groupIds }); 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( let ordersWhereCondition = and(
gte(orders.plannedDate, startDate), gte(orders.plannedDate, startDate),
lt(orders.plannedDate, endDate) lt(orders.plannedDate, endDate)
); );
// Pour les livraisons, utiliser deliveredDate pour celles livrées, sinon scheduledDate
let deliveriesWhereCondition = and( let deliveriesWhereCondition = and(
gte(deliveries.scheduledDate, startDate), gte(deliveries.scheduledDate, startDate),
lt(deliveries.scheduledDate, endDate) lt(deliveries.scheduledDate, endDate)
@@ -652,12 +653,19 @@ export class DatabaseStorage implements IStorage {
.where(pendingWhereCondition); .where(pendingWhereCondition);
// Calculer les totaux de palettes et colis du mois (SEULEMENT livraisons delivered) // 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( let deliveredWhereCondition = and(
deliveriesWhereCondition, gte(deliveries.deliveredDate, startDate),
lt(deliveries.deliveredDate, endDate),
eq(deliveries.status, 'delivered'), eq(deliveries.status, 'delivered'),
isNotNull(deliveries.deliveredDate) 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 const deliveriesStatsResult = await db
.select({ .select({
totalPalettes: sql<number>`COALESCE(SUM(CAST(${deliveries.quantity} as INTEGER)), 0)`, totalPalettes: sql<number>`COALESCE(SUM(CAST(${deliveries.quantity} as INTEGER)), 0)`,