From b28b0e69c024aa290d26449ed6fce7c91fdb73bfa08252b555a3face983448d2 Mon Sep 17 00:00:00 2001 From: wlfb Date: Mon, 28 Sep 2026 19:34:18 +0200 Subject: [PATCH] =?UTF-8?q?chore:=20Release=20v0.11.0=20(Szenario-L=C3=B6s?= =?UTF-8?q?chen,=20Grafana-Korrekturen,=20Tabellensortierung)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 (1M context) --- docs/ARCHITEKTUR.md | 43 +++++++++++++++++++++++++++++++- finance/VERSION | 2 +- finance/app/templates/hilfe.html | 26 ++++++++++++++++--- 3 files changed, 66 insertions(+), 5 deletions(-) diff --git a/docs/ARCHITEKTUR.md b/docs/ARCHITEKTUR.md index fdc0ff4..a0ff060 100644 --- a/docs/ARCHITEKTUR.md +++ b/docs/ARCHITEKTUR.md @@ -37,7 +37,8 @@ flowchart TD S_balances["balances.py
account_balance(at), total_balance"] S_categorize["categorize.py
apply_rules"] S_suggestions["suggestions.py
suggest_recurring"] - S_projection["projection_service.py
run_projection"] + S_projection["projection_service.py
run_projection, refresh_stale_projections"] + S_planning_chart["planning_chart.py
refresh_planning_chart"] S_admin["admin.py
change_password, apply_rules_retroactively"] end @@ -75,6 +76,8 @@ flowchart TD R_gui --> E_loans R_gui --> E_recurrence R_gui --> S_balances + R_gui --> S_projection + R_gui --> S_planning_chart R_admin --> R_gui R_accounts --> S_balances @@ -96,6 +99,9 @@ flowchart TD S_projection --> E_projection S_projection --> E_scenario S_projection --> S_balances + S_planning_chart --> E_loans + S_planning_chart --> E_recurrence + S_planning_chart --> M_tables S_admin --> S_categorize E_scenario --> E_loans @@ -300,6 +306,41 @@ ist die einzige Brücke: es lädt ORM-Objekte (`Loan`, `RecurringItem`, `PlannedItem`, `Scenario`, `ScenarioModifier`), baut daraus die Plain-Objekte und ruft `engine.scenario.build_cashflows` → `engine.projection.project`. +**`v_projection` (Ausbaustufe 11) — System-Ist + Szenarien ab heute.** +`models/views.py::VIEWS["v_projection"]` liefert für den Grafana-Szenario- +Vergleich drei Teile in einer Tabelle: die Ist-Gesamtsaldo-Serie unter dem +Namen `RESERVED_SCENARIO_NAME` (`"System-Ist"`, aus `v_balance_total`, endet +heute), je bereits durchgerechnetem Szenario einen Startpunkt exakt heute +(Ist-Saldo, damit die Kurve nahtlos ansetzt) sowie dessen gespeicherte +Projektionspunkte NACH heute (`projection_points`, `day > CURRENT_DATE`) — +Punkte <= heute aus einer älteren Berechnung erscheinen so nie. +`RESERVED_SCENARIO_NAME` ist für Szenario-Namen gesperrt: +`routers/scenarios.py::_check_reserved_name` lehnt `POST`/`PATCH` mit diesem +Namen (case-insensitiv) mit 422 ab. + +**Abgeleitete Tabellen + Advisory-Locks (Ausbaustufe 11).** Zwei Datenstände +werden bei GUI-Seitenaufrufen automatisch aufgefrischt, nie beim reinen +API-Zugriff (`routers/gui.py::_safe_refresh`, fehlerresistent — ein Fehler +rollt zurück, loggt und lässt die Seite mit dem alten Stand rendern): +`services/projection_service.py::refresh_stale_projections` rechnet jedes +bereits durchgerechnete, aber veraltete Szenario mit dem Standard-Horizont +neu (Advisory-Lock `STALE_PROJECTION_LOCK = 110_001`), aufgerufen von +`index` und `szenarien_page`. `services/planning_chart.py::refresh_planning_chart` +schreibt die Tabelle `planning_monthly` (`models/tables.py::PlanningMonthly`, +Migration `d5e8b3c7a410`) komplett neu — Monatssummen je Kategorie aus +Planung (wiederkehrende Posten, Einmalposten, Kreditraten aller Kredite +unter Kategorie „Kreditraten") für das Grafana-Panel „Planung nach +Kategorie" (`Advisory-Lock PLANNING_CHART_LOCK = 110_002`), aufgerufen von +`index` und `planung_page`. Beide Tabellen sind jederzeit reproduzierbar +(kein Backup-Sonderfall). + +**Tabellensortierung (Ausbaustufe 11).** `static/sort.js` sortiert generische +Tabellen client-seitig per Spaltenkopf-Klick (⇅/▲/▼, deutsche Zahlen-/ +Datumsformate, `htmx.onLoad`-Reinit für nachgeladene Fragmente) — Ausnahme +`table[data-sort-mode="server"]`. Die Buchungsliste (`/buchungen`) ist so +markiert und sortiert stattdessen serverseitig über alle Seiten +(`routers/transactions.py::SORT_COLUMNS`, `normalize_sort`, `_apply_sort`). + **`VERSION`-Datei als Single Source.** `finance/VERSION` (ein Einzeiler, z.B. `0.4.0`) ist die einzige Versionsquelle: `app/version.py::get_version()` liest sie (Fallback `"0.0.0-dev"`), gespeist in den Jinja2-Footer diff --git a/finance/VERSION b/finance/VERSION index 8d93765..a0bbdef 100644 --- a/finance/VERSION +++ b/finance/VERSION @@ -1 +1 @@ -0.10.0 +0.11.0 diff --git a/finance/app/templates/hilfe.html b/finance/app/templates/hilfe.html index 12d0cde..c45ad0d 100644 --- a/finance/app/templates/hilfe.html +++ b/finance/app/templates/hilfe.html @@ -76,16 +76,36 @@ ändern; „Prozent“/„Absolut“ kürzen Beträge; „Entfällt“ blendet sie ganz aus; „Einmalzahlung“ ergänzt einen einmaligen Zu- oder Abfluss, der nur in diesem Szenario zählt. Jeder Eintrag ist über „Bearbeiten“ direkt - änderbar. + änderbar. Ein Szenario lässt sich über „Löschen“ mit allen Einträgen + wieder entfernen. Bereits durchgerechnete Szenarien werden automatisch + mit dem Standard-Horizont neu gerechnet, sobald ihre Projektion nicht + mehr bei heute beginnt (z. B. nach ein paar Tagen Inaktivität) – das + passiert beim nächsten Aufruf der Übersicht oder der Szenarien-Seite.
  • Grafana: Kontostand-Verläufe, Monatsausgaben nach - Kategorie und der Szenario-Vergleich als Kurven (einmal mit demselben + Kategorie, der Szenario-Vergleich als Kurven (darin die Ist-Kurve + „System-Ist“ bis heute, ab heute je Szenario weiter) und das Panel + „Planung nach Kategorie“ (Monatssummen aus der reinen Planung inkl. + Kreditraten, ohne Szenario-Modifikatoren) – einmal mit demselben Passwort wie hier anmelden, dann erscheint das Dashboard auch in der - Übersicht). + Übersicht.
  • +

    + Tabellen sortieren: ein Klick auf einen Spaltenkopf + sortiert die Tabelle danach (⇅ unsortiert, ▲ aufsteigend, ▼ absteigend); + bei der Buchungsliste wirkt das über alle Seiten, nicht nur auf die + aktuell angezeigte. +

    + +

    + Planungs-Diagramm und automatisches Neurechnen werden beim Öffnen von + Übersicht, Planung oder Szenarien aktualisiert – Änderungen über die API + erscheinen also erst nach dem nächsten Seitenaufruf. +

    +

    Empfohlener Arbeitsablauf

    1. Monatlich: neue Auszüge importieren, Vorschau prüfen, übernehmen.