Terminplaner: Hinweistexte nach Recherche, Storno nur bei Preis

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
ClaudeandClaude Sonnet 5.5 committed 2026-10-05 04:29:32 +00:00
1 parent 722c686690
commit 6ec8885bfd
11 files changed
+230 -21

No files matched your search

+27 -2
View File
@@ -12,6 +12,7 @@ import {
zahlungText,
fehlendePflichtangaben,
zeigtWiderruf,
hatPreis,
} from '../server/services/termine/einstellungen.js'
import { VORLAGEN, vorlagenListe, ausVorlage } from '../server/services/termine/vorlagen.js'
import { BUNDESLAENDER } from '../server/services/termine/feiertage.js'
@@ -116,8 +117,12 @@ test('Vorlagen: Anfrage bei tattoo/handwerk/fotograf, sonst sofort; Werkstatt mi
assert.ok(werkstatt.ressourcen.every((r) => r.typ === 'platz'))
})
test('Vorlagen: Stornotext Variante 1 mit Frist aus den Regeln und 50 Prozent, Widerrufssatz bleibt', () => {
for (const key of Object.keys(VORLAGEN)) {
const MIT_PREIS = (key) => VORLAGEN[key].leistungen.some((l) => l.preisArt !== 'keiner' && l.preisCent > 0)
test('Vorlagen: Stornotext Variante 1 mit Frist aus den Regeln und 50 Prozent, Widerrufssatz bleibt (Vorlagen mit Preis)', () => {
const mitPreis = Object.keys(VORLAGEN).filter(MIT_PREIS)
assert.ok(mitPreis.length >= 7, 'die meisten Vorlagen haben Preise')
for (const key of mitPreis) {
const e = ausVorlage(key, BETRIEB, NOW)
const text = e.storno.text
assert.ok(text.startsWith(`Sie können Ihren Termin bis ${e.regeln.absageBisStd} Stunden vorher kostenlos absagen oder verschieben (Link in der Bestätigungsmail).`), key)
@@ -129,6 +134,26 @@ test('Vorlagen: Stornotext Variante 1 mit Frist aus den Regeln und 50 Prozent, W
}
})
test('vorlage_ohne_preis_ohne_storno: eine Vorlage, deren Leistungen alle kostenlos sind, bringt keinen Stornotext mit; Vorlagen mit Preisen bleiben unverändert', () => {
const ohnePreis = Object.keys(VORLAGEN).filter((key) => !MIT_PREIS(key))
assert.deepEqual(ohnePreis.sort(), ['handwerk', 'sonstiges'], 'diese beiden Vorlagen haben nur kostenlose Leistungen')
for (const key of ohnePreis) {
const e = ausVorlage(key, BETRIEB, NOW)
assert.ok(e.leistungen.every((l) => !hatPreis(l)), key)
assert.equal(e.storno.text, '', `${key}: kein Stornotext`)
assert.equal(e.storno.version, '', `${key}: und keine Fassungsnummer`)
assert.deepEqual(gueltig(e, { bisher: e }), e, `${key}: stabil`)
}
// mit Preisen: der Vorschlag steht wie bisher im Entwurf (50 % / 24 h für Salon)
for (const key of Object.keys(VORLAGEN).filter(MIT_PREIS)) {
const e = ausVorlage(key, BETRIEB, NOW)
assert.equal(e.storno.text, VORLAGEN[key].storno, key)
assert.equal(e.storno.version, '2026-10-02-1', key)
}
// die Vorlagendaten selbst bleiben unverändert (der Text steht dort weiter, ausVorlage entscheidet)
assert.ok(VORLAGEN.handwerk.storno.includes('50 %'))
})
test('Vorlagen: zwei Aufrufe ergeben verschiedene IDs und Feed-Token; Kleinunternehmer wird uebernommen', () => {
const a = ausVorlage('salon', BETRIEB, NOW)
const b = ausVorlage('salon', { ...BETRIEB, kleinunternehmer: true }, NOW)