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
60 lines
3.3 KiB
Markdown
60 lines
3.3 KiB
Markdown
# #020 Vorgesetzter auch für von Hand angelegte Personen
|
|
|
|
**Status:** erledigt
|
|
**Im Tracker:** [#31](https://git.wilde-server.de/florian.wilde/Laufzettel/issues/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](017-seed-sieben-vorlagen.md) 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()` in `src/server/queries/mitarbeiter.ts`
|
|
- `vorgesetztenLesen()` in `src/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
|
|
|
|
- [x] **Entschieden: eigene Selbstbeziehung `vorgesetzterId`** — und die befürchteten „zwei Wege zur
|
|
selben Auskunft“ gibt es nicht, weil der Abgleich sie mitschreibt. `vorgesetzterExterneId`
|
|
bleibt damit wie `abteilung` nur der rohe Wert des Verzeichnisses; gelesen wird allein
|
|
`vorgesetzterId`. Die Alternative hätte manuellen Personen eine erfundene `externeId` geben
|
|
müssen, und `externeId` heißt „objectGUID aus dem Verzeichnis“ — das wäre eine Lüge im
|
|
Datenmodell gewesen
|
|
- [x] Beide Lesepfade und `{{vorgesetzter}}` / `{{vorgesetzter_sam}}` entsprechend erweitern
|
|
- [x] Oberfläche: Vorgesetzten auf der Mitarbeiterseite setzen und entfernen
|
|
- [x] Der Abgleich darf die Zuordnung nicht überschreiben, wenn das Verzeichnis keinen `manager`
|
|
liefert — und keine Schleife zulassen (A ist Vorgesetzter von B ist Vorgesetzter von A)
|
|
- [x] Seed: Petra Klein als Vorgesetzte von Maria Huber eintragen
|
|
|
|
## Akzeptanzkriterien
|
|
|
|
- [x] Test: eine von Hand angelegte Person bekommt einen Vorgesetzten, `{{vorgesetzter_sam}}` löst auf
|
|
- [x] Test: die Zuordnung gilt nur innerhalb desselben Kunden
|
|
- [x] Test: ein Abgleich ohne `manager` lö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](021-stabiler-schluessel-vorlagen.md): 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.
|