折扣按鈕設定(POS 結帳)
餐飲 POS 結帳頁的「快速折扣」按鈕(9 折 / 95 折 / 85 折 / 8 折 等)可由 admin 自訂顯示哪幾顆、每顆獨立設「含 / 不含服務費」。
進入路徑
後台左側 餐飲 POS → 設定 → 快速折扣按鈕(路徑:/dashboard/modules/pos-restaurant/settings/discount-buttons)。
預設按鈕(boot-migration seed)
新租戶開通 pos_restaurant 模組時,系統自動 seed 4 顆預設按鈕(前 2 顆 enabled、後 2 顆 disabled):
| label | percent | include_service_charge | enabled | sort_order |
|---|---|---|---|---|
| 9 折 | 10 | false | true | 1 |
| 95 折 | 5 | false | true | 2 |
| 85 折 | 15 | false | false | 3 |
| 8 折 | 20 | false | false | 4 |
預設 4 顆全部「不含服務費」(只打折餐點、服務費照原價計算)。要「整桌含服務費一起打折」的客戶,進本頁逐顆勾「含服務費」即可。 (2026-08-01 起改此預設;此前開通的租戶保留原設定,可自行到本頁調整。)
設定欄位
每顆按鈕獨立設定:
| 欄位 | 規格 | 說明 |
|---|---|---|
| label | text | POS 結帳頁顯示的按鈕文字,如「9 折」「會員 8 折」「員工價」 |
| percent | 0-100 整數 | 折扣百分比(10 = 打 9 折 / 20 = 打 8 折) |
| include_service_charge | toggle | 是否含服務費一起打折(見下節說明) |
| enabled | toggle | 是否在 POS 結帳頁顯示這顆按鈕 |
| sort_order | int | POS 結帳頁按鈕排列順序(小到大) |
「含服務費」雙基底計算邏輯
POS 結帳金額算法為 雙基底:
| include_service_charge | 折扣基底 | 範例(小計 1000 + SC 100) |
|---|---|---|
| true(含服務費) | subtotal + service_charge | 9 折 = (1000 + 100) × 0.9 = 990 |
| false(不含服務費) | subtotal(純品項金額) | 9 折 = 1000 × 0.9 + 100 = 1000 |
判讀:含服務費 = 整張帳單打折(最直覺);不含服務費 = 只打品項、服務費照收(高級餐廳 / 嚴格規定不可折服務費的情境)。
2026-08-21 起:POS 開單頁也遵守這個設定了
此前只有結桌帳頁面會照這裡的設定算,開單頁不管您怎麼設,一律當成「含服務費」在折。結果是同一顆折扣按鈕,在開單當下按跟結桌時按會算出兩個不同的金額;設「不含服務費」的店家每次都被多折掉一段服務費。
現在兩個頁面用的是同一份算法,同一顆按鈕在哪裡按都是同一個數字,按鈕上的提示文字也會直接寫出這次是用小計還是「小計 + 服務費」在算。此前已結帳的訂單不會被追溯調整。
資料層:pos_orders.discount_include_sc BOOLEAN NOT NULL DEFAULT false 欄位(boot-migration F38),結帳時記錄當下用哪種基底,報表 / 退款重算時不會跑掉。折扣寫入時 POS 行為
POS 結帳頁點任一折扣按鈕:
- 後端
PATCH /api/pos-restaurant/orders/:id/discount帶{ discount, discount_include_sc } - backend UPDATE pos_orders SET discount + discount_include_sc + total(依雙基底重算)
- POS 畫面立即反映新 total
- 列印小票 / 結帳收據顯示折扣金額(不顯示「含 / 不含 SC」細節)
會留下操作紀錄(2026-08-21 起):每次套用整單折扣都會寫進 系統管理 → 使用記錄,可追誰在何時對哪張單折了多少、用的是哪一種基底。此前這段紀錄因為程式錯誤一直寫不進去,查到的永遠是 0 筆;單品折扣與手動改價的紀錄則一直是正常的。已經發生過的整單折扣補不回來,紀錄從修正上線後才開始累積。免單與上限守門(2026-09-03 起):整單折扣(按鈕與手動輸入金額)與品項臨時折扣共用同一組守門 —— 店家若設了臨時折扣上限或「臨時折扣需店長」(pos_features的item_discount_max_percent/item_discount_require_manager,目前由 ugomk 協助設定,沒設就不擋),整單折扣同樣受限;折到 0 元(折扣等於全部金額)一律需店長以上帳號,該店若設了管理員 PIN(餐飲 POS → 設定 → 管理員 PIN)結桌帳頁還會彈出 PIN 盤,授權人會一併寫進使用記錄。被擋下的嘗試也會留一筆pos_order_discount_denied。清除折扣(金額 0)不受影響。
自訂按鈕範例
範例 1:高級餐廳服務費神聖不可侵
9 折 | percent=10 | include_service_charge=false
85 折 | percent=15 | include_service_charge=false
員工價 | percent=30 | include_service_charge=false範例 2:火鍋店全打折
9 折 | percent=10 | include_service_charge=true
8 折(會員) | percent=20 | include_service_charge=true
半價(VIP) | percent=50 | include_service_charge=true範例 3:混合策略
9 折(整桌) | percent=10 | include_service_charge=true ← 一般折扣
9 折(品項) | percent=10 | include_service_charge=false ← 不打服務費資料儲存
pos_settings.key='discount_buttons' 的 jsonb:
{
"buttons": [
{"label":"9 折","percent":10,"include_service_charge":true,"enabled":true,"sort_order":1},
{"label":"95 折","percent":5,"include_service_charge":true,"enabled":true,"sort_order":2}
]
}舊格式(array of {label, percent})仍向後相容,admin 頁兩種格式都讀;新存一律寫新格式。多分店行為(2026-08-09 起改為 per-store)
折扣按鈕每家分店可各自設定。切到哪一間店(頁面上方橘色「正在編輯:○○店」橫幅),儲存就只影響那一間。
| 狀況 | 資料 key | 行為 |
|---|---|---|
| 該店設過折扣按鈕 | discount_buttons@<store_id> | POS 讀該店專屬那份 |
| 該店沒設過 | discount_buttons(無後綴) | 自動沿用全店共用那份 |
向下相容:本次改動前所有分店共用同一份設定。改動後尚未編輯過的分店行為完全不變(繼續讀共用那份);
你進某店存一次,該店才「獨立」出來。想讓某店回到共用,請聯繫 ugomk 刪除該店的 discount_buttons@<store_id>。
注意:2026-08-09 前此頁雖然有「正在編輯:○○店」橫幅,但實際仍寫入共用設定,
造成「改一間店 = 全部分店一起變」。已修正。常見問題
Q1 POS 結帳頁沒看到折扣按鈕?
- 確認該按鈕
enabled=true - POS 端有 cache,按 F5 reload POS 頁
- 確認你設定時切在正確的分店(見上節「多分店行為」):在 A 店設的按鈕不會出現在 B 店的 POS
Q2 按了折扣按鈕但金額沒變?
- 確認該訂單狀態為 pending(已結帳 completed 訂單不允許改折扣,要走退款重開單)
- 看 console 是否報「discount_include_sc 欄位不存在」→ boot-migration F38 未跑(請聯繫 ugomk)
Q3 報表「總折扣金額」對不上?
- 折扣基底不同算法不同:含服務費的單折更多金額
- 進「報表 → 訂單明細」單筆 drill-down 看
discount+discount_include_sc兩欄位驗算
Q4 可以針對特定品項打折嗎?
- 本頁設定的折扣按鈕是整單折扣,套用在整張單上
- 要折單一品項,請直接在 POS 點餐頁或結桌帳頁的該品項上輸入折扣(可輸入折數或折後單價),或改用「品項贈品」/直接改單價
- 品項折扣與整單折扣可並用;品項折扣同樣會留下操作紀錄
Q5 會員等級自動折扣怎設?
- 不在這頁。會員等級自動折扣請至
會員管理 → 會員等級設定設定每等級discount_rate - POS 結帳辨識會員 → 自動套會員折扣(與此頁的快速折扣按鈕獨立並存)
其他問題協助
若遇本說明未涵蓋的問題,請透過後台右下角 LINE 客服 @ugomk 聯繫真人專員協助處理。