import { readFile } from 'node:fs/promises' import path from 'node:path' import { fileURLToPath } from 'node:url' import { config } from '../config.js' import { legalPaths } from './analyseLegal.js' import { FUNKTIONEN_UNTERLAGEN_V6 } from './products.js' /** * Einzige Quelle der verlinkten Unterlagen im Abo-Modell (Katalog, Einschalt-Nachweis, Analyse). Blattmodul: importiert * nur config, analyseLegal.js und products.js (das selbst nur config und den Schalter liest). Liest bei jedem Aufruf (Tests * aendern config zur Laufzeit). Verdrahtung der Fassung 6 (N33): die fuenf Funktionen des Registers lesen * FUNKTIONEN_UNTERLAGEN_V6; die Analyse bleibt bis zur Freigabe bei den versionierten Alt-Seiten (legalPaths). */ const fassung = (unterlage) => (unterlage ? { version: unterlage.version, url: unterlage.url ?? '' } : null) /** * Leistungsbeschreibung und AVV einer Funktion: { leistungsbeschreibung: { version, url } | null, avv: { version, url } | null }. * Funktionen aus dem Register: die Dokumente der Fassung 6 aus FUNKTIONEN_UNTERLAGEN_V6 (Vorschaupfad /neu/rechtliches/, ohne Preise); * 'analyse': die versionierten Seiten aus legalPaths(config.analyse.avvVersion) (N33: erst nach der Freigabe auf Fassung 6). * Ein unbekannter Schluessel ist ein Programmfehler (TypeError). */ export function unterlagenFuer(key) { if (key === 'analyse') { const version = config.analyse.avvVersion const pfade = legalPaths(version) return { leistungsbeschreibung: { version, url: pfade.lb }, avv: { version, url: pfade.avv } } } if (typeof key !== 'string' || !Object.hasOwn(config.features, key)) throw new TypeError(`Unbekannte Funktion: ${String(key)}`) const unterlagen = FUNKTIONEN_UNTERLAGEN_V6[key] if (!unterlagen) throw new TypeError(`Keine Unterlagen der Fassung 6 fuer: ${key}`) return { leistungsbeschreibung: fassung(unterlagen.lb), avv: fassung(unterlagen.avv) } } /** Unterlagen der Analyse fuer Nachweis und Mail: { avvVersion, legal: { lb, avv } } (Adressen der versionierten Seiten). */ export function analyseUnterlagen() { const { leistungsbeschreibung, avv } = unterlagenFuer('analyse') return { avvVersion: avv.version, legal: { lb: leistungsbeschreibung.url, avv: avv.url } } } const PUBLIC_DIR = path.join(path.dirname(fileURLToPath(import.meta.url)), '..', '..', 'public') /** * PDF-Anhaenge fuer Mails aus Dokumenten der Fassung 6: [{ pdfFile, anhangName }] -> [{ filename: anhangName, content, contentType }]. * Wirft, wenn eine Datei fehlt, leer ist oder nicht mit %PDF- beginnt (nie ein leerer oder falscher Anhang). basis: Wurzel von * pdfFile (Vorgabe: public/). */ export async function pdfAnhaenge(dokumente, { basis = PUBLIC_DIR } = {}) { const anhaenge = [] for (const dok of dokumente) { const content = await readFile(path.join(basis, dok.pdfFile)) if (content.length === 0 || content.subarray(0, 5).toString('latin1') !== '%PDF-') throw new Error(`PDF fehlt oder ist ungueltig: ${dok.pdfFile}`) anhaenge.push({ filename: dok.anhangName, content, contentType: 'application/pdf' }) } return anhaenge }