# #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.