Gutschriften Phase 2a: Kleinunternehmer-Flag am Kunden + USt-Default

Kunden-Feld vatExempt (Kleinunternehmer/USt-befreit §19) + Migration
(ADD COLUMN IF NOT EXISTS). Checkbox im Kundenformular nur fuer
Firmenkunden.

Gutschrift-Vorbelegung vatRelevant wird aus dem Kunden abgeleitet:
Firmenkunde ohne USt-Befreiung -> USt-relevant an (Netto), sonst aus
(wie Privat). Jede Gutschrift speichert ihren eigenen Snapshot, ein
spaeterer Statuswechsel des Kunden aendert bestehende Gutschriften
nicht.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-08-06 10:10:13 +02:00
co-authored by Claude Opus 4.8
parent f1c37a7d25
commit 3580c51cb1
9 changed files with 54 additions and 8 deletions
+17 -4
View File
@@ -132,13 +132,26 @@ export async function getCreditNoteById(id: number) {
return prisma.creditNote.findUnique({ where: { id } });
}
// Ermittelt den Default-Kundentyp aus dem Vertrag (Firma vs. Privat).
export async function getDefaultCustomerType(contractId: number): Promise<CreditNoteCustomerType> {
// Ermittelt die Formular-Vorbelegung aus dem Kunden:
// - customerType: Firma vs. Privat (aus Kunde.type)
// - vatRelevant : Default nur bei Firmenkunde OHNE USt-Befreiung
// (Kleinunternehmer §19 → wie Privat, keine USt-Vorbelegung).
// WICHTIG: Das ist nur die Vorbelegung. Jede angelegte Gutschrift speichert
// ihren eigenen Snapshot; ein späterer Statuswechsel des Kunden ändert
// bestehende Gutschriften nicht.
export async function getCreditNoteDefaults(
contractId: number,
): Promise<{ customerType: CreditNoteCustomerType; vatRelevant: boolean }> {
const contract = await prisma.contract.findUnique({
where: { id: contractId },
select: { customer: { select: { type: true } } },
select: { customer: { select: { type: true, vatExempt: true } } },
});
return contract?.customer?.type === 'BUSINESS' ? 'FIRMA' : 'PRIVAT';
const isBusiness = contract?.customer?.type === 'BUSINESS';
const vatExempt = !!contract?.customer?.vatExempt;
return {
customerType: isBusiness ? 'FIRMA' : 'PRIVAT',
vatRelevant: isBusiness && !vatExempt,
};
}
export async function createCreditNote(
+2
View File
@@ -146,6 +146,7 @@ export async function createCustomer(data: {
phone?: string;
mobile?: string;
taxNumber?: string;
vatExempt?: boolean;
businessRegistration?: string;
commercialRegister?: string;
notes?: string;
@@ -173,6 +174,7 @@ export async function updateCustomer(
phone?: string;
mobile?: string;
taxNumber?: string;
vatExempt?: boolean;
businessRegistration?: string;
commercialRegister?: string;
notes?: string;