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
@@ -77,6 +77,7 @@ export default function CustomerForm() {
phone: data.phone || '',
mobile: data.mobile || '',
taxNumber: data.taxNumber || '',
vatExempt: data.vatExempt === true || (data.vatExempt as any) === 'true',
commercialRegisterNumber: data.commercialRegisterNumber || '',
notes: data.notes || '',
birthPlace: data.birthPlace || '',
@@ -229,6 +230,20 @@ export default function CustomerForm() {
placeholder="z.B. HRB 12345"
/>
</div>
<label className="mt-4 flex items-start gap-2 text-sm">
<input
type="checkbox"
{...register('vatExempt')}
className="mt-0.5 h-4 w-4 rounded border-gray-300 text-blue-600 focus:ring-blue-500"
/>
<span>
<span className="font-medium">Kleinunternehmer / USt-befreit (§19 UStG)</span>
<span className="block text-gray-500">
Wird bei Gutschriften wie ein Privatkunde behandelt (keine USt-Vorbelegung).
Ändert nur neue Gutschriften bereits erstellte bleiben unberührt.
</span>
</span>
</label>
{isEdit && (
<p className="mt-4 text-sm text-gray-500">
Dokumente (Gewerbeanmeldung, Handelsregisterauszug) können nach dem Speichern in der Kundendetailansicht hochgeladen werden.
+1
View File
@@ -109,6 +109,7 @@ export interface Customer {
phone?: string;
mobile?: string;
taxNumber?: string;
vatExempt?: boolean;
businessRegistrationPath?: string;
commercialRegisterPath?: string;
commercialRegisterNumber?: string;