Tutti i playbookBooking Platform

Aggiungere una finestra senza rimborso

Ogni servizio definisce le ultime ore prima dell'appuntamento in cui la cancellazione del cliente non viene più rimborsata.

Quando usarlo

Oggi il cliente che annulla in ritardo riceve late_cancellation_refund_percent dell'importo pagato, fino all'inizio dell'appuntamento. Questo playbook aggiunge una finestra per servizio (per esempio le ultime 4 ore) in cui il rimborso scende a zero.

Regole da rispettare

  • Le migration sono append-only: non modificare 202610060001_booking_domain.sql, aggiungi un nuovo file.
  • La decisione sul rimborso è pura e vive in refundForCancellation; workflows.ts la applica e non deve calcolare importi da solo.
  • Le cancellazioni dello staff rimborsano sempre per intero.
  • Un rimborso già deciso (refundTargetCents) non diminuisce mai.

Passi

  1. Crea supabase/migrations/<YYYYMMDDHHMM>_service_no_refund_window.sql con un timestamp successivo a tutte le migration esistenti:
    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);
    
    Il default 0 mantiene il comportamento attuale per i servizi esistenti.
  2. In src/lib/booking/policy.ts:
    • aggiungi noRefundHours a BookingPolicy;
    • aggiungi "no_refund_window" a RefundReason;
    • in refundForCancellation, per un cliente a cui mancano meno di noRefundHours all'inizio, imposta il motivo no_refund_window e il target 0. Lascia al suo posto il Math.max con refundTargetCents.
  3. In src/lib/booking/repository.ts aggiungi no_refund_hours a ServiceRow, al pick service di BookingDetails, a SERVICE_COLUMNS, alla select services(...) di BOOKING_DETAILS e a toPolicy.
  4. Nell'area admin aggiungi il campo noRefundHours al form dei servizi in src/app/admin/catalog/page.tsx e no_refund_hours: integer(formData, "noRefundHours", 0) all'insert in src/app/admin/actions.ts. I vincoli CHECK validano il valore.
  5. Spiega la finestra al cliente nel riquadro delle cancellazioni di src/app/book/[serviceId]/page.tsx, solo quando no_refund_hours > 0.
  6. In test/policy.test.ts aggiungi noRefundHours alla policy condivisa e verifica che:
    • dentro la finestra non ci sia rimborso, con motivo no_refund_window;
    • fra le due soglie valga ancora la percentuale tardiva;
    • lo staff rimborsi comunque per intero dentro la finestra;
    • un target di rimborso precedente non venga ridotto.

Completato quando

  • i comandi di verifica passano;
  • la migration si applica su un progetto Supabase con servizi esistenti;
  • i servizi creati prima della modifica si comportano esattamente come prima.