UGOMK 操作手冊
17 章 / 共 37

折扣按鈕設定(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):

labelpercentinclude_service_chargeenabledsort_order
9 折10falsetrue1
95 折5falsetrue2
85 折15falsefalse3
8 折20falsefalse4
預設 4 顆全部「不含服務費」(只打折餐點、服務費照原價計算)。要「整桌含服務費一起打折」的客戶,進本頁逐顆勾「含服務費」即可。 (2026-08-01 起改此預設;此前開通的租戶保留原設定,可自行到本頁調整。)

設定欄位

每顆按鈕獨立設定:

欄位規格說明
labeltextPOS 結帳頁顯示的按鈕文字,如「9 折」「會員 8 折」「員工價」
percent0-100 整數折扣百分比(10 = 打 9 折 / 20 = 打 8 折)
include_service_chargetoggle是否含服務費一起打折(見下節說明)
enabledtoggle是否在 POS 結帳頁顯示這顆按鈕
sort_orderintPOS 結帳頁按鈕排列順序(小到大)

「含服務費」雙基底計算邏輯

POS 結帳金額算法為 雙基底

include_service_charge折扣基底範例(小計 1000 + SC 100)
true(含服務費)subtotal + service_charge9 折 = (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 結帳頁點任一折扣按鈕:

  1. 後端 PATCH /api/pos-restaurant/orders/:id/discount{ discount, discount_include_sc }
  2. backend UPDATE pos_orders SET discount + discount_include_sc + total(依雙基底重算)
  3. POS 畫面立即反映新 total
  4. 列印小票 / 結帳收據顯示折扣金額(不顯示「含 / 不含 SC」細節)
會留下操作紀錄(2026-08-21 起):每次套用整單折扣都會寫進 系統管理 → 使用記錄,可追誰在何時對哪張單折了多少、用的是哪一種基底。此前這段紀錄因為程式錯誤一直寫不進去,查到的永遠是 0 筆;單品折扣與手動改價的紀錄則一直是正常的。已經發生過的整單折扣補不回來,紀錄從修正上線後才開始累積。
免單與上限守門(2026-09-03 起):整單折扣(按鈕與手動輸入金額)與品項臨時折扣共用同一組守門 —— 店家若設了臨時折扣上限或「臨時折扣需店長」(pos_featuresitem_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 聯繫真人專員協助處理。