Pensionierung: Entscheid ans Element, AHV-Vorbezug/Aufschub, PK-Kapitalquote

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-07-26 13:18:38 +02:00
parent 7979fed7bd
commit 9907fda6f4
9 changed files with 660 additions and 103 deletions
@@ -0,0 +1,18 @@
-- Pensionierung wird eine Eigenschaft der PERSON statt der Zeitachse (SPEZIFIKATION 3.13).
--
-- (1) `FinancialElement.retirementDecision` haelt den Bezugs-Entscheid von AHV, Pensionskasse
-- und Saeule 3a. Bisher lag er in `ElementTransitionValue` -- also am Schluessel
-- Element x Phasen-ID. Verschob sich das Pensionsalter, wanderte die Phasengrenze, und der
-- Entscheid musste verlustbehaftet von Grenze zu Grenze gerettet werden. Ohne Phasen-ID im
-- Schluessel ueberlebt er jede Zeitachsen-Aenderung.
--
-- (2) `Person.planningHorizonAge` macht das Planende explizit. Bisher ergab es sich
-- stillschweigend als Summe der Phasendauern -- zwei Szenarien konnten dadurch unbemerkt
-- verschieden weit rechnen und waren nicht vergleichbar. NULL bedeutet weiterhin
-- "aus den Phasendauern ableiten", der Wert ist also rueckwaertskompatibel.
--
-- Bewusst OHNE Datenmigration: Alte Entscheide in `ElementTransitionValue` bleiben liegen und
-- werden vom Rechenkern ignoriert. Die betroffenen Elemente erscheinen dadurch als
-- "Vorgabe ungeprueft" -- genau der Zustand, den das neue Drei-Zustands-Modell dafuer kennt.
ALTER TABLE "FinancialElement" ADD COLUMN "retirementDecision" JSONB;
ALTER TABLE "Person" ADD COLUMN "planningHorizonAge" INTEGER;
+8
View File
@@ -77,6 +77,10 @@ model Person {
scenario Scenario @relation(fields: [scenarioId], references: [id], onDelete: Cascade)
role PersonRole
retirementAge Int
// Bis zu welchem Alter gerechnet wird. Bisher ergab sich das Planende stillschweigend aus
// der Summe der Phasendauern -- zwei Szenarien konnten dadurch unbemerkt verschieden weit
// rechnen und waren nicht vergleichbar.
planningHorizonAge Int?
@@unique([scenarioId, role])
}
@@ -301,6 +305,10 @@ model FinancialElement {
// Gegenstueck im Eltern-Szenario (lose Referenz, kein FK) -- Grundlage des Diffs.
sourceElementId String?
// Pensionierungs-Entscheid (AHV/PK/3a). Bewusst OHNE Phasen-ID im Schluessel: So ueberlebt
// er jede Verschiebung der Zeitachse. Siehe src/lib/retirement-decision.ts.
retirementDecision Json?
phaseValues ElementPhaseValue[]
transitionValues ElementTransitionValue[]
}