Die Cornerstone-ID als eigenes, freiwilliges Feld
All checks were successful
CI / Lint, Typen, Tests, Build (push) Successful in 11m58s
CI / Migrationen auf leerer Datenbank (push) Successful in 10m24s

Cornerstone fuehrt jede Person unter einer eigenen Kennung. Der Export
dorthin trug in "User ID" und "Username" bisher die Alpenwerk-UUID --
richtig, solange es nichts Besseres gab, aber nicht die Kennung, unter
der Cornerstone die Person kennt. Jetzt steht dort diese Spalte.

Freiwillig, weil die Zuordnungstabelle des Kunden fuer 434 der 784
Personen keine Kennung liefert. Eindeutig, weil eine Kennung genau einer
Person gehoert. Als Text, weil fuehrende Nullen in einer numerischen
Spalte verlorengingen.

Ohne hinterlegte Kennung bleiben User ID und Username **leer**. Ein
Rueckfall auf die UUID braechte zwei Kennungsarten in eine Datei, ohne
dass es auffiele, und legte in Cornerstone eine zweite Person neben der
bestehenden an. Eine fehlende Angabe soll fehlen; dafuer gibt es einen
eigenen Test.

Fuenf Funktionen mussten mit -- dieselbe Liste und derselbe Grund wie bei
der Firmen-E-Mail: hire_employee und rehire_employee teilen sich den
Schritt "Person", change_employee_data macht das Feld aenderbar,
apply_due_pending_changes sorgt dafuer, dass eine datierte Aenderung
nicht verfaellt, app_feld_karte haelt den Eintrag in der Historie
richtigstellbar. Die Migration ist wieder erzeugt, nicht abgeschrieben,
und prueft jede der fuenf einzeln.

Erfasst wird das Feld in der Akte, in "Daten aendern", bei Einstellung
und Wiedereintritt sowie ueber den Massenimport; es steht im
Mitarbeiterexport und fuellt im Cornerstone-Export User ID und Username.
This commit is contained in:
2026-09-28 10:13:52 +02:00
parent 6717412c9f
commit c3e19606e2
16 changed files with 959 additions and 15 deletions

View File

@@ -31,6 +31,9 @@ const VORGABE =
"User ID,Local System ID,Prefix,First Name,Middle Name,Last Name,Suffix,Username,Approver,Manager,Absent,Allow Reconciliation,Email,Required Training Approvals,Gender,Exempt,Ethnicity,Months of Service,Compensation Currency,Address Line 1,Address Line 2,City,State,Zip,Mailstop,Country,Original Hire Date,Last Hire Date,Phone,Mobile,Home Phone,Fax,Status,User activation date,User de-activation date,Personal Email,Language,Time Zone,User Type,Employment Status,Leave Reason,Termination Type,Termination Reason,Termination Date,Eligible For Rehire,Rehired Employee,Division ID,Position ID,Grade ID,Cost Center ID,Location ID,Retention Rules,Organisationsstufe,Customfield ID AD,Customfield ID Doxis,Customfield ID Interflex,Customfield ID LGVplus";
const UUID = "8f2b1c40-9d3e-4a77-b2c1-5e6f70a81234";
// Die Kennung, unter der Cornerstone die Person kennt — seit 20260928100000
// fuehrt Alpenwerk sie mit, und sie steht in User ID und Username.
const CS_ID = "10000382";
const kontext: CornerstoneKontext = {
managerNummer: new Map([["chef", 1000]]),
@@ -47,6 +50,7 @@ function person(teil: Partial<CornerstoneQuelle> = {}): CornerstoneQuelle {
title_suffix: [],
gender: "m",
company_email: "m.test@alpenwerk.test.com",
cornerstone_id: CS_ID,
address: "Teststrasse 2",
postal_code: "1010",
city: "Wien",
@@ -142,7 +146,7 @@ describe("Eine Zeile gegen das Muster vom 27.09.2026", () => {
"Local System ID": "9002",
"First Name": "Max",
"Last Name": "Alpentest",
Username: UUID,
Username: CS_ID,
Email: "m.test@alpenwerk.test.com",
Gender: "male",
"Compensation Currency": "EUR",
@@ -246,12 +250,24 @@ describe("Benutzername und Benutzer-ID", () => {
expect(z.Username).toBe(z["User ID"]);
});
it("sind die UUID aus Alpenwerk, nicht die Personalnummer", () => {
// Die UUID aendert sich nie; eine Personalnummer kann berichtigt werden,
// und dann waere die Person in Cornerstone eine andere.
it("sind die Cornerstone-ID, nicht die UUID und nicht die Personalnummer", () => {
// Hier stand die Alpenwerk-UUID, solange Alpenwerk die Kennung des
// Lernsystems nicht kannte. Sie sagte dort niemandem etwas.
const z = zeile();
expect(z["User ID"]).toBe(UUID);
expect(z.Username).toBe(UUID);
expect(z["User ID"]).toBe(CS_ID);
expect(z.Username).toBe(CS_ID);
expect(z["User ID"]).not.toBe(UUID);
expect(z["User ID"]).not.toBe("9002");
});
it("bleiben leer, wenn keine Cornerstone-ID hinterlegt ist", () => {
// Kein Rueckfall auf die UUID: das braechte zwei Kennungsarten in eine
// Datei, ohne dass es auffiele, und legte in Cornerstone eine zweite
// Person neben der bestehenden an. Eine fehlende Angabe soll fehlen.
const z = baueCornerstoneZeile(person({ cornerstone_id: null }), kontext);
expect(z["User ID"]).toBe("");
expect(z.Username).toBe("");
expect(JSON.stringify(z)).not.toContain(UUID);
});
it("fuehren die LOGA-Personalnummer in Local System ID", () => {