Funktionen neu: Einschalt-Logik (Vorprüfung, Fristen, 409-Codes) und Testdaten

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
ClaudeandClaude Sonnet 5.5 committed 2026-10-16 18:01:27 +00:00
1 parent 1cd16ff293
commit 437947cdf6
4 files changed
+441

No files matched your search

+74
View File
@@ -0,0 +1,74 @@
// 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: { <key>: { …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')],
}
}