Files
Laufzettel/docs/issues/020-vorgesetzter-manuell.md
T
florian.wilde 0060a55387
Prüfung / pruefung (push) Canceled after 0s
Prüfung / e2e (push) Canceled after 0s
feat(mitarbeiter): Vorgesetzter auch fuer Personen ohne Verzeichnis (#43)
2026-10-04 15:10:34 +00:00

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.