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.sqlnicht ändern, sondern eine neue Datei anlegen. - Die Erstattungsentscheidung ist rein und liegt in
refundForCancellation;workflows.tswendet 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
- Lege
supabase/migrations/<YYYYMMDDHHMM>_service_no_refund_window.sqlmit einem Zeitstempel nach allen bestehenden Migrationen an:
Der Standardwertalter 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);0erhält das bisherige Verhalten bestehender Services. - In
src/lib/booking/policy.ts:noRefundHourszuBookingPolicyhinzufügen;"no_refund_window"zuRefundReasonhinzufügen;- in
refundForCancellationfür Kunden mit weniger alsnoRefundHoursbis zum Beginn den Grundno_refund_windowund das Ziel0setzen. Das bestehendeMath.maxmitrefundTargetCentsbleibt erhalten.
- In
src/lib/booking/repository.tsno_refund_hourszuServiceRow, zumservice-Pick vonBookingDetails, zuSERVICE_COLUMNS, zurservices(...)-Auswahl inBOOKING_DETAILSund zutoPolicyhinzufügen. - Im Admin-Bereich das Feld
noRefundHourszum Service-Formular insrc/app/admin/catalog/page.tsxundno_refund_hours: integer(formData, "noRefundHours", 0)zum Insert insrc/app/admin/actions.tshinzufügen. Die CHECK-Constraints prüfen den Wert. - Erkläre das Fenster im Stornierungsbereich von
src/app/book/[serviceId]/page.tsx, nur wennno_refund_hours > 0. - In
test/policy.test.tsnoRefundHourszur 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.
- innerhalb des Fensters nichts erstattet wird, mit Grund
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.
