feat(protokoll): Protokoll ansehen, mit Filtern und Mandantensicht (#45)
This commit was merged in pull request #45.
This commit is contained in:
@@ -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).
|
||||
@@ -135,6 +135,7 @@ model Kunde {
|
||||
geraete Geraet[]
|
||||
laeufe Lauf[]
|
||||
mitarbeiter Mitarbeiter[]
|
||||
protokolle Protokoll[]
|
||||
verzeichnisquellen Verzeichnisquelle[]
|
||||
vorlagen Vorlage[]
|
||||
|
||||
@@ -608,6 +609,12 @@ model Kommentar {
|
||||
model Protokoll {
|
||||
id String @id @default(cuid())
|
||||
laufId String?
|
||||
/// Der Kunde, um den es geht — **leer heisst global** (Einstellungen,
|
||||
/// Benutzer, kundenfreie Vorlagen, Schnellstart). CLAUDE.md verlangt die
|
||||
/// Spalte fuer jede kundenbezogene Zeile; ohne sie liess sich das Protokoll
|
||||
/// nicht nach Mandant filtern, ohne je Eintrag die Entitaet nachzuschlagen
|
||||
/// (#023).
|
||||
kundeId String?
|
||||
entitaet String
|
||||
entitaetId String
|
||||
aktion String
|
||||
@@ -617,11 +624,13 @@ model Protokoll {
|
||||
erstelltAm DateTime @default(now())
|
||||
|
||||
lauf Lauf? @relation(fields: [laufId], references: [id], onDelete: Restrict)
|
||||
kunde Kunde? @relation(fields: [kundeId], references: [id], onDelete: Restrict)
|
||||
benutzer Benutzer? @relation(fields: [benutzerId], references: [id], onDelete: Restrict)
|
||||
|
||||
@@index([laufId, erstelltAm])
|
||||
@@index([entitaet, entitaetId])
|
||||
@@index([erstelltAm])
|
||||
@@index([kundeId, erstelltAm])
|
||||
}
|
||||
|
||||
/// Sperre fuer Aufgaben, die nur einmal gleichzeitig laufen duerfen – zuerst der
|
||||
|
||||
Reference in New Issue
Block a user