Die Firmen-E-Mail als eigenes, freiwilliges Feld
employees.email ist die private Adresse (20260811140000). Sie taugt nicht als Dienstadresse und darf auch nicht als solche benutzt werden: der Honestly-Export geht an einen fremden Anbieter, der damit im Namen des Arbeitgebers einlaedt. Die Spalte "Email" stand dort deshalb seit jeher leer, mit einem Vermerk in lib/honestly.ts, dass die Firmenadresse im Datenmodell fehlt. Jetzt gibt es sie, und die Spalte fuellt sich. Eindeutig, aber freiwillig -- mehrere Personen ohne Adresse stoeren den Index nicht, weil null nie gleich null ist. Geschrieben wird ueber `case when ? then nullif` statt `coalesce`: eine Dienstadresse muss sich auch wieder entfernen lassen. Vier SQL-Funktionen mussten mit, weil `create or replace` die ganze Fassung ersetzt und ein ausgelassenes Feld dort still verschwindet: hire_employee und rehire_employee (beide teilen sich den Schritt "Person" -- das Formular haette das Feld gezeigt und den Wert weggeworfen), change_employee_data (sonst nicht aenderbar), apply_due_pending_changes (sonst verfiele eine auf spaeter datierte Aenderung) und die Feldkarte (sonst waere der Eintrag in der Historie nicht korrigierbar). Die Selbstpruefung am Ende prueft jede einzeln.
This commit is contained in:
@@ -24,6 +24,7 @@ function person(teil: Partial<Parameters<typeof baueHonestlyZeilen>[0][number]>
|
||||
// Die private Adresse, wie sie auf der Zeile aus der Datenbank steht —
|
||||
// sie darf im Export nirgends auftauchen.
|
||||
email: "anna.privat@example.test",
|
||||
company_email: "a.berger@firma.test",
|
||||
first_name: "Anna",
|
||||
last_name: "Berger",
|
||||
location_id: "wien",
|
||||
@@ -105,12 +106,17 @@ describe("baueHonestlyZeilen", () => {
|
||||
});
|
||||
});
|
||||
|
||||
it("lässt die E-Mail leer, bis es die Firmenadresse gibt", () => {
|
||||
// Die Spalte ist ein Platzhalter für die Firmen-E-Mail. Die private
|
||||
// Adresse (employees.email) gehört nicht in eine Datei an einen fremden
|
||||
// Anbieter — auch nicht, wenn sie vorhanden ist.
|
||||
it("nimmt die Firmenadresse in die E-Mail-Spalte", () => {
|
||||
const { zeilen, tiefe } = baueHonestlyZeilen([person()], maps, standorte);
|
||||
const zeile = Object.fromEntries(honestlySpalten(tiefe).map((s) => [s.header, s.get(zeilen[0])]));
|
||||
expect(zeile.Email).toBe("a.berger@firma.test");
|
||||
});
|
||||
|
||||
it("lässt die Spalte leer, wenn keine Firmenadresse hinterlegt ist", () => {
|
||||
// Eine fehlende Dienstadresse ist eine fehlende Angabe — und keine
|
||||
// Ausrede, ersatzweise die private zu nehmen.
|
||||
const { zeilen, tiefe } = baueHonestlyZeilen([person({ company_email: null })], maps, standorte);
|
||||
const zeile = Object.fromEntries(honestlySpalten(tiefe).map((s) => [s.header, s.get(zeilen[0])]));
|
||||
expect(zeile.Email).toBe("");
|
||||
});
|
||||
|
||||
@@ -120,6 +126,12 @@ describe("baueHonestlyZeilen", () => {
|
||||
const { zeilen, tiefe } = baueHonestlyZeilen([person()], maps, standorte);
|
||||
const csv = toCsv(zeilen, honestlySpalten(tiefe));
|
||||
expect(csv).not.toContain("anna.privat@example.test");
|
||||
expect(csv).toContain("a.berger@firma.test");
|
||||
});
|
||||
|
||||
it("nimmt auch dann nicht die private Adresse, wenn keine dienstliche da ist", () => {
|
||||
const { zeilen, tiefe } = baueHonestlyZeilen([person({ company_email: null })], maps, standorte);
|
||||
expect(toCsv(zeilen, honestlySpalten(tiefe))).not.toContain("anna.privat@example.test");
|
||||
});
|
||||
|
||||
it("behält die Spalte Email, auch solange sie leer ist", () => {
|
||||
|
||||
Reference in New Issue
Block a user