From 5076dcb68f85f309de9cb65f39aad213805abb70 Mon Sep 17 00:00:00 2001 From: kelle Date: Wed, 15 Jul 2026 13:00:42 +0200 Subject: [PATCH] Einkommen/Ausgaben: Basiswert direkt editierbar statt Uebersteuern-Feld MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Das separate "Uebersteuern"-Feld (amountOverride) konnte 0 nicht von "nicht gesetzt" unterscheiden und nahm faelschlich 0. Entfernt. Stattdessen ist der Basiswert (amount) selbst editierbar: ab Phase 2 mit dem fortgeschriebenen Endwert der Vorphase vorbelegt, aber bewusst aenderbar (Teilzeit/Beförderung/Jobwechsel). Solange nicht geaendert, wird der Wert 1:1 aus der Vorphase fortgeschrieben (pd.amount ungesetzt -> carry.flowBasis). Co-Authored-By: Claude Opus 4.8 --- src/components/ElementDetail.tsx | 25 ++++++++++--------------- src/lib/calculations.ts | 11 +++++++---- src/lib/elements.ts | 3 --- 3 files changed, 17 insertions(+), 22 deletions(-) diff --git a/src/components/ElementDetail.tsx b/src/components/ElementDetail.tsx index ee38915..d010dff 100644 --- a/src/components/ElementDetail.tsx +++ b/src/components/ElementDetail.tsx @@ -145,23 +145,18 @@ export function ElementPhaseFields({ onChange={(v) => setP({ teuerungsausgleich: v })} /> ); - if (carried) { - return ( - <> - - setP({ amountOverride: v })} - /> - {teuerung} - - ); - } + // Basiswert (erstes Jahr der Phase). Ab Phase 2 mit dem fortgeschriebenen Endwert der + // Vorphase vorbelegt, aber bewusst aenderbar (Teilzeit, Beförderung, Jobwechsel …). + const baseLabel = isIncome ? "Jahreseinkommen (CHF, erstes Jahr)" : "Jahresausgaben (CHF, erstes Jahr)"; + const baseValue = typeof pd.amount === "number" ? pd.amount : carried ? context.derivedStart : 0; return ( <> - setP({ amount: v })} /> + setP({ amount: v })} + /> {teuerung} ); diff --git a/src/lib/calculations.ts b/src/lib/calculations.ts index 0ad43eb..a07716f 100644 --- a/src/lib/calculations.ts +++ b/src/lib/calculations.ts @@ -231,11 +231,14 @@ export function computePlan(plan: PlanInput): PlanComputed { case "INCOME": case "EXPENSE": { const idx = num(pd.teuerungsausgleich, phaseInflation); + // Basiswert: Phase 1 = eingegebener Betrag; ab Phase 2 = fortgeschriebener Endwert + // der Vorphase, ausser der Nutzer hat ihn bewusst geaendert (pd.amount gesetzt). ec.baseValue = carry.hasCarry ? Math.round(carry.flowBasis) : Math.round(num(pd.amount)); - let basis: number; - if (!carry.hasCarry) basis = Math.round(num(pd.amount)); - else if (typeof pd.amountOverride === "number") basis = Math.round(pd.amountOverride); - else basis = ec.baseValue; + const basis = !carry.hasCarry + ? Math.round(num(pd.amount)) + : typeof pd.amount === "number" + ? Math.round(pd.amount) + : ec.baseValue; (e.category === "INCOME" ? incomes : expenses).push({ basis, idx, ec }); break; } diff --git a/src/lib/elements.ts b/src/lib/elements.ts index 306cbcb..4e87982 100644 --- a/src/lib/elements.ts +++ b/src/lib/elements.ts @@ -56,8 +56,6 @@ export interface PhaseData { // Phasenjahre (Jahr t = Basis x (1+idx)^(t-1)). Eigenes Feld je Element (Einkommen und // Ausgaben unabhaengig). Default = Phaseninflation. teuerungsausgleich?: number; - // INCOME / EXPENSE ab Phase 2: uebersteuert den fortgeschriebenen Basiswert dieser Phase. - amountOverride?: number; // AHV gapYears?: number; // PENSION_FUND / PILLAR_3A / OTHER_ASSET @@ -105,7 +103,6 @@ export const phaseDataSchema = z .object({ amount: nonNeg.optional(), teuerungsausgleich: z.number().min(-20).max(50).optional(), - amountOverride: nonNeg.optional(), gapYears: z.number().int().min(0).optional(), currentValue: nonNeg.optional(), startValue: nonNeg.optional(),