Export fuer LOLYO, und die Zielsystem-Exporte in einem eigenen Abschnitt
LOLYO ist die dritte Datei, die in ein fremdes System geladen wird. Spalten,
Trennzeichen und Schreibweise kommen aus der Vorlage des Anbieters, Zeichen fuer
Zeichen -- einschliesslich der gemischten Kopfzeile ("Titel prefix" deutsch,
"Title Suffix" englisch). Semikolon und kein BOM: das BOM haenge unsichtbar am
Namen der ersten Spalte, und "Benutzer/Code" kaeme in keiner Zuordnung mehr vor.
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 muessten.
Diese Datei legt Konten an, samt Passwort in der Zeile. Das Startpasswort steht
deshalb in der Route und nicht in lib/lolyo.ts: eine Route ist serverseitig, eine
lib-Datei waere nur so lange sicher, wie niemand sie aus einem Client-Bauteil
heraus einbindet -- und das saehe man dem Buendel nicht an. Dieselbe Ueberlegung
steht in lib/passwort.ts.
Die drei Zielsystem-Exporte stehen jetzt unter einer gemeinsamen Ueberschrift,
getrennt vom Datenexport darueber. Der gibt Zahlen heraus, die jemand ansieht;
diese legen im Zielsystem Datensaetze an. Nebeneinander in einer Reihe
gleichartiger Karten war das nicht zu sehen. Die Auswahl steht damit einmal
statt dreimal da.
Der erklaerende Text unter dem Cornerstone-Export entfaellt auf Wunsch des
Kunden.
This commit is contained in:
119
lib/lolyo.ts
Normal file
119
lib/lolyo.ts
Normal file
@@ -0,0 +1,119 @@
|
||||
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 — so sieht die Vorlage aus.
|
||||
*
|
||||
* Die Vorgabe von toCsv ist für Excel gemacht und setzt ein BOM voran; das
|
||||
* hinge unsichtbar am Namen der ersten Spalte, und „Benutzer/Code" käme beim
|
||||
* Einlesen in keiner Zuordnung mehr vor.
|
||||
*/
|
||||
export const LOLYO_CSV: CsvForm = { trenner: ";", bom: 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<string, string>;
|
||||
|
||||
/**
|
||||
* 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<LolyoZeile>[] {
|
||||
return LOLYO_SPALTEN.map((header) => ({ header, get: (z) => z[header] ?? "" }));
|
||||
}
|
||||
Reference in New Issue
Block a user