-- PDF-Berichte (Roadmap Nr. 11, SPEZIFIKATION 3.11). -- -- Die fertige PDF-Datei wird ALS BYTES abgelegt, nicht nur ihre Definition. Grund ist der -- Audit-Trail: Ein Bericht, den man heute erzeugt und verschickt, muss in drei Jahren -- byte-identisch wieder herunterladbar sein -- auch wenn sich Plan, Rechenkern oder Layout -- zwischenzeitlich geaendert haben. Eine Neuerzeugung koennte das nicht garantieren. -- -- Der App-Container wird bei jedem Deploy neu gebaut; nur das DB-Volume ueberlebt. Deshalb -- Postgres und nicht das Dateisystem. CREATE TABLE "Report" ( "id" TEXT NOT NULL, "planId" TEXT NOT NULL, "title" TEXT NOT NULL, -- Gewaehlte Parameter (Metrik, Quelle, Szenarien, Analysen) -- fuer die Liste und -- damit nachvollziehbar bleibt, wie der Bericht zustande kam. "config" JSONB NOT NULL DEFAULT '{}', -- Das eingefrorene Berichtsmodell (alle Zahlen). Erlaubt eine Zusammenfassung in der -- Liste, ohne das PDF zu oeffnen. "model" JSONB NOT NULL DEFAULT '{}', -- Die Datei selbst. "pdf" BYTEA NOT NULL, "pdfBytes" INTEGER NOT NULL DEFAULT 0, "createdById" TEXT NOT NULL, "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, CONSTRAINT "Report_pkey" PRIMARY KEY ("id") ); CREATE INDEX "Report_planId_createdAt_idx" ON "Report"("planId", "createdAt"); ALTER TABLE "Report" ADD CONSTRAINT "Report_planId_fkey" FOREIGN KEY ("planId") REFERENCES "Plan"("id") ON DELETE CASCADE ON UPDATE CASCADE; ALTER TABLE "Report" ADD CONSTRAINT "Report_createdById_fkey" FOREIGN KEY ("createdById") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;