import { getAnalyticsByYear, getMonthlyCollected, getAvailableYears, getTimeByClient, getTotalTrackedHours, } from "@/lib/analytics-queries"; import { YearSelector, MonthlyChart } from "@/components/admin/YearSelector"; export const revalidate = 0; function fmtEur(n: number) { return n.toLocaleString("it-IT", { style: "currency", currency: "EUR", minimumFractionDigits: 2 }); } function fmtSeconds(s: number): string { const h = Math.floor(s / 3600); const m = Math.floor((s % 3600) / 60); if (h > 0) return `${h}h ${m}m`; return `${m}m`; } function MetricCard({ label, value, sub, accent, }: { label: string; value: string; sub?: string; accent?: boolean; }) { return (

{label}

{value}

{sub && (

{sub}

)}
); } export default async function AnalyticsPage({ searchParams, }: { searchParams: Promise<{ year?: string }>; }) { const { year: yearParam } = await searchParams; const year = parseInt(yearParam ?? "") || new Date().getFullYear(); const [data, monthly, availableYears, timeByClient, totalHours] = await Promise.all([ getAnalyticsByYear(year), getMonthlyCollected(year), getAvailableYears(), getTimeByClient(year), getTotalTrackedHours(year), ]); const collectedPct = data.contracted > 0 ? Math.round((data.collected / data.contracted) * 100) : 0; const maxClientSeconds = timeByClient[0]?.totalSeconds ?? 1; return (
{/* Header */}

Statistiche

Panoramica per anno

{/* ── SEZIONE ECONOMICA ── */}

Fatturato

{data.contracted === 0 && (

Nessun cliente registrato nel {year}.

)}
{/* ── SEZIONE TIME TRACKING ── */}

Tempo tracciato

{timeByClient.length === 0 ? (

Nessuna sessione registrata nel {year}. Usa il timer ▶ nella lista clienti per iniziare.

) : (

Ore per cliente — {year}

{timeByClient.map((row) => { const pct = Math.round((row.totalSeconds / maxClientSeconds) * 100); return (
{row.clientName} {fmtSeconds(row.totalSeconds)}
); })}
)}
); }