Gutschrift: separater Lieferschein-Nummernkreis (GoBD, luecken-frei)

Pentester R142: Uebergang Geld->betragsloser Sachwert setzte die schon
vergebene Gutschriftsnummer auf null -> Luecke in der GS-Serie.

Loesung: betragsloser Sachwert = Lieferschein mit eigener
Lieferscheinnummer aus separatem Nummernkreis.

- Schema: CreditNote.deliveryNoteNumber (nullbar, unique) + neues Model
  DeliveryNoteNumberRange (Default-Praefix 'LS-') + Migration.
- deliveryNoteNumberRange.service (mirror, eigener Zaehler, FOR UPDATE).
- Nummern lazy pro Serie, NIE freigeben: Uebergaenge behalten die
  jeweils vergebene Nummer der anderen Serie reserviert -> kein
  Doppelverbrauch, keine Luecke. effectiveNumber() liefert je nach Typ
  die passende (LS/GS) fuer Anzeige/PDF/Audit.
- Endpunkte GET/PUT /credit-notes/delivery-note-number-range; Settings-
  Seite verwaltet jetzt beide Nummernkreise. PDF-Titel 'Sachwert-
  Uebergabe', Dateiname lieferschein-...
- Frontend: Typ + displayNumber in Liste/Modal.

Verifiziert: Sachwert 0 -> LS-Nr, GS-Zaehler unberuehrt; Geld -> GS-Nr;
Uebergaenge behalten beide Nummern (kein Neuverbrauch, keine Luecke).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-08-12 08:47:49 +02:00
co-authored by Claude Opus 4.8
parent 79f6f3e629
commit 5e606df49e
13 changed files with 360 additions and 94 deletions
+17
View File
@@ -97,6 +97,23 @@ isolierte Instanz (keine Multi-Tenancy im Code), Provisioning + Abrechnung
## ✅ Erledigt
- [x] **📦 Lieferschein-Nummernkreis für betragslose Sachwerte (GoBD)** (2026-08-12)
- Pentester-Hinweis R142: Beim Übergang Geld→betragsloser Sachwert wurde die
schon vergebene Gutschriftsnummer auf null gesetzt → **Lücke** in der GS-Serie.
- Lösung (User): betragsloser Sachwert = **Lieferschein** mit **eigener
Lieferscheinnummer** aus **separatem Nummernkreis** (`DeliveryNoteNumberRange`,
Default-Präfix „LS-"). `CreditNote.deliveryNoteNumber` (nullbar, unique) +
Migration.
- **Gap-frei:** Nummern werden lazy pro Serie vergeben und **nie wieder
freigegeben**. Übergänge (Geld↔betragsloser Sachwert) behalten die jeweils
schon vergebene Nummer der anderen Serie reserviert am Beleg → kein
Doppelverbrauch, keine Lücke. Angezeigt/erzeugt wird via `effectiveNumber`
je nach aktuellem Typ die passende (LS bzw. GS).
- Settings-Seite verwaltet jetzt **beide** Nummernkreise (Gutschrift +
Lieferschein); neue Endpunkte `GET/PUT /credit-notes/delivery-note-number-
range`. PDF-Titel „Sachwert-Übergabe", Dateiname `lieferschein-…`.
- Verifiziert: Sachwert 0 → LS-Nr, GS-Zähler unberührt; Geld → GS-Nr;
Übergänge behalten Nummern (kein Neuverbrauch).
- [x] **🔐 Portal-Passwort: Reveal/Send prüft Konsistenz (kein „falsches" PW)** (2026-08-11)
- Pentester-Hinweis: Bei einem Kunden waren bcrypt-Hash (Login) und
verschlüsseltes Reveal-Feld out-of-sync → Support hätte ein Passwort