"use client"; import { useActionState, useState } from "react"; import { kundenrechnungSpeichern, proxmoxRechnungSpeichern } from "@/server/actions/rechnungen"; import type { AktionsErgebnis } from "@/server/actions/kunden"; import { formatEuro } from "@/lib/format"; const LEER: AktionsErgebnis = {}; function isoDatum(wert: string | null | undefined) { return wert ? wert.slice(0, 10) : ""; } function Meldung({ ergebnis }: { ergebnis: AktionsErgebnis }) { if (ergebnis.fehler) return
{ergebnis.fehler}
; if (ergebnis.erfolg) return
{ergebnis.erfolg}
; return null; } export interface ProxmoxWerte { nummer: string | null; datum: string | null; faelligAm: string | null; nettoBetrag: number | null; ustSatz: number; rabatt: number | null; zahlungsart: string | null; bezahlt: boolean; bezahltAm: string | null; anhangId: string | null; anhangName: string | null; } /** Proxmox-Rechnung (Einkauf). Gleiche Rechnungsnummer heißt: Position an derselben Rechnung. */ export function ProxmoxRechnungFormular({ laufzeitId, hostId, werte, }: { laufzeitId: string; hostId: string; werte: ProxmoxWerte; }) { const [ergebnis, aktion, laeuft] = useActionState(proxmoxRechnungSpeichern, LEER); // Listenpreis und Rabatt im Zustand, damit der tatsächlich gezahlte Betrag sofort danebensteht. const [netto, setNetto] = useState(werte.nettoBetrag === null ? "" : String(werte.nettoBetrag)); const [rabatt, setRabatt] = useState(werte.rabatt === null ? "" : String(werte.rabatt)); const zahl = (wert: string) => Number(wert.replace(",", ".")) || 0; const nettoZahl = zahl(netto); const rabattZahl = zahl(rabatt); return (
Eine bereits vorhandene Nummer ergänzt die Sammelrechnung um diese Laufzeit.
setNetto(e.target.value)} required />
Betrag dieser einen Laufzeit, wie er auf der Rechnung steht.
setRabatt(e.target.value)} />
{rabattZahl > 0 ? ( <> Gerechnet wird mit {formatEuro(nettoZahl - rabattZahl)}. ) : ( "Proxmox weist ihn je Key als eigene Zeile aus („Client Discount“)." )}
{werte.anhangId ? (
Hinterlegt:{" "} {werte.anhangName ?? "PDF ansehen"}
) : null}
); } export interface KundenWerte { erstellt: boolean; nummer: string | null; datum: string | null; nettoBetrag: number | null; ustSatz: number; bezahlt: boolean; bezahltAm: string | null; anhangId: string | null; anhangName: string | null; } /** Kundenrechnung (Verkauf). */ export function KundenrechnungFormular({ laufzeitId, hostId, werte, kundeVorhanden, }: { laufzeitId: string; hostId: string; werte: KundenWerte; kundeVorhanden: boolean; }) { const [ergebnis, aktion, laeuft] = useActionState(kundenrechnungSpeichern, LEER); if (!kundeVorhanden) { return (

Dieser Host ist keinem Kunden zugewiesen. Ohne Kunde lässt sich keine Kundenrechnung erfassen.

); } return (
Gleiche Nummer = eine Rechnung über mehrere Laufzeiten.
{werte.anhangId ? ( ) : null}
); }