-- --------------------------------------------------------------------------- -- HANDGESCHRIEBEN. Prisma erzeugt hier zusaetzlich Loeschbefehle fuer die -- zusammengesetzten Fremdschluessel (Mandantengrenze), die Trigramm-Indizes -- (Archivsuche), die partiellen eindeutigen Indizes und die Trigger auf -- veroeffentlichten Versionen: es kennt sie nicht, weil sie sich im Schema nicht -- ausdruecken lassen. Diese Loeschbefehle sind bewusst gestrichen. -- -- tests/datenbankregeln.test.ts prueft, dass alle diese Objekte vorhanden sind – -- ein versehentlich stehengelassener Loeschbefehl faellt dort sofort auf. -- --------------------------------------------------------------------------- -- Mandantenspalte fuer das Protokoll (#023). -- -- CLAUDE.md verlangt sie fuer jede kundenbezogene Zeile. Das Protokoll hatte sie -- nicht, und damit liess sich die Protokoll-Ansicht nicht nach Mandant filtern, -- ohne je Eintrag die Entitaet nachzuschlagen. Leer heisst **global**: -- Einstellungen, Benutzer, kundenfreie Vorlagen, Schnellstart. ALTER TABLE "Protokoll" ADD COLUMN "kundeId" TEXT; CREATE INDEX "Protokoll_kundeId_erstelltAm_idx" ON "Protokoll"("kundeId", "erstelltAm"); ALTER TABLE "Protokoll" ADD CONSTRAINT "Protokoll_kundeId_fkey" FOREIGN KEY ("kundeId") REFERENCES "Kunde" ("id") ON DELETE RESTRICT ON UPDATE CASCADE; -- ---- Nachfuehrung --------------------------------------------------------- -- Vorhandene Eintraege bekommen ihren Kunden, soweit er sich ableiten laesst. -- Ohne das traegt jeder alte Eintrag "global" und waere fuer einen auf Kunden -- beschraenkten Benutzer sichtbar -- dieselbe Falle wie bei den Umstiegen in -- #021 und #020, nur hier mit Folgen fuer die Sichtbarkeit. -- 1. Alles, was an einem Lauf haengt: der Lauf kennt seinen Kunden. UPDATE "Protokoll" AS p SET "kundeId" = l."kundeId" FROM "Lauf" AS l WHERE p."laufId" = l."id" AND p."kundeId" IS NULL; -- 2. Die kundentragenden Entitaeten, je ueber ihre eigene Tabelle. UPDATE "Protokoll" AS p SET "kundeId" = m."kundeId" FROM "Mitarbeiter" AS m WHERE p."entitaet" = 'Mitarbeiter' AND p."entitaetId" = m."id" AND p."kundeId" IS NULL; UPDATE "Protokoll" AS p SET "kundeId" = g."kundeId" FROM "Geraet" AS g WHERE p."entitaet" = 'Geraet' AND p."entitaetId" = g."id" AND p."kundeId" IS NULL; UPDATE "Protokoll" AS p SET "kundeId" = a."kundeId" FROM "Abteilung" AS a WHERE p."entitaet" = 'Abteilung' AND p."entitaetId" = a."id" AND p."kundeId" IS NULL; UPDATE "Protokoll" AS p SET "kundeId" = q."kundeId" FROM "Verzeichnisquelle" AS q WHERE p."entitaet" = 'Verzeichnisquelle' AND p."entitaetId" = q."id" AND p."kundeId" IS NULL; -- 3. Ein Eintrag **ueber** einen Kunden gehoert zu diesem Kunden. UPDATE "Protokoll" AS p SET "kundeId" = k."id" FROM "Kunde" AS k WHERE p."entitaet" = 'Kunde' AND p."entitaetId" = k."id" AND p."kundeId" IS NULL; -- 4. Eine Vorlage traegt nur im Modus DIENSTLEISTUNG einen Kunden; ist sie -- kundenfrei, bleibt der Eintrag global. Genau richtig: sie gilt fuer alle. UPDATE "Protokoll" AS p SET "kundeId" = v."kundeId" FROM "Vorlage" AS v WHERE p."entitaet" = 'Vorlage' AND p."entitaetId" = v."id" AND p."kundeId" IS NULL; -- 5. Eine Version gehoert zum Kunden ihrer Vorlage. UPDATE "Protokoll" AS p SET "kundeId" = v."kundeId" FROM "VorlagenVersion" AS vv JOIN "Vorlage" AS v ON v."id" = vv."vorlageId" WHERE p."entitaet" = 'VorlagenVersion' AND p."entitaetId" = vv."id" AND p."kundeId" IS NULL; -- Alles Uebrige bleibt leer: Einstellung, Benutzer, GeraetetypVorlage und -- kundenfreie Vorlagen sind wirklich global. Eintraege zu **geloeschten** Zeilen -- bleiben ebenfalls leer und sind damit nicht zuordenbar — die Abfrage zeigt sie -- einem auf Kunden beschraenkten Benutzer deshalb **nicht** (fail closed, siehe -- src/server/queries/protokoll.ts).