'use client'; import { useEffect, useState } from 'react'; import Link from 'next/link'; import { useRouter } from 'next/navigation'; import { api, errMsg } from '@/lib/api'; import { Alert, Empty, eur, fmt } from '@/components/ui'; interface OverdueInv { id: string; number: string | null; orgName: string; customerNumber: string; dueDate: string | null; totalGrossCents: number } interface DueContract { id: string; number: string; orgId: string; orgName: string; customerNumber: string; productName: string | null; lastInvoicedAt: string | null; dueSince: string; lastGrossCents: number | null } interface Data { overdueInvoices: OverdueInv[]; dueContracts: DueContract[] } export default function Faellig() { const r = useRouter(); const [d, setD] = useState(null); const [err, setErr] = useState(''); const [busy, setBusy] = useState(''); useEffect(() => { api('GET', '/invoices/reminders').then(setD).catch((e) => setErr(errMsg(e))); }, []); async function createFor(c: DueContract) { setErr(''); setBusy(c.id); try { const inv = await api<{ id: string }>('POST', '/invoices', { orgId: c.orgId }); r.push(`/rechnungen/${inv.id}?fromContract=${c.id}`); } catch (x) { setErr(errMsg(x)); setBusy(''); } } return (<>

Fällig

← Rechnungen

Überfällige, bereits ausgestellte Rechnungen und aktive Verträge, bei denen die letzte Rechnung länger zurückliegt als ihre Verlängerungslaufzeit.

{err && {err}} {d === null ?

Wird geladen …

: (<>

Überfällige Rechnungen ({d.overdueInvoices.length})

{d.overdueInvoices.length === 0 ? :
{d.overdueInvoices.map((i) => ())}
Nr.KundeFällig seitBetrag
{i.number}{i.orgName} ({i.customerNumber}) {i.dueDate ? fmt(i.dueDate) : '–'}{eur(i.totalGrossCents)}
}

Verträge ohne aktuelle Rechnung ({d.dueContracts.length})

{d.dueContracts.length === 0 ? :
{d.dueContracts.map((c) => ())}
VertragKundeProduktZuletzt berechnetFällig seitLetzter Betrag
{c.number}{c.orgName} ({c.customerNumber}){c.productName ?? '–'} {c.lastInvoicedAt ? fmt(c.lastInvoicedAt) : nie}{fmt(c.dueSince)} {c.lastGrossCents === null ? '–' : eur(c.lastGrossCents)}
}

Grundlage ist die Verlängerungslaufzeit des Vertrags, nicht das Abrechnungsintervall des Produkts. Bei manuell abweichender Abrechnung bitte selbst prüfen.

)} ); }