chore: Release v0.14.0 (Szenario-Zeitraum, Neuer Betrag, Szenario-Zahlungen)

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-09-30 13:30:02 +02:00
co-authored by Claude Opus 5.5
parent 30330801cc
commit eb68781a1d
3 changed files with 43 additions and 15 deletions
+24 -6
View File
@@ -28,7 +28,7 @@ flowchart TD
R_categories["categories.py<br/>list_categories, create_category_rule"]
R_imports["imports.py<br/>upload, scan_inbox, preview,<br/>confirm, rollback"]
R_planning["planning.py<br/>list_recurring, list_planned,<br/>list_loans, recurring_suggestions"]
R_scenarios["scenarios.py<br/>create_scenario, add_modifier,<br/>project_scenario"]
R_scenarios["scenarios.py<br/>create_scenario, add_modifier,<br/>add_scenario_recurring,<br/>project_scenario"]
R_admin["admin.py<br/>admin_page, admin_change_password,<br/>apply_category_rules"]
end
@@ -47,10 +47,10 @@ flowchart TD
N_reserved["app/reserved.py<br/>check_reserved_name"]
subgraph ENGINE["engine/ (rein, kein DB-Zugriff)"]
E_loans["loans.py<br/>loan_schedule, annuity_payment, add_months"]
E_loans["loans.py<br/>loan_schedule, schedule_for,<br/>annuity_payment, add_months"]
E_recurrence["recurrence.py<br/>occurrences"]
E_projection["projection.py<br/>project"]
E_scenario["scenario.py<br/>build_cashflows (PlainRecurring/<br/>PlainPlanned/PlainModifier)"]
E_scenario["scenario.py<br/>build_cashflows, modified_amount<br/>(Stichtag on, gilt_am)<br/>PlainRecurring/PlainPlanned/<br/>PlainModifier"]
E_breakdown["breakdown.py<br/>breakdown_rows, summarize,<br/>category_rows, share"]
E_pie["pie.py<br/>pie_slices"]
end
@@ -67,9 +67,9 @@ flowchart TD
end
subgraph MODELS["models/ + alembic/"]
M_tables["tables.py<br/>Account, Statement, Transaction,<br/>RecurringItem, PlannedItem, Loan,<br/>Scenario, ProjectionResult, ..."]
M_tables["tables.py<br/>Account, Statement, Transaction,<br/>RecurringItem, PlannedItem, Loan,<br/>Scenario, ScenarioRecurringItem,<br/>ProjectionResult, ..."]
M_views["views.py — create_views()<br/>v_balance_history, v_balance_total,<br/>v_monthly_by_category, v_projection"]
M_alembic["alembic/versions<br/>b2b1f5a18a74_initial_schema<br/>1ef6a356f028_konto_anker"]
M_alembic["alembic/versions<br/>b2b1f5a18a74_initial_schema<br/>1ef6a356f028_konto_anker<br/>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