記錄規則¶
本頁說明交易資料在各種情境下的記法。欄位定義見交易推送。
金額恆等式¶
| 情況 | 恆等式 |
|---|---|
外加稅(prices_include_tax = false) |
total = subtotal − discount + tax + service_charge + tip + rounding |
內含稅(prices_include_tax = true) |
total = subtotal − discount + service_charge + tip + rounding |
不符時不拒收,於回應 warnings 列出,請檢查後更正(version +1 重送)。
套餐與選項¶
| 情境 | 記法 |
|---|---|
| 套餐 | 套餐本身一列(product_type = COMBO,帶套餐價);combo_components 的每個品項(含主餐)都要各列一列,parent_line_no 指向套餐列,unit_price = "0.00" |
| 選項加價 | 加價記在該列 modifiers[].price_delta,並已加進 unit_price。例:Fries 4.49 + Cheese Powder 0.75 → unit_price = "5.24" |
| 套餐飲料升級 | 套餐列 unit_price 加上升級價差,modifiers 記錄升級選項;飲料子品項列記實際選到的飲料,unit_price = "0.00" |
銷量統計
套餐內含品項(有 parent_line_no 的列)計入品項銷售數量,但不計金額;金額全部記在套餐列。
範例:套餐飲料升級¶
Jimbo 套餐(14.49)選椒鹽口味,飲料升級為珍珠奶茶(+3.50):
- 套餐列
unit_price = 14.49 + 3.50 = "17.99" - modifiers 含
{ "group_id": "COMBO_DRINK", "option_id": "DRK-BOBA", "price_delta": "3.50" } - 飲料子品項列
product_id = "DRK-BOBA"、unit_price = "0.00"
[
{ "line_no": 1, "parent_line_no": null, "product_id": "COMBO-02", "product_name": "Master Jimbo Combo", "product_type": "COMBO",
"quantity": "1", "unit_price": "17.99", "discount_amount": "0.00", "line_amount": "17.99", "tax_category": "STANDARD",
"modifiers": [
{ "group_id": "FLAVOR_JIMBO", "option_id": "SALT_PEPPER", "option_name": "Taiwanese Salt & Pepper", "quantity": "1", "price_delta": "0.00" },
{ "group_id": "COMBO_DRINK", "option_id": "DRK-BOBA", "option_name": "Taiwan Boba Tea", "quantity": "1", "price_delta": "3.50" }
], "is_voided": false },
{ "line_no": 2, "parent_line_no": 1, "product_id": "SGL-JIMBO", "product_name": "Master Jimbo", "product_type": "SINGLE",
"quantity": "1", "unit_price": "0.00", "discount_amount": "0.00", "line_amount": "0.00", "tax_category": "STANDARD", "modifiers": [], "is_voided": false },
{ "line_no": 3, "parent_line_no": 1, "product_id": "SIDE-FRIES", "product_name": "Fries", "product_type": "SIDE",
"quantity": "1", "unit_price": "0.00", "discount_amount": "0.00", "line_amount": "0.00", "tax_category": "STANDARD", "modifiers": [], "is_voided": false },
{ "line_no": 4, "parent_line_no": 1, "product_id": "DRK-BOBA", "product_name": "Taiwan Boba Tea", "product_type": "DRINK",
"quantity": "1", "unit_price": "0.00", "discount_amount": "0.00", "line_amount": "0.00", "tax_category": "STANDARD", "modifiers": [], "is_voided": false }
]
換貨(EXCHANGE)¶
顧客拿已購買的商品回來,在同一張單裡退掉舊品、換成新品,只收(或退)差額。一張單裡同時有退回(負)和新購(正),金額方向依品項而定,所以標準交易型態清單中 EXCHANGE 的 amount_sign 為 null。
- 退回的舊品:
quantity為負數,line_amount為負數。 - 換到的新品:
quantity、line_amount為正數。 original_trade_record_id指向原交易。- 差額:新品較貴時,用
payment_type = SALE補收;較便宜時用REFUND退差額;等價時payments為空陣列。
例:原本買 Fries(4.49),換成 Cheese Corn(5.49),補收 1.00(未稅):
"items": [
{ "line_no": 1, "parent_line_no": null, "product_id": "SIDE-FRIES", "product_name": "Fries", "product_type": "SIDE",
"quantity": "-1", "unit_price": "4.49", "discount_amount": "0.00", "line_amount": "-4.49", "tax_category": "STANDARD", "modifiers": [], "is_voided": false },
{ "line_no": 2, "parent_line_no": null, "product_id": "SIDE-CHEESE-CORN", "product_name": "Cheese Corn", "product_type": "SIDE",
"quantity": "1", "unit_price": "5.49", "discount_amount": "0.00", "line_amount": "5.49", "tax_category": "STANDARD", "modifiers": [], "is_voided": false }
]
Tip
POS 若沒有換貨功能,可拆成一筆 RETURN+一筆 SALE 送出,總部報表結果相同。
退款與已日結營業日的異動¶
- 退款:
business_date維持原交易營業日;以payments[].payment_type = REFUND與original_trade_record_id表示,original_payment_id指向原付款。 - 正負號:退貨/退款交易(
RETURN、REFUND)的品項quantity、line_amount,以及交易層subtotal_amount、discount_amount、tax_amount、total_amount等金額一律填負數;換貨(EXCHANGE)只有退回列為負數。付款amount仍填正數,方向由payment_type = REFUND表示。這樣日結時直接加總就是淨額。 - 已日結營業日的異動:重送該筆交易(
version + 1,新的batch_id),並重送該日 daily-close,控制總數更新為異動後的值。 - 同一筆交易收到多次:以
version較大者為準;version相同時以last_modified_at較晚者為準。
訂單類型與下單管道¶
order_type 描述取餐方式(內用/外帶/自取/外送),order_source 描述從哪裡下單。兩者分開記錄:
| 情境 | order_type | order_source | order_source_detail |
|---|---|---|---|
| 櫃台點餐內用 | DINE_IN | POS | — |
| 自助機點餐外帶 | TO_GO | KIOSK | — |
| Uber Eats 外送 | DELIVERY | DELIVERY_PLATFORM | UBER_EATS |
| 官網下單到店自取 | PICK_UP | WEB | — |
order_source建議使用代碼表的值;對應不到時可送自家原始值(自由字串,建議英文大寫+底線)。不在表內的值照收、不報錯,總部統計時歸為「其他」。- 未送
order_source(null或省略)視為未知,不會預設為POS。 order_type的ONLINE、KIOSK、THIRD_PARTY屬於下單管道的概念,建議order_type填取餐方式,下單管道改以order_source表示。
收付款性質與付款工具¶
payment_type 描述這筆錢的性質(收款、退款、暫收…),payment_method 描述用什麼工具付(現金、信用卡、點數…):
| 情境 | payment_type | payment_method | payment_method_detail |
|---|---|---|---|
| 刷 VISA 結帳 | SALE | CREDIT_CARD | VISA |
| 用會員點數折抵 | SALE | LOYALTY_POINTS | 例 POINTS:500 |
| 用禮物卡結帳 | SALE | GIFT_CARD | — |
| 預訂蛋糕先收現金訂金 | DEPOSIT | CASH | — |
| 取貨時以訂金折抵 | DEPOSIT_APPLIED | CASH(沿用原訂金的工具) | — |
| 退貨退回信用卡 | REFUND | CREDIT_CARD | VISA |
amount一律填正數,收付方向由payment_type決定(見代碼表);唯一例外是ADJUSTMENT,可用負數表示扣減。SALE、REFUND為所有合作夥伴必須支援的基本值;其他值可使用建議代碼或自由字串。- 使用自由字串時,請事先告知總部其意義與收付方向,否則總部無法判斷方向,該筆會列入人工確認並可能影響對帳。
會員¶
- 交易可選填
member_id,非會員或未綁定時為null或省略。 member_id必須是合作夥伴會員系統內部的 ID(最長 50 字元),不得直接使用手機號碼、Email 或身分證號。- 若會員系統以手機號碼為主鍵,請改送內部流水號,或送雜湊值(例 SHA-256 加 salt)。
- 個資限制詳見共通規範。