Gutschriften Phase 1: Backend (Modell, Nummernkreis, CRUD, USt-Rechnung)

Neues Feature Gutschriftsverwaltung (Subventionen am Vertrag):

- Modelle CreditNote + CreditNoteNumberRange + Enums (GELD/SACHWERT,
  PRIVAT/FIRMA, NETTO/BRUTTO) + Migration (IF NOT EXISTS, auf Dev
  angewandt).
- USt pro Gutschrift waehlbar (vatRelevant + Basis Netto/Brutto +
  Satz); Netto/USt/Brutto werden berechnet und getrennt gespeichert
  (ZUGFeRD-tauglich). Kundentyp Privat/Firma aus Kunde vorbelegt.
- Nummernkreis in Settings verwaltbar; Nummernvergabe transaktional
  mit SELECT ... FOR UPDATE (keine Doppelvergabe). Bsp GS-2026-0001.
- Service/Controller/Routes: GET/POST /contracts/:id/credit-notes,
  GET .../defaults, GET/PUT/DELETE /credit-notes/:id,
  GET/PUT /credit-notes/number-range. Portal-Token geblockt (interner
  Bereich), CREATE/UPDATE/DELETE auditiert.

Verifiziert: USt-Rechnung (200 netto->238, 200 brutto->168,07+31,93)
und fortlaufende Nummernvergabe.

Phase 2 (Vertrag-UI + Beleg-Upload + Nummernkreis-UI) und Phase 3
(PDF + ZUGFeRD) folgen.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-08-06 09:03:42 +02:00
co-authored by Claude Opus 4.8
parent 3bbe262039
commit f1c37a7d25
9 changed files with 657 additions and 0 deletions
+24
View File
@@ -97,6 +97,30 @@ isolierte Instanz (keine Multi-Tenancy im Code), Provisioning + Abrechnung
## ✅ Erledigt
- [~] **🧾 Gutschriftsverwaltung (Subventionen am Vertrag) Phase 1: Backend** (2026-08-06)
- Use-Case: zu einem Vertrag kann eine Subvention gewährt werden **Geld**
(Überweisung, EUR) oder **Sachwert** (Smartphone/Elektro …, Textfeld).
Betrag, Datum (änderbar), Ort/Unterschrift, bei Sachwert „Ware erhalten",
bei Geld Überweisungsbeleg (Upload, Phase 2).
- **USt pro Gutschrift wählbar** (`vatRelevant` + Basis NETTO/BRUTTO +
`vatRate`) → Netto/USt/Brutto werden berechnet & getrennt gespeichert
(ZUGFeRD-tauglich). `PRIVAT`/`FIRMA` aus Kunde vorbelegt. Verifiziert:
nicht-USt 200→200/0/200; NETTO 200→200/38/238; BRUTTO 200→168,07/31,93/200.
- **Nummernkreis** (`CreditNoteNumberRange`, Einzel-Zeile, in Settings
verwaltbar): Präfix/Jahr/Separator/Padding/Startzähler/Jahres-Reset.
Nummernvergabe transaktional mit `SELECT … FOR UPDATE` (keine Doppel-
vergabe). Beispiel `GS-2026-0001`.
- Neu: Model `CreditNote` + `CreditNoteNumberRange` + Enums + Migration
(IF NOT EXISTS, auf Dev angewandt). Service/Controller/Routes:
`GET/POST /contracts/:id/credit-notes`, `GET .../defaults`,
`GET/PUT/DELETE /credit-notes/:id`, `GET/PUT /credit-notes/number-range`.
Portal-Token explizit geblockt (interner Bereich), CREATE/UPDATE/DELETE
auditiert.
- **Offen:** Phase 2 (Vertrag-UI + Beleg-Upload + Nummernkreis-UI),
Phase 3 (PDF + ZUGFeRD/PDF-A3, muss gegen ZUGFeRD-Validator geprüft
werden). USt-Einordnung (Vermittlung vs. Abschlussbonus) mit Steuerberater
klären Modell deckt beide über `vatRelevant` ab.
- [x] **📄➕ Vertrag kopieren (neuer eigenständiger Vertrag aus Vorlage)** (2026-08-03)
- „Kopieren"-Button in der Vertragsansicht (`contracts:create`) → öffnet das
Neu-Formular unter `/contracts/new?copyFrom=<id>&customerId=<cid>` mit