# Modul: KPI-Dashboard (Admin-Statistik) > Server-seitig gerendertes Admin-Statistik-Dashboard: 4 KPI-Cards (Anfragen, bestätigte Mieten, Miettage, Umsatz), Umsatz-Balkendiagramm (letzte 6 Monate, CSS-basiert), Maschinenauslastungs-Tabelle (Top-Ressourcen), integrierter Gantt-Kalender (±3 Monate). Vollständig ohne externe Chart-Bibliothek. --- ## Enthaltene Dateien | Ziel im neuen Projekt | Inhalt | |---|---| | `app/admin/statistik/page.tsx` | Server Component: KPI-Cards + Umsatzdiagramm + Gantt | | `app/admin/statistik/GanttKalender.tsx` | Wiederverwendbare Gantt-Komponente (auch in Modul 04) | | `app/api/admin/statistik/route.ts` | GET: Aggregierte KPI-Daten (requireAdmin) | --- ## Voraussetzungen Keine zusätzlichen npm-Pakete. Benötigt: - `lib/supabase.ts` (Service Client) - `lib/admin-auth.ts` (Modul 02: `requireAdmin`) - Modul 04 (Reservation System) – Tabellen `anfragen`, `anfragen_positionen` --- ## Umgebungsvariablen Keine zusätzlichen. --- ## Datenbank Liest aus bestehenden Tabellen (kein Schema-Change nötig): - `anfragen` – Anzahl, Status-Verteilung, Zeiträume - `anfragen_positionen` – Tagessätze, Miettage, Umsatz - `anfrage_status_audit` – optional für Audit-Timeline --- ## Einbindung Schritt für Schritt ### 1. Dateien kopieren ### 2. Admin-Navigation ergänzen ```tsx Statistik ``` ### 3. Statistik-API anpassen (`app/api/admin/statistik/route.ts`) Die API aggregiert aktuell folgende Felder: ```ts { kpis: { anfragen_gesamt: number, bestaetigt: number, umsatz_gesamt: number, miettage_gesamt: number }, monatsUmsatz: Array<{ monat: string, umsatz: number, anzahl: number }>, // 6 Monate maschinenAuslastung: Array<{ name: string, tage: number, umsatz: number }>, planDaten: PlanPosition[] // für GanttKalender } ``` Abfrage anpassen wenn Tabellen-/Feldnamen abweichen. ### 4. Seite an eigenes Design anpassen (`app/admin/statistik/page.tsx`) - KPI-Cards: Farben, Icons, Bezeichnungen - Diagramm: Anzahl Monate, Skala - Auslastungs-Tabelle: Spalten ### 5. GanttKalender-Props ```tsx ``` `PlanPosition` Interface: ```ts interface PlanPosition { id: string; anfrage_id: string; maschine_name: string; maschine_kategorie: string; mietbeginn: string; // "YYYY-MM-DD" mietende: string; // "YYYY-MM-DD" gesamt_tage: number; tagessatz: number | null; anfrage_status: string; // "offen"|"bestaetigt"|"abgelehnt"|"abgeschlossen" firma: string | null; } ``` --- ## Anpassungspunkte | Was | Wo | |---|---| | KPI-Bezeichnungen | `app/admin/statistik/page.tsx` → KPI-Card Labels | | Umsatz-Formel (Tagessatz × Tage) | `app/api/admin/statistik/route.ts` → `umsatz_calc` | | Nur bestätigte Anfragen zählen | `app/api/admin/statistik/route.ts` → `status = 'bestaetigt'` Filter | | Diagramm Zeitraum (6 Monate) | `app/api/admin/statistik/route.ts` → `INTERVAL '6 months'` | | Gantt Zeitraum | `app/admin/statistik/page.tsx` → `startISO` + `tageGesamt` | | Status-Farben im Gantt | `app/admin/statistik/GanttKalender.tsx` → `STATUS_COLORS` | --- ## Integrations-Prompt Kopiere diesen Prompt in eine neue KI-Konversation, nachdem du die `files/` in dein Projekt kopiert hast. Ersetze alle `[PLATZHALTER]`. ``` Ich integriere das KPI-Dashboard (Statistik-Übersicht mit Gantt) in mein Next.js/Supabase-Projekt. PROJEKT-KONTEXT: - Modul 02 (Admin-Auth) ist bereits integriert (requireAdmin verfügbar) - Modul 04 (Reservierungssystem) ist bereits integriert (Tabellen: anfragen, anfragen_positionen, anfrage_status_audit) - Ressourcen-Bezeichnung: [MASCHINEN/ARTIKEL/...] - Währung: [EUR / CHF / ...] BEREITS KOPIERTE DATEIEN (aus modules/07-kpi-dashboard/files/): - app/admin/statistik/page.tsx - app/admin/statistik/GanttKalender.tsx - app/api/admin/statistik/route.ts AUFGABEN – führe sie der Reihe nach aus: 1. API ANPASSEN: Lies app/api/admin/statistik/route.ts vollständig. Prüfe ob alle referenzierten Tabellen-/Feldnamen mit den tatsächlichen übereinstimmen: - Tabelle "anfragen" → Status-Felder, Datum-Felder - Tabelle "anfragen_positionen" → Preis-Felder (tagessatz, gesamt_preis) Passe ggf. Feldnamen in den SQL-Abfragen an. 2. KPI-TEXTE ANPASSEN: Lies app/admin/statistik/page.tsx. Passe folgende Labels an die eigene Domäne an: - "Mietanfragen" → "[ANFRAGEN_BEZEICHNUNG]" - "Bestätigte Mieten" → "[BESTÄTIGTE_BEZEICHNUNG]" - "Miettage" → "[ZEITEINHEIT_BEZEICHNUNG]" - "Umsatz" → "Umsatz ([WÄHRUNG])" Ersetze alle Vorkommen von "Mietpark Hahn" und "Maschine/Gerät" durch die eigenen Begriffe. 3. GANTT ANPASSEN: Lies app/admin/statistik/GanttKalender.tsx. Falls Modul 04 bereits mit angepassten Ressourcen-Bezeichnungen eingebunden wurde, prüfe ob die PlanPosition-Felder noch stimmen (maschine_name, maschine_kategorie). Passe den Tooltip-Text an (aktuell: "Firma – Maschine – X Tage"). 4. ADMIN-NAV ergänzen: Füge einen Link zu /admin/statistik hinzu. 5. GANTT ZEITRAUM konfigurieren: Lies app/admin/statistik/page.tsx. Passe startISO und tageGesamt an die gewünschte Standardansicht an: - Kurzfristiger Betrieb (< 1 Monat): tageGesamt=60 - Mittelfristiger Betrieb: tageGesamt=180 (Standard) - Langzeitplanung: tageGesamt=365 6. TEST: a) Dev-Server starten, /admin/statistik aufrufen b) KPI-Cards zeigen Zahlen aus anfragen-Tabelle c) Umsatzdiagramm zeigt letzte 6 Monate d) Gantt-Kalender zeigt bestätigte Anfragen als Balken e) Balken anklicken → Weiterleitung zu /admin/anfragen/[id] Lies jede Datei vor dem Bearbeiten. Melde wenn alle Schritte abgeschlossen sind. ```