Die Zuordnung lief allein ueber vorgesetzterExterneId, und die ist nur
innerhalb einer Verzeichnisquelle eindeutig: eine von Hand angelegte Person
konnte keinen Vorgesetzten haben, und {{vorgesetzter_sam}} blieb im
Onboarding-Befehl leer -- genau dort, wo er gebraucht wird.
Entschieden fuer eine eigene Selbstbeziehung vorgesetzterId. Die befuerchteten
"zwei Wege zur selben Auskunft" entstehen nicht, weil der Abgleich sie
mitschreibt: vorgesetzterExterneId ist jetzt wie abteilung nur der rohe Wert
des Verzeichnisses, gelesen wird allein vorgesetzterId. Die Alternative haette
manuellen Personen eine erfundene externeId geben muessen, und externeId heisst
"objectGUID aus dem Verzeichnis".
Liefert das Verzeichnis keinen manager, bleibt eine von Hand gesetzte Zuordnung
stehen -- geleert wird nur, was das Verzeichnis selbst gesetzt hatte.
Die Migration fuehrt bestehende Daten nach. Ohne das waere die Auskunft nach
dem Einspielen bei jeder Verzeichnis-Person still leer gewesen, bis der
naechste Abgleich laeuft. An einem nachgebauten Vor-Zustand gefahren.
Drei Grenzen, drei Stellen: der zusammengesetzte Fremdschluessel haelt die
Mandantengrenze, ein CHECK die kuerzeste Schleife, und der Dienst laeuft die
Kette hinauf fuer laengere.
Im gebauten Stand durchgeklickt: speichern, neu laden, Wert steht, entfernen,
390 px ohne horizontales Scrollen. Gegenprobe am Abgleich gefahren.
Closes #31
3.3 KiB
#020 Vorgesetzter auch für von Hand angelegte Personen
Status: erledigt Im Tracker: #31 — die Zählung dort schließt Pull Requests ein und läuft deshalb auseinander Meilenstein: v0.2.0 Labels: phase-2, backend Geschätzt: 3 h Tatsächlich: 1 h 20 min
Ziel
Eine Person, die nicht aus dem Verzeichnis kommt, kann heute keinen Vorgesetzten haben. Das fiel in #017 auf: der Auftrag verlangt für den Beispielbestand „Maria Huber, Vorgesetzte Petra Klein“, und genau diese Zuordnung lässt sich nirgends speichern.
Woran es liegt
Mitarbeiter.vorgesetzterExterneId trägt die externeId des Vorgesetzten, und die ist nur
innerhalb einer Verzeichnisquelle eindeutig. Beide Lesepfade steigen deshalb aus, wenn die
Person keine Quelle hat:
vorgesetzterVon()insrc/server/queries/mitarbeiter.tsvorgesetztenLesen()insrc/server/services/platzhalter.ts
Das ist für Verzeichnis-Personen richtig. Für eine von Hand angelegte Person gibt es schlicht kein
Feld — {{vorgesetzter_sam}} bleibt dort immer leer.
Aufgaben
- Entschieden: eigene Selbstbeziehung
vorgesetzterId— und die befürchteten „zwei Wege zur selben Auskunft“ gibt es nicht, weil der Abgleich sie mitschreibt.vorgesetzterExterneIdbleibt damit wieabteilungnur der rohe Wert des Verzeichnisses; gelesen wird alleinvorgesetzterId. Die Alternative hätte manuellen Personen eine erfundeneexterneIdgeben müssen, undexterneIdheißt „objectGUID aus dem Verzeichnis“ — das wäre eine Lüge im Datenmodell gewesen - Beide Lesepfade und
{{vorgesetzter}}/{{vorgesetzter_sam}}entsprechend erweitern - Oberfläche: Vorgesetzten auf der Mitarbeiterseite setzen und entfernen
- Der Abgleich darf die Zuordnung nicht überschreiben, wenn das Verzeichnis keinen
managerliefert — und keine Schleife zulassen (A ist Vorgesetzter von B ist Vorgesetzter von A) - Seed: Petra Klein als Vorgesetzte von Maria Huber eintragen
Akzeptanzkriterien
- Test: eine von Hand angelegte Person bekommt einen Vorgesetzten,
{{vorgesetzter_sam}}löst auf - Test: die Zuordnung gilt nur innerhalb desselben Kunden
- Test: ein Abgleich ohne
managerlöscht eine von Hand gesetzte Zuordnung nicht
Beim Umsetzen dazugekommen
- Die Migration führt bestehende Daten nach. Ohne das wäre
{{vorgesetzter_sam}}nach dem Einspielen bei jeder Person aus dem Verzeichnis leer gewesen, bis der nächste Abgleich läuft — und zwar still. Dieselbe Falle wie der Seed-Schlüssel in #021: ein Umstieg, der die vorhandenen Daten nicht mitnimmt. An einem nachgebauten Vor-Zustand in der Entwicklungsdatenbank gefahren. - Der Seed setzt die Zuordnung nur für Personen, die derselbe Lauf angelegt hat. Eine leere Zuordnung sagt nicht, ob sie noch nie gesetzt oder im Betrieb entfernt wurde; ein zweiter Lauf darf nichts zurückdrehen.
- Zwei Schleifen-Prüfungen, nicht eine. Die Datenbank fängt die kürzeste ab
(
vorgesetzterId <> id), längere brauchen den Gang nach oben im Dienst — mit Obergrenze, damit eine schon beschädigte Kette die Suche nicht ewig laufen lässt.