Terminplaner: Fix Widerruf nach Terminbeginn, Zustimmung beim Verschieben, Berliner Widerrufsfrist, Grenzen nur ohne Treffer

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
ClaudeandClaude Sonnet 5.5 committed 2026-10-03 08:17:43 +00:00
1 parent 2d9b75b3bf
commit c4ec24448e
10 files changed
+319 -77

No files matched your search

+12 -9
View File
@@ -35,10 +35,12 @@ import { datumKurz, datumLang, uhrzeit } from './zeit.js'
* G07 altStart (bisheriger Beginn, Pflicht)
* G06/G07 ohneIcs: true laesst die Kalenderdatei weg (eine unbestaetigte Anfrage hat nie eine Einladung bekommen,
* es gibt im Kalender des Gastes nichts abzusagen oder zu verschieben)
* G08 fall 'zugeordnet' | 'nach_frist' | 'nicht_zugeordnet' (Pflicht); eingang (Date, Pflicht); an (bei 'nicht_zugeordnet')
* G08 fall 'zugeordnet' | 'nach_frist' | 'begonnen' | 'nicht_zugeordnet' (Pflicht); eingang (Date, Pflicht); an (Adresse der
* Erklaerung, Pflicht bei 'nicht_zugeordnet'). 'begonnen' (Widerruf nach Terminbeginn, Frist noch nicht um) und
* 'nicht_zugeordnet' tragen keinen Fallblock (neutraler Satz) und keine Buchungsnummer
* K20 fall (= block) 'anfrage' oder nichts
* K21 fall (= block) 'abgesagt' | 'verschoben' | 'widerrufen' | 'nicht_zugeordnet' | 'nach_frist' (Pflicht); altStart (verschoben);
* eingang (widerrufen, nach_frist, nicht_zugeordnet); bei 'nicht_zugeordnet' ist buchung { gastName, gastEmail,
* K21 fall (= block) 'abgesagt' | 'verschoben' | 'widerrufen' | 'nicht_zugeordnet' | 'nach_frist' | 'begonnen' (Pflicht);
* altStart (verschoben); eingang (widerrufen, nach_frist, begonnen, nicht_zugeordnet); bei 'nicht_zugeordnet' ist buchung { gastName, gastEmail,
* gastTelefon, gastNachricht } aus der Erklaerung
* K20/K21 kundeName (Anrede des Kunden; sonst Name aus dem Kundendokument, zuletzt der Betriebsname)
* Fuer Mails ohne Buchung gibt extra.bookingId den Bezug im Outbox-Eintrag an (Vorgabe '-').
@@ -90,6 +92,7 @@ export const BETREFFE = einfrieren({
verschoben: 'Termin verschoben: {leistung}, jetzt am {datum} um {zeit}',
widerrufen: 'Termin widerrufen: {leistung} am {datum} um {zeit}',
nach_frist: 'Widerruf nach Ablauf der Frist: {leistung} am {datum} um {zeit}',
begonnen: 'Widerruf nach Terminbeginn: {leistung} am {datum} um {zeit}',
nicht_zugeordnet: 'Widerruf ohne passende Buchung',
},
},
@@ -328,16 +331,16 @@ function gastG07({ ctx, anrede, buchung, extra }) {
}
function gastG08({ ctx, anrede, buchung, extra }) {
const fall = wahlFall(extra.fall, ['zugeordnet', 'nach_frist', 'nicht_zugeordnet'], 'G08')
const zugeordnet = fall !== 'nicht_zugeordnet'
const fall = wahlFall(extra.fall, ['zugeordnet', 'nach_frist', 'begonnen', 'nicht_zugeordnet'], 'G08')
const mitBlock = fall === 'zugeordnet' || fall === 'nach_frist'
const values = {
...betriebsWerte(ctx),
eingang: eingangText(extra.eingang),
// die gespeicherte Nummer der gefundenen Buchung, nie eine Eingabe des Gastes
nummer: zugeordnet ? buchungsNummer(pflichtText(buchung?.$id, 'buchung.$id')) : LEER,
nummer: mitBlock ? buchungsNummer(pflichtText(buchung?.$id, 'buchung.$id')) : LEER,
betreff: betreff('G08', anrede, 'standard', {}),
}
return { values, blocks: { [anrede]: true, ...(zugeordnet ? { [fall]: true } : {}) } }
return { values, blocks: { [anrede]: true, ...(mitBlock ? { [fall]: true } : {}) } }
}
const GAST_BAUER = {
@@ -379,7 +382,7 @@ function betriebK20({ ctx, buchung, extra }) {
}
function betriebK21({ ctx, buchung, extra }) {
const fall = wahlFall(extra.fall, ['abgesagt', 'verschoben', 'widerrufen', 'nicht_zugeordnet', 'nach_frist'], 'K21')
const fall = wahlFall(extra.fall, ['abgesagt', 'verschoben', 'widerrufen', 'nicht_zugeordnet', 'nach_frist', 'begonnen'], 'K21')
const values = {
...betriebsMailWerte(ctx, buchung, extra),
leistung: LEER,
@@ -400,7 +403,7 @@ function betriebK21({ ctx, buchung, extra }) {
const alt = pflichtDatum(extra.altStart, 'extra.altStart')
Object.assign(values, { alt_datum: datumLang(alt), alt_zeit: uhrzeit(alt) })
}
if (['widerrufen', 'nach_frist', 'nicht_zugeordnet'].includes(fall)) values.eingang = eingangText(extra.eingang)
if (['widerrufen', 'nach_frist', 'begonnen', 'nicht_zugeordnet'].includes(fall)) values.eingang = eingangText(extra.eingang)
values.betreff = betreff('K21', 'du', fall, { leistung: values.leistung, datum: kurz.datum, zeit: kurz.zeit })
return { values, blocks: { [fall]: true } }
}