Buchungsflow – Details

Version: 1.0.0 | Status: DRAFT | Updated: 2026-04-22


3-Schritt-Flow im Frontend

Schritt 1: /booking – Datum & Extras

  1. Kalender lädt gebuchte Zeiträume via fetchBookedDates()
  2. Gast wählt Check-In / Check-Out
  3. Gast wählt Extras: Bettwäsche (25€), Grill (15€), Bollerwagen (10€)
  4. Live-Preisberechnung via priceBreakdown Store
  5. → Weiter zu /concierge

Schritt 2: /concierge – REWE Concierge

  1. Katalog lädt via fetchReweCatalog()
  2. Gast wählt Paket: Basic (49,90€), Romantik (79,90€), Familie (89,90€)
  3. Gast wählt Addons: Bier, Wein, Frühstück, Grillpakete
  4. Lieferdatum = Check-In Tag − 1
  5. → Weiter zu /booking/confirmation

Schritt 3: /booking/confirmation – Bestätigung

  1. createAppointment() → MS Graph POST (Mock: gibt JSON zurück)
  2. Stripe UI erscheint (Placeholder im DEMO)
  3. Nach Zahlung: markAppointmentPaid() → MS Graph PATCH
  4. Falls Concierge gewählt: placeReweOrder()
  5. 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)