6e6cb0dc8d
- doc/architecture.md: arc42-Detaildokument mit Mermaid-Diagrammen (Bausteinsicht, Klassendiagramm, Statusmodell, 5 Sequenzdiagramme), Speicherkonzept, DEC-01..19-Entscheidungen mit Trade-offs - doc/requirements/: 7 Features als Gherkin-Szenarien (TDD-Grundlage) mit Traceability-Tabellen Szenario <-> Stdlib-Testname - doc/openapi.yaml: API-Vertrag fuer alle 9 Endpunkte (Quelle der Wahrheit) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
49 lines
2.3 KiB
Markdown
49 lines
2.3 KiB
Markdown
# Feature: Finale Ablage in Jahresordnern
|
|
|
|
Als Nutzer möchte ich, dass verarbeitete Dokumente unverändert und nachvollziehbar benannt
|
|
in einer Jahresstruktur abgelegt werden und über die UUID im Dateinamen jederzeit
|
|
ihrem Kontext in der Datenbank zuzuordnen sind.
|
|
|
|
```gherkin
|
|
Funktionalität: Finale Ablage
|
|
|
|
Szenario: Verarbeitetes Dokument landet im Jahresordner
|
|
Angenommen ein am 2026-07-12 importiertes Dokument
|
|
Wenn die File-Stage läuft
|
|
Dann liegt die Datei unter archive/2026/
|
|
Und ein Event "DocumentFiled" mit dem relativen archive_path wird aufgezeichnet
|
|
Und die Datei liegt nicht mehr im Staging
|
|
|
|
Szenario: Dateiname enthält UUID und optional den Importzeitstempel
|
|
Angenommen die Konfiguration filename_timestamp=true
|
|
Wenn ein Dokument "Rechnung Stadtwerke.pdf" abgelegt wird
|
|
Dann entspricht der Dateiname dem Muster {JJJJMMTT-HHMMSS}_rechnung-stadtwerke_{uuid}.pdf
|
|
Und bei filename_timestamp=false entfällt nur das Zeitstempel-Präfix
|
|
|
|
Szenario: Jahresordner folgt dem Importzeitpunkt
|
|
Angenommen ein Dokument mit LLM-erkanntem doc_date "2019-03-01", importiert 2026
|
|
Wenn es abgelegt wird
|
|
Dann liegt es in archive/2026/ (Importjahr, nicht Dokumentjahr)
|
|
|
|
Szenario: Ablage über Volume-Grenzen ist atomar sicher
|
|
Angenommen Staging und Archiv liegen auf unterschiedlichen Dateisystemen
|
|
Wenn die File-Stage läuft
|
|
Dann wird per Kopie mit fsync und anschließendem Rename verschoben
|
|
Und zu keinem Zeitpunkt ist im Archiv eine unvollständige Datei sichtbar
|
|
|
|
Szenario: Datei ist über die API abrufbar
|
|
Angenommen ein abgelegtes Dokument
|
|
Wenn GET /v1/documents/{id}/file aufgerufen wird
|
|
Dann wird die unveränderte Originaldatei mit korrektem Content-Type gestreamt
|
|
```
|
|
|
|
## Traceability
|
|
|
|
| Szenario | Go-Test (Pakete `internal/storage`, `internal/pipeline`, `internal/api`) |
|
|
|---|---|
|
|
| Verarbeitetes Dokument landet im Jahresordner | `TestFileStage_MovesToYearFolder` |
|
|
| Dateiname enthält UUID und optional den Importzeitstempel | `TestFiler_FilenamePatternWithUUIDAndTimestamp` |
|
|
| Jahresordner folgt dem Importzeitpunkt | `TestFiler_YearFromImportDateNotDocDate` |
|
|
| Ablage über Volume-Grenzen ist atomar sicher | `TestStorage_CrossDeviceMoveIsAtomic` |
|
|
| Datei ist über die API abrufbar | `TestGetFile_StreamsOriginal` |
|