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) }); }