From 19129ebd6acd09999504791eb19e2e71b00fff78 Mon Sep 17 00:00:00 2001 From: michaelschal <35957947-michaelschal@users.noreply.replit.com> Date: Mon, 22 Sep 2025 15:24:54 +0000 Subject: [PATCH] Expand default date range and improve data fetching diagnostics Update default date range to one year to show more data and add detailed console logging for API calls to aid in debugging data display issues. Replit-Commit-Author: Agent Replit-Commit-Session-Id: 1e4433b5-47ab-464c-b663-fea2e53367dd Replit-Commit-Checkpoint-Type: intermediate_checkpoint Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/1957c339-2757-4d1f-8e92-e9f71a1ce58e/1e4433b5-47ab-464c-b663-fea2e53367dd/P1V76jG --- .replit | 4 + attached_assets/image_1758554462272.png | Bin 0 -> 41478 bytes client/src/pages/Analytics.tsx | 185 +++++++++++++++--------- 3 files changed, 122 insertions(+), 67 deletions(-) create mode 100644 attached_assets/image_1758554462272.png diff --git a/.replit b/.replit index ba2f351..d234c98 100644 --- a/.replit +++ b/.replit @@ -27,6 +27,10 @@ externalPort = 3002 localPort = 41343 externalPort = 3001 +[[ports]] +localPort = 43431 +externalPort = 3003 + [workflows] runButton = "Project" diff --git a/attached_assets/image_1758554462272.png b/attached_assets/image_1758554462272.png new file mode 100644 index 0000000000000000000000000000000000000000..90147312687121710c23d0e1353bac940fb5bc15 GIT binary patch literal 41478 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 CdcO_; literal 0 HcmV?d00001 diff --git a/client/src/pages/Analytics.tsx b/client/src/pages/Analytics.tsx index dcd2554..b190313 100644 --- a/client/src/pages/Analytics.tsx +++ b/client/src/pages/Analytics.tsx @@ -20,10 +20,10 @@ export default function Analytics() { const { user } = useAuthUnified(); const { selectedStoreId } = useStore(); - // États des filtres + // États des filtres - élargir la période par défaut pour inclure plus de données const [dateRange, setDateRange] = useState({ - from: startOfMonth(new Date()), - to: endOfMonth(new Date()) + from: addDays(new Date(), -365), // Dernière année + to: new Date() }); const [selectedSuppliers, setSelectedSuppliers] = useState([]); const [selectedStores, setSelectedStores] = useState([]); @@ -56,11 +56,17 @@ export default function Analytics() { const { data: summary, isLoading: summaryLoading } = useQuery({ queryKey: ['/api/analytics/summary', queryParams], queryFn: async () => { + console.log('📊 [ANALYTICS] Fetching summary with params:', queryParams); const response = await fetch(`/api/analytics/summary?${queryParams}`, { credentials: 'include' }); - if (!response.ok) throw new Error('Failed to fetch summary'); - return response.json(); + if (!response.ok) { + console.error('❌ [ANALYTICS] Summary fetch failed:', response.status, response.statusText); + throw new Error('Failed to fetch summary'); + } + const data = await response.json(); + console.log('✅ [ANALYTICS] Summary data received:', data); + return data; }, refetchInterval: isRefreshing ? 30000 : false }); @@ -68,11 +74,18 @@ export default function Analytics() { const { data: timeseries } = useQuery({ queryKey: ['/api/analytics/timeseries', queryParams, granularity], queryFn: async () => { - const response = await fetch(`/api/analytics/timeseries?${queryParams}&granularity=${granularity}`, { + const url = `/api/analytics/timeseries?${queryParams}&granularity=${granularity}`; + console.log('📊 [ANALYTICS] Fetching timeseries:', url); + const response = await fetch(url, { credentials: 'include' }); - if (!response.ok) throw new Error('Failed to fetch timeseries'); - return response.json(); + if (!response.ok) { + console.error('❌ [ANALYTICS] Timeseries fetch failed:', response.status, response.statusText); + throw new Error('Failed to fetch timeseries'); + } + const data = await response.json(); + console.log('✅ [ANALYTICS] Timeseries data received:', data?.length || 0, 'entries'); + return data; } }); @@ -271,7 +284,7 @@ export default function Analytics() { Tous les fournisseurs - {suppliers?.map((supplier: any) => ( + {Array.isArray(suppliers) && suppliers.map((supplier: any) => ( {selectedSuppliers.includes(supplier.id) ? "✓ " : ""}{supplier.name} @@ -304,7 +317,7 @@ export default function Analytics() { Tous les magasins - {stores?.map((store: any) => ( + {Array.isArray(stores) && stores.map((store: any) => ( {selectedStores.includes(store.id) ? "✓ " : ""}{store.name} @@ -391,17 +404,27 @@ export default function Analytics() { Commandes vs Livraisons - - - - - - - - - - - + {Array.isArray(timeseries) && timeseries.length > 0 ? ( + + + + + + + + + + + + ) : ( +
+
+ +

Aucune donnée temporelle

+

Vérifiez la période sélectionnée

+
+
+ )}
@@ -415,25 +438,35 @@ export default function Analytics() { Top 5 fournisseurs - - - entry.supplierName} - outerRadius={80} - fill="#8884d8" - dataKey="deliveries" - > - {bySupplier?.slice(0, 5).map((entry: any, index: number) => ( - - ))} - - - - + {Array.isArray(bySupplier) && bySupplier.length > 0 ? ( + + + entry.supplierName} + outerRadius={80} + fill="#8884d8" + dataKey="deliveries" + > + {bySupplier.slice(0, 5).map((entry: any, index: number) => ( + + ))} + + + + + ) : ( +
+
+ +

Aucune donnée fournisseur

+

Aucune livraison trouvée

+
+
+ )}
@@ -447,17 +480,27 @@ export default function Analytics() { Commandes et livraisons - - - - - - - - - - - + {Array.isArray(byStore) && byStore.length > 0 ? ( + + + + + + + + + + + + ) : ( +
+
+ +

Aucune donnée magasin

+

Aucune activité détectée

+
+
+ )}
@@ -472,25 +515,33 @@ export default function Analytics() {
- {summary?.topSuppliers?.map((supplier: any, index: number) => ( -
-
- - {index + 1} - -
-

{supplier.name}

-

- {supplier.count} livraisons • {supplier.amount.toFixed(2)}€ -

+ {Array.isArray(summary?.topSuppliers) && summary.topSuppliers.length > 0 ? ( + summary.topSuppliers.map((supplier: any, index: number) => ( +
+
+ + {index + 1} + +
+

{supplier.name}

+

+ {supplier.count} livraisons • {supplier.amount.toFixed(2)}€ +

+
+
+
+
{supplier.count}
+
livraisons
-
-
{supplier.count}
-
livraisons
-
+ )) + ) : ( +
+ +

Aucune donnée disponible pour la période sélectionnée

+

Essayez d'élargir la plage de dates

- ))} + )}