律岩會計師事務所
營業稅申報管理系統
System Analysis Document · 系統分析文件
01系統概述
1.1 背景
事務所目前以 Excel(如 115期帳務明細.xlsx)人工維護營業稅申報。痛點:多人同檔協作衝突、權限無法隔離、歷史期別靠複製檔案、請款金額重複手動輸入、主管缺乏即時彙總視圖。
1.2 目標
- 申報作業線上化,支援 7 人同時作業且資料隔離。
- 以「期別」為單位管理工作分配與資料保存,歷史不覆蓋。
- 進銷項/代收費/服務費一次輸入,自動帶入請款單。
- 提供主管即時彙總儀表板與報表匯出。
1.3 範圍
| 範圍內 | 範圍外(本期不做) |
|---|---|
| 客戶主檔、期別分配、同事工作區、請款單、主管儀表板、歷史查詢、登入認證 | 線上金流/收款、電子發票開立、與國稅局申報系統 API 對接、完整總帳會計、記帳模組自動串接 |
02名詞定義
| 名詞 | 定義 |
|---|---|
| 期別 | 民國年 + 期次;雙月申報,每年 6 期。「115 期」指民國 115 年(西元 2026);系統內以「年-期次」表示,如 115-3 = 115 年第 3 期(05-06月)。為資料切分的主要維度。 |
| 民國年 / 期次 | 民國年:西元 = 民國年 + 1911。期次:一年內雙月序號 1~6(1期 01-02月 … 6期 11-12月)。 |
| 留抵 | 進項稅額大於銷項稅額時可留抵下期之稅額(本系統由人工填寫)。 |
| 代收 | 事務所代客戶繳納/收取的款項(如代收營業稅、二代健保等)。 |
| 服務費 | 事務所提供之服務收費(記帳費、簽證等)。 |
| 拋轉 | 期別分配後,自動為該期每位客戶在工作區建立一筆待填記錄。 |
| 工作區 | 同事個人專屬、僅見自己被分配客戶的作業介面。 |
| 結轉 | 本期某數值自動帶入下一期(如留抵、應收欠款)。 |
03角色與權限
| 角色 | 客戶主檔 | 期別分配 | 同事工作區 | 請款單 | 儀表板/報表 |
|---|---|---|---|---|---|
| 主管 | 新增/修改/查全部 | 建立期別、分配客戶 | 查全部 | 查全部 | 全部 + 匯出 |
| 同事 | 唯讀 | 唯讀 | 僅自己被分配客戶(可編輯) | 僅自己客戶 | 無 / 僅自己 |
關鍵限制同事只能看到「自己被分配的客戶」,需做列級隔離:後端強制
負責同事 = 登入者 篩選與寫入控制。04系統架構(自建網頁系統)
三層式架構。沿用 Ragic 的概念對照,但實作為自建系統:每張「表單」= 一張資料表 + 一組 CRUD API;「連結載入」= FK + JOIN;「列級權限」= 後端強制擁有者條件。
┌─────────── 前端 SPA ───────────┐
│ 登入 客戶主檔 工作區 請款單 儀表板 │
│ React/Vue + 表格元件 + 圖表 │
└───────────────┬────────────────────┘
│ HTTPS / JWT
┌───────────────▼────────────────────┐
│ 後端 API(REST) │
│ Auth │ 業務邏輯 │ 計算層 │ 匯出服務 │
│ Node(NestJS) 或 Python(FastAPI) │
└───────────────┬────────────────────┘
│ SQL(含列級權限)
┌───────────────▼────────────────────┐
│ 資料庫(PostgreSQL/MySQL) │
│ 7 張資料表(見第 6 節) │
└─────────────────────────────────────┘
4.1 概念對照(Ragic → 自建)
| 本系統概念 | Ragic 對應 | 自建系統對應 |
|---|---|---|
| 資料表 | Sheet 表單 | DB Table + 表單頁 |
| 跨表帶入 | 連結與載入 | Foreign Key + JOIN |
| 拋轉產生 | 動作按鈕/批次 | 批次寫入 API |
| 列級隔離 | 依登入者篩選權限 | Row-Level Security / WHERE owner=user |
| 小計/應收 | 公式欄位 | 後端計算層(純加總) |
建議選型前端 React + TanStack Table;後端 Node.js(NestJS) 或 Python(FastAPI);DB PostgreSQL;認證 JWT;匯出 exceljs / openpyxl。皆可依團隊熟悉度調整。
05資料模型(ERD)
[使用者] 1 ──< [客戶主檔] 1 ──< [期別分配明細] >── 1 [期別]
│ │
│ │ 拋轉產生
│ ▼
│ [同事工作區記錄] 1 ─── 1 [請款單]
│ ▲
└──────────────────────────────────────┤
[費用轉入紀錄] >─┘
5.1 主要實體與鍵值
| 實體 | 主鍵 | 重要外鍵 |
|---|---|---|
| 使用者 users | id | — |
| 客戶主檔 customers | 客編 | 預設負責同事 |
| 期別 periods | 期別代碼 | — |
| 期別分配明細 period_assignments | id | 期別、客編、負責同事 |
| 同事工作區記錄 worksheet_records | id | 期別、客編、負責同事 |
| 請款單 invoices | id | 期別、客編、負責同事 |
| 費用轉入紀錄 expense_imports | id | 期別、客編 |
設計重點以「期別 + 客編」作為跨表一致的複合識別,確保每期資料獨立、可追溯、不覆蓋。
06資料庫 Schema(核心)
-- 1. 使用者(★帳號/密碼由主管直接管理) TABLE users ( id PK, name, account, password_hash, role ENUM('manager','staff'), active BOOL, created_at, updated_at ) -- 1.1 操作軌跡(★供熱度圖) TABLE activity_logs ( id PK, user_id FK→users, action, -- login / edit_worksheet / send_email... entity, entity_id, -- 對象類型與識別 created_at -- 熱度圖以 user+日期+小時 聚合 ) -- 2. 客戶主檔(可停用) TABLE customers ( customer_no PK, -- 客編 00001 company_name, tax_id, -- 名稱、統一編號 default_staff_id FK→users, status ENUM('active','inactive') -- 停用功能 ) -- 2.1 客戶聯絡資訊(★一對多) TABLE customer_contacts ( id PK, customer_no FK, contact_name, phone, mobile, email, is_primary BOOL, note -- 可多筆,設主要 ) -- 2.2 客戶匯款資訊(★一對多) TABLE customer_bank_accounts ( id PK, customer_no FK, bank_name, branch, account_no, account_name, is_primary BOOL, note -- 可多筆,設主要 ) -- 3. 期別(★民國年 + 期次,每年 6 期) TABLE periods ( period_code PK, -- '115-3' = 民國115年 第3期 roc_year INT, -- 民國年(西元 = +1911) seq INT, -- 期次 1~6(雙月) month_range, -- '05-06月' start_date, end_date, is_closed BOOL, UNIQUE(roc_year, seq) ) -- 期次對照:1=01-02月 2=03-04月 3=05-06月 -- 4=07-08月 5=09-10月 6=11-12月 -- 4. 期別分配明細 TABLE period_assignments ( id PK, period_code FK, customer_no FK, staff_id FK→users, assigned_at, UNIQUE(period_code, customer_no) -- 一期一客戶一筆 ) -- 5. 同事工作區記錄(A~E 區) TABLE worksheet_records ( id PK, period_code FK, customer_no FK, staff_id FK, -- A 進銷項(手動) sales_amount, sales_tax, purchase_amount, purchase_tax, trade_count, other_qty, posting_note, -- B 稅額(★手動填寫,無公式) prev_credit, curr_credit, tax_reserved, collected_bt, -- C 代收 11 項(手動)→ c_subtotal 自動加總 c_business_tax, c_invoice, c_dividend_nhi, c_prepay, c_rent_withhold, c_rent_nhi, c_addr_rent, c_nhi, c_other_collect, c_tax_collect, c_self_pay_offset, c_subtotal, -- 代收合計(自動) -- D 服務費 8 項(手動)→ d_subtotal 自動加總 d_bookkeeping, d_biz_reg, d_shareholder, d_cpa_audit, d_dec_addon, d_other_service, d_other_fixed, d_bk_offset, d_subtotal, -- 服務合計(自動) -- E 申報狀態 invoice_detail_note, einvoice_count, is_filed BOOL, UNIQUE(period_code, customer_no) ) -- 6. 費用轉入紀錄(★手動輸入) TABLE expense_imports ( id PK, period_code FK, customer_no FK, category, -- 規費/郵費... amount, note, created_at ) -- 7. 請款單 TABLE invoices ( id PK, period_code FK, customer_no FK, staff_id FK, c_subtotal, d_subtotal, -- ★預設帶工作區,員工可編輯覆寫 imported_expense_total, -- ★預設帶 expense_imports,可編輯 current_amount, -- 本期金額(自動重算) prev_balance, -- ★上期結轉,可調 received, discount, -- 已收、折扣(手動) receivable, -- 應收(自動重算) amount_overridden BOOL, -- 金額被手動覆寫標記 email_to, email_cc, -- ★寄送收件人/副本(預設帶主要聯絡人) email_sent_at, email_status, -- ★寄送時間/狀態(sent/failed) note, UNIQUE(period_code, customer_no) )
★ 標記B 區稅額欄位(prev_credit/curr_credit/tax_reserved/collected_bt)依需求改為人工填寫,系統不套用稅額公式;費用轉入僅手動;prev_balance 由上期應收結轉。
07功能模組
M1客戶主檔
- 固定欄位:客編、公司行號名稱、統一編號、預設負責同事(下拉)。
- 具停用狀態;新期開始時只繼承啟用中客戶,不需重建。
- 權限:主管維護,同事唯讀。
M2期別工作分配
- 整年檢視:分配表一次顯示當年 6 期,每位客戶逐期顯示處理同事(決策 #15)。
- 解鎖編輯:右上「解鎖編輯」選的期次欄位才可編輯(🔓),其餘期欄鎖定唯讀(🔒),避免誤改已分配/歷史期。
- 在解鎖期欄勾選客戶、批次指定負責同事。
- 分配後「拋轉」:自動為該期每位客戶在工作區建立一筆待填記錄。
- 每期可重新分配,不影響其他期歷史。
M3同事工作區(核心輸入)
分 A~E 五區(詳見第 8 節):A 進銷項(手動)、B 稅額(手動)、C 代收 11 項(手動,合計自動)、D 服務費 8 項(手動,合計自動)、E 申報狀態。
M4請款單產生
- 資料來源:工作區 C/D 小計 + 費用轉入紀錄加總。
- 本期金額、應收自動計算;前期欠款/溢收自上期結轉。
- 費用轉入:規費、郵費等以手動方式登錄至「費用轉入表」,請款單自動吸收加總,同事不需重複輸入。
- Email 發送:請款單可透過 Email 發送(附 PDF),收件人預設帶客戶主要聯絡人,記錄寄送時間/狀態(決策 #10)。
- 查詢與調閱:可選客戶 + 期別查詢請款單,並調閱該客戶跨期歷史紀錄;每期獨立不覆蓋,受權限隔離(決策 #14)。
M5主管儀表板
- 全體客戶當期申報狀況(已完成 / 未完成)。
- 依負責同事分組、依申報狀態篩選。
- 列表各欄位可點欄頭升/降冪排序(決策 #9)。
- 一鍵匯出全體客戶帳務明細(可調整範本,對齊現行 Excel 彙總表)。
M6歷史資料與期別管理
- 每期資料獨立保存,不覆蓋。
- 可依期別查詢歷史。
- 新期繼承啟用客戶主檔;留抵與應收欠款自動結轉。
M7主管管理工具
- 員工帳號管理:主管可新增/停用員工帳號、改角色、直接重設密碼(後端雜湊);不提供員工自助忘記密碼(決策 #11)。
- 操作熱度圖:記錄操作軌跡
activity_logs,主管可選員工與期間,以熱度圖檢視操作的日期 × 時段分佈(決策 #12)。
08欄位規格書
A. 進銷項資料 手動
| 欄位 | 型態 | 必填 | 說明 |
|---|---|---|---|
| 銷項銷售額 | 金額 | 是 | |
| 銷項稅額 | 金額 | 是 | |
| 進項金額 | 金額 | 是 | |
| 進項稅額 | 金額 | 是 | |
| 進銷件數 | 數值 | 否 | |
| 其它數量 | 數值 | 否 | 電子發票張數等 |
| 入帳 | 文字/日期 | 否 | 完成日期或說明 |
B. 稅額計算欄 手動填寫(無公式)
| 欄位 | 型態 | 說明 |
|---|---|---|
| 上期留抵 | 金額 | 人工填寫(可參考上期數值) |
| 本期留抵 | 金額 | 人工填寫 |
| 稅金(留底) | 金額 | 人工填寫 |
| 代收營業稅金額(自繳稅額) | 金額 | 人工填寫 |
說明依需求,B 區不套用稅額公式,全部由同事依實際申報結果手動輸入。系統僅負責儲存與顯示。
C. 代收費用欄(11 項)手動 → 合計自動
代收營業稅、發票代收、股利二代健保費、暫繳、房租扣繳、房租二代、借址房租、搭保健保費、其他代收款、代收稅金、自繳稅額/發票折抵。
→ 小計:代收合計 = 上列 11 項加總(系統自動)
D. 服務費欄(8 項)手動 → 合計自動
記帳費、工商登記、股東平台申報、會計師簽證、扣繳結算加收(12月)、其他服務費、其他固定收費、記帳費折抵。
→ 小計:服務合計 = 上列加總(折抵以負值計,系統自動)
E. 申報狀態
| 欄位 | 型態 | 說明 |
|---|---|---|
| 統購發票明細 | 文字 | 備註欄 |
| 電子發票張數 | 數值 | |
| 申報完成 | 下拉(是/否) | 供儀表板篩選 |
請款單欄位
| 欄位 | 來源 / 計算 |
|---|---|
| 客戶名稱、期別 | 帶入 |
| 代收合計 | 工作區 C 預設 員工可編輯 |
| 服務合計 | 工作區 D 預設 員工可編輯 |
| 轉入費用合計 | 費用轉入表加總預設 員工可編輯 |
| 本期金額 | 代收合計 + 服務合計 + 轉入費用 自動重算 |
| 前期欠款/溢收 | 上期應收結餘 結轉 可調 |
| 已收 | 手動 |
| 折扣 | 手動 |
| 應收 | 本期金額 + 前期欠款/溢收 − 已收 − 折扣 自動重算 |
| 備註 | 負責同事 |
決策 #8請款單金額(代收/服務/轉入/前期欠款)預設由系統帶入,開放負責員工編輯覆寫;覆寫後本期金額、應收即時重算,並標記
amount_overridden。客戶聯絡資訊 一對多
| 欄位 | 說明 |
|---|---|
| 聯絡人 / 市話 / 手機 / Email | 基本聯絡欄位 |
| 主要聯絡人 | 每客戶至多一筆為主要 |
客戶匯款資訊 一對多
| 欄位 | 說明 |
|---|---|
| 銀行 / 分行 / 帳號 / 戶名 | 匯款帳戶欄位 |
| 主要匯款帳戶 | 每客戶至多一筆為主要 |
09計算邏輯
僅「純加總/結轉」由系統自動計算;稅額(B 區)為人工填寫。
-- 自動計算(後端計算層,前端不得自算) c_subtotal = Σ(代收 11 項) d_subtotal = Σ(服務 8 項,折抵為負) imported_expense_total = Σ expense_imports WHERE 期別+客編 current_amount = c_subtotal + d_subtotal + imported_expense_total receivable = current_amount + prev_balance - received - discount -- 跨期結轉(開新期時帶入) 本期 invoices.receivable ──結轉──▶ 下期 invoices.prev_balance -- B 區稅額:★人工填寫,系統不計算 prev_credit / curr_credit / tax_reserved / collected_bt = 手動輸入
注意「本期金額」是否納入轉入費用,請於上線前與貴所確認(目前設計為納入)。此為待辦項 D-1。
10API 設計(REST 摘要)
| 方法 | 路徑 | 角色 | 用途 |
|---|---|---|---|
| POST | /auth/login | all | 登入取 JWT |
| GET/POST/PUT | /users | 主管 | 員工帳號管理(新增/停用/改角色) |
| PUT | /users/{id}/password | 主管 | 主管直接重設員工密碼 |
| GET | /activity/heatmap?staff=&from=&to= | 主管 | 操作熱度(日期×時段聚合) |
| GET/POST/PUT | /customers | 主管寫·同事讀 | 客戶主檔(含停用) |
| POST | /periods | 主管 | 建立新期(繼承啟用客戶 + 結轉) |
| POST | /periods/{p}/assignments:batch | 主管 | 批次分配 |
| POST | /periods/{p}/dispatch | 主管 | 拋轉產生工作區記錄 |
| GET | /worksheets?period=&staff= | 隔離 | 工作區列表(同事僅自己) |
| PUT | /worksheets/{id} | 擁有者 | 輸入 A~E;後端回算 C/D 小計 |
| GET | /invoices?customer=&period= | 隔離 | 依客戶/期別查詢請款單(單筆) |
| GET | /invoices?customer= | 隔離 | 調閱該客戶跨期歷史請款紀錄(列表) |
| GET/PUT | /invoices/{id} | 隔離 | 請款單明細 |
| POST | /invoices/{id}/send-email | 隔離 | 透過 Email 發送請款單(附 PDF),記錄寄送狀態 |
| GET/POST | /expense-imports | 主管/同事 | 費用轉入(手動) |
| GET | /dashboard?period= | 主管 | 完成率、分組篩選 |
| GET | /export?period=&format=xlsx | 主管 | 匯出彙總報表(可調範本) |
11權限控制(列級隔離)
中介層:解析 JWT → req.user { id, role } if role == 'manager': # 不加擁有者條件,可查/改全部 if role == 'staff': # 所有 worksheet / invoice 查詢強制: WHERE staff_id = req.user.id # 寫入時僅能改 staff_id == 自己 的記錄 # 客戶主檔 / 期別 / 分配 / 拋轉 → 僅 manager
原則權限在後端強制,前端隱藏僅為體驗,不可作為安全邊界。
12業務流程
主管建立新期別(如 115 年 第3期 / period_code 115-3)
→ 繼承「啟用中」客戶主檔
→ 結轉上期留抵 / 應收欠款
→ 批次分配客戶給同事
→ 拋轉至各同事工作區
→ 同事輸入 進銷項 / 稅額 / 代收 / 服務費
→ 系統自動算 代收合計 / 服務合計
→ 標記「申報完成」
→ 費用轉入(規費 / 郵費 手動登錄)
→ 產生請款單(自動帶金額、結轉欠款)
→ 主管儀表板檢視完成率
→ 匯出全體報表(對齊 Excel 範本)
13報表與匯出
- 當期全體客戶帳務明細(進銷項 + 代收 + 服務費 + 應收)。
- 格式對齊現行 Excel 彙總表;做成可調整範本(欄位順序/欄名可設定),因日後可能再改。
- 篩選維度:期別、負責同事、申報狀態。
- 輸出格式:Excel(xlsx) / CSV。
14非功能性需求
| 項目 | 需求 |
|---|---|
| 並行 | 支援 7 人同時作業 |
| 權限隔離 | 同事僅見自己被分配客戶(後端強制) |
| 資料保存 | 每期獨立、不可覆蓋、可追溯 |
| 認證 | 自建帳號 + JWT 登入,密碼雜湊儲存 |
| 易用性 | 欄位名稱沿用現行 Excel 慣用名稱 |
| 可維護 | 主檔繼承、期別可重複分配、匯出範本可調 |
15決策紀錄與待辦
15.1 已確認決策
| # | 議題 | 決定 |
|---|---|---|
| 1 | B 區稅額計算 | 手動填寫,不套公式 |
| 2 | 費用轉入來源 | 手動輸入(不串接記帳模組) |
| 3 | 前期欠款/溢收 | 由上期應收自動結轉 |
| 4 | 匯出格式 | 對齊 Excel,做成可調整範本(日後可能再改) |
| 5 | 客戶主檔 | 需有停用功能;新期僅繼承啟用客戶 |
| 6 | 平台 | 不用 Ragic(僅參考架構),自建並含登入 |
| 7 | 客戶聯絡/匯款資訊 | 拆獨立子表,一對多(可多筆、設主要) |
| 8 | 請款單金額 | 員工可編輯覆寫,本期金額/應收即時重算 |
| 9 | 儀表板 | 列表各欄位可點欄頭排序 |
| 10 | 請款單 Email 發送 | 可透過 Email 發送(附 PDF、帶主要聯絡人、記寄送狀態) |
| 11 | 帳號密碼管理 | 主管直接管理員工帳號/重設密碼,不做自助忘記密碼 |
| 12 | 操作熱度圖 | 記錄 activity_logs,主管看員工操作日期×時段熱度 |
| 13 | 期別定義 | 「115 期」=民國 115 年;每年 6 期;period_code 改 民國年-期次(如 115-3) |
| 14 | 請款單查詢調閱 | 可選客戶+期別查詢,調閱跨期歷史紀錄;每期獨立不覆蓋 |
| 15 | 期別分配整年檢視 | 分配表一次顯示當年 6 期處理同事;右上解鎖編輯單期,其餘鎖定 |
15.2 待辦/待確認
| 編號 | 項目 | 狀態 |
|---|---|---|
| D-1 | 「本期金額」是否納入轉入費用(目前設計:納入) | 待確認 |
| D-2 | 現行 Excel 彙總表的精確欄位順序,供匯出範本對齊 | 待提供樣本 |
| ✅ 結案(決策 #11:主管直接重設) | ||
| ✅ 結案(決策 #12:activity_logs) | ||
| D-5 | Email 寄件方式與帳號(事務所信箱 / SMTP / 第三方寄信服務)、寄件人顯示名稱、信件範本 | 待確認 |
版本v0.8 — 已納入 15 項決策。後續變更請更新本表並升版。
律岩會計師事務所 · 營業稅申報管理系統 SA 文件 v0.8 · 2026-06-28