import type { CsvForm, ExportColumn } from "./export"; // Der Export für LOLYO, die Mitarbeiter-App: eine Zeile je Person, die dort // einen Zugang bekommen soll. // // Diese Datei tut etwas anderes als die beiden Exporte daneben. Honestly lädt // zu einer Befragung ein, Cornerstone führt Stammdaten nach — hier entstehen // **Konten**, samt Passwort in der Zeile. Wer die Datei hat, hat damit einen // Zugang zu jedem Konto darin, solange niemand sein Passwort gewechselt hat. // Deshalb steht das Passwort nicht in dieser Datei: die Route reicht es herein // (app/api/export/lolyo/route.ts), und es gelangt damit nie in ein Bündel, das // der Browser lädt. Dieselbe Überlegung steht in lib/passwort.ts. // // Kopfzeile und Trennzeichen kommen aus der Vorlage des Anbieters, Zeichen für // Zeichen. Die gemischte Schreibweise — „Titel prefix" deutsch, „Title Suffix" // englisch — steht so darin; sie hier stillschweigend zu vereinheitlichen // hiesse, eine Spalte zu liefern, die LOLYO nicht zuordnet. /** * Semikolon, kein BOM, kein Formelschutz — so liest LOLYO die Datei. * * Die Vorgabe von toCsv ist für Excel gemacht. Das BOM hinge unsichtbar am * Namen der ersten Spalte, und „Benutzer/Code" käme beim Einlesen in keiner * Zuordnung mehr vor. * * Der Formelschutz stellt jedem Wert, der mit `=`, `+`, `-` oder `@` beginnt, * ein Hochkomma voran, damit Excel ihn nicht als Formel rechnet. Hier wäre das * falsch: **jede** österreichische Telefonnummer beginnt mit „+", und in LOLYO * stünde danach `'+4366…` als Nummer — in jedem Konto, und niemandem fiele es * beim Erzeugen auf. Die Datei liest eine Maschine, kein Mensch in Excel. */ export const LOLYO_CSV: CsvForm = { trenner: ";", bom: false, formelschutz: false }; /** Für alle dieselbe. Wer eine andere braucht, stellt sie in LOLYO um, nicht hier. */ export const LOLYO_SPRACHE = "DE"; /** * Die Gruppe, in die alle kommen. * * Fest vorgegeben, nicht aus der Organisationseinheit abgeleitet: LOLYO-Gruppen * sind Verteiler in der App und nicht die Aufbauorganisation. Beides * gleichzusetzen erzeugte 78 Gruppen, die dort niemand bestellt hat. */ export const LOLYO_GRUPPE = "Demo-Gruppe"; /** LOLYO holt die Bestätigung selbst ein; aus Alpenwerk kommt sie nie bestätigt. */ export const LOLYO_EMAIL_BESTAETIGT = "0"; /** * Die Anrede aus dem Geschlecht. * * Alpenwerk kennt genau zwei Werte (gender_type), und die Vorgabe nennt genau * zwei Anreden. Ein dritter Wert bliebe hier leer statt geraten — eine falsche * Anrede steht in jeder Nachricht, die die App verschickt. */ export function anrede(gender: string): string { if (gender === "m") return "Herr"; if (gender === "w") return "Frau"; return ""; } /** Die Person, so wie der Export sie braucht. */ export type LolyoQuelle = { id: string; company_email: string | null; title_prefix: string[]; title_suffix: string[]; first_name: string; last_name: string; job_title: string; phone: string | null; gender: string; }; export type LolyoZeile = Record; /** * Eine Zeile. * * Der Benutzercode ist die Alpenwerk-UUID. Anders als bei Cornerstone ist das * hier richtig: LOLYO kennt die Person noch nicht und vergibt keine eigene * Kennung, die wir treffen müssten — die UUID ist der Schlüssel, über den sich * ein späterer Abgleich wieder auf dieselbe Person bezieht. * * Die E-Mail-Spalte trägt die **Firmenadresse** und niemals die private aus * employees.email: die Datei legt Konten bei einem fremden Anbieter an. */ export function baueLolyoZeile(p: LolyoQuelle, passwort: string): LolyoZeile { return { "Benutzer/Code": p.id, Email: p.company_email ?? "", Passwort: passwort, "Titel prefix": p.title_prefix.join(" "), Vorname: p.first_name, Nachname: p.last_name, "Title Suffix": p.title_suffix.join(" "), Position: p.job_title, Gruppen: LOLYO_GRUPPE, Telefon: p.phone ?? "", Anrede: anrede(p.gender), Sprache: LOLYO_SPRACHE, "E-Mail bestätigt": LOLYO_EMAIL_BESTAETIGT, }; } /** Die Spalten in der Reihenfolge der Vorlage. */ export const LOLYO_SPALTEN: readonly string[] = [ "Benutzer/Code", "Email", "Passwort", "Titel prefix", "Vorname", "Nachname", "Title Suffix", "Position", "Gruppen", "Telefon", "Anrede", "Sprache", "E-Mail bestätigt", ]; export function lolyoSpalten(): ExportColumn[] { return LOLYO_SPALTEN.map((header) => ({ header, get: (z) => z[header] ?? "" })); }