Files
alpenwerk-hr/app/api/export/lolyo/route.ts
Andrei Laas 676cecbf15
Some checks failed
CI / Migrationen auf leerer Datenbank (push) Has been cancelled
CI / Lint, Typen, Tests, Build (push) Has been cancelled
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.
2026-09-28 13:45:38 +02:00

46 lines
2.2 KiB
TypeScript

import { NextResponse, type NextRequest } from "next/server";
import { exportFilename, exportResponseHeaders, toCsv, toXlsx } from "@/lib/export";
import { exportParameter, ladeExportMitarbeiter } from "@/lib/export-auswahl";
import { baueLolyoZeile, LOLYO_CSV, lolyoSpalten } from "@/lib/lolyo";
import { requireHrUser } from "@/lib/auth/require-hr";
import { withUser } from "@/lib/db";
// Der Export für die Mitarbeiter-App LOLYO — Spalten und feste Werte stehen in
// lib/lolyo.ts.
//
// Dieselben Personen wie im vollständigen Export daneben, mit denselben Filtern
// (lib/export-auswahl.ts). Wer nur einen Bereich oder nur die Aktiven anlegen
// will, stellt das auf der Berichtsseite ein, bevor er exportiert.
/**
* Das gemeinsame Startpasswort, mit dem die Konten in LOLYO angelegt werden.
*
* Steht bewusst **hier** und nicht in lib/lolyo.ts: eine Route ist serverseitig
* und gelangt nie in ein Bündel, das der Browser lädt. Eine Konstante in einer
* lib-Datei wäre nur so lange sicher, wie niemand sie aus einem Client-Bauteil
* heraus einbindet — und das sähe man dem Bündel nicht an. Dieselbe Überlegung
* steht in lib/passwort.ts.
*
* Es ist dasselbe Passwort wie in Alpenwerk, so bestellt. Damit gilt hier auch
* dasselbe: es ist allen gemeinsam und damit bekannt, und es trägt so lange,
* bis die Person es wechselt. Die erzeugte Datei ist deshalb kein Anhang, den
* man weiterleitet.
*/
const STARTPASSWORT = "Initialpasswort2026!";
export async function GET(request: NextRequest) {
const gate = await requireHrUser();
if ("denied" in gate) return gate.denied;
const { format, asOf, filters } = exportParameter(request.nextUrl.searchParams);
const { rows } = await withUser(gate.userId, (tx) => ladeExportMitarbeiter(tx, { asOf, filters }));
const zeilen = rows.map((r) => baueLolyoZeile(r, STARTPASSWORT));
const spalten = lolyoSpalten();
const filename = exportFilename("lolyo-export", format);
const body = format === "xlsx" ? await toXlsx(zeilen, spalten, "LOLYO") : toCsv(zeilen, spalten, LOLYO_CSV);
// Derselbe Umweg über Blob wie im vollständigen Export (TS#59417).
return new NextResponse(new Blob([body as BlobPart]), { headers: exportResponseHeaders(filename, format) });
}