Fonction de réservation
Activez le flux opt-in avec créneaux sûrs, checkout Stripe, e-mail et calendriers.
Synchronisé avec le commit
7d452a6du starter.
Les réservations sont désactivées par défaut. Activez NEXT_PUBLIC_FEATURE_RESERVATIONS_ENABLED=true après avoir défini catalogue, zone IANA, horaires, prix/acompte, webhook Stripe et e-mail dans src/config/reservations.ts. L’auto-seed démo est aussi coupé et ne convient pas à la production.
Flux : GET /api/reservations/services, POST /api/reservations/availability, POST /api/reservations idempotent et GET /api/reservations/mine. UI : /:locale/reserve et /:locale/account/reservations.
Le checkout crée sous verrou un hold de 35 minutes et une session Stripe ; la même Idempotency-Key est rejouable. Advisory lock et contrainte d’exclusion empêchent les chevauchements. Seul le webhook vérifié confirme le paiement, jamais la page retour. L’expiration libère le hold de cette seule session.
La confirmation enfile un e-mail ICS et fournit Google Calendar. Testez concurrence, doublons, abandon, paiement retardé, zone/DST, acompte/total, reprises et isolation.