-- 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";