Vertragsbedingungen Version 4: Webmail, Übersicht, Löschung bei Vertragsende, Hinweise zum Widerruf, Tests
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
6f7daf757f
commit
0c2e50fc20
3 files changed
+88
-21
No files matched your search
Binary file not shown.
@@ -67,11 +67,11 @@
|
||||
<tr><td>Anbieter</td><td>WEBklar GbR, Am Schwimmbad 10, 67722 Winnweiler, vertreten durch die Gesellschafter Kenso Grimm und Justin Klein (jeder einzeln vertretungsberechtigt) · Telefon 0176 23726355 · E-Mail support@webklar.com</td></tr>
|
||||
<tr><td>Hosting-Abo</td><td>15,00 € pro Monat · Bereitstellung Ihrer statischen Website auf unserem Server in Deutschland · 1 Domain · 1 E-Mail-Postfach mit 5 GB · Änderungen an der Website nur nach Ihrer Freigabe, 100 € pro Stunde (Leistungsbeschreibung A)</td></tr>
|
||||
<tr><td>Wartungs-Abo</td><td>50,00 € pro Monat · Betrieb und Pflege Ihrer Website bzw. Web-Anwendung auf unserem Server in Deutschland · 1 Domain · beliebig viele E-Mail-Postfächer mit zusammen 5 GB · 1 Stunde Arbeitszeit pro Monat, nicht genutzte Zeit bleibt 12 Monate verfügbar; Mehraufwand nur nach Ihrer Freigabe, 100 € pro Stunde (Leistungsbeschreibung B)</td></tr>
|
||||
<tr><td>E-Mail-Zusatzspeicher</td><td>In beiden Abos: je Paket von 5 GB 1,00 € pro Monat, bis zu 10 Pakete. Im Kundenportal bestellbar und reduzierbar, solange das Abo nicht gekündigt ist und keine Zahlung offen ist; kündbar zum Ende des Abrechnungsmonats.</td></tr>
|
||||
<tr><td>E-Mail-Zusatzspeicher</td><td>In beiden Abos: je Paket von 5 GB 1,00 € pro Monat, bis zu 10 Pakete. Im Kundenportal bestellbar und reduzierbar nach Leistungsbeginn, solange das Abo nicht gekündigt ist und keine Zahlung offen ist; kündbar zum Ende des Abrechnungsmonats.</td></tr>
|
||||
<tr><td>Preise</td><td>Alle Preise sind Endpreise, zahlbar monatlich im Voraus. Gemäß § 19 UStG wird keine Umsatzsteuer berechnet.</td></tr>
|
||||
<tr><td>Zahlung</td><td>Kreditkarte oder SEPA-Lastschrift über Stripe</td></tr>
|
||||
<tr><td>Laufzeit</td><td>Mindestlaufzeit 12 Monate ab Leistungsbeginn, kündbar zum Ende der Mindestlaufzeit bis einen Monat vorher; danach unbefristet und jederzeit zum Ende des Abrechnungsmonats kündbar. Bei Geschäftsaufgabe Sonderkündigung mit einem Monat Frist.</td></tr>
|
||||
<tr><td>Wechsel</td><td>Vom Hosting- ins Wartungs-Abo im Kundenportal, auch während der Mindestlaufzeit, solange das Hosting-Abo nicht gekündigt ist und keine Zahlung offen ist; mit dem Wechsel beginnt eine neue Mindestlaufzeit von 12 Monaten. Vom Wartungs- ins Hosting-Abo auf Anfrage nach Ablauf der Mindestlaufzeit.</td></tr>
|
||||
<tr><td>Wechsel</td><td>Vom Hosting- ins Wartungs-Abo im Kundenportal nach Leistungsbeginn, auch während der Mindestlaufzeit, solange das Hosting-Abo nicht gekündigt ist und keine Zahlung offen ist; mit dem Wechsel beginnt eine neue Mindestlaufzeit von 12 Monaten. Vom Wartungs- ins Hosting-Abo auf Anfrage nach Ablauf der Mindestlaufzeit.</td></tr>
|
||||
<tr><td>Kündigen</td><td>project.webklar.com/kuendigen.html (ohne Anmeldung; Auswahl: das Abo oder nur der E-Mail-Zusatzspeicher) oder per E-Mail</td></tr>
|
||||
<tr><td>Widerruf</td><td>Verbraucher können jede Bestellung (Abo, Wechsel, Zusatzspeicher) innerhalb von 14 Tagen ab Vertragsschluss widerrufen: project.webklar.com/widerrufen.html (siehe Widerrufsbelehrung und Hinweise zum Widerruf)</td></tr>
|
||||
</table>
|
||||
@@ -97,7 +97,7 @@
|
||||
<li><a href="#p15">Änderungen dieser Bedingungen</a></li>
|
||||
<li><a href="#p16">Schlussbestimmungen</a></li>
|
||||
</ol>
|
||||
<p class="meta" style="margin-bottom:0">Außerdem: <a href="#hosting">Leistungsbeschreibung A: Hosting-Abo</a> · <a href="#wartung">Leistungsbeschreibung B: Wartungs-Abo</a> · <a href="#widerruf">Widerrufsbelehrung und Muster-Widerrufsformular</a> · <a href="#widerruf-hinweise">Hinweise zum Widerruf bei Wechsel und Zusatzspeicher</a> · <a href="#avv">Anlage 1: Auftragsverarbeitungsvertrag</a> · <a href="#tom">Anlage 2: Technische und organisatorische Maßnahmen</a> · <a href="#sub">Anlage 3: Unterauftragsverarbeiter</a></p>
|
||||
<p class="meta" style="margin-bottom:0">Außerdem: <a href="#hosting">Leistungsbeschreibung A: Hosting-Abo</a> · <a href="#wartung">Leistungsbeschreibung B: Wartungs-Abo</a> · <a href="#widerruf">Widerrufsbelehrung und Muster-Widerrufsformular</a> · <a href="#widerruf-hinweise">Hinweise zum Widerruf</a> · <a href="#avv">Anlage 1: Auftragsverarbeitungsvertrag</a> · <a href="#tom">Anlage 2: Technische und organisatorische Maßnahmen</a> · <a href="#sub">Anlage 3: Unterauftragsverarbeiter</a></p>
|
||||
</div>
|
||||
|
||||
<h2 id="p1">§ 1 Anbieter und Geltungsbereich</h2>
|
||||
@@ -144,7 +144,7 @@
|
||||
</ul>
|
||||
<h3>(4) E-Mail-Postfächer</h3>
|
||||
<ul>
|
||||
<li>Wir richten E-Mail-Postfächer unter der Domain des Kunden ein, mit verschlüsseltem Zugang per IMAP und SMTP sowie Spam- und Virenfilter. Wir stellen sie über Hetzner (Rechenzentrum Nürnberg, Deutschland) bereit. Das Hosting-Abo umfasst ein Postfach, das Wartungs-Abo beliebig viele Postfächer.</li>
|
||||
<li>Wir richten E-Mail-Postfächer unter der Domain des Kunden ein, mit verschlüsseltem Zugang per IMAP und SMTP sowie über Webmail, mit Spam- und Virenfilter. Wir stellen sie über Hetzner (Rechenzentrum Nürnberg, Deutschland) bereit. Das Hosting-Abo umfasst ein Postfach, das Wartungs-Abo beliebig viele Postfächer.</li>
|
||||
<li>Für die Postfächer des Kunden stehen zusammen 5 GB Speicher zur Verfügung, zuzüglich gebuchtem Zusatzspeicher (§ 10). Hetzner setzt für jedes Postfach eine Speichergrenze. Die Grenzen aller Postfächer des Kunden ergeben zusammen höchstens den verfügbaren Speicher. Wie der Speicher auf die Postfächer verteilt wird, bestimmt der Kunde; ohne Vorgabe teilen wir ihn gleichmäßig auf.</li>
|
||||
<li>Ist die Speichergrenze eines Postfachs erreicht, nimmt es keine neuen E-Mails mehr an, bis wieder Platz ist, etwa durch Löschen von E-Mails, eine andere Aufteilung oder Zusatzspeicher.</li>
|
||||
<li>Das Anlegen und Löschen von Postfächern, neue Passwörter und eine andere Aufteilung des Speichers beauftragt der Kunde über den Chat im Kundenportal (Schaltfläche „Postfach anfragen“) oder per E-Mail. Wir setzen das in der Regel innerhalb eines Werktags um. Diese Arbeiten sind im Abo enthalten.</li>
|
||||
@@ -178,8 +178,8 @@
|
||||
<li>Das Kontingent gilt für Änderungen, Erweiterungen, Beratung und Unterstützung rund um die im Abo betreute Website, Domain und E-Mail. Aufträge erteilt der Kunde über den Chat im Kundenportal oder per E-Mail. Aufträge von mehr als 4 Stunden in einem Monat setzen wir nach Terminabsprache um.</li>
|
||||
<li>Angerechnet wird die tatsächlich aufgewendete Zeit je Auftrag, aufgerundet auf volle 15 Minuten. Dazu zählen die Umsetzung und die Abstimmung zum Auftrag, soweit sie länger als 10 Minuten dauert. Nicht angerechnet werden die laufenden Leistungen nach § 3 Abs. 2 bis 5 und die Sicherheitsupdates nach Leistungsbeschreibung B Nr. 2 (Betrieb, Updates, Überwachung, Sicherung, Verwaltung von Domain und Postfächern), die Behebung von Störungen (§ 3 Abs. 6, § 5) sowie die Behebung von Fehlern, die wir zu vertreten haben.</li>
|
||||
<li>Verfügbare Zeit, Bereitstellungen, Verbrauch und Ablaufdaten sieht der Kunde jederzeit im Kundenportal.</li>
|
||||
<li>Reicht die verfügbare Zeit für einen Auftrag voraussichtlich nicht aus, nennen wir dem Kunden vorher den geschätzten Mehraufwand. Wir führen ihn nur nach seiner Freigabe aus, etwa im Chat oder per E-Mail, und berechnen 100 € pro Stunde (gemäß § 19 UStG ohne Umsatzsteuer), abgerechnet in Schritten von 15 Minuten. Aufträge mit einem Umfang von mehr als 10 Stunden bieten wir gesondert an.</li>
|
||||
<li>Im Hosting-Abo gibt es kein Stundenkontingent. Aufträge, etwa Änderungen an der Website, führen wir nur nach Freigabe des Kunden aus. Vorher nennen wir ihm den geschätzten Aufwand. Wir berechnen 100 € pro Stunde (gemäß § 19 UStG ohne Umsatzsteuer), abgerechnet in Schritten von 15 Minuten; Absatz 4 Satz 1 und 2 gelten entsprechend. Aufträge mit einem Umfang von mehr als 10 Stunden bieten wir gesondert an. Die Behebung von Störungen an Server, Domain und Postfach in unserem Verantwortungsbereich ist auch im Hosting-Abo inklusive.</li>
|
||||
<li>Reicht die verfügbare Zeit für einen Auftrag voraussichtlich nicht aus, nennen wir dem Kunden vorher den geschätzten Mehraufwand. Wir führen ihn nur nach seiner Freigabe aus, etwa im Chat oder per E-Mail, und berechnen 100 € pro Stunde (Endpreis, gemäß § 19 UStG ohne Umsatzsteuer), abgerechnet in Schritten von 15 Minuten. Aufträge mit einem Umfang von mehr als 10 Stunden bieten wir gesondert an.</li>
|
||||
<li>Im Hosting-Abo gibt es kein Stundenkontingent. Aufträge, etwa Änderungen an der Website, führen wir nur nach Freigabe des Kunden aus. Vorher nennen wir ihm den geschätzten Aufwand. Wir berechnen 100 € pro Stunde (Endpreis, gemäß § 19 UStG ohne Umsatzsteuer), abgerechnet in Schritten von 15 Minuten; Absatz 4 Satz 1 und 2 gelten entsprechend. Aufträge mit einem Umfang von mehr als 10 Stunden bieten wir gesondert an. Die Behebung von Störungen an Server, Domain und Postfach in unserem Verantwortungsbereich ist auch im Hosting-Abo inklusive.</li>
|
||||
</ol>
|
||||
|
||||
<h2 id="p5">§ 5 Verfügbarkeit und Wartung</h2>
|
||||
@@ -242,7 +242,7 @@
|
||||
<li>Der Kunde bestellt Zusatzspeicher im Kundenportal im Bereich „Verträge“, indem er die Zahl der Pakete erhöht (§ 2 Abs. 5). Die Bestellübersicht zeigt die neue Gesamtgröße, den Mehrpreis pro Monat, den anteiligen Betrag für den Rest des laufenden Abrechnungsmonats, den Tag der nächsten Abbuchung und die Laufzeit (monatlich, zum Ende jedes Abrechnungsmonats kündbar, endet spätestens mit dem Abo). Mit dem Klick auf „Zahlungspflichtig bestellen“ kommt der Vertrag über den Zusatzspeicher zustande.</li>
|
||||
<li>Wir stellen den zusätzlichen Speicher in der Regel innerhalb eines Werktags bereit und verteilen ihn nach den Vorgaben des Kunden auf die Postfächer (§ 3 Abs. 4). Bis dahin zeigt das Kundenportal die Bestellung als „wird eingerichtet“ an. Wir beginnen mit der Bereitstellung sofort, auch während der Widerrufsfrist; die Folgen eines Widerrufs stehen in den Hinweisen zum Widerruf.</li>
|
||||
<li>Die Abrechnung richtet sich nach § 7 Abs. 3.</li>
|
||||
<li>Der Kunde kann die Zahl der Pakete verringern, im Kundenportal im Bereich „Verträge“ mit der Schaltfläche „Speichern“, solange das Abo nicht gekündigt ist. Den Zusatzspeicher ganz kündigen kann er jederzeit über „Verträge hier kündigen“ mit der Auswahl „Nur den E-Mail-Zusatzspeicher“ oder in Textform (§ 8 Abs. 8); nach einer Kündigung des Abos ist auch eine Verringerung nur noch in Textform möglich. Die Änderung wirkt zum Ende des laufenden Abrechnungsmonats; bis dahin zeigt das Kundenportal den Zeitpunkt und die künftige Größe an. Wir bestätigen die Änderung per E-Mail. Passen die gespeicherten E-Mails dann nicht mehr in den verbleibenden Speicher, nimmt das betroffene Postfach keine neuen E-Mails mehr an, bis wieder Platz ist (§ 3 Abs. 4). Der Kunde sollte vorher E-Mails löschen oder sichern.</li>
|
||||
<li>Der Kunde kann die Zahl der Pakete verringern, im Kundenportal im Bereich „Verträge“ mit der Schaltfläche „Speichern“, solange das Abo nicht gekündigt ist. Den Zusatzspeicher ganz kündigen kann er jederzeit über „Verträge hier kündigen“ mit der Auswahl „Nur den E-Mail-Zusatzspeicher“ oder in Textform (§ 8 Abs. 8); nach einer Kündigung des Abos kann der Kunde die Zahl der Pakete nur noch in Textform verringern. Die Änderung wirkt zum Ende des laufenden Abrechnungsmonats; bis dahin zeigt das Kundenportal den Zeitpunkt und die künftige Größe an. Wir bestätigen die Änderung per E-Mail. Passen die gespeicherten E-Mails dann nicht mehr in den verbleibenden Speicher, nimmt das betroffene Postfach keine neuen E-Mails mehr an, bis wieder Platz ist (§ 3 Abs. 4). Der Kunde sollte vorher E-Mails löschen oder sichern.</li>
|
||||
<li>Der Zusatzspeicher endet spätestens mit dem Abo. Bei einem Wechsel ins Wartungs-Abo läuft er unverändert weiter.</li>
|
||||
</ol>
|
||||
|
||||
@@ -250,7 +250,7 @@
|
||||
<ol class="abs">
|
||||
<li>Während der Laufzeit und bis 30 Tage nach Vertragsende stellen wir dem Kunden auf Wunsch eine Kopie seiner Website bzw. Anwendungsdaten (Dateien und Datenbank-Export) und der Inhalte aller seiner Postfächer bereit. Wem Quellcode und Nutzungsrechte an der Website zustehen, richtet sich nach dem Vertrag über ihre Erstellung.</li>
|
||||
<li>Wir geben den AuthCode der Domain heraus und helfen beim Umzug zu einem anderen Anbieter. Ist die Domain 30 Tage nach Vertragsende nicht umgezogen, dürfen wir ihre Registrierung beenden. Das kündigen wir vorher in Textform an und setzen eine Frist von 14 Tagen.</li>
|
||||
<li>Nach Ablauf der Frist aus Absatz 1 löschen wir die Daten des Kunden einschließlich aller Postfächer, soweit keine gesetzliche Aufbewahrungspflicht besteht. Sicherungskopien werden spätestens mit Ablauf ihrer Aufbewahrungszeit (§ 3 Abs. 5) überschrieben.</li>
|
||||
<li>Nach Ablauf der Frist aus Absatz 1 löschen wir die Daten, die wir für den Kunden gespeichert haben (Website bzw. Anwendungsdaten und alle Postfächer). Vertrags- und Abrechnungsdaten bewahren wir auf, wie es die Datenschutzerklärung beschreibt (project.webklar.com/datenschutz.html). Sicherungskopien werden spätestens mit Ablauf ihrer Aufbewahrungszeit (§ 3 Abs. 5) überschrieben.</li>
|
||||
</ol>
|
||||
|
||||
<h2 id="p12">§ 12 Mängel</h2>
|
||||
@@ -365,7 +365,7 @@
|
||||
<p class="meta">(*) Unzutreffendes streichen.</p>
|
||||
</div>
|
||||
|
||||
<h2 id="widerruf-hinweise">Hinweise zum Widerruf bei Wechsel und Zusatzspeicher</h2>
|
||||
<h2 id="widerruf-hinweise">Hinweise zum Widerruf</h2>
|
||||
<p class="hinweis">Diese Hinweise gehören zu diesen Bedingungen, nicht zur gesetzlichen Widerrufsbelehrung. Sie erklären, wie sich das Widerrufsrecht auf die einzelnen Bestellungen auswirkt.</p>
|
||||
<ol class="abs">
|
||||
<li>Das Widerrufsrecht gilt für jede Bestellung gesondert: für den Abschluss eines Abos, für den Wechsel ins Wartungs-Abo und für jede Bestellung von Zusatzspeicher. Die Frist von vierzehn Tagen beginnt jeweils mit dem Vertragsschluss (§ 2 Abs. 3 bzw. Abs. 5). Unter project.webklar.com/widerrufen.html wählt der Kunde aus, welche Bestellung er widerruft. Solange eine Widerrufsfrist läuft, zeigt das Kundenportal unter „Verträge“ den letzten Tag der Frist an.</li>
|
||||
|
||||
+79
-12
@@ -128,15 +128,32 @@ test('Widerrufsfrist beginnt mit dem Vertragsschluss, nicht mit der Bestellung',
|
||||
assert.ok(hinweise.includes('Wertersatz verlangen wir dafür nicht (Nr. 4)'))
|
||||
})
|
||||
|
||||
// Absaetze eines Paragraphen auf oberster Ebene: genau vier Leerzeichen vor <li> (verschachtelte Listen haben acht)
|
||||
const absaetzeVon = (fromId, toId) => {
|
||||
const html = read(V4)
|
||||
const slice = html.slice(html.indexOf(`id="${fromId}"`), html.indexOf(`id="${toId}"`))
|
||||
return [...slice.matchAll(/^ <li>([\s\S]*?)<\/li>$/gm)].map((m) => strip(m[1]))
|
||||
}
|
||||
// Eine Zeile der Übersicht "Das Wichtigste auf einen Blick"
|
||||
const uebersichtZeile = (name) => strip(between(read(V4), `<tr><td>${name}</td><td>`, '</td></tr>'))
|
||||
|
||||
test('Wechsel, Plus und Minus im Portal nur ohne Kündigung und ohne offene Zahlung', () => {
|
||||
const wechsel = v4Section('wechsel', 'zusatzspeicher'), speicher = v4Section('zusatzspeicher', 'p11')
|
||||
assert.ok(wechsel.includes('nicht gekündigt'))
|
||||
assert.ok(speicher.includes('nicht gekündigt'))
|
||||
assert.ok(speicher.includes('„Nur den E-Mail-Zusatzspeicher“'))
|
||||
// Übersicht: kein unbedingtes "jederzeit" mehr bei Wechsel und Zusatzspeicher
|
||||
const uebersicht = strip(read(V4)).split('Inhalt ')[0]
|
||||
assert.ok(!/jederzeit im Kundenportal/.test(uebersicht))
|
||||
assert.ok(!/Jederzeit zum Ende des Abrechnungsmonats reduzierbar/.test(uebersicht))
|
||||
const wechsel = absaetzeVon('wechsel', 'zusatzspeicher'), speicher = absaetzeVon('zusatzspeicher', 'p11')
|
||||
assert.equal(wechsel.length, 5)
|
||||
assert.equal(speicher.length, 6)
|
||||
// Jeder Absatz einzeln, damit ein fehlendes "nicht gekündigt" in Abs. 1 ODER Abs. 5 auffällt
|
||||
assert.ok(wechsel[0].includes('nicht gekündigt'), '§ 9 Abs. 1')
|
||||
assert.ok(speicher[0].includes('nicht gekündigt'), '§ 10 Abs. 1 (Bestellen und Ändern im Portal)')
|
||||
assert.ok(speicher[4].includes('nicht gekündigt'), '§ 10 Abs. 5 (Verringern mit „Speichern“)')
|
||||
assert.ok(speicher[4].includes('„Nur den E-Mail-Zusatzspeicher“'))
|
||||
assert.ok(speicher[4].includes('kann der Kunde die Zahl der Pakete nur noch in Textform verringern'))
|
||||
assert.ok(!speicher[4].includes('auch eine Verringerung'))
|
||||
// Übersicht: dieselben Bedingungen wie § 9 Abs. 1 und § 10 Abs. 1, kein unbedingtes "jederzeit"
|
||||
for (const name of ['E-Mail-Zusatzspeicher', 'Wechsel']) {
|
||||
const zeile = uebersichtZeile(name)
|
||||
for (const s of ['nach Leistungsbeginn', 'nicht gekündigt', 'keine Zahlung offen']) assert.ok(zeile.includes(s), `${name}: ${s}`)
|
||||
assert.ok(!/jederzeit im Kundenportal|Jederzeit zum Ende/.test(zeile), name)
|
||||
}
|
||||
})
|
||||
|
||||
test('Bestellübersichten nennen Laufzeit und Kündigungsmöglichkeit (§ 312j Abs. 2 BGB)', () => {
|
||||
@@ -162,12 +179,34 @@ test('Faire Nutzung der Postfächer, Hetzner benannt, Formulare, AVV-Zusatzleist
|
||||
assert.ok(strip(read(V4)).includes('über „Abo verwalten & Rechnungen“'))
|
||||
})
|
||||
|
||||
// Text je <li> und <p>, jeweils dem innersten offenen Element zugeordnet. Text hinter einer verschachtelten
|
||||
// Liste zaehlt so zum aeusseren <li> (eine Regex bis zum ersten </li> wuerde ihn uebersehen).
|
||||
const textJeElement = (html) => {
|
||||
const out = [], stack = []
|
||||
for (const [, close, tag, text] of html.matchAll(/<(\/?)([a-zA-Z0-9]+)[^>]*>|([^<]+)/g)) {
|
||||
if (text !== undefined) { if (stack.length) stack[stack.length - 1].text += text; continue }
|
||||
const t = tag.toLowerCase()
|
||||
if (t !== 'li' && t !== 'p') continue
|
||||
if (!close) stack.push({ tag: t, text: '' })
|
||||
else { const el = stack.pop(); assert.equal(el?.tag, t, `Tag-Verschachtelung bei </${t}>`); out.push(strip(el.text)) }
|
||||
}
|
||||
assert.equal(stack.length, 0, 'offene <li>/<p>')
|
||||
return out
|
||||
}
|
||||
|
||||
test('Jeder Preis in Absätzen und Listenpunkten mit Hinweis auf § 19 UStG', () => {
|
||||
// Die Übersichtstabelle ist ausgenommen (<td>), ihre Zeile "Preise" trägt den Hinweis
|
||||
const elemente = [...read(V4).matchAll(/<(li|p)\b[^>]*>([\s\S]*?)<\/\1>/g)].map((m) => strip(m[2]))
|
||||
const mitPreis = elemente.filter((t) => /\d+(,\d\d)? €/.test(t))
|
||||
// Die Übersichtstabelle ist ausgenommen (<td>); ihre Zeile "Preise" trägt den Hinweis
|
||||
assert.ok(uebersichtZeile('Preise').includes('Gemäß § 19 UStG wird keine Umsatzsteuer berechnet.'))
|
||||
const mitPreis = textJeElement(read(V4)).filter((t) => /\d+(,\d\d)? €/.test(t))
|
||||
assert.ok(mitPreis.length >= 7, `Preisstellen: ${mitPreis.length}`)
|
||||
for (const t of mitPreis) assert.ok(t.includes('§ 19 UStG'), `ohne § 19 UStG: ${t.slice(0, 90)}`)
|
||||
// Ein Wortlaut je Stelle: Fliesstext in Klammern, Kopfzeilen von A und B mit Punkt, § 7 Abs. 1 mit vollem Satz
|
||||
const fliesstext = '(Endpreis, gemäß § 19 UStG ohne Umsatzsteuer)'
|
||||
const kopfzeile = '· Endpreis, gemäß § 19 UStG ohne Umsatzsteuer'
|
||||
const p7 = 'Alle Preise sind Endpreise. Als Kleinunternehmer im Sinne von § 19 UStG berechnen wir keine Umsatzsteuer.'
|
||||
for (const t of mitPreis) {
|
||||
assert.ok(t.includes(fliesstext) || t.includes(kopfzeile) || t.includes(p7), `ohne einheitlichen § 19-Hinweis: ${t.slice(0, 90)}`)
|
||||
}
|
||||
assert.ok(!strip(read(V4)).includes('(gemäß § 19 UStG ohne Umsatzsteuer)'), 'alter Wortlaut ohne „Endpreis“')
|
||||
})
|
||||
|
||||
test('Alle internen Links und Querverweise treffen', () => {
|
||||
@@ -201,6 +240,34 @@ test('Alle internen Links und Querverweise treffen', () => {
|
||||
for (const [ref, nr] of v4Section('wartung', 'widerruf').matchAll(/\bNr\. (\d+)/g)) assert.ok(Number(nr) <= maxB, `B: ${ref}`)
|
||||
})
|
||||
|
||||
// --- Follow-up vor der Rechtsrunde (Task 1, Fix 2) ---
|
||||
|
||||
test('Follow-up: Webmail, Überschrift der Hinweise, § 11 Abs. 3, § 4 Preiswortlaut', () => {
|
||||
const html = read(V4), text = strip(html)
|
||||
// Webmail als Zugang zu den Postfaechern, einmal genannt (§ 3 Abs. 4); Übersicht und A/B nennen keine Zugangswege
|
||||
const p3 = html.slice(html.indexOf('id="p3"'), html.indexOf('id="p4"'))
|
||||
const abs4 = strip(between(p3, '<h3>(4) E-Mail-Postfächer</h3>', '<h3>(5)'))
|
||||
assert.ok(abs4.includes('Webmail'))
|
||||
assert.equal(text.split('Webmail').length - 1, 1, 'Webmail genau einmal')
|
||||
// Die Hinweise betreffen auch den Widerruf des Abos selbst: kurze Überschrift, Anker bleibt
|
||||
assert.ok(html.includes('<h2 id="widerruf-hinweise">Hinweise zum Widerruf</h2>'))
|
||||
assert.ok(html.includes('<a href="#widerruf-hinweise">Hinweise zum Widerruf</a>'))
|
||||
assert.ok(!text.includes('Hinweise zum Widerruf bei Wechsel und Zusatzspeicher'))
|
||||
// § 11 Abs. 3: nur die fuer den Kunden gespeicherten Daten werden geloescht; Vertrags- und Abrechnungsdaten
|
||||
// bleiben nach der Datenschutzerklaerung (Nachweis drei Jahre, Rechnungen nach § 147 AO)
|
||||
const p11 = absaetzeVon('p11', 'p12')
|
||||
assert.equal(p11.length, 3)
|
||||
assert.ok(p11[2].includes('löschen wir die Daten, die wir für den Kunden gespeichert haben (Website bzw. Anwendungsdaten und alle Postfächer)'))
|
||||
assert.ok(p11[2].includes('Vertrags- und Abrechnungsdaten bewahren wir auf, wie es die Datenschutzerklärung beschreibt (project.webklar.com/datenschutz.html)'))
|
||||
assert.ok(p11[2].includes('Sicherungskopien werden spätestens mit Ablauf ihrer Aufbewahrungszeit (§ 3 Abs. 5) überschrieben'))
|
||||
assert.ok(!p11[2].includes('soweit keine gesetzliche Aufbewahrungspflicht besteht'))
|
||||
// § 4 Abs. 6 und 7: derselbe Wortlaut wie an den anderen Fliesstext-Preisen
|
||||
const p4 = absaetzeVon('p4', 'p5')
|
||||
assert.equal(p4.length, 7)
|
||||
assert.ok(p4[5].includes('100 € pro Stunde (Endpreis, gemäß § 19 UStG ohne Umsatzsteuer)'), '§ 4 Abs. 6')
|
||||
assert.ok(p4[6].includes('100 € pro Stunde (Endpreis, gemäß § 19 UStG ohne Umsatzsteuer)'), '§ 4 Abs. 7')
|
||||
})
|
||||
|
||||
// --- Datenschutzerklärung (Plan 2, Task 2) ---
|
||||
|
||||
const DS = 'public/datenschutz.html'
|
||||
|
||||
Reference in new issue
Block a user