75 lines
4.0 KiB
JavaScript
75 lines
4.0 KiB
JavaScript
// 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')],
|
||
}
|
||
}
|