ccairn

訂單與金流模型

一張訂單把「賣了什麼」「客人欠多少」「收了多少」「退了多少」拆成獨立明細;訂單上的金額與狀態都是這些明細算出來的結果。

理解這點,你才能正確解讀 GET /orders/{id} 回傳的欄位——外殼上的 *Twd 與狀態都是派生值,不是你直接設定的欄位。

訂單物件

一張訂單(order)是與產品種類無關的外殼(kindtourlodging)。它本身不帶總額——金額來自下面幾組明細,訂單上看到的 *Twd 與狀態欄位都是派生值:

欄位(回傳)意義
orderNumber訂單編號
kindtour(梯次團)或 lodging(住宿)
bookingState / paymentState / refundState三軸狀態(見下)
grossReceivableTwd應收總額(chargeLines 加總)
collectedTwd已收現金
customerCashAppliedTwd已套用到此單的客人現金(已收 − 已退)
outstandingTwd尚欠 = 應收 − 已套用現金
chargeLines / schedules / intents / transactions / travelers各類明細陣列
說明

訂單外殼沒有 total、沒有 paidAt。要知道客人欠多少看 outstandingTwd,收了多少看 collectedTwd——這些都由明細即時算出。

金額怎麼來

金額都是整數台幣(客人一律付台幣)。回傳的金額欄位對應這組白話關係:

應收 grossReceivableTwd      = 所有 chargeLines 金額加總(含折扣為負)
已收 collectedTwd            = 所有收進來的現金
已套用 customerCashAppliedTwd = 已收 − 退給客人的現金
尚欠 outstandingTwd          = 應收 − 已套用

所以折扣、加價、房升補款都是 chargeLines 裡的一筆(折扣是負數),不是訂單上某個彙總欄位。

三軸狀態

訂單沒有單一「狀態」。顯示狀態由三個獨立軸組成:

bookingState : pending_payment → confirmed → completed ;(任一 → cancelled)
paymentState : unpaid | partially_paid | deposit_paid | paid | overpaid
refundState  : none | partially_refunded | refunded
注意

paymentState = paid 不代表錢還在手上——它只代表「應收已被現金覆蓋」。一張全額退款的訂單,paymentState 仍是 paid,退款狀態由 refundState 表達(與 Stripe 全退的 PaymentIntent 仍 succeeded 同理)。畫狀態標籤請三軸一起看,不要只看 paymentState

退款的兩種意義

退款分兩種,務必分清:

種類動應收嗎?算進 refundState
減應收退款(取消 / 降價 / 服務未提供)是——同時調降 grossReceivableTwd
溢收退還(退多收的錢)否——只退現金

退款本身有自己的工作流狀態:

draft → submitted → approved → processing → paid
        submitted → rejected ; approved → cancelled ; processing → failed

對應 API:POST /orders/{id}/refunds 建立、.../refunds/{refundId}/approve/mark-paid/reject

常見流程

建立 tour 訂單POST /orderstripId / departureId / travelers / paymentMethod 等,平台會以保座方式建單(座位不足回 409 conflict),並依付款方案產生收款計畫。

付款後加價(如房型升級):平台新增一筆 chargeLines → 訂單重新出現 outstandingTwd → 產生補款連結。不會靜默把已付訂單金額改大。

讀取GET /orders 列表(依角色自動限縮可見範圍),GET /orders/{id} 取完整訂單(含旅客、應收、現金、收款計畫、退款、同意書)。每個欄位的型別見 API 參考的回應欄位表。

下一步

Command Palette

Search for a command to run...