AHV einkommensabhaengig + Warnhinweis bei Aenderungen in frueheren Phasen
Deploy App / deploy (push) Successful in 59s
Deploy App / deploy (push) Successful in 59s
Roadmap Nr. 3: Die AHV-Rente folgt neu der amtlichen Rentenformel (Skala 44) ueber das massgebende durchschnittliche Jahreseinkommen statt pauschal der Maximalrente. - Formel aus den amtlichen Randbedingungen hergeleitet und gegen die Tabelle 318.117.1 verifiziert: 51/51 Zeilen exakt. Schwellen sind Vielfache von R0=1'260 (12/36/72 x R0 = 15'120 / 45'360 / 90'720). Stuetzstellen als Golden Tests. - Alles REAL gerechnet: die AHV wertet vergangene Einkommen auf UND indexiert die Schwellen -- real hebt sich das auf. Nominal wuerde die Rente systematisch zu hoch ausfallen (Beispiel: faelschlich Maximalrente, ~41'600 ueber 25 Rentenjahre). - Pruefung der Beitragskarriere am Pensions-Uebergang; Zusatzfelder fuer die Jahre vor Planbeginn nur, wenn der Plan nicht bis Alter 21 zurueckreicht. - Sonderfall "bei Planbeginn bereits pensioniert": Felder in der Phasenzelle. - Ohne Pruefung gilt der geplante Durchschnitt (nicht 0) -- sonst waere die Rente still viel zu tief. - 13. Altersrente: Jahresbetrag = Monatsrente x 13. Roadmap Nr. 4: Warnhinweis in Phasenzellen und Phasen-Detail, wenn Folgephasen existieren -- Werte schreiben sich fort und wirken bis ans Planende durch. Verhaltensaenderung fuer bestehende Plaene: siehe SPEZIFIKATION 9.10. Zwoelf Regressionstests (18 -> 30). Spezifikation auf v0.4. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -58,6 +58,11 @@ export interface PhaseData {
|
||||
teuerungsausgleich?: number;
|
||||
// AHV
|
||||
gapYears?: number;
|
||||
// AHV, nur wenn die Person bei Planbeginn BEREITS pensioniert ist (dann gibt es keinen
|
||||
// Pensions-Uebergang, an dem die Karriere geprueft werden koennte): Beitragskarriere.
|
||||
// avgIncomeBefore ist REAL (heutige Kaufkraft).
|
||||
avgIncomeBefore?: number;
|
||||
gapYearsBefore?: number;
|
||||
// PENSION_FUND / PILLAR_3A / OTHER_ASSET
|
||||
currentValue?: number;
|
||||
startValue?: number;
|
||||
@@ -80,6 +85,12 @@ export type TransitionDecision = "HOLD" | "SELL";
|
||||
export type PkPayoutMode = "CAPITAL" | "PENSION" | "COMBI";
|
||||
|
||||
export interface TransitionData {
|
||||
// AHV (Pensions-Uebergang): Pruefung der Beitragskarriere. Das geplante Durchschnitts-
|
||||
// einkommen kommt aus dem Plan; reicht der Plan nicht bis zum Beitragsbeginn (Alter 21)
|
||||
// zurueck, ergaenzt der Benutzer die Jahre davor. avgIncomeBefore ist REAL.
|
||||
reviewed?: boolean;
|
||||
avgIncomeBefore?: number;
|
||||
gapYearsBefore?: number;
|
||||
// PENSION_FUND / PILLAR_3A (normaler Uebergang): expliziter Bezugs-Entscheid.
|
||||
withdrawalMode?: "NONE" | "AMOUNT";
|
||||
withdrawal?: number;
|
||||
@@ -135,6 +146,8 @@ export const phaseDataSchema = z
|
||||
amount: nonNeg.optional(),
|
||||
teuerungsausgleich: z.number().min(-20).max(50).optional(),
|
||||
gapYears: z.number().int().min(0).optional(),
|
||||
avgIncomeBefore: nonNeg.optional(),
|
||||
gapYearsBefore: z.number().int().min(0).max(50).optional(),
|
||||
currentValue: nonNeg.optional(),
|
||||
startValue: nonNeg.optional(),
|
||||
expectedReturn: z.number().min(-50).max(100).optional(),
|
||||
@@ -150,6 +163,9 @@ export const phaseDataSchema = z
|
||||
|
||||
export const transitionDataSchema = z
|
||||
.object({
|
||||
reviewed: z.boolean().optional(),
|
||||
avgIncomeBefore: nonNeg.optional(),
|
||||
gapYearsBefore: z.number().int().min(0).max(50).optional(),
|
||||
withdrawalMode: z.enum(["NONE", "AMOUNT"]).optional(),
|
||||
withdrawal: nonNeg.optional(),
|
||||
payoutMode: z.enum(["CAPITAL", "PENSION", "COMBI"]).optional(),
|
||||
|
||||
Reference in New Issue
Block a user