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 (
<>
| Host | Kunde | Key | Ablauf | Proxmox | Kundenrechnung |
|---|---|---|---|---|---|
|
{host.hostname}
{hostMeldetNicht(host) ? |
{kunde ? ( {kunde.name} ) : ( Nicht zugeordnet )} |
|
|
|
|