Ö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

+15 -8
View File
@@ -20,7 +20,7 @@
Kundenansicht (window.KbView.id() gesetzt): Einschalten, Bestellen und Behalten sind gesperrt, der Server antwortet dort ohnehin mit 403. */
import { fehlerKarte, h, infoKarte, request } from './termine-dom.js'
import { behaltenLage, renderZeitenBestellen, zeitenStatusKarte } from './zeiten-bestellen.js'
import { behaltenLage, renderZeitenBestellen, renderZeitenEinschalten, zeitenStatusKarte } from './zeiten-bestellen.js'
import { renderEditor } from './zeiten-editor.js'
// Auswahl bleibt beim Wechsel zwischen Funktionen und Zeiten erhalten
@@ -52,14 +52,15 @@ function pickProjekt(projects) {
* Darf der Kunde die Funktion jetzt behalten (30 €)? Nach dem erkannten Abo-Ende in Einrichtung/aktiv, abgeschaltet nur mit gespeicherten Eingaben,
* und nur ohne Abo (behaltenLage 'bezahlen': inklusive false UND grund kein_abo); laeuft das Abo (nicht_aktiv, gekuendigt, inklusive), gibt es nichts zu bezahlen.
*/
function behaltenMoeglich(projekt, angebot) {
function behaltenMoeglich(projekt, angebot, modell) {
if (modell === 'abo') return false // Abo-Modell: kein Behalten gegen Geld (Z2: Öffnungszeiten live läuft noch bis zur Frist)
const feature = projekt?.features?.zeiten
if (!feature || behaltenLage(angebot) !== 'bezahlen') return false
if (feature.state === 'setup' || feature.state === 'active') return Boolean(feature.aboEndeAt)
return feature.state === 'disabled' && feature.disabledReason === 'abo_ende' && projekt.zeitenLeer === false
}
export async function initZeiten(root, { projectId } = {}) {
export async function initZeiten(root, { projectId, einschalten } = {}) {
if (!root) return
const rueckkehr = leseRueckkehr()
const wunsch = rueckkehr.projekt || projectId || root.dataset.wunschProjekt || '' // die Kachel in Funktionen legt ihr Projekt hier ab
@@ -71,7 +72,7 @@ export async function initZeiten(root, { projectId } = {}) {
const projects = Array.isArray(antwort.projects) ? antwort.projects : []
const s = {
root, projects, angebot: antwort.zeiten || null, features: antwort.features || {}, ustHinweis: typeof antwort.ustHinweis === 'string' ? antwort.ustHinweis : '',
projekt: null, lauf: 0, buehne: null, danke: '', editorAlt: null,
modell: antwort.modell, einschalten, projekt: null, lauf: 0, buehne: null, danke: '', editorAlt: null,
}
// der Editorplatz der bisherigen Ansicht (mit seinem Editor) wird in den neuen Aufbau mitgenommen, ausser nach der Rueckkehr von Stripe
const alterEditor = !rueckkehr.bestellt && !rueckkehr.behalten && S?.root === root ? root.querySelector('.zt-editor') : null
@@ -95,7 +96,7 @@ export async function initZeiten(root, { projectId } = {}) {
const key = stand(s.projekt, s.angebot)
const editorDa = root.dataset.zeitenKey === key && root.querySelector('.zt-editor') && S?.root === root
if (editorDa && !rueckkehr.bestellt && !rueckkehr.behalten) {
if (wunschWeg === 'behalten' && behaltenMoeglich(S.projekt, S.angebot)) zeigeBehalten(S)
if (wunschWeg === 'behalten' && behaltenMoeglich(S.projekt, S.angebot, S.modell)) zeigeBehalten(S)
return
}
S = s
@@ -104,7 +105,7 @@ export async function initZeiten(root, { projectId } = {}) {
: rueckkehr.behalten && (!rueckkehr.projekt || rueckkehr.projekt === s.projekt.projectId) ? 'behalten' : ''
s.buehne = h('div', { id: 'zeiten-buehne' })
root.replaceChildren(...(projects.length > 1 ? [projektwahl(s)] : []), s.buehne)
zeichneProjekt(s, { weg: wunschWeg })
zeichneProjekt(s, { weg: s.modell === 'abo' ? '' : wunschWeg })
}
/** Alles, was die Statuskarte zeigt und der Editorplatz davon abhaengt (auch die Abo-Lage: Behalten gibt es nur ohne Abo); aendert es sich, wird neu aufgebaut. */
@@ -134,6 +135,7 @@ async function ladeListe(s) {
const projects = Array.isArray(antwort.projects) ? antwort.projects : []
s.projects = projects
s.angebot = antwort.zeiten || null
s.modell = antwort.modell
s.features = antwort.features || {}
s.ustHinweis = typeof antwort.ustHinweis === 'string' ? antwort.ustHinweis : ''
s.projekt = projects.find((p) => p.projectId === s.projekt?.projectId) || s.projekt
@@ -164,6 +166,7 @@ function baueCtx(s, projekt) {
features: s.features,
ustHinweis: s.ustHinweis,
kundenansicht: kundenansicht(),
einschalten: s.einschalten, // Ablauf des Einschaltens im Abo-Modell (Init-Option der Hülle)
neuZeichnen: (optionen) => neuZeichnen(s, optionen),
fertig: ({ danke } = {}) => neuZeichnen(s, { danke }),
}
@@ -216,18 +219,22 @@ function zeichneProjekt(s, { weg = '', meldung = '', bestellformular = false } =
}
const statusKarte = (zusatz = {}) => zeitenStatusKarte(
{ projekt, feature, angebot: s.angebot, kundenansicht: ctx.kundenansicht, danke, ...zusatz },
{ projekt, feature, angebot: s.angebot, kundenansicht: ctx.kundenansicht, danke, modell: s.modell, ...zusatz },
{
behalten: () => zeigeBehalten(s),
weiter: (fall) => zeichneProjekt(s, { bestellformular: fall?.bestellen === true, meldung: fall?.meldung || '' }),
})
if (zustand === 'off' && s.modell === 'abo') {
renderZeitenEinschalten(kopf, { ctx, projekt })
return
}
if (zustand === 'off' || (zustand === 'ordered' && bestellformular)) {
renderZeitenBestellen(kopf, { ctx, angebot: s.angebot, projekt })
return
}
kopf.replaceChildren(statusKarte())
if (weg === 'behalten' && behaltenMoeglich(projekt, s.angebot)) zeigeBehalten(s)
if (weg === 'behalten' && behaltenMoeglich(projekt, s.angebot, s.modell)) zeigeBehalten(s)
}
/** Behalten-Seite (30 €) statt der Statuskarte; der Editor darunter bleibt, nur versteckt, damit nichts verloren geht. „Zurück“ zeigt wieder die Karte. */