予約機能
同時実行に安全な hold、Stripe checkout、email、calendar を持つ opt-in 予約を有効化します。
スターターのコミット
7d452a6と同期済みです。
予約は既定で無効です。src/config/reservations.ts に service catalog、IANA timezone、営業時間、価格/deposit、Stripe webhook、email policy を定義してから NEXT_PUBLIC_FEATURE_RESERVATIONS_ENABLED=true にします。demo auto-seed も無効で本番依存は禁止です。
API は GET /api/reservations/services、POST /api/reservations/availability、冪等 POST /api/reservations、GET /api/reservations/mine。UI は /:locale/reserve と /:locale/account/reservations です。
checkout は DB lock 内で 35 分 hold と Stripe Session を一度作り、同じ Idempotency-Key を安全に replay します。advisory lock と exclusion constraint が同時 hold/confirmed の重複を防ぎます。支払い確定は検証済み webhook だけで、return page では行いません。期限切れは該当 session の hold だけ解放します。
確定時は ICS email を enqueue し Google Calendar link を提供します。同時予約、重複、放棄、遅延支払い、timezone/DST、deposit/full、email retry、組織 scope をテストします。