feat: API für Szenario-Zeitraum, Neuer Betrag und szenario-eigene wiederkehrende Zahlungen (A14-T3)
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -15,7 +15,7 @@ from app.engine.scenario import (PlainModifier, PlainPlanned, PlainRecurring,
|
||||
from app.models.tables import (Loan, PlannedItem, ProjectionPoint,
|
||||
ProjectionResult, RecurringItem, Scenario,
|
||||
ScenarioLoan, ScenarioModifier,
|
||||
ScenarioPlannedItem)
|
||||
ScenarioPlannedItem, ScenarioRecurringItem)
|
||||
from app.services.balances import total_balance
|
||||
|
||||
|
||||
@@ -31,7 +31,8 @@ class ScenarioInputs:
|
||||
def load_scenario_inputs(session: Session, scenario: Scenario | None) -> ScenarioInputs:
|
||||
"""Lädt die Eingaben eines Szenarios. scenario=None ist die reine
|
||||
Planung („System-Plan"): alle Fixposten, alle globalen Einmalposten,
|
||||
alle Kredite, keine Modifikatoren, keine Szenario-Einmalposten."""
|
||||
alle Kredite, keine Modifikatoren, keine Szenario-Einmalposten und keine
|
||||
szenario-eigenen wiederkehrenden Zahlungen."""
|
||||
recurring = []
|
||||
if scenario is None or scenario.include_recurring:
|
||||
recurring = [PlainRecurring(r.id, r.name, Decimal(r.amount), r.rhythm,
|
||||
@@ -46,9 +47,16 @@ def load_scenario_inputs(session: Session, scenario: Scenario | None) -> Scenari
|
||||
if scenario is None:
|
||||
loans = list(session.execute(select(Loan).order_by(Loan.id)).scalars())
|
||||
return ScenarioInputs(recurring, planned, loans, [])
|
||||
# Szenario-eigene Einmalzahlungen zaehlen IMMER fuer dieses Szenario -
|
||||
# include_planned steuert nur die globalen PlannedItems.
|
||||
planned += [PlainPlanned(p.name, Decimal(p.amount), p.due, None)
|
||||
# Szenario-eigene Zahlungen zählen IMMER für dieses Szenario -
|
||||
# include_recurring/include_planned steuern nur die globalen Posten.
|
||||
# id=None: Posten-Einträge (target_type="recurring") treffen sie nie,
|
||||
# die IDs zweier Tabellen könnten sonst kollidieren.
|
||||
recurring += [PlainRecurring(None, r.name, Decimal(r.amount), r.rhythm, r.due_day,
|
||||
r.start_date, r.end_date, r.category_id)
|
||||
for r in session.execute(select(ScenarioRecurringItem).where(
|
||||
ScenarioRecurringItem.scenario_id == scenario.id)
|
||||
.order_by(ScenarioRecurringItem.id)).scalars()]
|
||||
planned += [PlainPlanned(p.name, Decimal(p.amount), p.due, p.category_id)
|
||||
for p in session.execute(select(ScenarioPlannedItem).where(
|
||||
ScenarioPlannedItem.scenario_id == scenario.id)
|
||||
.order_by(ScenarioPlannedItem.id)).scalars()]
|
||||
@@ -57,7 +65,7 @@ def load_scenario_inputs(session: Session, scenario: Scenario | None) -> Scenari
|
||||
.where(ScenarioLoan.scenario_id == scenario.id)
|
||||
.order_by(Loan.id)).scalars())
|
||||
modifiers = [PlainModifier(m.target_type, m.target_id, m.kind,
|
||||
Decimal(m.value), m.end_date)
|
||||
Decimal(m.value), m.end_date, m.start_date)
|
||||
for m in session.execute(select(ScenarioModifier).where(
|
||||
ScenarioModifier.scenario_id == scenario.id)
|
||||
.order_by(ScenarioModifier.id)).scalars()]
|
||||
|
||||
Reference in New Issue
Block a user