import { createServiceClient } from "@/lib/supabase"; import { verifySessionToken } from "@/lib/admin-auth"; import { AdminNav } from "@/components/admin/AdminNav"; import { cookies } from "next/headers"; import { redirect } from "next/navigation"; import type { Metadata } from "next"; export const metadata: Metadata = { title: "Statistik – MBO Tech IT" }; export const dynamic = "force-dynamic"; function fmt(n: number) { return n.toLocaleString("de-DE"); } export default async function StatistikPage() { const cookieStore = await cookies(); const token = cookieStore.get("admin_session")?.value; if (!token) redirect("/admin/login"); const session = await verifySessionToken(token); if (!session) redirect("/admin/login?session_expired=true"); const db = createServiceClient(); const { data: alleAnfragen } = await db .from("anfragen") .select("id, status, created_at, name, betreff"); const anfragen = alleAnfragen ?? []; const gesamt = anfragen.length; const offen = anfragen.filter((a) => a.status === "offen").length; const inBearbeitung = anfragen.filter((a) => a.status === "in_bearbeitung").length; const abgeschlossen = anfragen.filter((a) => a.status === "abgeschlossen").length; const { data: recentRaw } = await db .from("anfragen") .select("id, created_at, name, betreff, status, email") .order("created_at", { ascending: false }) .limit(20); const recentAnfragen = recentRaw ?? []; const heute = new Date(); const monatsStats: { monat: string; label: string; count: number }[] = []; for (let i = 5; i >= 0; i--) { const d = new Date(heute); d.setMonth(d.getMonth() - i); const monat = `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, "0")}`; const label = d.toLocaleDateString("de-DE", { month: "short", year: "2-digit" }); const count = anfragen.filter((a) => a.created_at.startsWith(monat)).length; monatsStats.push({ monat, label, count }); } const maxCount = Math.max(...monatsStats.map((m) => m.count), 1); return (

Statistik

Anfragen-Übersicht

{[ { label: "Anfragen gesamt", wert: fmt(gesamt), farbe: "border-l-slate-400" }, { label: "Offen", wert: fmt(offen), farbe: "border-l-amber-500" }, { label: "In Bearbeitung", wert: fmt(inBearbeitung), farbe: "border-l-blue-500" }, { label: "Abgeschlossen", wert: fmt(abgeschlossen), farbe: "border-l-green-500" }, ].map((k) => (

{k.label}

{k.wert}

))}

Anfragen letzte 6 Monate

{monatsStats.map((m) => (
{m.count > 0 ? m.count : "–"}
0 ? 8 : 0, Math.round((m.count / maxCount) * 80))}px`, }} />
{m.label}
))}

Letzte 20 Anfragen

{recentAnfragen.length === 0 ? ( ) : ( recentAnfragen.map((a) => ( )) )}
Datum Name Betreff Status
Keine Anfragen vorhanden
{new Date(a.created_at).toLocaleDateString("de-DE")} {a.name} {a.betreff} {a.status === "offen" ? "Offen" : a.status === "in_bearbeitung" ? "In Bearbeitung" : "Abgeschlossen"}
); }