Files
ClaudeandClaude Sonnet 5.5 bfe3895a50 Kundenansicht neu P7: Einschalten zeigt Linkzeile, Häkchen und Unterlagen der Fassung 6 aus P8
Verdrahtet P5 Task 15 und P7 Task 0 (N33): consentAbo liest Linkzeile und Hinweis aus WORTLAUT_V6, unterlagenFuer die fünf Funktionen aus FUNKTIONEN_UNTERLAGEN_V6 (Analyse bleibt bei den Alt-Unterlagen bis zur Freigabe), config.aboFunktionen.texte.hinweis entfällt, pdfAnhaenge liest PDFs der Fassung 6, sichereAdresse lässt /neu/rechtliches/ zu. Der Analyse-Kundenweg setzt wie der Team-Weg den Abo-Marker (unlockedBy und einrichtungAbrechnung abo).

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-16 19:56:40 +00:00

57 lines
3.0 KiB
JavaScript

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
}