diff --git a/docs/WEBklar-Datenschutzerklaerung.pdf b/docs/WEBklar-Datenschutzerklaerung.pdf
index 43f8168..9486c6a 100644
Binary files a/docs/WEBklar-Datenschutzerklaerung.pdf and b/docs/WEBklar-Datenschutzerklaerung.pdf differ
diff --git a/docs/WEBklar-Leitfaden-Empfehlungsgeber.pdf b/docs/WEBklar-Leitfaden-Empfehlungsgeber.pdf
index 3e6afe8..68b2665 100644
Binary files a/docs/WEBklar-Leitfaden-Empfehlungsgeber.pdf and b/docs/WEBklar-Leitfaden-Empfehlungsgeber.pdf differ
diff --git a/public/WEBklar-Wartungs-Abo-Vertragsunterlagen.pdf b/public/WEBklar-Wartungs-Abo-Vertragsunterlagen.pdf
index 2a62689..ff3b568 100644
Binary files a/public/WEBklar-Wartungs-Abo-Vertragsunterlagen.pdf and b/public/WEBklar-Wartungs-Abo-Vertragsunterlagen.pdf differ
diff --git a/public/abo-bedingungen.html b/public/abo-bedingungen.html
index 60b1673..4cacb84 100644
--- a/public/abo-bedingungen.html
+++ b/public/abo-bedingungen.html
@@ -327,7 +327,7 @@
Bereich
Maßnahmen
Rechenzentrum und Zutritt
Betrieb im Rechenzentrum der Hetzner Online GmbH in Falkenstein (Deutschland). Hetzner ist nach ISO/IEC 27001 zertifiziert. Zutritt, Stromversorgung, Klimatisierung und Brandschutz regeln die Maßnahmen von Hetzner.
-
Zugang zu den Systemen
Serververwaltung nur per SSH mit Schlüssel, keine Anmeldung per Passwort. Firewall, die nur benötigte Dienste zulässt. Automatische Sperre bei wiederholten Fehlversuchen. Zwei-Faktor-Anmeldung für die Verwaltungskonten bei Hetzner, Stripe und dem E-Mail-Anbieter. Persönliche Konten für jede berechtigte Person.
+
Zugang zu den Systemen
Serververwaltung nur über verschlüsselte SSH-Verbindung, Zugang nur für die Gesellschafter. Automatische Sperre bei wiederholten Fehlversuchen. Firewall des Rechenzentrumsbetreibers, die nur die benötigten Dienste zulässt. Zwei-Faktor-Anmeldung für die Verwaltungskonten bei Hetzner und Stripe.
Zugriff auf Daten
Zugriff nur für die Gesellschafter und beauftragte Mitarbeiter, soweit ihre Aufgabe es erfordert. Im Kundenportal sieht jeder Kunde nur seine eigenen Daten. Datenbanken sind nur für die jeweilige Anwendung erreichbar.
Übertragung
Verschlüsselte Übertragung (TLS) für alle Websites, das Kundenportal und die Verwaltung. E-Mail-Versand und -Abruf nur verschlüsselt.
Nachvollziehbarkeit
Änderungen an Websites laufen über eine Versionsverwaltung (Git) und sind nachvollziehbar. Aufträge und Weisungen werden im Ticketsystem bzw. im Chat des Kundenportals dokumentiert.
diff --git a/public/app.js b/public/app.js
index 1d9b840..187ff2f 100644
--- a/public/app.js
+++ b/public/app.js
@@ -579,10 +579,10 @@ async function pollChatBadge() {
// ---------------------------------------------------------------------------
const ABO_FEATURES = [
- ['Betrieb & Pflege Ihrer Website/Anwendung', 'Server, Updates, Sicherheit, Backups, Monitoring – damit sie online bleibt'],
+ ['Betrieb & Pflege Ihrer Website/Anwendung', 'Server in Deutschland, Updates, Sicherheit, tägliche Datensicherung, Überwachung'],
['1 Domain inklusive', 'Registrierung auf Ihren Namen, DNS- und Zertifikatsverwaltung'],
- ['1 E-Mail-Postfach', 'mit Ihrer eigenen Domain'],
- ['1 Stunde Arbeitszeit pro Monat', 'sammelt sich an, jede Stunde ist 12 Monate gültig'],
+ ['1 E-Mail-Postfach', 'mit Ihrer eigenen Domain, 5 GB Speicher'],
+ ['1 Stunde Arbeitszeit pro Monat', 'nicht genutzte Zeit bleibt 12 Monate verfügbar'],
]
function fmtHours(min) {
@@ -598,6 +598,13 @@ function aboFeaturesHtml() {
).join('')}`
}
+function lateStartDate() {
+ // Beginn nach der 14-tägigen Widerrufsfrist = 15 Tage nach heute
+ const d = new Date()
+ d.setDate(d.getDate() + 15)
+ return d.toLocaleDateString('de-DE', { day: '2-digit', month: '2-digit', year: 'numeric' })
+}
+
function renderAboOffer(card, data, { ended } = {}) {
const available = data.available
card.innerHTML = `
@@ -612,25 +619,38 @@ function renderAboOffer(card, data, { ended } = {}) {
${available
- ? 'Keine Mindestlaufzeit. Gemäß § 19 UStG ohne Umsatzsteuer.'
+ ? 'Keine Mindestlaufzeit. Zahlung per Kreditkarte oder SEPA-Lastschrift. Gemäß § 19 UStG ohne Umsatzsteuer.'
: 'Die Online-Bestellung wird gerade eingerichtet – schreiben Sie uns gern im Chat.'}
- Danach hinterlegen Sie bei unserem Zahlungsdienstleister Stripe Ihre Zahlungsart.
+ Danach hinterlegen Sie bei unserem Zahlungsdienstleister Stripe Ihre Zahlungsart. Bis zum Abschluss dort können Sie jederzeit abbrechen.
`
@@ -647,9 +667,13 @@ function renderAboOffer(card, data, { ended } = {}) {
const errEl = card.querySelector('#abo-error')
hideError(errEl)
const acceptTerms = card.querySelector('#abo-terms').checked
- const earlyStart = card.querySelector('#abo-early').checked
- if (!acceptTerms || !earlyStart) {
- showError(errEl, 'Bitte bestätigen Sie beide Punkte, um zu bestellen.')
+ const startChoice = card.querySelector('input[name="abo-start-choice"]:checked')?.value || ''
+ if (!acceptTerms) {
+ showError(errEl, 'Bitte stimmen Sie den Vertragsbedingungen zu.')
+ return
+ }
+ if (!startChoice) {
+ showError(errEl, 'Bitte wählen Sie, wann wir mit der Leistung beginnen sollen.')
return
}
btn.disabled = true
@@ -657,7 +681,7 @@ function renderAboOffer(card, data, { ended } = {}) {
try {
const { url } = await api('/api/abo/checkout', {
method: 'POST',
- body: JSON.stringify({ acceptTerms, earlyStart, termsVersion: data.termsVersion }),
+ body: JSON.stringify({ acceptTerms, startChoice, termsVersion: data.termsVersion }),
})
window.location.href = url
} catch (err) {
@@ -671,45 +695,52 @@ function renderAboOffer(card, data, { ended } = {}) {
function renderAboActive(card, data) {
const sub = data.subscription
const l = data.ledger || { balanceMinutes: 0, credits: [], usage: [] }
- const statusLine = sub.cancelAtPeriodEnd
- ? `gekündigt zum ${fmtDateShort(sub.currentPeriodEnd)}`
- : sub.paymentProblem
- ? 'Zahlung offen'
- : `aktivnächste Abbuchung ${fmtDateShort(sub.currentPeriodEnd)}`
+ let statusLine
+ if (sub.serviceStartsAt) {
+ statusLine = `beginnt am ${fmtDateShort(sub.serviceStartsAt)}`
+ } else if (sub.cancelAtPeriodEnd) {
+ statusLine = `gekündigt zum ${fmtDateShort(sub.currentPeriodEnd)}`
+ } else if (sub.paymentProblem) {
+ statusLine = 'Zahlung offen'
+ } else {
+ statusLine = `aktivnächste Abbuchung ${fmtDateShort(sub.currentPeriodEnd)}`
+ }
const usageRows = (l.usage || []).map((u) => `
+${fmtHours(c.minutes)} ${c.expired ? 'abgelaufen' : `gültig bis ${fmtDateShort(c.expiresAt)}`}
`).join('')
+
${fmtDateShort(c.grantedAt)}
Monatskontingent
+
+${fmtHours(c.minutes)} ${c.expired ? 'abgelaufen' : `nutzbar bis ${fmtDateShort(c.expiresAt)}`}
`).join('')
card.innerHTML = `
Ihr Wartungs-Abo
-
Stundenkonto
+
Stundenkontingent
${statusLine}
${sub.paymentProblem ? '
Die letzte Abbuchung ist fehlgeschlagen. Bitte aktualisieren Sie Ihre Zahlungsart, 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ügbares Guthaben
+
${fmtHours(l.balanceMinutes)}verfügbare Zeit
${fmtHours(l.usedMinutes)}bisher genutzt
${l.nextExpiry ? `
${fmtHours(l.nextExpiry.minutes)}verfallen am ${fmtDateShort(l.nextExpiry.at)}
` : ''}
-
Jeden Monat kommt 1 Stunde dazu. Abgerechnet wird in 15-Minuten-Schritten, die ältesten Stunden zuerst.
+
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.
Die Zahlungen wickelt die Stripe Payments Europe, Limited, 1 Grand Canal Street Lower, Grand Canal Dock, Dublin, D02 H210, Irland („Stripe“) ab. Stripe verarbeitet die Daten teils in unserem Auftrag und teils als eigener Verantwortlicher, etwa zur Betrugsvorbeugung und zur Erfüllung gesetzlicher Pflichten. Dabei können Daten an die Stripe, LLC in den USA übermittelt werden. Die Stripe, LLC ist nach dem EU-US Data Privacy Framework zertifiziert, für das ein Angemessenheitsbeschluss der EU-Kommission besteht. Auf der Zahlungsseite von Stripe gelten dessen Datenschutzhinweise: stripe.com/de/privacy. Rechtsgrundlage ist Art. 6 Abs. 1 lit. b DSGVO.
8. E-Mail
-
Vertragsbestätigungen, Benachrichtigungen und unsere sonstige Korrespondenz versenden wir per E-Mail über [E-MAIL-ANBIETER, festzulegen]. Die Übertragung ist verschlüsselt. Rechtsgrundlage ist Art. 6 Abs. 1 lit. b DSGVO, bei sonstiger Korrespondenz lit. f DSGVO.
+
Vertragsbestätigungen, Benachrichtigungen und unsere sonstige Korrespondenz versenden und empfangen wir derzeit über den E-Mail-Dienst der Porkbun LLC, 11575 SW Pacific Hwy PMB 40649, Tigard, OR 97223, USA. Dabei werden Inhalte und Verbindungsdaten der E-Mails in den USA verarbeitet. Für Porkbun besteht kein Angemessenheitsbeschluss der EU-Kommission. Die Übermittlung erfolgt, soweit sie zur Durchführung eines Vertrags mit Ihnen oder zur Beantwortung Ihrer Anfrage erforderlich ist (Art. 49 Abs. 1 lit. b DSGVO). Wir stellen unseren E-Mail-Dienst in Kürze auf die Hetzner Online GmbH (Rechenzentrum Nürnberg, Deutschland) um.
+
Die Übertragung ist verschlüsselt. Rechtsgrundlage ist Art. 6 Abs. 1 lit. b DSGVO, bei sonstiger Korrespondenz lit. f DSGVO. Die E-Mail-Postfächer, die wir Kunden im Rahmen des Wartungs-Abos bereitstellen, liegen bereits bei der Hetzner Online GmbH in Deutschland.
9. Buchhaltung und Rechnungen
Rechnungen erstellen wir mit einer Buchhaltungssoftware, die wir selbst auf unserem Server betreiben, bzw. für das Wartungs-Abo über Stripe. Soweit erforderlich, geben wir Buchhaltungsdaten an unsere Steuerberatung und an Finanzbehörden weiter. Rechtsgrundlage ist Art. 6 Abs. 1 lit. c DSGVO.
@@ -102,7 +103,7 @@
Hetzner Online GmbH: Hosting und Datensicherung (Auftragsverarbeiter)
Stripe: Zahlungsabwicklung (Abschnitt 7)
-
unser E-Mail-Anbieter (Abschnitt 8)
+
Porkbun LLC: unser E-Mail-Dienst bis zur Umstellung (Abschnitt 8)
Domain-Registrar und Vergabestellen, sofern wir eine Domain für Sie registrieren (Abschnitt 10)
Steuerberatung und Behörden, soweit gesetzlich erforderlich
diff --git a/public/widerrufen.html b/public/widerrufen.html
index cdeac73..c9e98c2 100644
--- a/public/widerrufen.html
+++ b/public/widerrufen.html
@@ -3,47 +3,42 @@
- Vertrag widerrufen – Webklar
+ Vertrag widerrufen – WEBklar
-
+
WEBKLAR
Vertrag widerrufen
-
-
Als Verbraucher können Sie Ihr Webklar Wartungs-Abo innerhalb von 14 Tagen nach Vertragsschluss ohne Angabe von Gründen widerrufen. Einzelheiten stehen in der Widerrufsbelehrung.
-
-
-
-
-
Ihr Widerruf ist eingegangen
+
Ihr Widerruf ist bei uns eingegangen
Eingang:
-
Eine Eingangsbestätigung haben wir an Ihre E-Mail-Adresse geschickt. Es erfolgen keine weiteren Abbuchungen. Die Erstattung rechnen wir gesondert ab.
+
Eine Eingangsbestätigung mit diesen Angaben haben wir an Ihre E-Mail-Adresse geschickt.