Files
Laufzettel/docs/issues/020-vorgesetzter-manuell.md
T
Florian Wilde 02ca74e661
Prüfung / pruefung (pull_request) Canceled after 0s
Prüfung / pruefung (push) Canceled after 0s
Prüfung / e2e (pull_request) Canceled after 0s
Prüfung / e2e (push) Canceled after 0s
feat(mitarbeiter): Vorgesetzter auch fuer Personen ohne Verzeichnis
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
2026-10-04 17:09:54 +02:00

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() 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

  • 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
  • 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 manager liefert — 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 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: 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.