程式資訊
- 程式 ID:
COMMISSION - 所屬子系統:I.帳款管理
- 狀態:stable
業務員佣金計算¶
功能簡介¶
「業務員佣金計算」依佣金公式(佣金設定)把某一會計期間(年月)內的銷貨/退貨單據展開成各業務員的應付佣金與倉租明細,產生一張佣金單,最後可一鍵把佣金與倉租轉成應付帳款(應付帳款 PAYMNT)對業務員(以廠商身分)入帳。適合會計/財務人員每月結帳後使用:先建一張當期佣金單、按 Get Data 重算明細、核對無誤後再轉應付。
每筆明細都標有類別(LineFlag),代表佣金的來源:
| LineFlag | 中文 | 說明 |
|---|---|---|
| 1 | Regular(正常) | 當期銷貨依公式算出的佣金/倉租 |
| 2 | Deduct(逾期扣回) | 因帳款逾期未收而扣回的佣金 |
| 3 | Pay back(補回) | 先前因逾期扣回、之後收款補回的佣金(系統以負數加回) |
| 9 | Manual Entry(手動) | 人工輸入的調整列 |
前置需求¶
- 權限:I.應收應付 →
業務員佣金計算(Commission)的新增/修改/瀏覽/列印權限;要轉應付者另需 應付帳款 PAYMNT 的新增權限。 - 基礎資料:佣金計算結果完全取決於下列資料的維護狀況——
| 資料 | 影響什麼 |
|---|---|
| 佣金設定(Commissionformula) | 各業務員/客戶/倉別/品號的佣金率與倉租率;沒有對應公式則該業務員佣金算 0 |
| 業務員主檔(SALES1/SALES2 帶在訂單上) | 明細歸到哪位業務員;E61、S43 及 Z 開頭的業務員代號會被排除不計佣 |
| 倉別與業務員對應(Splace/倉別主檔) | 倉租(WarehouseFee)歸屬的業務員;PR、DI 開頭的倉別不計倉租 |
| 客戶主檔/廠商主檔 | 客戶簡稱;轉應付時業務員必須同時建為廠商,否則無法轉入(見欄位連動與附加功能) |
| 應收應付單據(RPHEADERA/RPMA/TRSADE/TRSAMA/ORMAST) | 當期銷貨/退貨來源、訂單上的佣金率與業務員 |
| 財務類別設定 RPDEF | 轉應付使用財務類別 5C(PrimeCommission),須先在 RPDEF 維護 |
Prime 專屬功能
本表單的計算後端走 PRIME_SALESCOMMISION / PRIME_SALESCOMMISIONCALCULATOR 等 Prime 客製 SP,屬於特定客戶的佣金制度。各代號排除規則(E61/S43/Z*/PR/DI/科目 611401、611402)皆為該制度的內建邏輯。
操作步驟¶
新增一張佣金單¶
- 按工具列
新增。系統自動帶入(見AfterAddNew):- Created Date(建檔日期)=今天
- Specify Date(指定日期)=今天
- Period(會計期間)=今天所屬的結帳年月
- 視需要把 Period 改成要計算的年月(格式
YYYY/MM),把 Specify Date 改成轉應付時要用的交易日期。 - Document No(單號) 由系統存檔時自動編,不需輸入。
計算佣金明細(Get Data)¶
- 確認 Period 已填且為合法年月(系統會用
Period + "/01"試解析,格式不對會擋下)。 - 按畫面上的
Get Data按鈕。系統會以該期間呼叫後端重算,把結果填入下方明細格線:- 拆出每位業務員的 SalesAmount(銷貨額)/Commission(佣金)/WarehouseFee(倉租)。
- 依 LineFlag 區分正常/扣回/補回列。
- 重算後再存檔,即把這批明細寫入佣金歷史。
重複期間的列無法重存
若某列(期間+類別+轉入單號+業務員)在佣金歷史中已存在,系統會把該列標記為不可存(CanAllowSave = -1000),避免同一筆佣金被重複建立。新算出來、歷史沒有的列才允許存檔。
修改與刪除¶
- 在瀏覽狀態下叫出要修改的佣金單,按
修改調整 Specify Date 等欄位,或重新Get Data重算。 - 明細列只有沒有轉入單號(TransferNumber 為空)的手動列才允許刪除;由系統算出、帶有來源單號的列不可單獨刪除(見 Source 的
NeedDeleteFunction)。
查詢與列印¶
- 用工具列查詢叫出歷史佣金單。
- 按
列印:本表單實作IPrintCondition,列印條件Print1(Print Print Period)會自動以目前佣金單的 Period 當查詢條件(符號G,可設定起訖),不必手動輸入期間。
轉應付帳款(其他1)¶
核對佣金明細無誤後,按工具列 其他1(延伸功能一)把佣金與倉租轉成對業務員的應付帳款。詳見欄位連動與附加功能的「其他1:轉應付帳款」。
匯出 Excel¶
格線右鍵可選兩種匯出版型(IExcelSetting):
- Summary:依業務員彙總,分欄列出正常佣金/倉租、逾期扣回(Deduction)、補回(Payback)、更正(Correction)。
- Rep:逐列明細匯出。
欄位說明¶
表頭¶
| 欄位 | 必填 | 說明/格式/預設 |
|---|---|---|
| Document No(單號) | — | 系統自動編號,唯讀 |
| Created Date(建檔日期) | — | 新增時預設今天(ShortDate) |
| Period(會計期間) | ✔ | 計算與列印的年月,格式 YYYY/MM;新增時預設今天所屬結帳期間。空白或格式錯誤時 Get Data 會擋下並提示 |
| Specify Date(指定日期) | ✔ | 轉應付時帶入應付單的交易日期;新增時預設今天。轉應付前若為空會擋下 |
| Is Closed(是否結案) | — | 系統控制欄位(橘色標示);值為 Y 時不可再轉應付 |
明細格線¶
| 欄位 | 說明 |
|---|---|
| APInvoice(應付發票) | 轉應付後回寫的應付單號;可點超連結導覽到應付帳款(NavigateProgramClass = AP)。空白=尚未轉應付 |
| Period(期間) | 該列所屬會計期間 |
| Transaction#(轉入單號 TransferNumber) | 來源財務單號(銷貨/退貨單);手動列為空 |
| Customer(客戶) | 客戶代號 |
| CustomerPO | 客戶訂單號 |
| Rep(業務員 SalesRepCode) | 計佣業務員代號 |
| Warehouse(倉別) | 倉租歸屬的倉別 |
| SalesAmount(銷貨額) | 本幣,唯讀 |
| Commission(佣金) | 本幣,唯讀 |
| WarehouseFee(倉租) | 唯讀 |
| LineFlag(類別) | 1 正常/2 扣回/3 補回/9 手動(對照表見功能簡介) |
明細為唯讀
格線各欄皆 IsReadOnly=True,由 Get Data 重算產生,使用者不在格線內直接改數字,而是透過維護佣金公式、重新計算來修正。
欄位連動與附加功能¶
【本節是本頁重點。以下都是程式碼裡真實存在的行為。】
新增時的預設值(AfterAddNew)¶
當你按 新增,系統會:
- 把 Created Date 與 Specify Date 設為今天(
TodayYYYYMMDD)。 - 把 Period 設為今天所屬的結帳期間(
TodayStatementPeriod,年月)。
按 Get Data 重算佣金(GetDataCommand)¶
當你按 Get Data,系統會:
- 先檢查 Period:為空、或
Period + "/01"無法解析成日期,就跳訊息要求重填,不繼續。 - 呼叫
CommissionGenerateBll.GenerateData(Period)重算,過程包含:- 抓單據來源:取當期銷貨(
R…)與逾期扣回(R1…)單據;會計科目(accno1)為611401/611402的單據、以及財務單號以24或R24開頭(預收)的單據會被略過。 - 拆業務員:同一張單上的 SALES1/SALES2 各算一筆;
E61、S43、Z開頭的業務員不計佣金。 - 算倉租:依倉別找對應業務員計倉租;
PR、DI開頭的倉別不計。 - 套佣金率:依 佣金設定 比對「客戶代號/倉別/品號」三項條件(支援
*萬用前置碼),取最相符的公式;訂單若有特殊佣金率(OrderEvent)則覆蓋一般佣率。 - 逾期扣回與補回:逾期未收的單據佣金以類別
2扣回;之後補回的以類別3用負數加回。
- 抓單據來源:取當期銷貨(
- 清空舊明細、把重算結果逐列填入格線,並依「期間+類別+轉入單號+業務員」比對佣金歷史,標記每列是否可存(
CanAllowSave)。
改了佣金公式要重按 Get Data
修改 佣金設定 後,回到本表單重按一次 Get Data 才會用新佣率重算,光改公式不會自動更新已開的佣金單。
其他1:轉應付帳款(ExtendedFunction1)¶
當你在轉應付前,系統會依序檢查並執行:
- 重新整理確認資料未被刪:先
Renew一次,若單據已被別人刪除(主鍵變了)即中止。 - 結案檢查:Is Closed 為
Y時跳「已結案」訊息、不轉。 - 指定日期檢查:Specify Date 為空時要求補填。
- 依業務員彙總:把明細按 SalesRepCode 分組,加總未轉應付(APInvoice 為空)的佣金與倉租;該業務員佣金與倉租都是 0 時跳過。
- 建立應付主檔(Twork_arp_vw_rp_m),每位業務員一張:
- 幣別=該業務員(廠商)幣別,沒有就用本位幣(
Context.Env.LocalCurrency)。 - 程式類別=
P、財務類別=5C(PrimeCommission)(見 RPDEF)。 - 相關單號=本佣金單的 Document No;轉入備註 記
System與當下日期;備註串接該業務員所有來源單號。 - 交易日期=Specify Date;發票號碼 自動組為
{業務員編號}-交易月年/格式(業務員編號取自應付主檔欄位)。 - 匯率 以交易日期取會計用賣出匯率(
U_Blrate)。
- 幣別=該業務員(廠商)幣別,沒有就用本位幣(
- 建立應付明細(Twork_arp_vw_rp_d):佣金不為 0 時開一筆品號
COM990(摘要 Commission),倉租不為 0 時開一筆品號COM991(摘要 WarehouseFee),數量 1、單價=該業務員佣金/倉租金額,並由TaxCalculator自動算稅。 - 上傳應付:成功跳「存檔成功」;失敗顯示錯誤訊息。完成後再
Renew。 - 查無廠商的業務員:若某業務員在廠商主檔找不到對應,會收集成清單並自動匯出 Excel 提醒你補建廠商,這些業務員的佣金本次不會轉入。
業務員要先建為廠商才能轉應付
轉應付是把佣金當成「應付給業務員」的帳款,業務員必須在廠商主檔有對應代號。沒建的會被列進匯出 Excel、該筆佣金留在佣金單未轉。
列印條件自動帶期間(IPrintCondition)¶
當你按 列印 選 Print1(Print Print Period),系統自動把目前佣金單的 Period 設為列印條件起始值(比對符號 G、可設起訖),不必再手動輸入要印哪一期。
Excel 匯出兩版型(IExcelSetting)¶
- Summary:依業務員把各列依 LineFlag 拆成正常佣金/倉租、逾期扣回(Deduction)、補回(Payback)、更正(Correction),彙總成一列;並依業務員代號前置碼決定排序群組。
- Rep:原始明細逐列匯出。
另外瀏覽時會以
GetGroupCommissionHistory補上各業務員的年度累計(YTD)銷貨額/佣金/倉租到對應列。
常見問題¶
按了 Get Data 卻跳訊息、算不出明細?
多半是 Period 沒填或格式不對。Period 必須是合法年月,系統會用 Period + "/01" 試著解析,像 2026/06 才會通過;空白或亂填都會被擋下。
某位業務員的佣金一直是 0?
佣金率來自 佣金設定,請確認該業務員(搭配客戶代號/倉別/品號)有對應公式且生效日早於交易日期。另外 E61、S43 及 Z 開頭的業務員代號是制度上不計佣金的;PR、DI 開頭的倉別不計倉租——這些是內建排除,不是漏算。
轉應付後有業務員沒被轉入,還跳出一個 Excel?
那是「查無廠商的業務員清單」。轉應付會把佣金當成應付給業務員的帳款,業務員必須先在廠商主檔建好對應代號;找不到的會被收集進 Excel、該筆佣金留在佣金單不轉。補建廠商後重轉即可。
為什麼有些明細列存不進去?
若該列(期間+類別+轉入單號+業務員)在佣金歷史中已經存在,系統會標記為不可存,避免同一筆佣金重複建立。只有重算後、歷史裡沒有的新列才會被存檔,這是防重複的設計。
明細列為什麼不能直接改金額或刪除?
格線各欄皆唯讀,金額由 Get Data 依佣金公式重算而來;要修正請改 佣金設定 後重算。刪除方面,只有沒有來源單號(手動列)才允許刪,系統算出的列不可單獨刪除。
Is Closed 是什麼?為什麼不能轉應付?
Is Closed 是系統控制的結案旗標,值為 Y 代表該佣金單已結案;此時按 其他1 轉應付會跳「已結案」並中止,避免重複入帳。
相關功能¶
需補截圖清單
以下截圖待 runtime 驗收後補拍(放 docs/I-ARAP/images/):
commission-step1.png— 表頭(Document No/Period/Specify Date/Is Closed)與Get Data按鈕commission-step2.png—Get Data重算後的明細格線(含 LineFlag 各類別列)commission-step3.png—其他1轉應付後 APInvoice 回填、可超連結到應付帳款commission-step4.png— Excel 匯出 Summary 版型(業務員彙總含扣回/補回)