Neuer Knopf auf Plan-Ebene: Liste plus Wizard in zwei Schritten. Ein
Ist-Satz haengt am PLAN, nicht am Szenario -- die Zuordnung laeuft ueber
die Herkunfts-Kette sourceElementId.
computePlan nimmt neu { actuals }: Die Werte schnappen in jedem erfassten
Jahr auf die Realitaet und laufen von dort planmaessig weiter. Luecken
fallen auf die Plandaten zurueck. Ohne die Option unveraendert -- die 43
Golden Tests laufen durch.
Der Sprung ist keine Rendite: eigene Brueckenposition actualsCorrection
in Vermoegens- und Cash-Bruecke, sonst ginge die Zerlegung nicht auf.
Matrix: Umschalter Plan/Effektiv, im Ist-Modus mit farbiger Abweichung
statt acht Zahlen je Zelle. Zeitachse: Marker je Jahr, juengster farbig.
Vier Analysewerkzeuge mit einheitlicher Leiste (nominal/real als
Einfachauswahl, Plan/Effektiv). MC: Zielbetrag dreht mit, Startjahr
abgeleitet statt eingebbar.
Neue Tabelle ActualsSet (gegen echtes Postgres verifiziert), Module
actuals.ts und dataview.ts. Spezifikation 0.21, 27 Tests (181 -> 208).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -86,5 +86,24 @@ describe("Datenbank-Migrationen", () => {
|
||||
)
|
||||
).rows.map((r) => r.indexname);
|
||||
expect(idx).toContain("ScenarioVersion_scenarioId_major_minor_key");
|
||||
|
||||
// --- Effektive Werte ---
|
||||
expect(tables, "Tabelle ActualsSet fehlt").toContain("ActualsSet");
|
||||
const actCols = await cols("ActualsSet");
|
||||
for (const c of ["planId", "recordedOn", "year", "comment", "cash", "values", "createdById"]) {
|
||||
expect(actCols, `ActualsSet.${c} fehlt`).toContain(c);
|
||||
}
|
||||
|
||||
// Der Ist-Satz hängt am PLAN, nicht am Szenario -- sonst wäre die Realität pro Szenario
|
||||
// verschieden erfasst.
|
||||
expect(actCols).not.toContain("scenarioId");
|
||||
|
||||
// `cash` muss leer bleiben dürfen: Wer den Kontostand nicht kennt, soll den Satz trotzdem
|
||||
// erfassen können (Lücken fallen auf die Plandaten zurück).
|
||||
const cashCol = await db.query<{ is_nullable: string }>(
|
||||
`SELECT is_nullable FROM information_schema.columns
|
||||
WHERE table_name='ActualsSet' AND column_name='cash'`
|
||||
);
|
||||
expect(cashCol.rows[0].is_nullable).toBe("YES");
|
||||
}, 60000);
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user