+ {/* Section title */}
+
+
+
+
+ Hit Parade — {name}
+
+
+ Données du {dateLabel(dateHier)} · site {siteData.site}
+
+
-
-
-
-
+
+ {/* Three tables */}
+
+
+
+
+
+
+ );
+}
+
+// ---------------------------------------------------------------------------
+// Section divider
+// ---------------------------------------------------------------------------
+
+function SectionHeader({ label, sub }: { label: string; sub?: string }) {
+ return (
+
+
+
+ {label}
+
+ {sub &&
{sub}
}
);
@@ -190,9 +552,28 @@ export default async function DashboardPage() {
const msg = e instanceof Error ? e.message : String(e);
console.error("[Dashboard] pgGetDashboardData failed:", e);
return (
-
-
- Impossible de charger le tableau de bord : {msg.slice(0, 500)}
+
+
+
+
+
+ Impossible de charger le tableau de bord
+
+
+ {msg.slice(0, 300)}
);
@@ -205,73 +586,131 @@ export default async function DashboardPage() {
const totalTickets = sites.reduce((s, r) => s + r.tickets_hier, 0);
const totalTicketsN1 = sites.reduce((s, r) => s + r.tickets_n1, 0);
+ const dCaReseau = delta(totalCa, totalCaN1);
+ const dTicketsReseau = delta(totalTickets, totalTicketsN1);
+
+ const dHier = dateLabel(dateHier);
+ const dN1 = dateN1 ? dateLabel(dateN1) : "—";
+
return (
-
- {/* Header */}
-
-
- Tableau de Bord
-
-
- Données du {dateLabel(dateHier)}
- {" "}· Comparaison vs même jour de semaine N-1
- {dateN1 && ({dateLabel(dateN1)})}
-
+
+
+ {/* ── PAGE HEADER ─────────────────────────────────────────────── */}
+
+ {/* subtle background pattern */}
+
+
+
+
+ Tableau de Bord
+
+
+ Données du{" "}
+ {dHier}
+ {" · "}
+ Comparaison vs même jour de semaine N-1{" "}
+ ({dN1})
+
+
+
+
+
+
+ {sites.length} magasin{sites.length > 1 ? "s" : ""} actif{sites.length > 1 ? "s" : ""}
+
+
- {/* KPI réseau */}
-
-
-
-
SITE_NAMES[s.site] ?? s.site).join(" · ")}
- icon={TrendingUp}
- />
+ {/* ── KPI RÉSEAU ──────────────────────────────────────────────── */}
+
- {/* Par magasin */}
-
-
- Par magasin
-
- {sites.length === 0 ? (
-
Aucune donnée pour hier.
- ) : (
-
- {sites.map(s => )}
-
- )}
-
+ {/* ── PAR MAGASIN ─────────────────────────────────────────────── */}
+ {sites.length > 0 && (
+
+
SITE_NAMES[s.site] ?? s.site).join(" · ")}`} />
- {/* Hit Parade par magasin */}
-
-
- Hit Parade par magasin
-
- {top10BySite.length === 0 ? (
-
Aucune donnée pour hier.
- ) : (
-
- {top10BySite.map(s => (
-
+
+ {sites.map(s => (
+
))}
- )}
-
+
+ )}
+
+ {/* ── HIT PARADE ──────────────────────────────────────────────── */}
+ {top10BySite.length > 0 && (
+
+
+
+
+ {top10BySite.map((s, idx) => (
+
+ {idx > 0 && (
+
+ )}
+
+
+ ))}
+
+
+ )}
+
+ {/* ── EMPTY STATE ─────────────────────────────────────────────── */}
+ {sites.length === 0 && (
+
+ Aucune donnée disponible pour hier.
+
+ )}
);
}