From eb68781a1df900a9c3a4e2d3ebe2e49a53e8d7bca447378c8f50b0d57a3c51cf Mon Sep 17 00:00:00 2001 From: wlfb Date: Wed, 30 Sep 2026 13:30:02 +0200 Subject: [PATCH] chore: Release v0.14.0 (Szenario-Zeitraum, Neuer Betrag, Szenario-Zahlungen) Co-Authored-By: Claude Opus 5.5 (1M context) --- docs/ARCHITEKTUR.md | 30 ++++++++++++++++++++++++------ finance/VERSION | 2 +- finance/app/templates/hilfe.html | 26 ++++++++++++++++++-------- 3 files changed, 43 insertions(+), 15 deletions(-) diff --git a/docs/ARCHITEKTUR.md b/docs/ARCHITEKTUR.md index a786be7..89cffde 100644 --- a/docs/ARCHITEKTUR.md +++ b/docs/ARCHITEKTUR.md @@ -28,7 +28,7 @@ flowchart TD R_categories["categories.py
list_categories, create_category_rule"] R_imports["imports.py
upload, scan_inbox, preview,
confirm, rollback"] R_planning["planning.py
list_recurring, list_planned,
list_loans, recurring_suggestions"] - R_scenarios["scenarios.py
create_scenario, add_modifier,
project_scenario"] + R_scenarios["scenarios.py
create_scenario, add_modifier,
add_scenario_recurring,
project_scenario"] R_admin["admin.py
admin_page, admin_change_password,
apply_category_rules"] end @@ -47,10 +47,10 @@ flowchart TD N_reserved["app/reserved.py
check_reserved_name"] subgraph ENGINE["engine/ (rein, kein DB-Zugriff)"] - E_loans["loans.py
loan_schedule, annuity_payment, add_months"] + E_loans["loans.py
loan_schedule, schedule_for,
annuity_payment, add_months"] E_recurrence["recurrence.py
occurrences"] E_projection["projection.py
project"] - E_scenario["scenario.py
build_cashflows (PlainRecurring/
PlainPlanned/PlainModifier)"] + E_scenario["scenario.py
build_cashflows, modified_amount
(Stichtag on, gilt_am)
PlainRecurring/PlainPlanned/
PlainModifier"] E_breakdown["breakdown.py
breakdown_rows, summarize,
category_rows, share"] E_pie["pie.py
pie_slices"] end @@ -67,9 +67,9 @@ flowchart TD end subgraph MODELS["models/ + alembic/"] - M_tables["tables.py
Account, Statement, Transaction,
RecurringItem, PlannedItem, Loan,
Scenario, ProjectionResult, ..."] + M_tables["tables.py
Account, Statement, Transaction,
RecurringItem, PlannedItem, Loan,
Scenario, ScenarioRecurringItem,
ProjectionResult, ..."] M_views["views.py — create_views()
v_balance_history, v_balance_total,
v_monthly_by_category, v_projection"] - M_alembic["alembic/versions
b2b1f5a18a74_initial_schema
1ef6a356f028_konto_anker"] + M_alembic["alembic/versions
b2b1f5a18a74_initial_schema
1ef6a356f028_konto_anker
e7f1a9c3b214_szenario_zeitraum"] end R_gui --> T_pages @@ -326,9 +326,27 @@ Ausgaben sind einfache Dataclasses (`Installment`, `PlainRecurring`, ist die einzige Brücke: `load_scenario_inputs(session, scenario)` ist die gemeinsame Ladefunktion (`None` = System-Plan, ohne Szenario-Änderungen) und lädt ORM-Objekte (`Loan`, `RecurringItem`, -`PlannedItem`, `Scenario`, `ScenarioModifier`), baut daraus die Plain-Objekte +`PlannedItem`, `Scenario`, `ScenarioModifier`, `ScenarioRecurringItem` — Letztere +als `PlainRecurring` mit `id=None`), baut daraus die Plain-Objekte und ruft `engine.scenario.build_cashflows` → `engine.projection.project`. +**Szenario-Einträge mit Zeitraum (Ausbaustufe 14).** `ScenarioModifier.start_date`/ +`end_date` sind „Gültig ab/bis" (inklusiv, leer = unbegrenzt; bei Art `ende` +zählt nur `end_date` als Enddatum). Neue Art `set` („Neuer Betrag", nur für +Posten) ersetzt den Betrag. `engine.scenario.modified_amount(..., on=)` wertet +die Einträge mit einem Stichtag je Fälligkeit aus — `build_cashflows` nimmt +jedes Fälligkeitsdatum, `engine.breakdown.breakdown_rows` über +`engine.recurrence.due_in_month` das Fälligkeitsdatum im Monat; `gilt_am` +prüft den Zeitraum, mehrere treffende Einträge wirken in Anlage-Reihenfolge. +`ScenarioRecurringItem` (Tabelle `scenario_recurring_items`, API +`/api/scenarios/{id}/recurring`) sind wiederkehrende Zahlungen nur in einem +Szenario: sie zählen unabhängig von `include_recurring` und werden von +Posten-Einträgen nie getroffen (`PlainRecurring.id=None`). +`ScenarioPlannedItem.category_id` ordnet Szenario-Einmalzahlungen einer +Kategorie zu. Die Szenarien-Seite (`szenarien.html`) nutzt dafür +`static/szenarien.js` (`window.FBSzenario`). Migration: +`e7f1a9c3b214_szenario_zeitraum`. + **`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 diff --git a/finance/VERSION b/finance/VERSION index 092a790..ff745ae 100644 --- a/finance/VERSION +++ b/finance/VERSION @@ -1 +1 @@ -0.13.1 +0.14.0 diff --git a/finance/app/templates/hilfe.html b/finance/app/templates/hilfe.html index c7ecac3..6bec852 100644 --- a/finance/app/templates/hilfe.html +++ b/finance/app/templates/hilfe.html @@ -67,16 +67,26 @@
  • Szenarien: eine "Was-wäre-wenn"-Rechnung. Basis = alle wiederkehrenden Posten + Einmalposten. Varianten entstehen durch Zuordnen - von Krediten und Modifikatoren (Kategorie oder Posten prozentual/absolut - kürzen oder ganz streichen). "Durchrechnen" liefert: tiefster Kontostand + von Krediten und Einträgen (Kategorie oder Posten prozentual oder um einen Betrag + kürzen, auf einen neuen Betrag setzen oder ganz streichen – auch nur für + einen Zeitraum). "Durchrechnen" liefert: tiefster Kontostand mit Datum, erstes Datum unter 0 und unter der Warnschwelle. Varianten wie „Best Case“ pflegst du in der Tabelle „Einträge“ des - Szenarios: Art „Ende“ lässt einen wiederkehrenden Posten (z. B. eine - auslaufende Miete) zu einem Datum enden, ohne den Posten selbst zu - ä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. Ein Szenario lässt sich über „Löschen“ mit allen Einträgen + Szenarios. Das Formular „Neue Änderung an Bestehendem“ ändert + vorhandene Posten oder Kategorien: „Prozent“ und „Kürzung (€)“ kürzen + Beträge, „Neuer Betrag“ ersetzt den Betrag eines Postens (mit + Vorzeichen, z. B. -250,00), „Entfällt“ blendet ihn aus, „Ende“ lässt + einen wiederkehrenden Posten zu einem Datum enden. Mit „Gültig ab“ und + „Gültig bis“ wirken Prozent, Kürzung, Neuer Betrag und Entfällt nur in + diesem Zeitraum (Grenzen einschließlich, leer = unbegrenzt). Beispiel: + ein Posten wird mit „Prozent 50 ab 16.10.“ halbiert – ist er am 14. + fällig, zählt er im Oktober noch voll, ab November zur Hälfte. Das + Formular „Neue Zahlung nur in diesem Szenario“ ergänzt eine + Einmalzahlung oder eine wiederkehrende Zahlung (Rhythmus, + Fälligkeitstag, Start/Ende, optional mit Kategorie), die nur in diesem + Szenario zählt – auch wenn „Wiederkehrende Posten einschließen“ bzw. + „Einmalposten einschließen“ aus ist. Jeder Eintrag ist über + „Bearbeiten“ direkt ä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