Alle PlaybooksBooking Platform

Ein Fenster ohne Erstattung hinzufügen

Jeder Service legt die letzten Stunden vor dem Termin fest, in denen eine Stornierung durch den Kunden nicht mehr erstattet wird.

Wann du es brauchst

Heute erhält ein Kunde, der spät storniert, late_cancellation_refund_percent des gezahlten Betrags, bis zum Beginn des Termins. Dieses Playbook ergänzt pro Service ein Fenster (zum Beispiel die letzten 4 Stunden), in dem die Erstattung auf null sinkt.

Regeln, die gelten bleiben

  • Migrationen sind append-only: 202610060001_booking_domain.sql nicht ändern, sondern eine neue Datei anlegen.
  • Die Erstattungsentscheidung ist rein und liegt in refundForCancellation; workflows.ts wendet sie an und berechnet keine Beträge selbst.
  • Stornierungen durch das Team werden immer vollständig erstattet.
  • Eine bereits festgelegte Erstattung (refundTargetCents) sinkt nie.

Schritte

  1. Lege supabase/migrations/<YYYYMMDDHHMM>_service_no_refund_window.sql mit einem Zeitstempel nach allen bestehenden Migrationen an:
    alter table public.services
      add column no_refund_hours integer not null default 0
        check (no_refund_hours between 0 and 720),
      add constraint services_no_refund_within_free_window
        check (no_refund_hours <= free_cancellation_hours);
    
    Der Standardwert 0 erhält das bisherige Verhalten bestehender Services.
  2. In src/lib/booking/policy.ts:
    • noRefundHours zu BookingPolicy hinzufügen;
    • "no_refund_window" zu RefundReason hinzufügen;
    • in refundForCancellation für Kunden mit weniger als noRefundHours bis zum Beginn den Grund no_refund_window und das Ziel 0 setzen. Das bestehende Math.max mit refundTargetCents bleibt erhalten.
  3. In src/lib/booking/repository.ts no_refund_hours zu ServiceRow, zum service-Pick von BookingDetails, zu SERVICE_COLUMNS, zur services(...)-Auswahl in BOOKING_DETAILS und zu toPolicy hinzufügen.
  4. Im Admin-Bereich das Feld noRefundHours zum Service-Formular in src/app/admin/catalog/page.tsx und no_refund_hours: integer(formData, "noRefundHours", 0) zum Insert in src/app/admin/actions.ts hinzufügen. Die CHECK-Constraints prüfen den Wert.
  5. Erkläre das Fenster im Stornierungsbereich von src/app/book/[serviceId]/page.tsx, nur wenn no_refund_hours > 0.
  6. In test/policy.test.ts noRefundHours zur gemeinsamen Policy hinzufügen und prüfen, dass:
    • innerhalb des Fensters nichts erstattet wird, mit Grund no_refund_window;
    • zwischen den beiden Schwellen weiterhin der Prozentsatz für späte Stornierungen gilt;
    • das Team auch innerhalb des Fensters vollständig erstattet;
    • ein früheres Erstattungsziel nicht verringert wird.

Fertig, wenn

  • die Prüfbefehle erfolgreich laufen;
  • die Migration auf einem Supabase-Projekt mit bestehenden Services durchläuft;
  • vor der Änderung angelegte Services sich genau wie vorher verhalten.