一句話:訂房散客直訂是 lodging 模組的成交 flow,前台或後台選旅宿 / 房型 / 日期區間,扣每晚庫存,建立 lodging order line,並接同一套金流分類帳。
/booking,只看 lodging 模組啟用且可直訂的旅宿。room_night_inventory,計算逐晚價格與可售數。orders(kind='lodging');order_lines(line_kind='lodging');lodging_booking_lines;lodging_nightly_snapshots;order_charge_lines(type='lodging_night');payment_schedules 與首個 payment_intents。後台 /admin/lodging/book 可替客戶建 lodging order。代訂可選立即手動入帳、ATM / credit card redirect,或先建立待付款單;無論入口如何,資料模型與前台自助一致。
訂房不走 trips/departures 席次模型;庫存以 property + room_type + date 為單位。
reserveNightsInTx 在同一交易中 conditional update 每晚 booked_count;room_night_inventory。Lodging order 不在 orders 外殼保存房型或金額。資料責任:
| 表 | 職責 |
|---|---|
orders | 營運外殼與三軸狀態快取。 |
order_lines | lodging 商品 line;保存顯示 snapshot。 |
lodging_booking_lines | 房型、入住退房區間、間數、入住人數、訂房人快照。 |
lodging_nightly_snapshots | 每晚售價與庫存快照,供稽核與重新顯示。 |
order_charge_lines | 每晚應收、折扣、費用等財務真相。 |
會員中心與訂單詳情必須 kind-aware 呈現 lodging 訂單;tour-only 管理頁面不得靜默把 lodging order 當 tour 處理。
payment_schedules 表達。payment_transactions。取消 lodging order 一律走 cancelLodgingBooking(lodging/booking-repo.ts):
booking_state='cancelled'——refund_state='refunded' 但仍 confirmed 的單照樣取消釋庫存(先退款後取消不可漏放房晚);room_night_holds.released_at,見 lodging-inventory §3.3.1);booking_state 轉為 cancelled;reversal 沖掉應收 → reconcileSchedulesToReceivable 收斂 schedules → 重算三軸 + 斷言不變量;同時 expire 開放中的 attempts / intents(現為 inline 實作,待整併 import 共用 sweepOrderReceivableOnCancel);通用 cancelOrder(tour 取消入口)對 lodging 訂單 fail-closed 回 invalid_kind——server action 與 /api/v1 直呼皆被擋,不再有「翻狀態不釋庫存」的漏放路徑。退款需另走 refunds 工作流;取消本身不代表自動退款(取消後 gross=0,退款走 overpayment_return)。
/booking 與後台 lodging routes fail closed。