Files
FPT/prisma/migrations/20260720140000_plan_level_profile/migration.sql
T
admGitAICDS ce5f83823f
Deploy App / deploy (push) Successful in 1m52s
V7: Haushalt auf Plan-Ebene, Annahmen bleiben am Szenario
Haushaltsform, Personen (Name/Alter) und Startjahr wandern vom Szenario
auf den Plan. Das Pensionsalter bleibt szenario-eigen -- es ist der Kern
jedes Frueh-/Spaetpensionierungs-Szenarios.

Neue Tabelle PlanPerson; Person behaelt nur Rolle + Pensionsalter;
Plan bekommt householdType und startYear.

Der Rechenkern bleibt unberuehrt: toPlanInput fuegt beide Ebenen wieder
zu einem unveraenderten PlanInput zusammen. 43 Golden Tests unveraendert.

Nebeneffekt: Ein Ist-Satz trifft jetzt in ALLEN Szenarien dasselbe
Planjahr -- vorher war das nicht garantiert.

Wiederherstellen einer Version setzt nur noch Szenario-Eigenes zurueck.
Profil-Dialog kennzeichnet plan-weite vs. szenario-eigene Felder.

Zwei Tests spielen echte V6-Daten ein und pruefen die Uebernahme.
Spezifikation 0.23 (210 -> 212).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-20 21:53:12 +02:00

72 lines
2.9 KiB
SQL

-- V7: Haushaltsform, Personen (Name/Alter) und Planstartjahr wandern auf PLAN-Ebene.
--
-- Begruendung (SPEZIFIKATION 2.1, 9.30): Diese Angaben beschreiben den HAUSHALT, nicht eine
-- Planungsvariante. Unterscheiden sie sich, ist es ein anderer Plan -- kein anderes Szenario.
-- Solange sie am Szenario hingen, konnten zwei Szenarien desselben Plans verschiedene
-- Startjahre tragen; derselbe Ist-Satz waere dann je Szenario auf einem anderen Planjahr
-- gelandet.
--
-- Das PENSIONSALTER bleibt bewusst am Szenario -- es ist der Kern jedes
-- Frueh-/Spaetpensionierungs-Szenarios.
ALTER TABLE "Plan" ADD COLUMN "householdType" "HouseholdType";
ALTER TABLE "Plan" ADD COLUMN "startYear" INTEGER;
CREATE TABLE "PlanPerson" (
"id" TEXT NOT NULL,
"planId" TEXT NOT NULL,
"role" "PersonRole" NOT NULL,
"name" TEXT,
"age" INTEGER NOT NULL,
CONSTRAINT "PlanPerson_pkey" PRIMARY KEY ("id")
);
CREATE UNIQUE INDEX "PlanPerson_planId_role_key" ON "PlanPerson"("planId", "role");
ALTER TABLE "PlanPerson" ADD CONSTRAINT "PlanPerson_planId_fkey"
FOREIGN KEY ("planId") REFERENCES "Plan"("id") ON DELETE CASCADE ON UPDATE CASCADE;
-- --- Datenuebernahme aus dem BASISSZENARIO ------------------------------------------------
-- Das Basisszenario ist der kanonische Stand. Weichen Nebenszenarien ab, gewinnt die Basis.
UPDATE "Plan" p
SET "householdType" = s."householdType",
"startYear" = s."startYear"
FROM "Scenario" s
WHERE s."planId" = p."id" AND s."isBase" = true;
-- Sicherheitsnetz: Plaene ohne Basisszenario (sollte es nicht geben) nehmen irgendein Szenario.
UPDATE "Plan" p
SET "householdType" = s."householdType",
"startYear" = COALESCE(p."startYear", s."startYear")
FROM "Scenario" s
WHERE s."planId" = p."id" AND p."householdType" IS NULL;
INSERT INTO "PlanPerson" ("id", "planId", "role", "name", "age")
SELECT 'pp_' || pe."id", s."planId", pe."role", pe."name", pe."age"
FROM "Person" pe
JOIN "Scenario" s ON s."id" = pe."scenarioId"
WHERE s."isBase" = true
ON CONFLICT ("planId", "role") DO NOTHING;
-- Netz fuer Plaene, deren Basisszenario keine Personen traegt.
INSERT INTO "PlanPerson" ("id", "planId", "role", "name", "age")
SELECT DISTINCT ON (s."planId", pe."role") 'pp_' || pe."id", s."planId", pe."role", pe."name", pe."age"
FROM "Person" pe
JOIN "Scenario" s ON s."id" = pe."scenarioId"
ORDER BY s."planId", pe."role", s."isBase" DESC
ON CONFLICT ("planId", "role") DO NOTHING;
-- Ein Plan ohne Haushaltsform waere nicht rechenbar.
UPDATE "Plan" SET "householdType" = 'SINGLE' WHERE "householdType" IS NULL;
ALTER TABLE "Plan" ALTER COLUMN "householdType" SET NOT NULL;
-- --- Szenario-Ebene verschlanken ----------------------------------------------------------
-- Person traegt nur noch Rolle + Pensionsalter; Name und Alter kommen vom Plan.
ALTER TABLE "Person" DROP COLUMN "name";
ALTER TABLE "Person" DROP COLUMN "age";
ALTER TABLE "Scenario" DROP COLUMN "householdType";
ALTER TABLE "Scenario" DROP COLUMN "startYear";