Wechsel Hosting → Wartung: neuer Abbuchungstag, Gutschrift, 12 neue Monate
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
379cc26dcd
commit
188db4b3c1
15 files changed
+2035
-12
No files matched your search
@@ -4,15 +4,19 @@ import { test } from 'node:test'
|
||||
import { escapeHtml, htmlToText, loadTemplate, renderMail, templateIds } from '../server/services/mailTemplates.js'
|
||||
|
||||
const DIR = new URL('../server/mail-templates/', import.meta.url)
|
||||
// K12, K14 und T12 (Wechsel ins Wartungs-Abo) aus Task 9; K13/T13 und die Endfassung der Texte folgen in Task 12
|
||||
const EXPECTED = [
|
||||
...Array.from({ length: 11 }, (_, i) => `K${String(i + 1).padStart(2, '0')}`),
|
||||
'K12',
|
||||
'K14',
|
||||
...Array.from({ length: 11 }, (_, i) => `T${String(i + 1).padStart(2, '0')}`),
|
||||
'T12',
|
||||
]
|
||||
|
||||
const sampleValues = (tpl) => Object.fromEntries(tpl.placeholders.map((p) => [p, `Wert-${p}`]))
|
||||
const allBlocks = (tpl, on) => Object.fromEntries(tpl.blocks.map((b) => [b, on]))
|
||||
|
||||
test('alle 22 Vorlagen sind da', () => {
|
||||
test('alle Vorlagen sind da', () => {
|
||||
assert.deepEqual(templateIds(), EXPECTED)
|
||||
})
|
||||
|
||||
@@ -149,3 +153,50 @@ test('T02: Block nachweis_fehlt weist auf den fehlenden Nachweis hin', () => {
|
||||
assert.match(withBlock.text, /contractEvents/)
|
||||
assert.doesNotMatch(renderMail('T02', values, {}).text, /Nachweis nicht gespeichert/)
|
||||
})
|
||||
|
||||
// Task 9 (Rechtsrunde 28.09.2026): Wechsel ins Wartungs-Abo wird erst mit der Zahlung wirksam
|
||||
test('K12, K14, T12: Betreff, Platzhalter und Blöcke des Wechsels', () => {
|
||||
assert.equal(loadTemplate('K12').subject, 'Ihr Wechsel ins WEBklar Wartungs-Abo – Bestätigung')
|
||||
assert.deepEqual(loadTemplate('K12').placeholders, ['name', 'wechseltag', 'betrag_heute', 'monatspreis', 'mindestlaufzeit_bis', 'bedingungen_version', 'zustimmung_zeitpunkt'])
|
||||
assert.equal(loadTemplate('K14').subject, 'Ihr Wechsel ins WEBklar Wartungs-Abo ist nicht zustande gekommen')
|
||||
assert.deepEqual(loadTemplate('K14').placeholders, ['name', 'grund'])
|
||||
assert.equal(loadTemplate('T12').subject, '[Abo] Wechsel ins Wartungs-Abo: {{email}}')
|
||||
// F37: feste Platzhalter fuer T12
|
||||
assert.deepEqual(loadTemplate('T12').placeholders, ['email', 'name', 'stripe_abo_id', 'wechseltag', 'betrag_heute', 'monatspreis'])
|
||||
for (const block of ['gescheitert', 'lastschrift_gescheitert']) assert.ok(loadTemplate('T12').blocks.includes(block), block)
|
||||
})
|
||||
|
||||
test('K12: Block zahlung_offen wörtlich, Block lastschrift mit dem Satz aus § 9 Abs. 3', () => {
|
||||
const values = sampleValues(loadTemplate('K12'))
|
||||
const offen = renderMail('K12', values, { zahlung_offen: true })
|
||||
assert.ok(offen.text.includes('Der Wechsel wird wirksam, sobald die Zahlung bestätigt ist. Andernfalls läuft Ihr Hosting-Abo mit Preis und Mindestlaufzeit wie bisher weiter.'))
|
||||
assert.doesNotMatch(offen.text, /SEPA-Lastschrift/)
|
||||
const sepa = renderMail('K12', values, { lastschrift: true })
|
||||
assert.match(sepa.text, /Wird die Lastschrift nicht eingelöst, gilt der Wechsel als nicht erfolgt/)
|
||||
assert.match(sepa.text, /Ihr Abbuchungstag bleibt der Wechseltag/)
|
||||
assert.doesNotMatch(sepa.text, /sobald die Zahlung bestätigt ist/)
|
||||
const plain = renderMail('K12', values, {})
|
||||
assert.doesNotMatch(plain.text, /sobald die Zahlung bestätigt ist|Wird die Lastschrift nicht eingelöst/)
|
||||
// Vertragsbestaetigung: Preis mit § 19 UStG, Mindestlaufzeit, Unterlagen, Zustimmung zum Sofortbeginn
|
||||
for (const text of ['gemäß § 19 UStG ohne Umsatzsteuer', 'Mindestlaufzeit 12 Monate bis Wert-mindestlaufzeit_bis.', 'Widerrufsbelehrung mit Muster-Widerrufsformular', 'Sie haben ausdrücklich verlangt, dass wir vor Ablauf der Widerrufsfrist mit dem Wartungs-Abo beginnen']) {
|
||||
assert.ok(plain.text.includes(text), text)
|
||||
}
|
||||
})
|
||||
|
||||
test('K14: Hosting-Abo läuft wie vor dem Wechsel weiter; SEPA: Abbuchungstag bleibt', () => {
|
||||
const values = { name: 'Kunde', grund: 'Die SEPA-Lastschrift für die Wechselrechnung wurde nicht eingelöst.' }
|
||||
const card = renderMail('K14', values, {})
|
||||
assert.deepEqual(card.problems, [])
|
||||
assert.ok(card.text.includes('Ihr Hosting-Abo läuft mit Preis und Mindestlaufzeit wie vor dem Wechsel weiter.'))
|
||||
assert.ok(card.text.includes(values.grund))
|
||||
assert.doesNotMatch(card.text, /Abbuchungstag/)
|
||||
assert.match(renderMail('K14', values, { lastschrift: true }).text, /Ihr Abbuchungstag bleibt der Tag des Wechsels\./)
|
||||
})
|
||||
|
||||
// Nach der Pruefung der Rechtsrunden-Texte: Stripe kann die Frist auch kuerzer setzen
|
||||
test('Wechsel-Mails nennen keine feste Frist von 23 Stunden', () => {
|
||||
for (const id of ['K12', 'K14', 'T12']) {
|
||||
const tpl = loadTemplate(id)
|
||||
assert.doesNotMatch(renderMail(id, sampleValues(tpl), allBlocks(tpl, true)).text, /23 Stunden/, id)
|
||||
}
|
||||
})
|
||||
Reference in new issue
Block a user