F02 Fachliche Rechnungsidentität und Duplikatschutz korrigieren
Frühere Version vom 2026-07-16T18:39:13.335375+02:00 · zur aktuellen Fassung
Fachliche Rechnungsidentität und Duplikatschutz korrigieren
Finding: F02 Priorität: P0 Status: OFFEN Stand: 2026-07-16
Problembeschreibung
- shouldProcess prüft nur sourceId/status (IngestInvoicesUseCase.php:203).
- SourceInvoice.rechnungsschluessel enthält sourceId (SourceInvoice.php:37); gleiche Rechnung unter neuer URL gilt als neu.
- Nummer, Lieferant, Hash und Voucherlist sind keine zwingenden Schranken; State-Löschung entfernt den Schutz.
Ziel
Dieselbe wirtschaftliche Rechnung wird unabhängig von URL, Dateiname, State-Reset und Parallelität genau einmal verarbeitet.
Aufgabe
- Kanonischen Schlüssel aus Lieferant, echter Nummer und Datum definieren.
- SHA-256 und Konfliktregeln ergänzen.
- Lokalen Index und Voucherlist vor Posting prüfen; Bestand ohne Reposting migrieren.
Scope
- In Scope: alle unter Code Blast genannten Komponenten, Daten, Verträge und Tests.
- Out of Scope: neue Features und produktive externe Mutation ohne separate Freigabe.
Harte Spezifikation
- MUST: Identität URL-/Pfad-unabhängig.
- MUST: gleicher Hash/neue URL wird nicht gepostet.
- MUST: gleiche Nummer/anderer Hash blockiert.
- MUST: leerer Local-State plus Remote-Beleg erzeugt 0 POSTs.
Harte Quality Gateways
- Vollständige URL/Hash/Nummern-Matrix grün.
- Zwei Parallelworker erzeugen einen Intent.
- Realer Beleg wird RF183233049809, nicht 148077689, zugeordnet.
- Global: PHPStan Level 8 und PHPUnit liefern 0 Fehler; kein Ignore oder Baseline.
Code Blast
- Direkt: SourceInvoice, InvoiceRecord/State, Ingest, State-Adapter, LexofficePort.
- Datenmigration; lesender Voucherlist-Abgleich.
Code-Impact-Analyse
- Schützt nach Portalwechsel/Reset.
- Konflikte werden sichtbar und benötigen Operator-Workflow.
Risikoanalyse
| Risiko | Eintritt | Schaden | |---|---|---| | Duplikat nach URL-Wechsel | hoch | kritisch | | Falsch-positive Dublette | mittel | hoch |
Strategie zur Risikonullierung
- Prevent: Schlüssel plus Hash.
- Detect: lokal/remote.
- Contain: Quarantäne.
- Recover: auditierte Entscheidung.
Abschlussnachweis
Erledigt erst, wenn alle MUST-Spezifikationen implementiert, alle Gateways mit unveränderlicher Evidenz grün und Restrisiken technisch ausgeschlossen oder ausdrücklich fachlich akzeptiert sind.