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:
1 parent
1cd16ff293
commit
437947cdf6
4 files changed
+441
No files matched your search
@@ -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')],
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user