feat(protokoll): Protokoll ansehen, mit Filtern und Mandantensicht (#45)
Prüfung / pruefung (push) Canceled after 0s
Prüfung / e2e (push) Canceled after 0s

This commit was merged in pull request #45.
This commit is contained in:
2026-10-04 16:06:26 +00:00
parent f5936327a0
commit e1f244e4e8
23 changed files with 1103 additions and 22 deletions
@@ -0,0 +1,78 @@
-- ---------------------------------------------------------------------------
-- 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).