Öffnungszeiten live: im Abo-Modell Einschalten und kein Behalten-Weg

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
ClaudeandClaude Sonnet 5.5 committed 2026-10-16 18:49:08 +00:00
1 parent 5f3d8f3e96
commit c37faabcd3
9 files changed
+190 -18

No files matched your search

+34 -7
View File
@@ -17,10 +17,13 @@
ctx (baut zeiten.js): { projectId, features, ustHinweis, kundenansicht (Boolean), neuZeichnen({ meldung }), fertig({ danke }), zurueck() }.
Bei 409 (inklusive, kein_abo, gekuendigt, nicht_aktiv, fassung_veraltet, schon bestellt …) holt neuZeichnen die Liste neu und zeichnet die Ansicht
nach dem neuen Stand mit der Meldung des Servers; fehlt ctx.neuZeichnen oder scheitert es, bleibt die Meldung am Knopf.
zeitenStatusKarte({ projekt, feature, angebot, kundenansicht, danke, meldung }, { behalten, weiter }) ist die Karte fuer ordered, setup, active
und disabled (Zustand off hat die Seite oben). */
zeitenStatusKarte({ projekt, feature, angebot, kundenansicht, danke, meldung, modell }, { behalten, weiter }) ist die Karte fuer ordered, setup, active
und disabled (Zustand off hat die Seite oben).
Abo-Modell (modell === 'abo' in GET /api/funktionen, strikt): renderZeitenEinschalten zeigt statt der Seiten oben die gemeinsame Einschalt-Seite
(funktion-bestellen.js, Ablauf von P3); die Karte kennt kein Behalten und keinen Preis: „Eingeschaltet am“, bei Abo-Ende die Frist (Z2), nach der
Abschaltung „Deine Eingaben bleiben … gespeichert“ (Z3). */
import { bestellKoerper, sicherLink } from './funktion-bestellen.js'
import { bestellKoerper, renderEinschaltSeite, sicherLink } from './funktion-bestellen.js'
import { fehlerKarte, h, hakenFeld, request } from './termine-dom.js'
const WEGE = {
@@ -260,6 +263,21 @@ export function renderZeitenBestellen(root, { ctx = {}, angebot = {}, projekt =
return seite
}
/* ----------------------------------------------------- Einschalten im Abo-Modell --- */
/**
* Abo-Modell, Zustand off: die gemeinsame Einschalt-Seite (renderEinschaltSeite) mit key 'zeiten'. Den Ablauf (Bestätigung, Knopf, Fehlertexte) zeichnet
* ctx.einschalten (Init-Option der Hülle, P3); nach dem Einschalten zeichnet ctx.fertig({ danke }) die Ansicht neu. Kein Preis, kein Haken, kein Behalten.
*/
export function renderZeitenEinschalten(root, { ctx = {}, projekt = {} } = {}) {
return renderEinschaltSeite(root, {
ctx: { ...ctx, projectId: text(ctx.projectId) || text(projekt.projectId) },
daten: { offen: [], kundenansicht: ctx.kundenansicht === true },
key: 'zeiten',
einschalten: ctx.einschalten,
nachEinschalten: () => (typeof ctx.fertig === 'function' ? ctx.fertig({ danke: 'eingeschaltet' }) : undefined),
})
}
/* ---------------------------------------------------------------- Statuskarte --- */
const PILLE = { ordered: ['Zahlung offen', 'wait'], setup: ['In Einrichtung', 'wait'], active: ['Aktiv', 'ok'], disabled: ['Abgeschaltet', 'off'] }
const DANKE = {
@@ -286,7 +304,8 @@ function dankeText(danke, feature) {
* weiter({ bestellen, meldung }) wird gerufen, wenn „Zahlung fortsetzen“ scheitert (bestellen: es gibt keine offene Zahlungsseite mehr, die Ansicht
* zeigt wieder die Bestellseite).
*/
export function zeitenStatusKarte({ projekt, feature, angebot, kundenansicht, danke, meldung } = {}, { behalten, weiter } = {}) {
export function zeitenStatusKarte({ projekt, feature, angebot, kundenansicht, danke, meldung, modell } = {}, { behalten, weiter } = {}) {
const abo = modell === 'abo'
const state = text(feature?.state) || 'off'
const [pilleText, pilleArt] = PILLE[state] || PILLE.setup
const preis = text(angebot?.preis) || '30 €'
@@ -298,7 +317,7 @@ export function zeitenStatusKarte({ projekt, feature, angebot, kundenansicht, da
const zeile = (name, wert) => h('div', null, h('dt', null, name), h('dd', null, wert))
const fakten = [
state === 'setup' || state === 'active' ? (hatTicket ? zeile('Ticketnummer', `#${ticket}`) : null) : null,
bestelltAm ? zeile('Bestellt am', bestelltAm) : null,
bestelltAm ? zeile(abo ? 'Eingeschaltet am' : 'Bestellt am', bestelltAm) : null,
].filter(Boolean)
const aboEnde = feature?.disabledReason === 'abo_ende'
@@ -327,7 +346,11 @@ export function zeitenStatusKarte({ projekt, feature, angebot, kundenansicht, da
const behaltenKnopf = (beschriftung) => h('button', { type: 'button', class: 'kb-btn-outline', 'data-aktion': 'behalten', disabled: sperre, onclick: () => { if (typeof behalten === 'function') behalten() } }, beschriftung)
const lage = behaltenLage(angebot)
let behaltenBox = null
if (frist && lage === 'bezahlen') {
if (abo) {
// Abo-Modell: kein Behalten gegen Geld; Öffnungszeiten live läuft nach dem Abo-Ende noch bis zur Frist (Text Z2)
if (frist && lage === 'bezahlen') behaltenBox = h('div', { class: 'tm-box tm-box-info', role: 'note', 'data-hinweis': 'abo-ende' }, h('span', null, `Dein Wartungs-Abo ist beendet. Öffnungszeiten live läuft noch bis ${frist} und schaltet sich dann ab.`))
else if (frist && lage === 'abo') behaltenBox = h('div', { class: 'tm-box tm-box-info', role: 'note', 'data-hinweis': 'abo-laeuft' }, h('span', null, 'Dein Wartungs-Abo läuft wieder – Öffnungszeiten live ist darin enthalten.'))
} else if (frist && lage === 'bezahlen') {
behaltenBox = h('div', { class: 'tm-box tm-box-warn', role: 'note', 'data-hinweis': 'behalten' },
h('span', null, `Dein Wartungs-Abo ist beendet – behalte die Funktion bis ${frist} für einmalig ${preis}.`),
behaltenKnopf(`Für ${preis} behalten`))
@@ -335,7 +358,11 @@ export function zeitenStatusKarte({ projekt, feature, angebot, kundenansicht, da
behaltenBox = h('div', { class: 'tm-box tm-box-info', role: 'note', 'data-hinweis': 'abo-laeuft' }, h('span', null, 'Dein Wartungs-Abo läuft wieder – Öffnungszeiten live ist darin enthalten.'))
}
let abgeschaltetBox = null
if (daten && lage === 'bezahlen') {
if (abo && daten && lage === 'bezahlen') {
// Text Z3: die Eingaben bleiben gespeichert, ein neues Wartungs-Abo schaltet die Funktion wieder ein
abgeschaltetBox = h('div', { class: 'tm-box tm-box-info', role: 'note', 'data-hinweis': 'daten-gespeichert' },
h('span', null, `Deine Eingaben bleiben${tagText(feature?.loeschungAm) ? ` bis ${tagText(feature.loeschungAm)}` : ''} gespeichert. Mit einem neuen Wartungs-Abo schaltet sich Öffnungszeiten live wieder ein.`))
} else if (daten && lage === 'bezahlen') {
abgeschaltetBox = h('div', { class: 'tm-box tm-box-warn', role: 'note', 'data-hinweis': 'wieder-einschalten' },
h('span', null, `Deine Eingaben bleiben${tagText(feature?.loeschungAm) ? ` bis ${tagText(feature.loeschungAm)}` : ''} gespeichert. Für einmalig ${preis} schaltest du die Funktion wieder ein.`),
behaltenKnopf(`Für ${preis} wieder einschalten`))