// Testdaten für P3 (Funktionen-Rahmen der Kundenansicht neu). Form laut GET /api/funktionen im Abo-Modell // (server/routes/funktionen.js, server/services/aboKatalog.js, featureRegistry.js consentAbo, siteFeatures.js featureView). // Beträge und Preise gibt es hier nicht: der Katalog trägt keinen Preis. const KEYS = ['news', 'termine', 'shop', 'unterkunft', 'zeiten', 'analyse'] const NAMEN = { news: 'News-Pinnwand', termine: 'Terminplaner', shop: 'Webshop', unterkunft: 'Buchungskalender', zeiten: 'Öffnungszeiten live', analyse: 'Analyse' } const EINRICHTUNG = { termine: 'meist in 1–2 Wochen', unterkunft: 'meist in 1–2 Wochen', shop: 'meist in 2–3 Wochen' } // Hinweis ohne Haken (N17): nur Webshop, Buchungskalender und Terminplaner; Texte wie config.aboFunktionen.texte.hinweis const HINWEISE = { shop: 'Du verkaufst in eigenem Namen und bist für deine Produkte, Preise und Rechtstexte verantwortlich. Die Zahlungen deiner Käufer laufen über dein eigenes Stripe-Konto.', unterkunft: 'Du vermietest in eigenem Namen und bist für Preise, Stornobedingungen, Rechnungen und Meldepflichten verantwortlich. Online-Zahlungen deiner Gäste laufen über dein eigenes Stripe-Konto.', termine: 'Der Terminplaner ist nicht für den Gesundheitsbereich gedacht. Das fragen wir im Fragebogen ab.', } const BEGINN = 'Bitte beginnt sofort mit der Einrichtung. Mir ist klar: Mit der vollständigen Einrichtung erlischt mein Widerrufsrecht, und wenn ich vorher widerrufe, zahle ich den bis dahin erbrachten Teil.' /** Ein Katalogeintrag mit den Standardwerten des Schlüssels; edit überschreibt Felder. */ export function katalogEintrag(key, edit = {}) { const hinweis = HINWEISE[key] ?? null const items = [{ id: 'einschalten-zeile', text: 'Es gelten Leistungsbeschreibung und Auftragsverarbeitung (Fassung 2026-10-05).', haken: false }] if (hinweis) items.push({ id: 'hinweis', text: hinweis, haken: false }) items.push({ id: 'beginn', text: BEGINN, haken: true, nurPrivatInFrist: true }) return { key, name: NAMEN[key], beschreibung: `Beschreibung ${NAMEN[key]}.`, bild: `/neu/bilder/${key}.webp`, enthaltenIn: key === 'analyse' ? 'hosting' : 'wartung', verfuegbar: true, ablauf: key === 'termine' ? 'fragebogen' : (key === 'shop' || key === 'unterkunft') ? 'anfrage' : 'direkt', einrichtung: EINRICHTUNG[key] ?? 'meist in wenigen Tagen', unterlagen: { leistungsbeschreibung: { version: '2026-10-05', url: `/rechtliches/leistungsbeschreibung-${key}-2026-10-05.html` }, avv: { version: '2026-10-05', url: `/rechtliches/avv-${key}-2026-10-05.html` }, }, nurBetrieb: key === 'shop', consent: key === 'analyse' ? null : { version: '2026-10-20', knopf: 'Einschalten', items }, hinweis: key === 'analyse' ? null : hinweis, ...edit, } } /** Zustand einer Funktion an einer Website (featureView). */ export function feature(state = 'off', extra = {}) { return { state, siteKey: null, ticketWoid: null, activatedAt: null, disabledReason: null, loeschungAm: null, ...extra } } /** Eine Website mit den Zuständen der Funktionen; Webshop und Buchungskalender tragen den Anfragestatus (N18). */ export function projekt(projectId, projectName, features = {}, analyse = { state: 'off' }) { return { projectId, projectName, liveUrl: '', features: { news: feature('off'), termine: feature('off'), shop: feature('off', { anfrageStatus: '' }), unterkunft: feature('off', { anfrageStatus: '' }), zeiten: feature('off'), ...features, }, analyse, } } /** Antwort von GET /api/funktionen im Abo-Modell. katalogEdit: { : { …Felder… } } wird über den Eintrag gelegt. */ export function daten({ abo = {}, kundenart = 'unternehmen', projekte, katalogEdit = {} } = {}) { return { modell: 'abo', kundenart, abo: { produkt: 'wartung', laeuft: true, gekuendigt: false, widerrufsfristBis: null, ...abo }, katalog: KEYS.map((key) => katalogEintrag(key, katalogEdit[key])), projects: projekte ?? [projekt('p1', 'Bäckerei Sonnenschein')], } }