Files
florian.wilde e1f244e4e8
Prüfung / pruefung (push) Canceled after 0s
Prüfung / e2e (push) Canceled after 0s
feat(protokoll): Protokoll ansehen, mit Filtern und Mandantensicht (#45)
2026-10-04 16:06:26 +00:00

79 lines
3.7 KiB
SQL
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
-- ---------------------------------------------------------------------------
-- 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).