Buchungskalender: Preise je Personenzahl (Server)

Jede Staffel darf personenCent tragen (Preis pro Nacht für 1 bis k Personen, k = 2 bis 10), ohne Schemaänderung im JSON-Feld staffeln. pruefePreise prüft Länge, Werte und Gleichheit über alle Staffeln und setzt preisProNachtCent = personenCent[0]. berechnePreis wählt die Spalte der Gästezahl (Posten mit Personenzahl), bei mehr Gästen als Spalten gilt die letzte plus Zusatzperson-Aufpreis. preiseVollstaendig prüft die Konsistenz. Ohne personenCent rechnet alles wie bisher. Tests mit Mimis Preismatrix, Doku in unterkunft-api.md.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
knsoandClaude Opus 5.5 committed 2026-10-11 15:02:45 +00:00
1 parent b264d7f734
commit a4ade5f649
5 files changed
+379 -12

No files matched your search

+43 -4
View File
@@ -3,6 +3,7 @@ import { config } from '../../config.js'
import { istTag, naechte } from './datum.js'
import { AKTIVE_STATUS, ueberschneidet } from './belegung.js'
import { listeAnfragenNachStatus, listeSperren } from './speicher.js'
import { NACHT_CENT_MAX, NACHT_CENT_MIN, PERSONEN_PREISE_MAX, PERSONEN_PREISE_MIN } from './preis.js'
/**
* Buchungskalender, Verwaltung durch den Vermieter: Validierung der Eingaben (reine Funktionen, Rueckgabe { werte } oder
@@ -26,6 +27,8 @@ export const PLATZHALTER_TEXT = 'Bitte ersetze die Platzhalter in eckigen Klamme
export const MAX_UNTERKUENFTE = 20
export const MAX_ICAL_IMPORTE = 5
export const MAX_STAFFELN = 6
/** Groesse des Textfelds ukPreise.staffeln (schema.js); test/unterkunftVerwaltung.test.js vergleicht beide Werte. */
export const STAFFELN_MAX_ZEICHEN = 2000
// ---- Einstellungen
@@ -149,7 +152,12 @@ export function pruefeUnterkunft(eingabe, { partiell = false } = {}) {
// ---- Preise
/** Pruefung der Preise einer Unterkunft (Staffeln aufsteigend, erste ab 1 Nacht, hoechstens 6). */
/**
* Pruefung der Preise einer Unterkunft (Staffeln aufsteigend, erste ab 1 Nacht, hoechstens 6).
* Jede Staffel darf personenCent tragen (Preis pro Nacht fuer 1..k Personen, k = 2 bis 10): entweder alle Staffeln mit gleich
* vielen Werten oder keine (Modell "pauschal", unveraendert). Im Personen-Modus setzt der Server preisProNachtCent = personenCent[0]
* (eine mitgeschickte Zahl wird ueberschrieben).
*/
export function pruefePreise(eingabe) {
const e = eingabe && typeof eingabe === 'object' && !Array.isArray(eingabe) ? eingabe : {}
const fehler = {}
@@ -160,15 +168,42 @@ export function pruefePreise(eingabe) {
else {
const sauber = []
let letzte = 0
let personenAnzahl // undefined = noch keine Staffel gesehen, 0 = pauschal, sonst Laenge k von personenCent
for (const s of st) {
if (!s || typeof s !== 'object' || !ganz(s.abNaechten) || !ganz(s.preisProNachtCent)) {
if (!s || typeof s !== 'object' || !ganz(s.abNaechten)) {
fehler.staffeln = 'Ungültige Preisstufe.'
break
}
if (s.preisProNachtCent < 100 || s.preisProNachtCent > 100000) {
const hatPersonen = s.personenCent !== undefined && s.personenCent !== null
if (hatPersonen) {
const pc = s.personenCent
if (!Array.isArray(pc)) {
fehler.staffeln = 'Die Preise je Personenzahl sind ungültig.'
break
}
if (pc.length < PERSONEN_PREISE_MIN || pc.length > PERSONEN_PREISE_MAX) {
fehler.staffeln = `Der Preis je Personenzahl braucht ${PERSONEN_PREISE_MIN} bis ${PERSONEN_PREISE_MAX} Werte (für 1 bis ${PERSONEN_PREISE_MAX} Personen).`
break
}
if (!pc.every((c) => ganz(c) && c >= NACHT_CENT_MIN && c <= NACHT_CENT_MAX)) {
fehler.staffeln = 'Der Preis pro Nacht muss zwischen 1 € und 1.000 € liegen.'
break
}
} else if (!ganz(s.preisProNachtCent)) {
fehler.staffeln = 'Ungültige Preisstufe.'
break
} else if (s.preisProNachtCent < NACHT_CENT_MIN || s.preisProNachtCent > NACHT_CENT_MAX) {
fehler.staffeln = 'Der Preis pro Nacht muss zwischen 1 € und 1.000 € liegen.'
break
}
const anzahl = hatPersonen ? s.personenCent.length : 0
if (personenAnzahl !== undefined && anzahl !== personenAnzahl) {
fehler.staffeln = anzahl === 0 || personenAnzahl === 0
? 'Entweder haben alle Preisstufen Preise je Personenzahl oder keine.'
: 'Alle Preisstufen brauchen gleich viele Preise je Personenzahl.'
break
}
personenAnzahl = anzahl
if (sauber.length === 0 && s.abNaechten !== 1) {
fehler.staffeln = 'Die erste Preisstufe muss ab 1 Nacht gelten.'
break
@@ -178,8 +213,12 @@ export function pruefePreise(eingabe) {
break
}
letzte = s.abNaechten
sauber.push({ abNaechten: s.abNaechten, preisProNachtCent: s.preisProNachtCent })
sauber.push(hatPersonen
? { abNaechten: s.abNaechten, preisProNachtCent: s.personenCent[0], personenCent: [...s.personenCent] }
: { abNaechten: s.abNaechten, preisProNachtCent: s.preisProNachtCent })
}
// Sicherung: das Textfeld ukPreise.staffeln fasst STAFFELN_MAX_ZEICHEN (schema.js); der Hoechstfall (6 x 10 Werte) braucht rund 800
if (!fehler.staffeln && JSON.stringify(sauber).length > STAFFELN_MAX_ZEICHEN) fehler.staffeln = 'Die Preisstufen sind zu umfangreich.'
if (!fehler.staffeln) werte.staffeln = sauber
}
const zahl = (k, min, max, label, std) => {