會員進入預約結帳時,由後端鎖定營位、重算金額並建立 15 分鐘有效的待付款預約。
POST /api/booking/checkout/sessions
→ 驗證會員與冪等鍵
→ 鎖定營區,依 zoneId 排序鎖定營位
→ 同一交易內重查跨晚可用量
→ 依 calendar_dates 計算平日/假日晚數與金額
→ 建立 pending + unpaid Booking、營位快照、狀態歷程
→ 回傳 ready_to_pay 與 checkoutExpiresAt
IDEMPOTENCY_CONFLICT。ZONE_UNAVAILABLE,交易不留下半成品。pending、unpaid,期限為建立時間加 15 分鐘。BookingCheckoutIntegrationTest 在只有完整 Schema、沒有 dev seed 的 PostgreSQL 執行 7 項,全部通過。