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)}
);
})}
)}
);
}