Antrag
Leistung {r.services}
Bisher bei {r.provider}
Domain {r.domain ? {r.domain} : '–'}
Rechnung {formatCents(r.invoiceAmountCents)} für {r.billingMonths} Monat{r.billingMonths === 1 ? '' : 'e'}
Bezahlt bis {fmtDate(r.paidUntil)}
Antwort an {r.email}
Bestätigt Angaben und Bedingungen (Stand {r.conditionsVersion || '–'}) am {fmtDateTime(r.consentAt)}
Grund / Nachricht
{r.message}
Nachweise
{r.files.length ? (
{r.files.map((f) => (
{f.name} ({fmtBytes(f.size)}, {fmtDate(f.uploadedAt)})
))}
) :
Keine Nachweise (mehr) vorhanden.
}
Verlauf
{r.history.map((h, i) => (
{historyLabel(h.type)} {fmtDateTime(h.at)}{staffOf(h.by)}
{h.text &&
{h.text}
}
{(h.files || []).length > 0 &&
Dateien: {h.files.map((fid) => fileNames.get(fid) || 'gelöscht').join(', ')}
}
))}
Kunde & Vertrag
Kunde {c.name || c.companyName}{c.code ? ` · Kd.-Nr. ${c.code}` : ''}
E-Mail {c.email || '–'}
Abo
{s ? <>{productLabelOf(s.productKey)} {s.status} Zusatzspeicher: {storageLabel(s.storageUnits)} > : kein Abo }
{s && (
<>
Leistungsbeginn {fmtDate(s.serviceStart)}
Nächste Abbuchung {s.active ? fmtDate(s.currentPeriodEnd) : '–'}
{s.cancelAt && <>Gekündigt zum {fmtDate(s.cancelAt)} >}
Stripe-Guthaben {s.creditBalanceCents == null ? '–' : formatCents(s.creditBalanceCents)}
>
)}
{s?.stripeUrl && In Stripe öffnen }
{d.otherRequests.length > 0 && (
<>
Weitere Anträge des Kunden
>
)}
Automatische Prüfung
{d.autoChecks.map((k) => (
{k.status === 'ok' ? '✓' : k.status === 'warn' ? '!' : 'i'} {k.label}{k.detail && <>{k.detail} >}
))}
{pending ? (
<>
Prüfung durch dich
{d.requiredChecks.map((k) => (
setForm({ ...form, checks: { ...form.checks, [k.key]: e.target.checked } })} /> {k.label}
))}
Berechnung
Rechnungsbetrag (€) setFigure('invoiceAmount', e.target.value)} />
Rechnung gilt für
setFigure('billingMonths', Number(e.target.value))}>
{BILLING_MONTHS.map((m) => {m} Monat{m === 1 ? '' : 'e'} )}
Bezahlt bis setFigure('paidUntil', e.target.value)} />
Übernahme ab setFigure('takeoverFrom', e.target.value)} />
{calcText}
Werte weichen von der Rechnung ab? Hier korrigieren – die Korrektur wird beim Genehmigen im Verlauf vermerkt. „Übernahme ab“ ist der Leistungsbeginn des Abos.
Gutschrift (€)
{ amountTouched.current = true; setForm({ ...form, amount: e.target.value }) }} />
Nachricht an den Kunden (bei Rückfrage und Ablehnung Pflicht, beim Genehmigen optional)
decide('approve')} disabled={!canApprove}>Genehmigen & gutschreiben
decide('question')} disabled={busy}>Rückfrage senden
decide('reject')} disabled={busy}>Ablehnen
{busy && }
Genehmigen geht, sobald alle Punkte abgehakt sind. Der Kunde bekommt jede Entscheidung per E-Mail.
{!s?.active && Achtung: Der Kunde hat kein laufendes Abo. }
>
) : (
<>
Entscheidung
{r.status === 'genehmigt' ? (
<>
Genehmigt {fmtDateTime(r.decidedAt)} · {r.decidedBy}
Gutschrift {formatCents(r.amountCents)}
Berechnung {r.calculation}
Geprüft {r.checks ? `alle Punkte abgehakt (${r.checks.by || ''})` : '–'}
{r.decisionNote && <>Nachricht {r.decisionNote} >}
Verrechnung
{r.appliedAt ? <>Stripe-Guthaben gebucht am {fmtDateTime(r.appliedAt)} ({r.stripeBalanceTransactionId}) > : noch nicht in Stripe gebucht }
{!r.appliedAt &&
Jetzt in Stripe gutschreiben
}
>
) : (
Abgelehnt {fmtDateTime(r.decidedAt)} · {r.decidedBy}
Begründung {r.decisionNote}
)}
>
)}
{actionError &&
{actionError}
}