Szenario-Hierarchie: Plan als Behaelter, Diff-Markierung (V6)
Deploy App / deploy (push) Successful in 1m43s
Deploy App / deploy (push) Successful in 1m43s
Groesste Umstrukturierung bisher. Der PLAN ist neu ein schlanker Behaelter ohne Finanzdaten; die berechenbare Einheit ist das SZENARIO. Modell: - Jeder Plan bekommt beim Anlegen automatisch ein Basisszenario (isBase). - Das Grundprofil liegt am Szenario, nicht am Plan -- nur so sind Szenarien mit abweichendem PENSIONSALTER moeglich (Fruehpensionierung), das in Person steckt. - Neue Szenarien sind vollstaendige Kopien eines BELIEBIGEN Szenarios und haengen als Baum darunter (parentScenarioId); die Seitenleiste rueckt sie ein. - Kopierte Phasen/Elemente tragen Herkunfts-Verweise (sourcePhaseId, sourceElementId). Ueber den Namen zu matchen waere fragil gewesen. Abweichungs-Markierung (Diff gegen das Eltern-Szenario, live): - geaendert = gelb, neu = gruen + Badge, entfernt = graue Geisterzeile. - Markiert: Phasen-/Uebergangszellen, Element-Zeilen, Phasenkoepfe, Cash-Anfangswert, Cash-Uebergaenge, Grundprofil. Zaehler ueber der Matrix. - Eigene Theme-Tokens fuer Hell/Dunkel/Warm -- ein fester Gelbwert waere im Dunkelschema unbrauchbar. Charts vergleichen neu die Geschwister-Szenarien statt fremder Plaene. Datenmodell/Migration: - Neue Tabelle Plan; bisheriger Plan -> Scenario (IDs erhalten, damit alle Kind-Fremdschluessel gueltig bleiben); planId -> scenarioId in Person/Phase/ FinancialElement. Bestehende Szenarien werden per rekursivem CTE demselben Behaelter zugeordnet, auch mehrfach verschachtelte. - Migration VOR dem Deploy gegen echtes PostgreSQL verifiziert (PGlite, in-process), inkl. verschachtelter Szenarien und Cascade. Der Test ist als migrations.test.ts committet und sichert kuenftige Migrationen ab. API neu unter /api/scenarios/*. 10 neue Tests (48 -> 58). Spezifikation auf v0.8. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -26,6 +26,12 @@
|
||||
--danger-soft: #fef2f2;
|
||||
--success: #059669;
|
||||
--person-a: #4f46e5;
|
||||
--diff: #b45309;
|
||||
--diff-soft: #fef3c7;
|
||||
--diff-added: #15803d;
|
||||
--diff-added-soft: #dcfce7;
|
||||
--diff-removed: #71717a;
|
||||
--diff-removed-soft: #f4f4f5;
|
||||
--person-b: #0ea5e9;
|
||||
}
|
||||
|
||||
@@ -48,6 +54,12 @@
|
||||
--danger-soft: rgba(220, 38, 38, 0.16);
|
||||
--success: #34d399;
|
||||
--person-a: #818cf8;
|
||||
--diff: #fbbf24;
|
||||
--diff-soft: rgba(251, 191, 36, 0.16);
|
||||
--diff-added: #4ade80;
|
||||
--diff-added-soft: rgba(74, 222, 128, 0.14);
|
||||
--diff-removed: #a1a1aa;
|
||||
--diff-removed-soft: rgba(161, 161, 170, 0.12);
|
||||
--person-b: #38bdf8;
|
||||
}
|
||||
|
||||
@@ -71,6 +83,12 @@
|
||||
--danger-soft: #fbeae7;
|
||||
--success: #2e9e7b;
|
||||
--person-a: #e8663c;
|
||||
--diff: #b45309;
|
||||
--diff-soft: #fbeccb;
|
||||
--diff-added: #2e7d52;
|
||||
--diff-added-soft: #dcf0e2;
|
||||
--diff-removed: #8a7f72;
|
||||
--diff-removed-soft: #f0e8dd;
|
||||
--person-b: #f2a93b;
|
||||
}
|
||||
|
||||
@@ -95,6 +113,12 @@
|
||||
--danger-soft: rgba(220, 38, 38, 0.16);
|
||||
--success: #34d399;
|
||||
--person-a: #818cf8;
|
||||
--diff: #fbbf24;
|
||||
--diff-soft: rgba(251, 191, 36, 0.16);
|
||||
--diff-added: #4ade80;
|
||||
--diff-added-soft: rgba(74, 222, 128, 0.14);
|
||||
--diff-removed: #a1a1aa;
|
||||
--diff-removed-soft: rgba(161, 161, 170, 0.12);
|
||||
--person-b: #38bdf8;
|
||||
}
|
||||
}
|
||||
@@ -117,6 +141,12 @@
|
||||
--color-danger: var(--danger);
|
||||
--color-danger-soft: var(--danger-soft);
|
||||
--color-success: var(--success);
|
||||
--color-diff: var(--diff);
|
||||
--color-diff-soft: var(--diff-soft);
|
||||
--color-diff-added: var(--diff-added);
|
||||
--color-diff-added-soft: var(--diff-added-soft);
|
||||
--color-diff-removed: var(--diff-removed);
|
||||
--color-diff-removed-soft: var(--diff-removed-soft);
|
||||
--color-person-a: var(--person-a);
|
||||
--color-person-b: var(--person-b);
|
||||
--font-sans: var(--font-geist-sans);
|
||||
|
||||
Reference in New Issue
Block a user