Öffnungszeiten: Abo-Abgleich mit 30 Tagen Frist
gleicheZeitenAboAb(now) koppelt die im Wartungs-Abo enthaltenen Zeiten (unlockedBy abo) an das Abo (Spec 5, Z11): Abo-Ende erkennen (aboEndeAt, K26), nach 30 Berliner Kalendertagen abschalten (abo_ende, K27, Ersatz-Ticket), bei Rückkehr des Abos wieder einschalten (Neubau nach dem Abschalten, K24 wieder), 30 Tage nach dem Abschalten Daten löschen und state off. Lesefehler beim Abo: Kunde überspringen, nie abschalten oder löschen. R25: activate() leert aboEndeAt und behaltenSessionId; starteBehalten lehnt bei laufendem Wartungs-Abo mit 409 ab (Lesefehler 503). R17: k24Mail mit einbau null und wieder schaltet beide Einbau-Blöcke ab, K24 bekommt dafür den Block weiter um den Kasten "Wie geht es weiter?". Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
53253f0451
commit
efc6dcf332
8 files changed
+1285
-10
No files matched your search
@@ -43,6 +43,7 @@ const BEISPIELE = {
|
||||
'K24 angestossen': () => k24Mail({ kunde: KUNDE.name, projekt: 'Praxis Muster', einbau: 'angestossen', wieder: false, ticketNr: 100123 }),
|
||||
'K24 manuell mit Ticket': () => k24Mail({ kunde: KUNDE.name, projekt: 'Praxis Muster', einbau: 'manuell', wieder: false, ticketNr: 100123 }),
|
||||
'K24 wieder ohne Ticket': () => k24Mail({ kunde: KUNDE.name, projekt: 'Praxis Muster', einbau: 'angestossen', wieder: true }),
|
||||
'K24 wieder ohne Neubau': () => k24Mail({ kunde: KUNDE.name, projekt: 'Praxis Muster', einbau: null, wieder: true }),
|
||||
'K25 ein Tag': () => k25Mail({ kunde: KUNDE.name, projekt: 'Praxis Muster', tage: [{ tag: '2026-10-03', name: 'Tag der Deutschen Einheit', art: 'feiertag' }] }),
|
||||
'K25 mehrere mit prüfen': () =>
|
||||
k25Mail({
|
||||
@@ -61,7 +62,7 @@ const BEISPIELE = {
|
||||
|
||||
test('Vorlagen K24–K27: Datei, Betreff, Platzhalter und Blöcke stehen fest', () => {
|
||||
const erwartet = {
|
||||
K24: { file: 'K24 Zeiten eingeschaltet.html', subject: 'Öffnungszeiten live ist eingeschaltet', placeholders: ['kunde_name', 'projekt', 'ticket', 'portal_url'], blocks: ['angestossen', 'manuell', 'wieder'] },
|
||||
K24: { file: 'K24 Zeiten eingeschaltet.html', subject: 'Öffnungszeiten live ist eingeschaltet', placeholders: ['kunde_name', 'projekt', 'ticket', 'portal_url'], blocks: ['angestossen', 'manuell', 'wieder', 'weiter'] },
|
||||
K25: { file: 'K25 Zeiten Feiertage pruefen.html', subject: 'Feiertage stehen an – stimmen Deine Zeiten?', placeholders: ['kunde_name', 'projekt', 'tage', 'portal_url'], blocks: ['pruefen', 'mehrere'] },
|
||||
K26: { file: 'K26 Zeiten Abo beendet.html', subject: 'Dein Wartungs-Abo ist beendet – Öffnungszeiten live behalten?', placeholders: ['kunde_name', 'projekt', 'frist', 'preis', 'portal_url'], blocks: ['abo_ende', 'hosting', 'wechsel_widerrufen'] },
|
||||
K27: { file: 'K27 Zeiten abgeschaltet.html', subject: 'Öffnungszeiten live ist abgeschaltet', placeholders: ['kunde_name', 'projekt', 'loeschdatum', 'preis', 'portal_url'], blocks: [] },
|
||||
@@ -100,26 +101,48 @@ test('Anrede: Kunde als Name oder als Kundendokument, ohne Namen bleibt der Wert
|
||||
test('K24: Text je nach einbau (angestossen: nach dem nächsten Veröffentlichen, manuell: das Team baut ein)', () => {
|
||||
const auto = BEISPIELE['K24 angestossen']()
|
||||
assert.equal(auto.template, 'K24')
|
||||
assert.deepEqual(auto.blocks, { angestossen: true, manuell: false, wieder: false })
|
||||
assert.deepEqual(auto.blocks, { angestossen: true, manuell: false, wieder: false, weiter: true })
|
||||
const textAuto = render(auto).text
|
||||
assert.match(textAuto, /nach dem nächsten Veröffentlichen/)
|
||||
assert.doesNotMatch(textAuto, /baut unser Team/)
|
||||
assert.match(textAuto, /Ticket #100123/, 'Ticketnummer steht in beiden Fällen in der Mail')
|
||||
|
||||
const hand = BEISPIELE['K24 manuell mit Ticket']()
|
||||
assert.deepEqual(hand.blocks, { angestossen: false, manuell: true, wieder: false })
|
||||
assert.deepEqual(hand.blocks, { angestossen: false, manuell: true, wieder: false, weiter: true })
|
||||
const textHand = render(hand).text
|
||||
assert.match(textHand, /baut unser Team/)
|
||||
assert.doesNotMatch(textHand, /nach dem nächsten Veröffentlichen/)
|
||||
assert.match(textHand, /Ticket #100123/)
|
||||
|
||||
// ohne bekannten Einbau sagt die Mail das Vorsichtige: das Team baut ein
|
||||
// ohne bekannten Einbau sagt die Mail das Vorsichtige: das Team baut ein (null gilt nur mit wieder als "kein Einbau nötig", siehe unten)
|
||||
for (const einbau of [undefined, null, '', 'unbekannt']) {
|
||||
const unklar = k24Mail({ kunde: 'K', projekt: 'P', einbau })
|
||||
assert.deepEqual(unklar.blocks, { angestossen: false, manuell: true, wieder: false }, String(einbau))
|
||||
assert.deepEqual(unklar.blocks, { angestossen: false, manuell: true, wieder: false, weiter: true }, String(einbau))
|
||||
}
|
||||
})
|
||||
|
||||
test('K24 wieder ohne Neubau (einbau null, Abo kehrt vor dem Abschalten zurück): beide Einbau-Blöcke und der Kasten "Wie geht es weiter" entfallen', () => {
|
||||
const ohne = BEISPIELE['K24 wieder ohne Neubau']()
|
||||
assert.deepEqual(ohne.blocks, { angestossen: false, manuell: false, wieder: true, weiter: false })
|
||||
const mail = render(ohne)
|
||||
assert.deepEqual(mail.problems, [])
|
||||
assert.match(mail.text, /Dein Wartungs-Abo läuft wieder/)
|
||||
assert.match(mail.text, /Zeiten und Einstellungen sind unverändert/)
|
||||
// nichts, was nach Einbau klingt (die Leisten waren nie weg)
|
||||
assert.doesNotMatch(mail.text, /Wie geht es weiter|nach dem nächsten Veröffentlichen|baut unser Team|Ohne gespeicherte Zeiten|Ticket/)
|
||||
// Knopf, Projekt und Funktion bleiben
|
||||
assert.match(mail.text, /Projekt: Praxis Muster/)
|
||||
assert.match(mail.html, new RegExp(`<a href="${PORTAL.replaceAll('.', '\\.')}"`))
|
||||
|
||||
// mit Neubau (angestossen oder manuell) bleibt der Kasten, auch beim Wiedereinschalten
|
||||
for (const einbau of ['angestossen', 'manuell']) {
|
||||
const text = render(k24Mail({ kunde: 'K', projekt: 'P', einbau, wieder: true })).text
|
||||
assert.match(text, /Wie geht es weiter/, einbau)
|
||||
}
|
||||
// einbau null ohne wieder ist kein Fall der Mail: es bleibt beim Vorsichtigen
|
||||
assert.deepEqual(k24Mail({ kunde: 'K', projekt: 'P', einbau: null }).blocks, { angestossen: false, manuell: true, wieder: false, weiter: true })
|
||||
})
|
||||
|
||||
test('K24: ohne Ticketnummer steht kein leeres Ticket in der Mail; wieder nennt das Abo', () => {
|
||||
const ohne = k24Mail({ kunde: 'K', projekt: 'P', einbau: 'manuell' })
|
||||
assert.equal(ohne.values.ticket, '')
|
||||
@@ -129,7 +152,7 @@ test('K24: ohne Ticketnummer steht kein leeres Ticket in der Mail; wieder nennt
|
||||
assert.equal(k24Mail({ kunde: 'K', projekt: 'P', einbau: 'manuell', ticketNr: '#100124' }).values.ticket, ' (Ticket #100124)')
|
||||
|
||||
const wieder = BEISPIELE['K24 wieder ohne Ticket']()
|
||||
assert.deepEqual(wieder.blocks, { angestossen: true, manuell: false, wieder: true })
|
||||
assert.deepEqual(wieder.blocks, { angestossen: true, manuell: false, wieder: true, weiter: true })
|
||||
const mitWieder = render(wieder).text
|
||||
assert.match(mitWieder, /Dein Wartungs-Abo läuft wieder/)
|
||||
assert.match(mitWieder, /wieder eingeschaltet/)
|
||||
|
||||
Reference in new issue
Block a user