diff --git a/attached_assets/image_1755101144625.png b/attached_assets/image_1755101144625.png new file mode 100644 index 0000000..bd49e36 Binary files /dev/null and b/attached_assets/image_1755101144625.png differ diff --git a/client/src/lib/queryClient.ts b/client/src/lib/queryClient.ts index ff72171..fa5743f 100644 --- a/client/src/lib/queryClient.ts +++ b/client/src/lib/queryClient.ts @@ -13,7 +13,10 @@ export async function apiRequest( body?: unknown, headers: Record = {} ): Promise { - console.log("🌐 API Request:", { url, method, body }); + // Logging désactivé en production pour éviter la latence + if (import.meta.env.DEV) { + console.log("🌐 API Request:", { url, method }); + } const res = await fetch(url, { method, @@ -25,7 +28,10 @@ export async function apiRequest( credentials: "include", }); - console.log("🌐 API Response:", { status: res.status, ok: res.ok }); + // Logging des erreurs uniquement en production + if (!res.ok || import.meta.env.DEV) { + console.log("🌐 API Response:", { status: res.status, ok: res.ok, url }); + } await throwIfResNotOk(res); diff --git a/client/src/pages/BLReconciliation.tsx b/client/src/pages/BLReconciliation.tsx index b0b43fe..1e5346d 100644 --- a/client/src/pages/BLReconciliation.tsx +++ b/client/src/pages/BLReconciliation.tsx @@ -206,10 +206,10 @@ export default function BLReconciliation() { const deliveries = await response.json(); - // Debug : examiner les données des groupes en production - console.log('🔍 DEBUG Production - Première livraison:', deliveries[0]); - console.log('🔍 DEBUG Production - Groupe de la première livraison:', deliveries[0]?.group); - console.log('🔍 DEBUG Production - Champs disponibles dans group:', deliveries[0]?.group ? Object.keys(deliveries[0].group) : 'Pas de groupe'); + // Debug désactivé en production pour éviter latence + if (import.meta.env.DEV && deliveries[0]) { + console.log('🔍 DEBUG - Première livraison:', deliveries[0]); + } const filtered = Array.isArray(deliveries) ? deliveries.filter((d: any) => d.status === 'delivered') : []; return filtered.sort((a: any, b: any) => new Date(b.deliveredDate || b.updatedAt).getTime() - new Date(a.deliveredDate || a.updatedAt).getTime()); @@ -222,12 +222,16 @@ export default function BLReconciliation() { useEffect(() => { if (!deliveriesWithBL.length || !suppliers.length) return; - console.log('🔄 Déclenchement vérifications automatiques...'); + if (import.meta.env.DEV) { + console.log('🔄 Déclenchement vérifications automatiques...'); + } deliveriesWithBL.forEach((delivery: any) => { // Vérifier seulement si on a une référence de facture et pas déjà de résultat if (delivery.invoiceReference && !verificationResults[delivery.id] && !verifyingDeliveries.has(delivery.id)) { - console.log(`🔍 Vérification auto pour livraison ${delivery.id}:`, delivery.invoiceReference); + if (import.meta.env.DEV) { + console.log(`🔍 Vérification auto pour livraison ${delivery.id}:`, delivery.invoiceReference); + } // Délai pour éviter de surcharger le serveur - le cache évitera les appels inutiles setTimeout(() => { @@ -373,14 +377,12 @@ export default function BLReconciliation() { // Et il faut qu'il y ait un magasin assigné avec un webhook const hasValidGroup = delivery.group && delivery.group.webhookUrl; - // Debug temporaire pour diagnostiquer le problème - if (delivery && delivery.supplier?.name) { + // Debug uniquement en développement + if (import.meta.env.DEV && delivery && delivery.supplier?.name) { console.log(`🔍 Debug bouton facture pour ${delivery.supplier.name}:`, { isNotValidated, hasNoInvoiceReference, hasValidGroup, - group: delivery.group, - webhookUrl: delivery.group?.webhookUrl, shouldShow: (isNotValidated || hasNoInvoiceReference) && hasValidGroup }); } diff --git a/client/src/pages/DlcPage.tsx b/client/src/pages/DlcPage.tsx index b855015..d0f2707 100644 --- a/client/src/pages/DlcPage.tsx +++ b/client/src/pages/DlcPage.tsx @@ -73,21 +73,25 @@ export default function DlcPage() { if (statusFilter && statusFilter !== "all") params.append("status", statusFilter); if (supplierFilter && supplierFilter !== "all") params.append("supplierId", supplierFilter); - console.log("🔍 Requête DLC products:", { - url: `/api/dlc-products?${params.toString()}`, - user: user?.role, - selectedStoreId, - userGroups: user?.userGroups?.map(ug => ({ groupId: ug.groupId, groupName: ug.group?.name })) - }); + if (import.meta.env.DEV) { + console.log("🔍 Requête DLC products:", { + url: `/api/dlc-products?${params.toString()}`, + user: user?.role, + selectedStoreId, + userGroups: user?.userGroups?.map(ug => ({ groupId: ug.groupId, groupName: ug.group?.name })) + }); + } return apiRequest(`/api/dlc-products?${params.toString()}`); }, enabled: !authLoading, onSuccess: (data) => { - console.log("📋 DLC products reçus:", { - total: data.length, - sample: data.slice(0, 3).map(d => ({ id: d.id, productName: d.productName, groupId: d.groupId })) - }); + if (import.meta.env.DEV) { + console.log("📋 DLC products reçus:", { + total: data.length, + sample: data.slice(0, 3).map(d => ({ id: d.id, productName: d.productName, groupId: d.groupId })) + }); + } } }); @@ -121,7 +125,9 @@ export default function DlcPage() { // Invalidate all DLC queries with any combination of parameters queryClient.invalidateQueries({ queryKey: ["/api/dlc-products"], exact: false }); queryClient.invalidateQueries({ queryKey: ["/api/dlc-products/stats"], exact: false }); - console.log("🔄 Cache DLC invalidé après création"); + if (import.meta.env.DEV) { + console.log("🔄 Cache DLC invalidé après création"); + } toast({ title: "Produit DLC créé avec succès" }); setIsDialogOpen(false); form.reset(); @@ -143,7 +149,9 @@ export default function DlcPage() { onSuccess: () => { queryClient.invalidateQueries({ queryKey: ["/api/dlc-products"], exact: false }); queryClient.invalidateQueries({ queryKey: ["/api/dlc-products/stats"], exact: false }); - console.log("🔄 Cache DLC invalidé après mise à jour"); + if (import.meta.env.DEV) { + console.log("🔄 Cache DLC invalidé après mise à jour"); + } toast({ title: "Produit DLC mis à jour avec succès" }); setIsDialogOpen(false); form.reset(); @@ -164,7 +172,9 @@ export default function DlcPage() { onSuccess: () => { queryClient.invalidateQueries({ queryKey: ["/api/dlc-products"], exact: false }); queryClient.invalidateQueries({ queryKey: ["/api/dlc-products/stats"], exact: false }); - console.log("🔄 Cache DLC invalidé après validation"); + if (import.meta.env.DEV) { + console.log("🔄 Cache DLC invalidé après validation"); + } toast({ title: "Produit validé avec succès" }); }, onError: (error: any) => { diff --git a/cookies.txt b/cookies.txt index a58f839..4390e07 100644 --- a/cookies.txt +++ b/cookies.txt @@ -2,4 +2,4 @@ # https://curl.se/docs/http-cookies.html # This file was generated by libcurl! Edit at your own risk. -#HttpOnly_localhost FALSE / FALSE 1755183951 connect.sid s%3A5AoIK-t2wOxXHZXR8IfvVc8xyfwMVSB8.wszhmo%2FyUviNdYS5uw4KwFZ7AoexEQiDD3olvfqQfHM +#HttpOnly_localhost FALSE / FALSE 1755187696 connect.sid s%3AnEg7s3fD2sLyetJTCx-VYkzZFbBkPEcf.2BsOBC1UlFIC%2BpyKgdtocMX42YO%2FZLBn1cU6UeEnIYY diff --git a/replit.md b/replit.md index e21cffe..1186295 100644 --- a/replit.md +++ b/replit.md @@ -19,6 +19,19 @@ La plateforme fournit une gestion robuste des flux de travail de livraison avec ## Recent Changes +### 2025-08-13 - Optimisation performance production + suppression fonctionnelle +✅ **Résolution latence production** : +- **Problème** : Console saturée par centaines de logs "API Response" causant latence +- **Solution** : Logging conditionnel - seulement en développement pour requêtes normales +- **Production** : Seules les erreurs API sont loggées pour debugging +- **Impact** : Réduction drastique de la charge console et amélioration performances + +✅ **Fonctionnalité suppression complètement opérationnelle** : +- **Cache NocoDB** : Fonction `saveInvoiceVerificationCache` ajoutée aux deux systèmes stockage +- **MemStorage** : Implémentation CRUD complète pour ordres et livraisons +- **Test validé** : Création, lecture et suppression fonctionnent parfaitement +- **Production** : Les suppressions de livraisons et rapprochements sont maintenant possibles + ### 2025-08-13 - Problème authentification production résolu ✅ **Diagnostic et solution du problème de validation des livraisons** :