LoanOut erbt nicht mehr von LoanIn - definiert term_months ohne Grenzen.
Altbestände mit term_months>1200 (vor Validierung direkt eingefügt)
crashen GET /api/loans und PATCH nicht mehr.
Regression-Test: test_altbestand_kredit_mit_laufzeit_ausserhalb_grenzen
- Inseriert Loan mit term_months=1500 direkt via DB
- Bestätigt GET /api/loans und Ausgabe-Serialisierung funktioniert
- Keine Validierung auf Output
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
In gestapelten Balken mit vielen Kategorien überlagerten sich die
Segment-Beschriftungen, sichtbar blieb ein zufälliger kleiner Wert.
Betrifft Monat nach Kategorie und Planung nach Kategorie.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
tests/test_sort_js.py übergab bisher tests/js als Verzeichnis an
`node --test`; unter Node 22 führt das zu MODULE_NOT_FOUND, weil Node
einen Verzeichnispfad hier nicht auflöst (Fable-Fund). Fix: Testdateien
per Glob (*.test.js, sortiert) einzeln übergeben. Verifiziert unter
Node 22 via Podman mit exakt dieser Argumentliste: 14/14 Tests grün,
0 geskippt. Gesamtsuite unverändert bei 248 passed, 3 skipped.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Neues static/sort.js sortiert Tabellen clientseitig per Klick auf den
Spaltenkopf (⇅/▲/▼): Datum TT.MM.JJJJ, deutsche Zahlen/Beträge, sonst
Text (Intl.Collator 'de'). Sortierwert optional per td[data-sort]
(Punkt-Dezimal/ISO) überschreibbar, th[data-nosort] bekommt keinen
Button, table[data-sort-mode="server"] wird übersprungen (Buchungen
sortiert serverseitig, folgt in Task 5). Bearbeiten-/Tilgungsplan-
Zeilen (tr[data-sort-follow]) wandern mit ihrer Vorzeile mit.
Initialisierung über htmx.onLoad, greift auch bei nachgeladenen
Fragmenten.
Templates entsprechend annotiert (Planung, Szenarien, Admin, Index,
Salden, Import-Liste, Buchungen); Salden-Gesamtzeile dafür in ein
tfoot verschoben. test_gui.py::test_gui_zeigt_deutsche_betragsformate
angepasst, da das neue machinenlesbare data-sort-Attribut bewusst
Punkt-Dezimal führt (Interface-Konvention) - die Prüfung auf deutsches
Format im sichtbaren Text bleibt bestehen.
JS-Unit-/DOM-Tests unter tests/js (node --test, DOM-Teil optional via
jsdom), pytest-Wrapper skip ohne node (Fable-Gate führt sie per
Podman aus). Suite: 248 passed, 3 skipped (vorher 242/2).
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Neue Tabelle planning_monthly (Monatssummen je Kategorie aus wiederkehrenden
Posten, Einmalposten und allen Kreditraten), Service planning_chart mit
refresh_planning_chart (Advisory-Lock, komplette Neuschreibung), GUI-Hooks
in index/planung_page ueber _safe_refresh, neues Barchart-Panel im
Grafana-Dashboard (Panel 5).
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Corrected closing quotation mark in hx-confirm attribute and test assertions
from U+201D (RIGHT DOUBLE QUOTATION MARK) to U+201C (LEFT DOUBLE QUOTATION
MARK), matching German typographic convention („...") and house style (line 114).
Changes by code point:
- finance/app/templates/szenarien.html line 17: 1 × U+201D → U+201C
- finance/tests/test_gui.py lines 501, 521: 2 × U+201D → U+201C
Template lines 17 and 114 now have identical quote code points: U+201E...U+201C.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Critical quoting fix: the hx-confirm attribute now uses U+201D (") for the
closing German quote instead of ASCII " (0x22), which was terminating the
attribute early and losing the confirm message text. The template now
correctly contains: hx-confirm="Szenario „{{ sc.name }}" mit allen..."
Test enhancement: restored the complete assertion text from the brief and
added HTML parsing verification to ensure the attribute value matches exactly
with correct typographic quotes.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>