diff --git a/docs/superpowers/specs/2026-07-20-ausbaustufe-5-design.md b/docs/superpowers/specs/2026-07-20-ausbaustufe-5-design.md new file mode 100644 index 0000000..14b35dc --- /dev/null +++ b/docs/superpowers/specs/2026-07-20-ausbaustufe-5-design.md @@ -0,0 +1,157 @@ +# Design — Ausbaustufe 5: Deutsche Formate, Posten-Bearbeitung, Szenario-Ende (v0.6.0) + +> Status: vom Nutzer freigegeben (Chat 2026-07-20). Umsetzungsplan folgt unter +> `docs/superpowers/plans/`. Datenschutz-Regel aus `CLAUDE.md` gilt: konkrete +> Empfängernamen/Beträge des Demo-Szenarios stehen nur im Chat und in der +> Live-Datenbank, nicht in diesem Dokument, nicht in Commits, nicht im Ledger. + +## Ziel + +Drei Nutzeranforderungen an die Web-GUI des Finanzberatungs-Tools: + +1. **Deutsche Formate** — Beträge werden deutsch angezeigt (`1.234,56 €`) + und deutsch eingegeben (Komma-Dezimaltrenner); englische GUI-Begriffe + (`monthly`, `annuity`, `percent`, …) werden übersetzt. +2. **Wiederkehrende Posten** — Felder `Start`/`Ende` in der GUI sichtbar und + pflegbar (Modell/API/Engine können das bereits); jeder Posten bekommt + einen `Bearbeiten`-Button. Inline-Bearbeitung zusätzlich für + Einmalposten, Kredite und den Szenario-Kopf (Nutzerentscheidung). +3. **Szenarien** — Modifikator-Art `Ende` (Posten endet innerhalb des + Szenarios an einem Datum, ohne den Posten selbst zu ändern) und + szenario-eigene Einmalzahlungen. Demo-Szenario „Best Case" wird nach dem + Release live angelegt und durchgerechnet. + +## Nutzerentscheidungen (Chat 2026-07-20) + +- Szenario-Ende als **neue Modifikator-Art `ende`** mit Datumsfeld (nicht + als Gültigkeitszeitraum aller Modifikatoren). +- Einmalzahlung im Demo-Szenario ist **szenario-spezifisch** → neues Feature + „Szenario-Einmalzahlungen". +- Formate: **Zahlen + deutsche Begriffe** (API-Werte bleiben englisch). +- Bearbeiten-Buttons für: wiederkehrende Posten, Einmalposten, Kredite, + Szenario-Kopf. + +## Teil 1 — Deutsche Formate + +**Anzeige.** Neuer Jinja-Filter `eur` in `app/routers/gui.py` +(`templates.env.filters["eur"]`), reine `Decimal`-Formatierung ohne +`locale`-Modul (Container-Locale unzuverlässig): Vorzeichen, Tausenderpunkt, +Komma, zwei Nachkommastellen. Ersetzt alle `'%.2f'|format(...)`-Stellen in +`index.html`, `salden.html`, `transactions.html`, `planning.html`, +`_preview_table.html`. Prozentwerte (Kredit-Zins) analog mit Komma. +Der per JavaScript nachgeladene Tilgungsplan (`planning.html`, +`loadLoanSchedule`) formatiert mit +`toLocaleString('de-DE', {minimumFractionDigits: 2, maximumFractionDigits: 2})`. + +**Eingabe.** Die json-form-Extension in `base.html` lernt +`data-type="amount"`: Whitespace/€ entfernen; enthält der Wert ein Komma → +Tausenderpunkte entfernen, Komma→Punkt; ohne Komma bleibt der Wert +unverändert (Punkt-Eingaben funktionieren weiter). Alle +Betrags-``-Felder (Fixposten, Einmalposten, Kredit, Modifikator-Wert, +Szenario-Einmalzahlung) bekommen `data-type="amount"` und deutsche +Platzhalter (`-49,99`). Versteckte Felder der Vorschlags-Übernahme bleiben +ohne `data-type="amount"` (Server liefert Punktformat). Die JSON-API bleibt +strikt Punkt-Dezimal — Tests, Skripte und Grafana sind nicht betroffen. + +**Begriffe.** Zentrales Mapping als Jinja-Global `de_label` (Definition in +`gui.py`): `monthly→monatlich`, `quarterly→vierteljährlich`, +`yearly→jährlich`, `annuity→Annuität`, `bullet→endfällig`, +`percent→Prozent`, `absolute→Absolut`, `remove→Entfällt`, `ende→Ende`. +Dropdown-`