Terminplaner: Handeintraege verlangen nur den Namen, Bestaetigung braucht eine Adresse
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
be49d38e0c
commit
589f5088a6
3 files changed
+65
-14
No files matched your search
@@ -88,6 +88,7 @@ export const MELDUNG = {
|
||||
nameLeer: 'Bitte einen Namen angeben.',
|
||||
nameLang: `Der Name darf höchstens ${NAME_MAX} Zeichen lang sein.`,
|
||||
email: 'Bitte eine gültige E-Mail-Adresse angeben (genau ein Postfach).',
|
||||
bestaetigungAdresse: 'Für die Bestätigung braucht der Gast eine E-Mail-Adresse.',
|
||||
telefonLeer: 'Bitte eine Telefonnummer angeben.',
|
||||
telefon: 'Bitte eine gültige Telefonnummer angeben (Ziffern, Leerzeichen, + - und Klammern).',
|
||||
nachrichtLeer: 'Bitte eine Nachricht angeben.',
|
||||
@@ -155,10 +156,13 @@ export async function mailSicher(was, bookingId, fn) {
|
||||
/**
|
||||
* Prueft die Eingabe des Formulars gegen die Einstellung. => geprueft und bereinigt; sonst 400 mit allen Feldfehlern.
|
||||
* Abgeschaltete Gastfelder (aus) werden ignoriert, Zusatzfelder muessen konfiguriert sein.
|
||||
* manuell (Termin von Hand, ablaufBetrieb.js): die E-Mail-Adresse ist freiwillig (leer => ''; ist sie angegeben, muss sie
|
||||
* stimmen), Erinnerung und Zustimmungen entfallen (der Betrieb traegt ein, der Gast klickt nichts an).
|
||||
* manuell (Termin von Hand, ablaufBetrieb.js; meist Telefon oder Laufkundschaft): Pflicht ist nur der Name. E-Mail, Telefon,
|
||||
* Nachricht und Zusatzfelder sind freiwillig, unabhaengig von gastFelder (auch bei "aus" oder "pflicht"); was angegeben ist,
|
||||
* wird wie beim Gast auf Form und Laenge geprueft (Zusatzfelder muessen konfiguriert sein). Mit bestaetigung (der Gast soll
|
||||
* eine Bestaetigung bekommen) ist die E-Mail-Adresse Pflicht. Erinnerung und Zustimmungen entfallen (der Betrieb traegt
|
||||
* ein, der Gast klickt nichts an).
|
||||
*/
|
||||
export function pruefeEingabe(e, roh, now, { manuell = false } = {}) {
|
||||
export function pruefeEingabe(e, roh, now, { manuell = false, bestaetigung = false } = {}) {
|
||||
if (!istObjekt(roh)) throw fehlerMit(400, { _: MELDUNG.formular })
|
||||
const { fehler, fehl } = fehlerSammler()
|
||||
|
||||
@@ -189,9 +193,12 @@ export function pruefeEingabe(e, roh, now, { manuell = false } = {}) {
|
||||
const ohneAdresse = manuell && (roh.email === undefined || roh.email === null || (typeof roh.email === 'string' && roh.email.trim() === ''))
|
||||
const email = ohneAdresse ? '' : emailAdresse(roh.email)
|
||||
if (email === null) fehl('email', MELDUNG.email)
|
||||
else if (ohneAdresse && bestaetigung) fehl('email', MELDUNG.bestaetigungAdresse)
|
||||
|
||||
// Telefon, Nachricht, Zusatzfelder nach gastFelder
|
||||
const felder = e.gastFelder || {}
|
||||
// Telefon, Nachricht, Zusatzfelder nach gastFelder (bei Handeintraegen alles freiwillig, siehe oben)
|
||||
const felder = manuell
|
||||
? { telefon: 'optional', nachricht: 'optional', zusatz: (e.gastFelder?.zusatz || []).map((f) => ({ ...f, pflicht: false })) }
|
||||
: e.gastFelder || {}
|
||||
let telefon = ''
|
||||
if (felder.telefon !== 'aus') {
|
||||
telefon = bereinigterText(roh.telefon, TELEFON_MAX + 1)
|
||||
|
||||
@@ -262,11 +262,12 @@ async function legeBelegungAn(ctx, id, daten, ressourceId, start, block, now, be
|
||||
|
||||
/**
|
||||
* Termin von Hand eintragen (Telefon, Laufkundschaft): `quelle 'manuell'`, sofort `bestaetigt`, `verbraucher false`
|
||||
* (kein Widerruf, keine Belehrung durch das System: bei telefonischen Buchungen Sache des Betriebs). Eingabe und Pruefung
|
||||
* wie beim Gast (Leistung, Person oder "egal", Tag, Uhrzeit, Name, Telefon, Nachricht, Zusatzfelder), aber ohne Zustimmungen
|
||||
* und Erinnerung, die E-Mail-Adresse ist freiwillig. Die Zeit muss frei sein (freie Zeiten der Leistung), nur Vorlauf und
|
||||
* Horizont gelten nicht (ohneRegeln; nie die Vergangenheit, nie belegte Zellen). G02 (Einladung, Verwaltungslink, ohne
|
||||
* Widerrufsbelehrung) geht nur mit `bestaetigungSenden: true` und einer Adresse an den Gast. Kein K20: der Betrieb weiss es.
|
||||
* (kein Widerruf, keine Belehrung durch das System: bei telefonischen Buchungen Sache des Betriebs). Pflicht ist nur der
|
||||
* Name; E-Mail, Telefon, Nachricht und Zusatzfelder sind freiwillig, egal was gastFelder fuer Gaeste vorgibt, werden aber,
|
||||
* wenn angegeben, wie beim Gast geprueft. Leistung, Person oder "egal", Tag und Uhrzeit wie beim Gast, ohne Zustimmungen
|
||||
* und Erinnerung. Die Zeit muss frei sein (freie Zeiten der Leistung), nur Vorlauf und Horizont gelten nicht (ohneRegeln;
|
||||
* nie die Vergangenheit, nie belegte Zellen). G02 (Einladung, Verwaltungslink, ohne Widerrufsbelehrung) geht nur mit
|
||||
* `bestaetigungSenden: true` an den Gast; dann ist die E-Mail-Adresse Pflicht (400 Feld email). Kein K20: der Betrieb weiss es.
|
||||
* @param {{ feature: object, einstellung: object }} ctx Kontext (kontext.js)
|
||||
* @param {object} roh { leistung, ressource, tag, zeit, name, email?, telefon?, nachricht?, zusatz?, bestaetigungSenden? }
|
||||
* @param {Date} now
|
||||
@@ -277,11 +278,11 @@ export async function manuell(ctx, roh, now) {
|
||||
pruefeNow(now, 'manuell')
|
||||
pruefeKontext(ctx, 'manuell')
|
||||
const e = ctx.einstellung
|
||||
const g = pruefeEingabe(e, roh, now, { manuell: true })
|
||||
const senden = roh?.bestaetigungSenden === true
|
||||
const g = pruefeEingabe(e, roh, now, { manuell: true, bestaetigung: senden })
|
||||
if (roh.bestaetigungSenden !== undefined && roh.bestaetigungSenden !== null && typeof roh.bestaetigungSenden !== 'boolean') {
|
||||
throw fehlerMit(400, { bestaetigungSenden: MELDUNG.ungueltig })
|
||||
}
|
||||
const senden = roh.bestaetigungSenden === true && g.email !== ''
|
||||
|
||||
const { start, ressourceId } = await pruefeSlot(ctx, g, now, { ohneRegeln: true })
|
||||
const block = blockEnde(start, g.leistung)
|
||||
|
||||
Reference in new issue
Block a user