From f5e304ad7a9ee2b7da95cd75f33d928a316615bb Mon Sep 17 00:00:00 2001 From: Kenso Grimm Date: Wed, 7 Oct 2026 15:09:57 +0000 Subject: [PATCH] =?UTF-8?q?Buchungskalender:=20UI-Durchlauf=20=E2=80=93=20?= =?UTF-8?q?Platzhalter=20in=20Stornobedingungen=20blockieren=20das=20Speic?= =?UTF-8?q?hern?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 --- public/buchungen-preise.js | 1 + server/services/unterkunft/verwaltung.js | 3 +++ test/unterkunftVerwaltung.test.js | 8 ++++++++ 3 files changed, 12 insertions(+) diff --git a/public/buchungen-preise.js b/public/buchungen-preise.js index caa9b13..fe694a8 100644 --- a/public/buchungen-preise.js +++ b/public/buchungen-preise.js @@ -143,6 +143,7 @@ export async function zeichnePreise(ctx, unterkunft) { } const storn = String(storno.value).trim() if (storn.length < 20 || storn.length > 5000) fehler.stornobedingungen = 'Die Stornobedingungen brauchen 20 bis 5000 Zeichen.' + if (!fehler.stornobedingungen && /\[[^\]]*\]/.test(storn)) fehler.stornobedingungen = 'Bitte ersetze die Platzhalter in eckigen Klammern durch deine Werte.' const body = { staffeln, reinigungCent, aufpreisPersonNachtCent: aufpreisCent, personenInklusive: zahl('personenInklusive', inklusive, 'Bitte gib eine ganze Zahl ab 1 an.', 1, 1000), diff --git a/server/services/unterkunft/verwaltung.js b/server/services/unterkunft/verwaltung.js index 23a6cb9..c3a5006 100644 --- a/server/services/unterkunft/verwaltung.js +++ b/server/services/unterkunft/verwaltung.js @@ -21,6 +21,8 @@ const BIC_RE = /^[A-Z0-9]{8}([A-Z0-9]{3})?$/ const UST_ID_RE = /^[A-Z]{2}[A-Z0-9]{2,18}$/ const SAETZE = [0, 7, 19] +/** Unausgefuellte Platzhalter des Mustertexts ("[30]", "[E-Mail-Adresse des Vermieters]") duerfen nicht zum Gast gelangen. */ +export const PLATZHALTER_TEXT = 'Bitte ersetze die Platzhalter in eckigen Klammern durch deine Werte.' export const MAX_UNTERKUENFTE = 20 export const MAX_ICAL_IMPORTE = 5 export const MAX_STAFFELN = 6 @@ -204,6 +206,7 @@ export function pruefePreise(eingabe) { } const sb = text(e.stornobedingungen, 5000) if (sb.length < 20 || sb.length > 5000) fehler.stornobedingungen = 'Die Stornobedingungen müssen 20 bis 5000 Zeichen lang sein.' + else if (/\[[^\]]*\]/.test(sb)) fehler.stornobedingungen = PLATZHALTER_TEXT else werte.stornobedingungen = sb return Object.keys(fehler).length ? { fehler } : { werte } } diff --git a/test/unterkunftVerwaltung.test.js b/test/unterkunftVerwaltung.test.js index c18d1a4..ac73a5f 100644 --- a/test/unterkunftVerwaltung.test.js +++ b/test/unterkunftVerwaltung.test.js @@ -613,3 +613,11 @@ test('Online-Zahlung: nur mit aktivem Stripe-Konto, sonst 409 mit felder.onlineZ assert.equal((await put('/einstellungen', { telefon: '123' })).status, 200) assert.equal((await put('/einstellungen', { onlineZahlung: true })).status, 200) }) + +test('Stornobedingungen mit unausgefuellten Platzhaltern in eckigen Klammern werden abgelehnt', () => { + for (const text of ['Bis [30] Tage vor Anreise kostenfrei, sonst Anteil.', 'Stornierung per E-Mail an [E-Mail-Adresse des Vermieters] moeglich.']) { + const r = pruefePreise({ ...PREISE, stornobedingungen: text }) + assert.equal(r.fehler?.stornobedingungen, 'Bitte ersetze die Platzhalter in eckigen Klammern durch deine Werte.', text) + } + assert.ok(pruefePreise({ ...PREISE, stornobedingungen: 'Bis 30 Tage vor Anreise kostenfrei, danach 50 Prozent.' }).werte) +})