feat(mitarbeiter): Vorgesetzter auch fuer Personen ohne Verzeichnis (#43)
This commit was merged in pull request #43.
This commit is contained in:
@@ -0,0 +1,62 @@
|
||||
-- ---------------------------------------------------------------------------
|
||||
-- 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.
|
||||
-- ---------------------------------------------------------------------------
|
||||
|
||||
-- Vorgesetzter auch fuer von Hand angelegte Personen (#020).
|
||||
--
|
||||
-- Bisher lief die Auskunft allein ueber `vorgesetzterExterneId`, und die ist nur
|
||||
-- innerhalb einer Verzeichnisquelle eindeutig: eine Person ohne Quelle konnte
|
||||
-- keinen Vorgesetzten haben, {{vorgesetzter_sam}} blieb dort immer leer.
|
||||
ALTER TABLE "Mitarbeiter"
|
||||
ADD COLUMN "vorgesetzterId" TEXT;
|
||||
|
||||
CREATE INDEX "Mitarbeiter_vorgesetzterId_idx" ON "Mitarbeiter"("vorgesetzterId");
|
||||
|
||||
ALTER TABLE "Mitarbeiter"
|
||||
ADD CONSTRAINT "Mitarbeiter_vorgesetzterId_fkey"
|
||||
FOREIGN KEY ("vorgesetzterId") REFERENCES "Mitarbeiter" ("id")
|
||||
ON DELETE RESTRICT ON UPDATE CASCADE;
|
||||
|
||||
-- Die Mandantengrenze, wie bei Lauf und Geraet: der Vorgesetzte gehoert zum
|
||||
-- selben Kunden. MATCH SIMPLE ist richtig — ist die Spalte NULL, greift der
|
||||
-- Fremdschluessel nicht, eine Person ohne Vorgesetzten bleibt also erlaubt.
|
||||
ALTER TABLE "Mitarbeiter"
|
||||
ADD CONSTRAINT "Mitarbeiter_vorgesetzter_gleicher_kunde"
|
||||
FOREIGN KEY ("vorgesetzterId", "kundeId") REFERENCES "Mitarbeiter" ("id", "kundeId")
|
||||
ON DELETE RESTRICT ON UPDATE CASCADE;
|
||||
|
||||
-- Niemand ist sein eigener Vorgesetzter. Das ist die kuerzeste Schleife und die
|
||||
-- einzige, die sich ohne Rekursion abfangen laesst; laengere haelt der Dienst
|
||||
-- auf (siehe mitarbeiter.ts, vorgesetztenSetzen).
|
||||
ALTER TABLE "Mitarbeiter"
|
||||
ADD CONSTRAINT "Mitarbeiter_vorgesetzter_nicht_selbst"
|
||||
CHECK ("vorgesetzterId" IS NULL OR "vorgesetzterId" <> "id");
|
||||
|
||||
-- Nachfuehrung fuer bestehende Installationen.
|
||||
--
|
||||
-- Ohne sie waere `{{vorgesetzter_sam}}` nach dieser Migration bei **jeder**
|
||||
-- Person aus dem Verzeichnis leer, bis der naechste Abgleich laeuft -- und zwar
|
||||
-- still: die Auskunft lief bisher allein ueber `vorgesetzterExterneId`, der neue
|
||||
-- Leseweg nimmt nur `vorgesetzterId`. Dieselbe Falle wie beim Seed-Schluessel
|
||||
-- in #021: ein Umstieg, der die vorhandenen Daten nicht mitnimmt.
|
||||
--
|
||||
-- Die Zuordnung laeuft ueber die `externeId` **derselben** Quelle, genau wie der
|
||||
-- alte Leseweg: die Kennung ist nur dort eindeutig.
|
||||
UPDATE "Mitarbeiter" AS person
|
||||
SET "vorgesetzterId" = chef."id"
|
||||
FROM "Mitarbeiter" AS chef
|
||||
WHERE person."vorgesetzterExterneId" IS NOT NULL
|
||||
AND person."quelleId" IS NOT NULL
|
||||
AND chef."quelleId" = person."quelleId"
|
||||
AND chef."externeId" = person."vorgesetzterExterneId"
|
||||
-- Die Mandantengrenze gilt auch hier; stand je eine Zuordnung ueber Kunden
|
||||
-- hinweg in den Daten, bliebe sie leer statt den Fremdschluessel zu brechen.
|
||||
AND chef."kundeId" = person."kundeId"
|
||||
AND chef."id" <> person."id";
|
||||
Reference in New Issue
Block a user