Beim E2E-Smoke-Test schlug der Import mit 'Invalid cross-device link'
fehl: rename() funktioniert nicht ueber zwei getrennte Bind-Mounts.
Inbox und Uploads liegen jetzt unter einem einzigen /data-Mount.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Basis-Image docker.io/library/python:3.12.11-slim wie im Brief gepinnt
(Tag existiert auf Docker Hub, kein Patch-Bump nötig, verifiziert via
podman pull).
Zusätzlich finance/.containerignore ergänzt (.venv/, tests/, .env,
*.sqlite, inbox/, uploads/), da der Build-Kontext sonst echte
Bank-PDFs aus tests/fixtures/ sowie die ~150MB .venv/ in den
Container-Build einschleusen würde.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Kreditzuordnung im Szenario prueft jetzt response.ok, zeigt bei Fehlschlag
eine deutsche Meldung und macht die Checkbox-Aenderung rueckgaengig statt
stillschweigend neu zu laden. process_pdf faengt zusaetzlich zu ParserError
auch unerwartete Parser-Exceptions (z.B. pdfminer bei strukturell kaputten
PDFs) ab und legt dafuer ein sauberes error-Statement an statt eines
unbehandelten 500; die Datei bleibt dabei im Posteingang.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Ersetzt die Platzhalter-Routen aus Task 12 durch echte GUI-Seiten: /import
mit Drop-Zone (Fetch-Upload), gepollter Importliste (Status-Badges,
aufklappbarer Vorschau samt Saldo-/Duplikat-Anzeige, Uebernehmen/Verwerfen)
und /planung mit den vier Abschnitten Fixposten (inkl. Vorschlaege),
Einmalposten, Kredite (Tilgungsplan-Aufklapper) und Szenarien
(Kredit-Zuordnung, Modifikatoren, Durchrechnen mit Ergebnisanzeige).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- parse_german_amount: Fix non-breaking space (U+00A0) handling in second replace call
was: .replace(" ", "").replace(" ", "") → now: .replace(" ", "").replace("\xa0", "")
- parse_german_date: Catch ValueError from invalid calendar dates (e.g., 31.02.2026)
and raise ParserError with "Ungültiges Datum" message instead
- Add test for non-breaking space amount parsing
- Add test for invalid date error handling with pytest.raises
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- ParsedTransaction und ParsedStatement Datenklassen
- parse_german_amount(): German format number parsing (1.234,56 -> Decimal)
- parse_german_date(): DD.MM.YYYY date parsing with optional year
- detect_bank(): Recognize VR/HVB/DKB from text markers
- balance_difference(): Validate statement balance consistency
- dedup_hash(): SHA256-based transaction deduplication
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Implementiert Task 5 mit TDD-Ansatz: projection.py mit Projection-Klasse
und project()-Funktion für Cashflow-Simulation; scenario.py mit PlainRecurring,
PlainPlanned, PlainModifier Dataclasses und build_cashflows() für Szenarien-Zahlungsströme
mit Modifier-Support (remove, percent, absolute). Alle 15 Tests grün.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>