import Link from "next/link"; import { notFound } from "next/navigation"; import { ContentHeader } from "@/components/layout/ContentHeader"; import { KundenrechnungFormular, ProxmoxRechnungFormular } from "@/components/rechnungen/RechnungsFormulare"; import { Badge, EinkaufBadge, VerkaufBadge } from "@/components/ui/Badges"; import { Callout } from "@/components/ui/Callout"; import { Card } from "@/components/ui/Card"; import { CopyableCode } from "@/components/ui/CopyableCode"; import { PRODUKT_TEXT } from "@/lib/anzeige"; import { formatDatum, formatEuro } from "@/lib/format"; import { laufzeitBestaetigenAktion, laufzeitVerwerfenAktion } from "@/server/actions/rechnungen"; import { einstellungen, faelligkeitsVorschlag } from "@/server/einstellungen"; import { laufzeitDetail } from "@/server/queries/rechnungen"; export async function generateMetadata({ params }: { params: Promise<{ id: string }> }) { const { id } = await params; const laufzeit = await laufzeitDetail(id); return { title: laufzeit ? `Laufzeit ${laufzeit.host.hostname}` : "Laufzeit" }; } export default async function LaufzeitSeite({ params }: { params: Promise<{ id: string }> }) { const { id } = await params; const laufzeit = await laufzeitDetail(id); if (!laufzeit) notFound(); const einkauf = laufzeit.proxmoxPosition?.rechnung ?? null; const verkauf = laufzeit.kundenPosition?.rechnung ?? null; const einkaufBetrag = laufzeit.proxmoxPosition ? Number(laufzeit.proxmoxPosition.nettoBetrag) : null; const verkaufBetrag = laufzeit.kundenPosition ? Number(laufzeit.kundenPosition.nettoBetrag) : null; const marge = einkaufBetrag !== null && verkaufBetrag !== null ? verkaufBetrag - einkaufBetrag : null; // Vorgaben aus den Einstellungen füllen leere Felder vor (#025). const [vorgaben, faelligVorschlag] = await Promise.all([einstellungen(), faelligkeitsVorschlag()]); const verkaufVorschlag = verkaufBetrag ?? (einkaufBetrag === null ? null : Math.round(einkaufBetrag * (1 + vorgaben.margeProzent / 100) * 100) / 100); const zeitraum = `${formatDatum(laufzeit.start)} – ${formatDatum(laufzeit.ende)}`; return ( <> Vorschlag : null} />
{laufzeit.status === "VORSCHLAG" ? (
} > Der Host hat ein neues Ablaufdatum gemeldet. Mit dem Erfassen einer Proxmox-Rechnung gilt die Laufzeit automatisch als bestätigt. ) : null}
Host
{laufzeit.host.hostname}
Kunde
{laufzeit.host.kunde ? ( {laufzeit.host.kunde.name} ) : ( Nicht zugeordnet )}
Produkt
{PRODUKT_TEXT[laufzeit.host.produkt]}
Key
Beginn
{formatDatum(laufzeit.start)}
Ende
{formatDatum(laufzeit.ende)}

Einkauf netto
{formatEuro(einkaufBetrag)}
Verkauf netto
{formatEuro(verkaufBetrag)}
Marge
= 0 ? "pl-text-success" : "pl-text-danger"}`}> {marge === null ? "–" : formatEuro(marge)}
{einkauf && einkauf.positionen.length > 1 ? (

Die Proxmox-Rechnung {einkauf.nummer} deckt mehrere Laufzeiten ab:

    {einkauf.positionen.map((position) => (
  • {position.laufzeit ? ( {position.laufzeit.host.hostname} ) : ( position.bezeichnung )}{" "} · {formatEuro(Number(position.nettoBetrag))}
  • ))}
) : null}
} > } >
); }