feat(mitarbeiter): Vorgesetzter auch fuer Personen ohne Verzeichnis (#43)
Prüfung / pruefung (push) Canceled after 0s
Prüfung / e2e (push) Canceled after 0s

This commit was merged in pull request #43.
This commit is contained in:
2026-10-04 15:10:34 +00:00
parent 0fa41b9e08
commit 0060a55387
19 changed files with 683 additions and 49 deletions
+28 -4
View File
@@ -57,6 +57,8 @@ export type PersonenVorgabe = {
readonly upn: string;
readonly abteilung: string;
readonly titel: string;
/** UPN des Vorgesetzten – aufgeloest, nachdem alle Personen stehen. */
readonly vorgesetzterUpn?: string;
};
/**
@@ -64,10 +66,11 @@ export type PersonenVorgabe = {
* Haus ohne Verzeichnis entstehen.
*
* Maria Huber steht so im Auftrag und taucht in den Abnahmekriterien wieder auf.
* Ihre Vorgesetzte Petra Klein ist deshalb ebenfalls dabei; **gespeichert wird
* die Zuordnung nicht**: `vorgesetzterExterneId` zeigt auf die `externeId`
* derselben Verzeichnisquelle, und eine von Hand angelegte Person hat beides
* nicht. Im Onboarding-Lauf wird der Vorgesetzte ohnehin beim Start gewaehlt.
* Ihre Vorgesetzte Petra Klein ist deshalb ebenfalls dabei — **und die Zuordnung
* wird gespeichert**, seit `vorgesetzterId` es erlaubt (#020). Vorher ging das
* nicht: die Auskunft lief allein ueber `vorgesetzterExterneId`, und die zeigt
* auf die `externeId` derselben Verzeichnisquelle, die eine von Hand angelegte
* Person nicht hat.
*/
export const PERSONEN: readonly PersonenVorgabe[] = [
{
@@ -77,6 +80,7 @@ export const PERSONEN: readonly PersonenVorgabe[] = [
upn: "m.huber@firma.example",
abteilung: "Buchhaltung",
titel: "Sachbearbeiterin Rechnungsprüfung",
vorgesetzterUpn: "p.klein@firma.example",
},
{
vorname: "Petra",
@@ -230,6 +234,8 @@ export async function stammdatenSaeen(
let personen = 0;
const nachUpn = new Map<string, string>();
/** Nur diese bekommen eine Vorgesetzten-Zuordnung – siehe unten. */
const neuAngelegt = new Set<string>();
for (const vorgabe of PERSONEN) {
const vorhanden = await db.mitarbeiter.findFirst({ where: { kundeId, upn: vorgabe.upn } });
if (vorhanden) {
@@ -252,9 +258,27 @@ export async function stammdatenSaeen(
},
});
nachUpn.set(vorgabe.upn, angelegt.id);
neuAngelegt.add(vorgabe.upn);
personen += 1;
}
/*
* Die Vorgesetzten erst jetzt, wenn alle Personen stehen: eine Zuordnung
* zeigt auf eine Zeile, die beim Anlegen der ersten noch nicht da war.
*
* Nur fuer Personen, die **dieser Lauf** angelegt hat. Eine leere Zuordnung
* sagt nicht, ob sie noch nie gesetzt oder im Betrieb entfernt wurde — und ein
* zweiter Seed-Lauf darf nichts zurueckdrehen. Dieselbe Regel wie fuer alles
* andere hier.
*/
for (const vorgabe of PERSONEN) {
if (!vorgabe.vorgesetzterUpn || !neuAngelegt.has(vorgabe.upn)) continue;
const personId = nachUpn.get(vorgabe.upn);
const vorgesetzterId = nachUpn.get(vorgabe.vorgesetzterUpn);
if (!personId || !vorgesetzterId) continue;
await db.mitarbeiter.update({ where: { id: personId }, data: { vorgesetzterId } });
}
// Im Modus DIENSTLEISTUNG traegt der Hostname das Kundenkuerzel – dieselbe
// Regel, die auch die Namensvorschlaege benutzen (`{kundenkuerzel}-PC-{nnn}`).
const praefix = optionen.hostnamePraefix ? `${optionen.hostnamePraefix}-` : "";