Kundenansicht P5: Katalogfelder, consentAbo mit Hinweis und Unterlagen-Quelle im Funktionen-Register
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
8e0d2b2736
commit
4bf1b67e67
4 files changed
+268
-1
No files matched your search
@@ -0,0 +1,32 @@
|
||||
import { config } from '../config.js'
|
||||
import { legalPaths } from './analyseLegal.js'
|
||||
|
||||
/**
|
||||
* Einzige Quelle der verlinkten Unterlagen im Abo-Modell (Katalog, Einschalt-Nachweis, Analyse). Blattmodul: importiert
|
||||
* nur config und analyseLegal.js. Liest bei jedem Aufruf (Tests aendern config zur Laufzeit). Task 15 (Fassung 6) stellt
|
||||
* nur diese Quelle um; die Aufrufer bleiben unveraendert.
|
||||
*/
|
||||
|
||||
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: deren Eintraege; 'analyse': die versionierten Seiten aus legalPaths(config.analyse.avvVersion).
|
||||
* 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 eintrag = config.features[key]
|
||||
return { leistungsbeschreibung: fassung(eintrag.leistungsbeschreibung), avv: fassung(eintrag.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 } }
|
||||
}
|
||||
@@ -3,10 +3,12 @@ import { termineFuerKunde } from './termine/schalter.js'
|
||||
import { shopFuerKunde } from './shop/schalter.js'
|
||||
import { unterkunftFuerKunde } from './unterkunft/schalter.js'
|
||||
import { zeitenFuerKunde } from './zeiten/schalter.js'
|
||||
import { analyseUnterlagen, unterlagenFuer } from './aboUnterlagen.js'
|
||||
|
||||
// Helfer fuer das Funktionen-Register config.features (News-Pinnwand, Terminplaner, Webshop, Oeffnungszeiten live; Daten in server/config.js).
|
||||
// Diese Datei wird von siteFeatures.js importiert und importiert selbst keine Dienste statisch (einzige Ausnahmen:
|
||||
// termine/schalter.js, shop/schalter.js und zeiten/schalter.js, die nur config lesen): Standard-Haken laden ihre Dienste per dynamischem import()
|
||||
// termine/schalter.js, shop/schalter.js und zeiten/schalter.js, die nur config lesen, und aboUnterlagen.js, ein Blattmodul,
|
||||
// das nur config und analyseLegal.js importiert): Standard-Haken laden ihre Dienste per dynamischem import()
|
||||
// innerhalb der Funktion (sonst entstuenden Importzyklen).
|
||||
|
||||
/** Namen der Haken, die ein Registereintrag hat (optional): Bestell-, Freischalt- und Unterlagenpruefungen, dazu nachFreischaltung. */
|
||||
@@ -216,6 +218,77 @@ export function freiweg(feature) {
|
||||
return { ...feature, consent: feature.consentFrei }
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------------------------------------------
|
||||
// Abo-Modell der Funktionen (Kundenansicht neu, P5): Katalogfelder, Einschalt-Erklaerung ohne Preis und Unterlagen.
|
||||
// Reine Lesefunktionen auf config.features und config.aboFunktionen; die Unterlagen kommen aus aboUnterlagen.js.
|
||||
// ---------------------------------------------------------------------------------------------------------------
|
||||
|
||||
/** Schluessel des Katalogs in Anzeigereihenfolge (Kopie), mit 'analyse' am Ende. */
|
||||
export function katalogReihenfolge() {
|
||||
return [...config.aboFunktionen.reihenfolge]
|
||||
}
|
||||
|
||||
/** { beschreibung, bild, ablauf, einrichtung, nurBetrieb } einer Funktion (auch 'analyse'); unbekannter Schluessel => null. */
|
||||
export function katalogFelder(key) {
|
||||
const quelle = key === 'analyse' ? config.aboFunktionen.analyse : featureConfig(key)
|
||||
if (!quelle) return null
|
||||
const { beschreibung, bild, ablauf, einrichtung, nurBetrieb } = quelle
|
||||
return { beschreibung, bild, ablauf, einrichtung, nurBetrieb }
|
||||
}
|
||||
|
||||
/**
|
||||
* Einschalt-Erklaerung einer Funktion im Abo-Modell: { version, knopf: 'Einschalten', items } in Anzeigereihenfolge
|
||||
* einschalten-zeile (Linkzeile mit Fassung, kein Haken), hinweis (nur shop, unterkunft, termine; kein Haken) und beginn
|
||||
* (Haken, nur fuer Privatkunden innerhalb der Widerrufsfrist). Baut die Items bei jedem Aufruf aus aboUnterlagen.js und
|
||||
* config.aboFunktionen.texte. Analyse und unbekannte Schluessel => null.
|
||||
*/
|
||||
export function consentAbo(key) {
|
||||
if (!featureConfig(key)) return null
|
||||
const { leistungsbeschreibung, avv } = unterlagenFuer(key)
|
||||
const { fassung: version, texte } = config.aboFunktionen
|
||||
const zeile = avv
|
||||
? `Es gelten Leistungsbeschreibung und Auftragsverarbeitung (Fassung ${leistungsbeschreibung.version}).`
|
||||
: `Es gilt die Leistungsbeschreibung (Fassung ${leistungsbeschreibung.version}).`
|
||||
const items = [{ id: 'einschalten-zeile', text: zeile, haken: false }]
|
||||
if (Object.hasOwn(texte.hinweis, key)) items.push({ id: 'hinweis', text: texte.hinweis[key], haken: false })
|
||||
items.push({ id: 'beginn', text: texte.beginn, haken: true, nurPrivatInFrist: true })
|
||||
return { version, knopf: 'Einschalten', items }
|
||||
}
|
||||
|
||||
/** Die Erklaerung, wie sie angezeigt wird: ohne beginn, solange das Haekchen nicht verlangt ist. */
|
||||
export function consentAboAktiv(key, { beginn = false } = {}) {
|
||||
const consent = consentAbo(key)
|
||||
if (!consent) return null
|
||||
return { ...consent, items: consent.items.filter((item) => item.id !== 'beginn' || beginn) }
|
||||
}
|
||||
|
||||
/** Abo-Weg einer Funktion fuer den Nachweis: derselbe Eintrag mit der Abo-Erklaerung, den Unterlagen aus aboUnterlagen.js und ohne Widerrufsbelehrung. */
|
||||
export function aboweg(feature, { beginn = false } = {}) {
|
||||
const { leistungsbeschreibung, avv } = unterlagenFuer(feature.key)
|
||||
return { ...feature, consent: consentAboAktiv(feature.key, { beginn }), leistungsbeschreibung, avv, widerruf: null }
|
||||
}
|
||||
|
||||
/** Einschalt-Erklaerung der Analyse: Linkzeile (Fassung der AVV), Zielgruppen-Haken (Kinder unter 16) und Knopf. */
|
||||
export function consentAboAnalyse() {
|
||||
const { avvVersion } = analyseUnterlagen()
|
||||
const { fassung: version, texte } = config.aboFunktionen
|
||||
return {
|
||||
version,
|
||||
avvVersion,
|
||||
knopf: texte.analyseKnopf,
|
||||
items: [
|
||||
{ id: 'einschalten-zeile', text: `Es gelten Leistungsbeschreibung und Auftragsverarbeitung (Fassung ${avvVersion}).`, haken: false },
|
||||
{ id: 'zielgruppe', text: texte.zielgruppe, haken: true },
|
||||
],
|
||||
}
|
||||
}
|
||||
|
||||
/** Abo-Weg der Analyse in der Form, die speichereNachweisAusAnfrage erwartet. */
|
||||
export function abowegAnalyse() {
|
||||
const { avvVersion } = analyseUnterlagen()
|
||||
return { key: 'analyse', consent: consentAboAnalyse(), leistungsbeschreibung: { version: avvVersion }, avv: { version: avvVersion }, widerruf: null }
|
||||
}
|
||||
|
||||
const fassung = (f) => (f ? { version: f.version, url: f.url ?? '' } : null)
|
||||
|
||||
/**
|
||||
|
||||
Reference in new issue
Block a user