-- Versionierung je Szenario (SPEZIFIKATION 3.8, 4.16). -- -- Eine Version haelt den VOLLSTAENDIGEN Zustand des Szenarios als JSON (Form: PlanInput), -- nicht eine Differenz. Grund: Alle Analysewerkzeuge nehmen ohnehin PlanInput entgegen -- -- damit lassen sich alte Staende ohne Umbau rechnen, anzeigen und wiederherstellen. -- Laufende Hauptversion des Szenarios. Nebenversionen zaehlen in ScenarioVersion. ALTER TABLE "Scenario" ADD COLUMN "currentMajor" INTEGER NOT NULL DEFAULT 1; CREATE TABLE "ScenarioVersion" ( "id" TEXT NOT NULL, "scenarioId" TEXT NOT NULL, -- Version A.B: major wird manuell hochgezogen, minor je Bearbeitungssitzung. "major" INTEGER NOT NULL, "minor" INTEGER NOT NULL, -- Pflicht bei Hauptversionen, sonst leer. Wiederherstellungen tragen hier ihre Herkunft. "comment" TEXT, "isMajor" BOOLEAN NOT NULL DEFAULT false, -- Wer die Version erzeugt hat. Heute immer der Eigentuemer; vorbereitet auf spaetere -- Freigabe an einen Finanzberater. "createdById" TEXT NOT NULL, -- Vollstaendiger Zustand (PlanInput als JSON). "snapshot" JSONB NOT NULL, "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, -- Wird bei Zusammenfassung innerhalb einer Bearbeitungssitzung mitgezogen. "updatedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, CONSTRAINT "ScenarioVersion_pkey" PRIMARY KEY ("id") ); CREATE UNIQUE INDEX "ScenarioVersion_scenarioId_major_minor_key" ON "ScenarioVersion"("scenarioId", "major", "minor"); -- Die Historie wird immer neuestzuerst gelesen. CREATE INDEX "ScenarioVersion_scenarioId_createdAt_idx" ON "ScenarioVersion"("scenarioId", "createdAt"); ALTER TABLE "ScenarioVersion" ADD CONSTRAINT "ScenarioVersion_scenarioId_fkey" FOREIGN KEY ("scenarioId") REFERENCES "Scenario"("id") ON DELETE CASCADE ON UPDATE CASCADE; -- Beim Loeschen eines Benutzers verschwinden dessen Plaene ohnehin per Cascade; der -- Verweis bleibt bewusst RESTRICT-frei, damit die Historie nie ein Loeschen blockiert. ALTER TABLE "ScenarioVersion" ADD CONSTRAINT "ScenarioVersion_createdById_fkey" FOREIGN KEY ("createdById") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;