diff --git a/public/app.js b/public/app.js index ce3b018..329d373 100644 --- a/public/app.js +++ b/public/app.js @@ -876,14 +876,24 @@ async function openBillingPortal(btn, errorEl) { } } -/* Ansicht "Wartungs-Abo": Bestellung (Bestellübersicht direkt über dem Bestellbutton, § 312j BGB) */ -function renderAboOrderView(view, data) { - const available = data.available - const offer = data.offer +/* Bestellseite je Produkt (#bestellen-hosting, #bestellen-wartung): Bestellübersicht direkt über dem Bestellbutton (§ 312j BGB) */ +function renderOrderView(view, data, productKey) { + const product = productOf(data, productKey) + const offer = data.offers?.[productKey] || null + const label = productLabelOf(data, productKey) + if (!product || !data.available) { + view.innerHTML = ` +

${escapeHtml(label)}

+

Die Online-Bestellung wird gerade eingerichtet – schreiben Sie uns gern im Chat.

` + return + } + const price = fmtEuro(product.amountCents / 100) + const lateStart = data.lateStartAt ? fmtDateShort(data.lateStartAt) : '' + const isWartung = productKey === 'wartung' view.innerHTML = `
-

Wartungs-Abo

-

Betrieb, Pflege und Support für Ihre Website – ${offer ? 'mit Ihrem persönlichen Angebot' : 'für 50 € im Monat'}.

+

${escapeHtml(label)}

+

${isWartung ? 'Betrieb, Pflege und Support für Ihre Website' : 'Ihre Website sicher und schnell online'} – ${offer ? 'mit Ihrem persönlichen Angebot' : `für ${escapeHtml(price)} im Monat`}.

${offer ? `
@@ -893,10 +903,9 @@ function renderAboOrderView(view, data) {

Gültig bis ${fmtDateShort(offer.validUntil)} · wird beim Abschluss automatisch berücksichtigt

` : ''}
- ${aboFeaturesHtml(productOf(data, 'wartung')?.features)} + ${aboFeaturesHtml(product.features)}

Schon bei einem anderen Anbieter für Domain, Hosting oder E-Mail bezahlt? Nach dem Abschluss können Sie eine Übernahmegutschrift beantragen – wir rechnen die doppelt bezahlte Zeit anteilig an.

- ${available ? `

Ihre Bestellung

${data.testAccount ? `
Testkonto: Bei Stripe wird ein Test-Rabatt verrechnet, abgebucht werden nur 0,50 € pro Monat.${offer ? ' Das Angebot wird nach dem Abschluss zusätzlich ans Abo gehängt.' : ''}
` : ''} @@ -908,18 +917,19 @@ function renderAboOrderView(view, data) { + Nach Ablauf der 14-tägigen Widerrufsfrist${lateStart ? ` (am ${lateStart})` : ''}. Bis dahin erbringt WEBklar keine Leistungen und bucht nichts ab.

Firmenkunden haben kein Widerrufsrecht und wählen am besten „Sofort“.

- + + : `${escapeHtml(price)} pro Monat (Gesamtpreis, gemäß § 19 UStG ohne Umsatzsteuer), keine weiteren Kosten`} - + +
LeistungWEBklar Wartungs-Abo: Betrieb & Pflege Ihrer Website bzw. Web-Anwendung, 1 Domain, 1 E-Mail-Postfach (5 GB), 1 Stunde Arbeitszeit je bezahltem Monat (12 Monate nutzbar)
Leistung${escapeHtml(product.name)}: ${(product.features || []).map(([t]) => escapeHtml(t)).join(', ')}
Preis${offer ? `${escapeHtml(offer.text)} (individuelles Angebot; Gesamtpreis, gemäß § 19 UStG ohne Umsatzsteuer), keine weiteren Kosten` - : '50,00 € pro Monat (Gesamtpreis, gemäß § 19 UStG ohne Umsatzsteuer), keine weiteren Kosten'}
Abrechnungmonatlich im Voraus, erstmals zum Leistungsbeginn
LaufzeitMindestlaufzeit 12 Monate ab Leistungsbeginn, kündbar zum Ende der Mindestlaufzeit bis einen Monat vorher; danach unbefristet und jederzeit zum Ende des Abrechnungsmonats kündbar
LeistungsbeginnBitte oben wählen: sofort oder nach Ablauf der 14-tägigen Widerrufsfrist${lateStart ? ` (am ${lateStart})` : ''}
LaufzeitMindestlaufzeit ${escapeHtml(String(product.minTermMonths))} Monate ab Leistungsbeginn, kündbar zum Ende der Mindestlaufzeit bis einen Monat vorher; danach unbefristet und jederzeit zum Ende des Abrechnungsmonats kündbar
ZahlungKreditkarte oder SEPA-Lastschrift über Stripe
AnbieterWEBklar GbR, Am Schwimmbad 10, 67722 Winnweiler · Telefon 0176 23726355 · support@webklar.com
@@ -930,8 +940,14 @@ function renderAboOrderView(view, data) { Danach hinterlegen Sie bei unserem Zahlungsdienstleister Stripe Ihre Zahlungsart. Bis zum Abschluss dort können Sie jederzeit abbrechen.
-
` : ` -

Die Online-Bestellung wird gerade eingerichtet – schreiben Sie uns gern im Chat.

`}` + ` + + view.querySelectorAll('input[name="abo-start-choice"]').forEach((radio) => radio.addEventListener('change', () => { + const el = view.querySelector('#abo-start-summary') + if (el) el.textContent = radio.value === 'sofort' + ? 'sofort, auf Ihren ausdrücklichen Wunsch vor Ablauf der Widerrufsfrist' + : `nach Ablauf der 14-tägigen Widerrufsfrist${lateStart ? ` (am ${lateStart})` : ''}; bis dahin keine Leistung und keine Abbuchung` + })) view.querySelector('#abo-buy')?.addEventListener('click', async (ev) => { const btn = ev.currentTarget @@ -952,7 +968,7 @@ function renderAboOrderView(view, data) { try { const { url } = await api('/api/abo/checkout', { method: 'POST', - body: JSON.stringify({ acceptTerms, startChoice, termsVersion: data.termsVersion, offerId: offer?.id || '', lateStartAt: data.lateStartAt || '' }), + body: JSON.stringify({ productKey, acceptTerms, startChoice, termsVersion: data.termsVersion, offerId: offer?.id || '', lateStartAt: data.lateStartAt || '' }), }) window.location.href = url } catch (err) { @@ -1149,6 +1165,10 @@ async function loadContracts({ afterCheckout = false } = {}) { aboState.data = data renderSideCard(card, data) renderContractsView(contracts, data) + for (const key of ['hosting', 'wartung']) { + const orderView = document.getElementById(`view-bestellen-${key}`) + if (orderView) renderOrderView(orderView, data, key) + } if (data.subscription?.active && data.subscription.productKey === 'wartung') renderHoursView(view, data) else view.innerHTML = '

Stundenkonto

Ein Stundenkonto gibt es im Wartungs-Abo. Ihre Verträge finden Sie unter Verträge.

' card.classList.remove('hidden')