PCE TW GUI — SuiteTax 支援規劃
狀態:銷項開立已在 SuiteTax 帳測過台幣發票與折讓。課稅別對應維持既有稅碼清單,定案不改(2026-11-04)。
最後更新:2026-11-04
對象:產品/顧問/開發
目的:讓模組在 SuiteTax 帳號上仍能正確把 NetSuite 明細稅資訊對到 PCE 課稅別 1/2/3,行為與現行 Legacy Tax(Sales Tax Item) 帳號一致。
最後更新:2026-11-04
對象:產品/顧問/開發
目的:讓模組在 SuiteTax 帳號上仍能正確把 NetSuite 明細稅資訊對到 PCE 課稅別 1/2/3,行為與現行 Legacy Tax(Sales Tax Item) 帳號一致。
導入假設(產品):客戶在 上線 PCE 前 即已在 NetSuite 決定 Legacy 或 SuiteTax;本規劃 不 涵蓋「營運中把同一帳號從 Legacy 改 SuiteTax」後的對應轉換、匯出/匯入或重新對應 SOP。
1. 為什麼需要
| 面向 | 說明 |
|---|---|
| 業務 | 台灣電子發票 MIG 要求 PCE 主檔/明細的 課稅別、稅率、稅額 與來源交易一致;銷項開立前必須完成 課稅別 ↔ NS 稅碼 對應。 |
| 平台 | SuiteTax 與 Legacy 的稅碼主檔、搜尋方式、部分交易欄位行為不同;現行程式假設 Legacy。 |
| 風險 | 在 SuiteTax 帳號上:對應 UI 可能 稅碼清單為空、開立時 taxcode 反查失敗、或對到錯誤 internal id,導致無法開立或課稅別錯誤。 |
2. 現況(Legacy 假設)
2.1 資料模型(不變)
customrecord_pce_tax_type:custrecord_pce_taxtype_code_value(1/2/3)+custrecord_pce_taxtype_ns_taxcode(MULTISELECT,存 NS 稅碼 internal id)。- 語意:同一 PCE 課稅別可對多個 NS 稅碼(例如不同稅率皆屬應稅)。
2.2 程式 touch points
| 區塊 | 檔案 | 現行做法 |
|---|---|---|
| 對應 UI | common/PCE_SL_TaxTypeMapping.js | search.Type.SALES_TAX_ITEM 載入下拉選項 |
| 反查 map | ar/libraries/PCE_LIB_AR_Lookup.js | 讀 tax type CR 的 multiselect → nsTaxCodeId → PCE code |
| 銷項開立 | ar/libraries/PCE_LIB_AR_Issue.js | Invoice/CM item 子列表 taxcode(value/text);驗證未對應稅碼 |
| 開立搜尋 | ar/libraries/PCE_LIB_AR_IssueSearch.js | 搜尋欄位含 taxcode |
| 交易 CS | ar/clientscripts/PCE_CS_Trans_AR_Body.js | 讀 line taxcode |
| 進項 | AP 程式 | 未直接綁 NS taxcode;課稅別多來自 CSV/欄位,SuiteTax 影響較小(仍可能間接影響交易稅額) |
2.3 帳上設定入口
- PCE GUI Portal → 模組設定 → 課稅別稅碼對應(
customscript_pce_sl_taxtype_mapping)。
3. SuiteTax vs Legacy(工作假設,需帳上驗證)
以下為實作前必須在 已啟用 SuiteTax 的 sandbox/客戶帳 核對的項目;細節以 Oracle Help/該帳 API 為準。
| 主題 | Legacy(現行支援) | SuiteTax(待支援) |
|---|---|---|
| 稅碼主檔 | sales tax item / SALES_TAX_ITEM search | 通常為 SuiteTax Tax Code(record type/search 路徑不同,不可再只搜 SALES_TAX_ITEM) |
| 明細稅欄位 | item.taxcode(internal id + text) | 多數仍暴露 line tax code,但 id 命名空間不同;部分情境可能需 tax details 或額外欄位(需實測 Invoice/CM) |
| 啟用判斷 | 預設 Legacy | 建議 runtime.isFeatureInEffect/帳號 preference(確切 feature id 需查官方文件並在目標帳驗證) |
| 子公司/nexus | 相對單純 | SuiteTax 常與 nexus、tax registration 連動;下拉稅碼可能需 依 subsidiary 過濾 |
原則:PCE 仍只關心「line 上選了哪個 NS 稅碼 id → 對到 1/2/3」;差異集中在 如何列舉合法稅碼 與 如何從交易讀出同一個 id**。
4. 目標與非目標
4.1 目標(MVP)
- 依帳號稅制(Legacy 或 SuiteTax)走對應 UI/開立分支;實作上以偵測或 上線時寫死的模組設定 二擇一(見 §5.1),不處理稅制中途切換。
- 銷項開立(含自訂明細、來源 Invoice/CM)在 SuiteTax 帳號可完成 taxcode 反查與未對應驗證,產出正確 PCE 課稅別。台幣發票與折讓已在帳上開立。
- Legacy 帳號行為不變(回歸測試必過)。
- 文件:使用說明、操作手冊 HTML 各加一段「SuiteTax 帳號注意事項」。
4.2 非目標(第一版不做)
- 替 NetSuite 計算 稅額或改寫 SuiteTax engine 設定。
- 完整 tax details 子表逐行同步到 PCE 明細(除非實測證明僅讀
taxcode不足)。 - 多國 VAT/US sales tax 通用化(仍以 台灣 PCE 課稅別 1/2/3 為範圍;他國稅碼若出現在清單,僅作映射,不保證報稅語意)。
- AP Write/進項 CSV 全面重寫(除非發現 SuiteTax 導致 taxType 來源交易 不一致,再開子項)。
- Legacy → SuiteTax 帳號稅制轉換 後的對應修補、資料匯出/匯入、專用 migration 文件(不在範圍)。
- 改課稅別對應的稅碼清單。既有對應是正確的,SuiteTax 帳也沿用,不另做 SuiteTax 稅碼下拉。
5. 建議架構
5.1 稅制引擎抽象層(新建 library)
建議:common/PCE_LIB_NsTaxEngine.js(名稱可調),對外固定 API:
| 方法 | 用途 | |
|---|---|---|
getTaxEngineMode(context) | 回傳 LEGACY \ | SUITETAX(可帶 subsidiaryId) |
listTaxCodesForMapping(options) | 對應 UI 下拉:{ value: internalId, text: label }[] | |
getLineTaxCodeId(record, { sublistId, line }) | 統一從交易明細取稅碼 id | |
getLineTaxCodeLabel(record, …) | 顯示用;SuiteTax 若 text 格式不同在此對應調整 | |
validateMappingIds(ids) | 儲存前確認 id 在該引擎仍有效 |
設定(可選):模組通用設定增加 NS 稅制 列舉 AUTO | LEGACY | SUITETAX(預設 AUTO),供 導入/建帳 時與 NetSuite 對齊;正常營運中不預期變更。
5.2 改接現有模組(薄改)
PCE_SL_TaxTypeMapping.js → listTaxCodesForMapping() PCE_LIB_AR_Lookup.js → (map 仍讀 CR;可加引擎無關快取) PCE_LIB_AR_Issue.js → getLineTaxCodeId / 驗證未對應 PCE_LIB_AR_IssueSearch.js → 確認 search column 在 SuiteTax 仍可用 PCE_CS_Trans_AR_Body.js → 同上
5.3 資料相容
- 不新增 第二套 multiselect 欄位;同一帳號內只會存在 一種 稅制下的稅碼 id。
- 對應 UI 可選:儲存的 id 若在現行稅制搜尋不到則標示無效(設定錯誤或環境不一致時除錯用),非為稅制轉換流程設計。
6. 分期建議
| 階段 | 內容 | 交付/驗收 |
|---|---|---|
| S0 探索 | 在 SuiteTax 帳:列舉稅碼 API、Invoice/CM 明細欄位、feature 判斷;產出 帳上筆記(record type、範例 id、screenshot) | 1 頁技術備忘 + 測試交易 id |
| S1 對應 UI | 決議不做 | 課稅別對應維持既有稅碼清單 |
| S2 銷項開立 | Issue/Lookup/Search/CS 改接;錯誤訊息區分「未對應」vs「引擎不支援」 | 台幣發票與折讓已在 SuiteTax 帳上開立 |
| S3 硬化 | subsidiary/nexus 過濾、安裝後檢查、模組設定頁提示 | 多子公司帳測試;npm test 新增 engine mock 單測 |
| S4 文件 | user-guide、手冊 HTML、AR status 能力列 | 顧問可照文件設定 |
7. 測試策略
| 類型 | 做法 |
|---|---|
| 單元 | mock NsTaxEngine:Legacy/SuiteTax 各一組假稅碼 id + line 讀取 |
| 本機 | 延伸 test/ar-*:反查 map、未對應驗證 |
| 帳上 | 雙帳:TD2905095(Legacy?)+ SuiteTax sandbox;開立 smoke 寫入 test/results/ |
| 回歸 | 現有 npm run test:ar-*、tax mapping 相關(若無則 S1 補 test/ns-tax-engine.test.js) |
8. 風險與決策點
- 僅帳級 SuiteTax vs 子公司混用:若存在「部分子公司 Legacy」,
getTaxEngineMode必須 依 subsidiary 而非全帳一種。 - taxcode search column:SuiteTax 下 saved search 是否仍回傳相同 internal id;若否,Issue 查詢需改 join 或改載入方式。
- 對應 multiselect 儲存值:Legacy 與 SuiteTax 的 id 不可跨帳/跨稅制複製(僅防顧問誤拷 sandbox 設定)。
- Performance:SuiteTax 稅碼數量可能更大 → 對應 UI 考慮 subsidiary 篩選或分頁(第二版;對應表仍全帳共用,見 §9)。
9. 產品決策(已確認)
| 問題 | 決策 |
|---|---|
| SuiteTax 時程 | 晚於「產營業稅檔」能力完成之後 再排 SuiteTax 實作與首個目標帳驗收;Legacy 帳仍須長期並行支援(不同客戶/不同帳 各走各的稅制,非同一帳轉換)。 |
| 對應表範圍 | 全帳共用(維持現行 customrecord_pce_tax_type 一組 1/2/3 對應,不依子公司拆表)。 |
| 導入方式 | 上線前 與 NetSuite 稅制(Legacy/SuiteTax)一次定案;完成 課稅別 NS 稅碼對應 後始用銷項開立。不規劃 營運中稅制切換的配套。 |
| 課稅別對應 | 維持既有稅碼清單,定案不改。SuiteTax 帳沿用同一份 1/2/3 對應,不另做 SuiteTax 稅碼下拉。 |
10. 相關文件
| 文件 | 關係 |
|---|---|
| PCE TW GUI MODULE — 銷項(AR)實作進度(一頁式) | 實作後更新能力列 |
| 使用說明 § 課稅別對應 | 操作步驟 |
| 銷項藍圖 | 階段可併入 Phase 2/4 或獨立「平台」里程碑 |
| Oracle SuiteTax/SuiteScript Records 說明 | S0 必查(Agent Skill:netsuite-suitescript-records-reference) |
變更紀錄
| 日期 | 摘要 |
|---|---|
| 2026-11-04 | 課稅別對應維持既有稅碼清單,定案不改。SuiteTax 帳上已開立台幣銷項發票與折讓單 |
| 2026-10-29 | 模組通用新增 suiteTax。勾選後銷項讀 Tax Details,進項與交易建立寫入 Tax Details。課稅別下拉仍列 Legacy 稅碼,帳上驗證未做 |
| 2026-09-17 | 初版規劃:現況盤點、抽象層、分期與風險 |
| 2026-09-17 | 產品決策:SuiteTax 排在產營業稅檔之後;對應表全帳共用;不做對應匯入匯出工具 |
| 2026-09-17 | 導入假設:上線前定案 Legacy/SuiteTax;不涵蓋帳號稅制中途轉換 |