import Link from "next/link"; import { ContentHeader } from "@/components/layout/ContentHeader"; import { AblaufBadge, EinkaufBadge, KeineMeldungBadge, VerkaufBadge } from "@/components/ui/Badges"; import { Callout, ProgressBar } from "@/components/ui/Callout"; import { Card } from "@/components/ui/Card"; import { CopyableCode } from "@/components/ui/CopyableCode"; import { SmallBox } from "@/components/ui/SmallBox"; import { TodoList, type Aufgabe } from "@/components/ui/TodoList"; import { formatDatum, formatEuro } from "@/lib/format"; import { HEUTE } from "@/mock/data"; import { laufzeitZuAblauf, dashboardKennzahlen, getKunde, hostMeldetNicht, hostsNachAblauf, nichtZugeordneteHosts, offeneRechnungsLaufzeiten, rechnungsFortschrittProKunde, } from "@/mock/queries"; export const metadata = { title: "Dashboard" }; function aufgabenliste(): Aufgabe[] { return offeneRechnungsLaufzeiten().flatMap((laufzeit) => { const host = hostsNachAblauf().find((h) => h.id === laufzeit.hostId); const kunde = getKunde(host?.kundeId ?? null); const basis = `${host?.hostname ?? "?"} · ${kunde?.name ?? "Nicht zugeordnet"}`; const aufgaben: Aufgabe[] = []; if (laufzeit.einkauf && !laufzeit.einkauf.bezahlt) { aufgaben.push({ id: `${laufzeit.id}-einkauf`, titel: `Proxmox-Rechnung ${laufzeit.einkauf.nummer} bezahlen`, detail: `${basis} · ${formatEuro(laufzeit.einkauf.nettoBetrag)} netto · fällig am ${formatDatum( laufzeit.einkauf.faelligAm, )}`, dringlichkeit: "gefahr", badgeText: "Einkauf", href: `/hosts/${laufzeit.hostId}`, }); } if (laufzeit.einkauf && (!laufzeit.verkauf || !laufzeit.verkauf.erstellt)) { aufgaben.push({ id: `${laufzeit.id}-verkauf`, titel: "Kundenrechnung erstellen", detail: `${basis} · Laufzeit ${formatDatum(laufzeit.start)} – ${formatDatum(laufzeit.ende)}`, dringlichkeit: "warnung", badgeText: "Verkauf", href: `/rechnungen`, }); } return aufgaben; }); } export default function DashboardSeite() { const kennzahlen = dashboardKennzahlen(); const ohneKunde = nichtZugeordneteHosts(); const fortschritt = rechnungsFortschrittProKunde(); const aufgaben = aufgabenliste(); const nichtZugeordnetAufgaben: Aufgabe[] = ohneKunde.map((host) => ({ id: `zuweisen-${host.id}`, titel: `${host.hostname} einem Kunden zuweisen`, detail: `Server-ID ${host.serverId} · seit ${formatDatum(host.letzterReport)} gemeldet`, dringlichkeit: "info", badgeText: "Zuweisen", href: "/hosts/nicht-zugeordnet", })); return ( <>
{ohneKunde.length > 0 ? ( Jetzt zuweisen } > Neu registrierte Hosts erscheinen hier, bis sie einem Kunden zugewiesen sind:{" "} {ohneKunde.map((h) => h.hostname).join(", ")} ) : null}
{hostsNachAblauf().map((host) => { const kunde = getKunde(host.kundeId); const laufzeit = laufzeitZuAblauf(host); return ( ); })}
Host Kunde Key Ablauf Proxmox Kundenrechnung
{host.hostname} {hostMeldetNicht(host) ? : null} {kunde ? ( {kunde.name} ) : ( Nicht zugeordnet )}
{aufgaben.length + nichtZugeordnetAufgaben.length} } >
{fortschritt.map((eintrag) => (
{eintrag.kunde.name} {eintrag.erledigt} von {eintrag.gesamt} Punkten erledigt
))}