Buchungsflow – Details
Version: 1.0.0 | Status: DRAFT | Updated: 2026-04-22
3-Schritt-Flow im Frontend
Schritt 1: /booking – Datum & Extras
- Kalender lädt gebuchte Zeiträume via
fetchBookedDates() - Gast wählt Check-In / Check-Out
- Gast wählt Extras: Bettwäsche (25€), Grill (15€), Bollerwagen (10€)
- Live-Preisberechnung via
priceBreakdownStore - → Weiter zu
/concierge
Schritt 2: /concierge – REWE Concierge
- Katalog lädt via
fetchReweCatalog() - Gast wählt Paket: Basic (49,90€), Romantik (79,90€), Familie (89,90€)
- Gast wählt Addons: Bier, Wein, Frühstück, Grillpakete
- Lieferdatum = Check-In Tag − 1
- → Weiter zu
/booking/confirmation
Schritt 3: /booking/confirmation – Bestätigung
createAppointment()→ MS Graph POST (Mock: gibt JSON zurück)- Stripe UI erscheint (Placeholder im DEMO)
- Nach Zahlung:
markAppointmentPaid()→ MS Graph PATCH - Falls Concierge gewählt:
placeReweOrder() - Buchungsbestätigung + REWE-Status anzeigen
Preisberechnung (Store)
priceBreakdown = derived(booking, ($b) => {
const nights = calcNights($b.checkIn, $b.checkOut);
return {
nights,
basePrice: nights * PRICE_PER_NIGHT, // 150€
linenCost: $b.extras.linen ? 25 : 0,
grillCost: $b.extras.grill ? 15 : 0,
bollerCost: $b.extras.boller ? 10 : 0,
cleaningFee: 150,
conciergeFee: $b.concierge ? calcConciergeTotal(...) : 0,
total: /* Summe */
};
});
Midweek-Lückenwoche – Auslastungsoptimierung
!!! tip "Strategischer Hintergrund" Wochenend-Buchungen (Fr–So) hinterlassen regelmäßig Lücken zwischen zwei Buchungsblöcken. Diese Lücken würden ungenutzt bleiben. Das Midweek-System macht sie flexibel buchbar und steigert die Auslastung ohne den Sa-Woche / Fr-Weekend-Rhythmus zu stören.
Wann entsteht ein Midweek-Fenster?
Das System erkennt automatisch zwei Lücken-Typen aus den MS Graph Buchungsdaten:
Fall 1 – Lücke VOR einem Freitag (Wochenend-Buchung folgt):
─────────────────────────────────────────────────────────────
[Sa–Sa Woche] Lücke amber [Fr–So Weekend]
└─ from: Ende Wochenbuchung (Sa)
└─ to: Start Wochenend-Buchung (Fr) ← Ankerpunkt!
└─ Bedingung: to.getDay() === 5 (Freitag)
Fall 2 – Lücke NACH einem Wochenende (Monday-Start durch Sunday-Blocking):
────────────────────────────────────────────────────────────────────────────
[Fr–So Weekend] Lücke amber [Sa–Sa Woche]
└─ from: Mo (Wochenend-Checkout So 20:00 → Sunday-Blocking → Mo)
└─ Fenster bis: from + 5 Tage = Samstag (gedeckelt durch nächste Buchung)
└─ Bedingung: from.getDay() === 1 (Montag)
Implementierung in BookingCalendar.svelte
$: midweekWindows = (() => {
const sorted = [...bookedRanges].sort((a, b) => a.start.localeCompare(b.start));
const wins: { from: string; to: string }[] = [];
for (let i = 0; i < sorted.length - 1; i++) {
const from = sorted[i].end;
const to = sorted[i + 1].start;
const toDay = new Date(to + 'T12:00:00').getDay();
const fromDay= new Date(from + 'T12:00:00').getDay();
// Fall 1: Lücke endet an Freitag
if (toDay === 5 && nightsBetween(from, to) >= 2) {
wins.push({ from, to });
}
// Fall 2: Lücke beginnt an Montag → Fenster bis zum nächsten Samstag
if (fromDay === 1) {
const nextSat = addDaysStr(from, 5);
const windowTo = nextSat < to ? nextSat : to; // min(Sa, nächste Buchung)
if (nightsBetween(from, windowTo) >= 2) {
wins.push({ from, to: windowTo });
}
}
}
return wins;
})();
!!! note "Wichtig: T12:00:00 Mittag-Ankerpunkt"
Alle new Date(dateStr) Aufrufe verwenden T12:00:00 als Suffix.
Ohne dies würde new Date("2026-05-16") als UTC Mitternacht interpretiert –
in CEST (UTC+2) wäre das lokale 02:00, der Wochentag könnte auf den Vortag fallen.
Erlaubte Midweek-Starts
Ein Tag ist amber-markiert und buchbar wenn:
| Bedingung | Erklärung |
|---|---|
Tag liegt in midweekWindow |
str >= win.from && str < win.to |
| Mindestens 2 Nächte bis Fenster-Ende | nightsBetween(str, win.to) >= 2 |
| Kein Freitag | Freitag → immer eigene Weekend-Logik |
| Samstag nur wenn ungültiger Sa-Start | Sa mit Überschneidung → Midweek erlaubt |
| Nicht vergangen, nicht belegt | Basisprüfung |
Praxisbeispiel Mai 2026
[Sa 09.05.–Sa 16.05.] Wochenbuchung (7N)
─────────────────────────────────────────────
LÜCKE 1 (Fall 1): Sa 16.05. → Fr 22.05. (6N)
✅ Sa 16.05. amber (Woche würde bis 23.05. reichen → Überschneidung → Midweek)
✅ So 17.05. amber (5N bis Fr)
✅ Mo 18.05. amber (4N)
✅ Di 19.05. amber (3N)
✅ Mi 20.05. amber (2N) ← letzter möglicher Start
❌ Do 21.05. (nur 1N bis Fr → Minimum nicht erfüllt)
─────────────────────────────────────────────
[Fr 22.05.–So 24.05.] Wochenend-Buchung (2N, Late Checkout 20:00)
[Mo 25.05.] Sunday-Blocking (So 20:00 → range bis Mo)
─────────────────────────────────────────────
LÜCKE 2 (Fall 2): Mo 25.05. → Sa 30.05. (5N, Fenster Mo+5)
✅ Mo 25.05. amber (5N bis Sa)
✅ Di 26.05. amber (4N)
✅ Mi 27.05. amber (3N)
✅ Do 28.05. amber (2N) ← letzter möglicher Start
❌ Fr 29.05. (Freitag → Weekend-Logik, nicht Midweek)
❌ Sa 30.05. (Fenstergrenze, nicht im Fenster)
─────────────────────────────────────────────
[Sa 06.06.–Sa 13.06.] Wochenbuchung (7N)
Business-Impact
| Szenario | Ohne Midweek | Mit Midweek |
|---|---|---|
| Freitags-Buchung in voller Woche | 5 Leernächte | bis zu 5 × 150€ = 750€ Mehrumsatz |
| Kurze Woche nach Wochenende | 5 Leernächte | bis zu 5 × 150€ = 750€ Mehrumsatz |
| Aktionspreis ab 8. Nacht | — | 120€/Nacht (attraktiv für Langzeitgäste) |