Betrieb, Pflege und Support für Ihre Website – ${offer ? 'mit Ihrem persönlichen Angebot' : 'für 50 € im Monat'}.
+
${offer ? `
Ihr persönliches Angebot
@@ -635,15 +755,12 @@ function renderAboOffer(card, data, { ended } = {}) {
${offer.note ? `
${escapeHtml(offer.note)}
` : ''}
Gültig bis ${fmtDateShort(offer.validUntil)} · wird beim Abschluss automatisch berücksichtigt
` : ''}
- ${aboFeaturesHtml()}
- ${available ? '
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
- ? 'Mindestlaufzeit 12 Monate, danach monatlich kündbar. Zahlung per Kreditkarte oder SEPA-Lastschrift. Gemäß § 19 UStG ohne Umsatzsteuer.'
- : 'Die Online-Bestellung wird gerade eingerichtet – schreiben Sie uns gern im Chat.'}
+
+ ${aboFeaturesHtml()}
+
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.' : ''}
` : ''}
-
-
+
+
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.
@@ -738,71 +838,59 @@ function renderAboActive(card, data) {
${fmtDateShort(c.grantedAt)}
Monatskontingent
+${fmtHours(c.minutes)} ${c.expired ? 'abgelaufen' : `nutzbar bis ${fmtDateShort(c.expiresAt)}`}
`).join('')
- card.innerHTML = `
-
-
-
Ihr Wartungs-Abo
-
Stundenkontingent
-
-
${statusLine}
-
- ${sub.paymentProblem ? '
Die letzte Abbuchung ist fehlgeschlagen. Bitte aktualisieren Sie Ihre Zahlungsart, damit Ihre Website online bleibt.
' : ''}
+ view.innerHTML = `
+
+
Wartungs-Abo
+
Ihr Stundenkontingent, der Verlauf und Ihr Vertrag.
+
+ ${sub.paymentProblem ? '
Die letzte Abbuchung ist fehlgeschlagen. Bitte aktualisieren Sie Ihre Zahlungsart über „Zahlungsart aktualisieren“ in der Seitenleiste, damit Ihre Website online bleibt.
' : ''}
${sub.serviceStartsAt ? `
Wie gewählt beginnen wir nach Ablauf der Widerrufsfrist am ${fmtDateShort(sub.serviceStartsAt)}. Dann wird auch zum ersten Mal abgebucht, und Ihre erste Stunde steht bereit.
` : ''}
-
-
${fmtHours(l.balanceMinutes)}verfügbare Zeit
-
${fmtHours(l.usedMinutes)}bisher genutzt
- ${l.nextExpiry ? `
${fmtHours(l.nextExpiry.minutes)}verfallen am ${fmtDateShort(l.nextExpiry.at)}
` : ''}
+
+
${fmtHours(l.balanceMinutes)}verfügbare Zeit
+
${fmtHours(l.usedMinutes)}bisher genutzt
+ ${l.nextExpiry ? `
${fmtHours(l.nextExpiry.minutes)}verfallen am ${fmtDateShort(l.nextExpiry.at)}
` : ''}
-
Jeden bezahlten Monat kommt 1 Stunde dazu. Angerechnet wird in 15-Minuten-Schritten, die ältesten Stunden zuerst.
- Aufträge schicken Sie uns einfach über den Chat.${sub.minTermEnd && !sub.cancelAtPeriodEnd ? ` Mindestlaufzeit bis ${fmtDateShort(sub.minTermEnd)}, danach monatlich kündbar.` : ''}
Jeden bezahlten Monat kommt 1 Stunde dazu. Angerechnet wird in 15-Minuten-Schritten, die ältesten Stunden zuerst. Aufträge schicken Sie uns einfach über den Chat.
`
}
+const aboState = { data: null }
+
async function loadAboCard({ afterCheckout = false } = {}) {
const card = document.getElementById('abo-card')
- if (!card) return
+ const view = document.getElementById('view-abo')
+ if (!card || !view) return
try {
let data = await api('/api/abo')
// Direkt nach dem Checkout kann der Stripe-Webhook noch unterwegs sein
for (let i = 0; afterCheckout && !data.subscription?.active && i < 10; i += 1) {
card.classList.remove('hidden')
- card.innerHTML = '
Vielen Dank!
Ihr Abo wird aktiviert…
Das dauert nur einen Moment.
'
+ card.innerHTML = '
Vielen Dank!
Ihr Abo wird aktiviert…
Das dauert nur einen Moment.
'
await new Promise((r) => setTimeout(r, 2000))
data = await api('/api/abo')
}
+ aboState.data = data
if (data.subscription?.active) {
- renderAboActive(card, data)
+ renderAboSideActive(card, data)
+ renderAboAccountView(view, data)
} else {
- renderAboOffer(card, data, { ended: Boolean(data.subscription) })
+ renderAboSideOffer(card, data, { ended: Boolean(data.subscription) })
+ renderAboOrderView(view, data)
}
card.classList.remove('hidden')
+ document.getElementById('invoices-abo-note')?.classList.toggle('hidden', !data.subscription)
loadTakeoverCard({ abo: data })
} catch (err) {
console.warn('Abo konnte nicht geladen werden:', err.message)
@@ -914,7 +1002,7 @@ function takeoverFormHtml(limits) {
-
+
`
}
@@ -998,45 +1086,47 @@ async function submitTakeoverReply(form, limits) {
}
}
+function updateTakeoverBadge(requests) {
+ const badge = document.getElementById('takeover-badge')
+ if (!badge) return
+ const open = requests.filter((r) => r.status === 'rueckfrage').length
+ badge.textContent = open
+ badge.classList.toggle('hidden', !open)
+}
+
async function loadTakeoverCard({ abo, notice = '' } = {}) {
const card = document.getElementById('takeover-card')
if (!card) return
if (abo) takeoverState.abo = abo
const active = Boolean(takeoverState.abo?.subscription?.active)
- if (!takeoverState.abo?.subscription) {
- card.classList.add('hidden')
- return
- }
- let data
- try {
- data = await api('/api/abo/takeover-credits')
- } catch (err) {
- console.warn('Übernahmegutschrift konnte nicht geladen werden:', err.message)
- return
+ let data = { requests: [], limits: null }
+ if (takeoverState.abo?.subscription) {
+ try {
+ data = await api('/api/abo/takeover-credits')
+ } catch (err) {
+ card.innerHTML = `
Übernahmegutschrift konnte nicht geladen werden: ${escapeHtml(err.message)}
Die Übernahmegutschrift können Sie beantragen, sobald Ihr Wartungs-Abo läuft. Zum Wartungs-Abo
'
return
}
card.innerHTML = `
-
-
-
Wechsel ohne doppelte Kosten
-
Übernahmegutschrift
-
-
-
Sie haben Domain, Hosting oder E-Mail bei Ihrem bisherigen Anbieter schon im Voraus bezahlt? Den Anteil, den Sie ab Beginn Ihres Abos doppelt zahlen, schreiben wir Ihnen gut und verrechnen ihn mit Ihren nächsten Monatsgebühren. Schicken Sie uns dazu einfach die Rechnung.
- ${notice ? `
${escapeHtml(notice)}
` : ''}
- ${active ? `
-
-
- ${chatState.viewAs ? 'Im Ansichtsmodus kann kein Antrag gestellt werden.' : ''}
-
Sie haben Domain, Hosting oder E-Mail bei Ihrem bisherigen Anbieter schon im Voraus bezahlt? Den Anteil, den Sie ab Beginn Ihres Abos doppelt zahlen, schreiben wir Ihnen gut und verrechnen ihn mit Ihren nächsten Monatsgebühren. Schicken Sie uns dazu einfach die Rechnung.
+ ${notice ? `
${escapeHtml(notice)}
` : ''}
+ ${active ? `
+
+
+ ${chatState.viewAs ? 'Im Ansichtsmodus kann kein Antrag gestellt werden.' : ''}
+