函證Table Design Specification

函證Table Design Specification

永輝查帳系統資料庫設計參考資料

函證是主+明細?還是單一表?

這是設計「函證模組」時最關鍵的結構抉擇之一。
讓我們清楚區分兩種模式:


最佳實務建議:主表 + 明細表(Header + Line Items)

→ 在專業審計系統(如 CaseWare CloudTeamMate+Evershine AIS)中,
函證通常採「主表+明細表」結構。

為什麼?

因為實務上函證有兩個層次:

  1. 函證批次/作業層(主表):描述整個寄發作業(例如「2025年度應收帳款函證」)
  2. 函證明細層(子表):每一封寄出的函證(對象、金額、回覆狀態)

主表:confirmation_batches(或簡稱 confirmations_header

功能:控制整體函證作業的一次寄發或年度層級設定。

欄位說明
id主鍵
engagement_id所屬查核案件
subject_areabank / receivable / payable / legal …
batch_code批次代號(例如 CONF-AR-2025)
title「2025年度應收帳款函證作業」
description範圍、目的、樣板說明
prepared_by_user_id / approved_by_user_id編製與核准人
sent_at / completed_at寄發與結束時間
total_requests / total_replies數量統計
statusdraft / in_progress / completed / archived
template_id使用的函證樣板
delivery_methodpostal / email / online_portal
notes / tags補充說明與標籤

明細表:confirmation_items(或 confirmations_detail

功能:紀錄每一封函證的寄發與回覆情況。

欄位說明
id主鍵
batch_id外鍵 → confirmation_batches.id
counterparty_id對象(客戶/銀行/供應商)
account_item科目(應收帳款、銀行存款等)
account_code對應 TB 科目代號
amount_per_books帳載金額
currency_code幣別
is_blank_confirmation是否空白函證
sent_at / response_at寄發與回覆時間
response_amount回覆金額
response_statusreceived / no_response / discrepancy_found / resolved
discrepancy_notes差異說明
follow_up_count / last_follow_up_at追蹤次數與日期
workpaper_id對應底稿 C-3 等
finding_id若導致查核發現
document_count附件數
statuspending / sent / replied / closed
created_at / updated_at稽核追蹤

其他輔助表

表名功能
confirmation_documents儲存寄發與回覆附件(多對多)
confirmation_logs記錄每次追蹤行為(寄發、再發、致電、回覆)
confirmation_wp_links指到底稿內頁(例如「C-3 第3頁」)

優點

面向說明
效率一次建主表(控制設定),多筆明細批量匯入
彈性可對每一筆明細分別追蹤寄發/回覆狀態
可稽核性主表記錄整體流程、明細追蹤個別進度
可重用性下一年度可複製批次架構再寄發

簡化模式:單一表(Flat Table)

適用於中小型會計師事務所或非系統化作業。

在這種情況下,所有資訊(批次 + 明細)都放在同一張表:
每一列代表一封函證。

欄位範例備註
engagement_id查核案別
counterparty_id對象
account_item科目
amount_per_books金額
sent_at / response_at寄發 / 回覆
response_amount回覆金額
status狀態
batch_name用文字標示所屬批次(非外鍵)

優點:簡單、容易維護
缺點:

  • 無法有效追蹤批次統計(例如「本次寄出50封、回覆45封」)
  • 批次設定無法重用
  • 多年度或多次寄發難以區分

實務建議(Evershine等中大型事務所)

採用「主表 + 明細表」結構,再搭配:

  • confirmation_batches(控制整體流程)
  • confirmation_items(記錄個別寄發狀況)
  • confirmation_documents(附件)
  • confirmation_logs(追蹤紀錄)

函證有兩種選擇: (1)主+明細 (2)單一表,選擇(1) 0r (2) 跟 Document Table 的多對多關係有關嗎?

沒有直接關係。
不論你選 (1)「主+明細」或 (2)「單一表」,Document(附件)和函證資料都應採多對多 (M↔N) 關係,用中介表連結,而不是把 document_id 直接塞進函證主表/明細表或 documents 表裡。


為什麼與結構選擇無關?

  • 同一份檔案(例如「客戶A回函.pdf」)常同時被:
    • 某一筆函證明細的回函證據
    • 同一張底稿(如 C-3)的附件
    • 甚至匯入管理階層聲明書報送封面等。
  • 反過來,一筆函證(不論是單一表的一列、或主+明細的某一筆)也可能對應多份檔案(寄發函、回函、追蹤郵件、電話紀錄、快遞收據…)。
    ➡️ 典型多對多,所以要用 junction table

兩種模型下應如何連 Documents?

(1) 主+明細(建議做法)

你會同時存在批次層個別函證層的附件:

  • 批次層(整批共用的憑證/樣板)
    • 範例:寄發名冊、制式函證模板、快遞總收據
    • 建議:confirmation_batch_documents(batch_id, document_id, role)
      • role 例:template, mailing_manifest, batch_receipt
  • 明細層(每一封的往返證據)
    • 範例:某客戶回函PDF、單筆的追蹤郵件、通話紀錄單
    • 建議:confirmation_item_documents(item_id, document_id, role)
      • role 例:outbound_letter, inbound_reply, email_thread, phone_memo

好處:批次與個別證據清楚分流;查詢與權限控管更貼近實務。

(2) 單一表

  • 只有一層:每一列就是一封函證
  • 建議:confirmation_documents(confirmation_row_id, document_id, role)
    • role 同上(寄發/回覆/追蹤/收據…)

好處:表數少;
限制:缺乏「批次」維度(像模板、批次寄送收據就不好掛)。


為何不要把外鍵塞進 documents

  • 同一檔案可能同時屬於多個明細同張底稿其他模組
  • 若在 documents 上放 confirmation_idworkpaper_id,會造成一檔只能掛一處,破壞正規化並誘發重複上傳。
    ✅ 正解:永遠用 junction

快速決策建議

需求情境建議模型對 Documents 的設計
有批次操作(名冊、統一模板、快遞總收據)(1) 主+明細兩張 junction:batch_documentsitem_documents
僅少量單封函證、無批次管理(2) 單一表一張 junction:confirmation_documents
預期擴充、跨年度比對(1) 主+明細批次層利於複製/統計/權限

小技巧(不論選 1 或 2 都適用)

  • role 欄位一定要有:outbound_letter / inbound_reply / email_thread / phone_memo / delivery_proof / template …
  • 在 junction 上放時間戳與上傳人,方便追溯:uploaded_by, uploaded_at
  • 文件版本:Documents 表管理 version / is_active / checksum,junction 只做連結與語意(role)

結論

  • 函證結構 (主+明細 vs 單一表) 不影響 Documents 一定用 M↔N 的原則。
  • 若有批次管理與統計需求,選 (1) 主+明細,並分設 批次文件明細文件兩個 junction;
  • 簡單案可用 (2) 單一表+單一 junction。

函證有兩種選擇: (1)主+明細 (2)單一表,選擇(1) 0r (2) 跟 Workpaper Table 的多對多關係有關嗎?

沒有直接關係、是正交的設計點
選 (1)「主+明細」或 (2)「單一表」不會決定與 Workpaper 是否為多對多;是否 M↔N 取決於業務規則:一封(或一筆)函證,需不需要同時掛多張底稿


標準實務(建議預設

  • Workpaper ↔ Confirmation:一對多 (1→N)
    一張底稿(如 C-3 應收函證底稿)對應多筆函證;
    每筆函證只屬於一張底稿
  • 不論你選 (1) 或 (2),都可以這樣做:
    • (1) 主+明細:在 明細項confirmation_items)放 workpaper_id
    • (2) 單一表:在 同一表 直接放 workpaper_id

需要多對多的情境(才加 M↔N)

只有在下列「共享」情境才需要 M↔N

  • 同一封銀行函證回函同時作為存款借款兩張底稿的證據。
  • 合併/多公司案件下,一筆函證要同時掛多張底稿。

實作方式

  • (1) 主+明細:
    • 仍建議在 明細workpaper_id 做預設 1→N;
    • 另外加 選配關聯表 confirmation_workpapers(confirmation_item_id, workpaper_id) 以支援 M↔N 例外。
  • (2) 單一表:
    • 直接加 選配關聯表 confirmation_workpapers(confirmation_id, workpaper_id)

這樣「常態一對多」簡潔、偶發多對多也能覆蓋。


小抄(如何選)

問題建議
90% 情況每筆函證只掛一張底稿?1→N(欄位 workpaper_id),最簡單
偶爾需要跨掛多張底稿?保留 workpaper_id + 加一張 junction 覆蓋例外
常態要跨掛(銀行函證常同時支援多底稿)?直接改用 純 M↔N(只用 junction,不放 workpaper_id 欄位)

兩個實務建議

  1. 唯一性約束:避免同一年度、同一對象、同一 TB 科目重複建單(例如 UNIQUE(engagement_id, counterparty_id, tb_id))。
  2. 人類可讀索引:在函證記錄保存 workpaper_index_code(如「C-3」),報表易讀、JOIN 仍用 ID。

結論:Workpaper 是否與函證為多對多,由你的流程決定,與 (1) 或 (2) 的資料表結構選擇無直接關聯;最佳做法是預設 1→N,再以「選配 junction」安全覆蓋 M↔N 情境。

永輝查帳系統資料庫設計參考資料

接洽我們:


永輝啟佳聯合會計師事務所- EvershineCPA.tpe
臺灣永輝協同網路服務股份有限公司- EvershineBPO.tpe
永輝專利師事務所 – EvershineIPO.tpe
臺北市長春路378號6F 靠近長春路與復興北路交叉口
捷運文湖線與松山線交口 南京復興站,兄弟大飯店附近
接洽人:
陳中成 首席合夥人/會計師/專利師
Mobile: +886-933920199    
Office: +886-2-27170515 E100    
Skype: daleccchen
Wechat ID: evershiinecpa | Line ID:evershinecpa
Linkedin address:Dale Chen Linkedin    
E-mail: dalechen@evershinecpa.com

Evershine在以下城市擁有100%的附屬公司:

永輝總部臺北永輝廈門永輝北京永輝上海那靈深圳常新紐約永輝加州永輝德州永輝鳳凰城永輝東京永輝首爾永輝河內永輝越南胡志明曼谷永輝新加坡永輝吉隆玻永輝雅加達永輝馬尼拉永輝墨爾本永輝澳洲雪梨孟加拉永輝新德里永輝印度孟買杜拜永輝法蘭克福永輝巴黎永輝倫敦永輝荷蘭永輝西班牙永輝義大利永輝羅馬尼亞永輝多倫多永輝墨西哥永輝
其他已提供中文化服務城市:
邁阿密、亞特蘭大、俄克拉荷馬、密歇根、西雅圖、特拉華;
柏林; 斯圖加特;布拉格;布加勒斯特;班加羅爾;泗水;
高雄、香港、深圳、東關、廣州、清遠、永康、杭州、蘇州、崑山、南京、重慶、許昌、青島、天津。
永輝潛在可服務城市 (2個月籌備期):
我們為IAPA會員所,總部在倫敦,全球300個會員所,員工約1萬人。
我們為LEA會員所,總部在美國芝加哥,全球600個會員所,員工約2萬8千人。
Evershine is local Partner of ADP Streamline® in Taiwan.
(版本:2025/10)

Top