Community研究與資料分析github.com

Auromix/expense-reimbursement-skill

代理技能,用於整理發票與費用報銷材料,產出可直接提交財務的結構化交付物。

expense-reimbursement-skill 是什麼?

這是一個專為工程師與 AI 代理設計的企業報銷整理技能,能將一堆雜亂的原始報銷材料(圖片、PDF、OFD、Excel 等)自動化地整理成結構清晰、命名規範的交付物,包括分桶歸檔的材料、填好的費用明細表、給財務的額外說明以及可追溯的過程台帳。它支援 Claude Code、Cursor、Codex 等主流開發平台,完全依賴 Python3 腳本跨平台執行(mac/linux/windows),無需系統專有命令。其核心工作流程包含 8 個步驟:建立工作區與備份、逐份讀取並理解材料(支援視覺辨識與文字提取)、依據規範歸桶分類與關聯事件、建立物料台帳、複製與重命名歸桶、撰寫額外說明、台帳去重勾稽產生 ledger 並回填到模板副本(或無模板時生成通用明細表),最後產出審閱報告。技能強調三大不可逾越紅線(原始材料不修改、不臆造資訊、不重複計費),並提供待核實、無關、替票、補充材料四個特殊目錄,讓處理過程既嚴謹又靈活。

相容平台~Claude Code~Codex CLI~Cursor
npx skills add Auromix/expense-reimbursement-skill

Installed? Explore more 研究與資料分析 skills: affaan-m/uspto-database, affaan-m/scholar-evaluation, affaan-m/literature-review · View all 6 →

在你喜歡的 AI 中提問

開啟一個已預先載入此 Agent Skill 的新對話。

說明文件

企業報銷材料整理

把用戶給的一堆原始報銷材料,整理成結構清晰、命名規範、可直接交財務的一套交付物:分桶歸檔的材料 + 填好的費用明細表 + 給財務看的額外說明 + 可追溯的過程台帳。

三條不可逾越的紅線

  1. 原始材料和原模板永不修改。 一切改動都發生在備份件和模板副本上。
  2. 絕不臆造資訊。 看不清、對不上、要素缺失的,列入存疑清單向用戶索取,寧可問也不編。
  3. 一筆消費只入表一行,絕不重複計費。 發票和它的支付截圖是同一筆;改簽前後是同一程;企業已代付的部分不報。詳見 references/歸類與命名規範.md 第 3.1–3.3、第六節。

命令一律用 python3(很多環境沒有 python 別名);腳本路徑用相對本 skill 目錄的 scripts/...。


開始前要拿到的輸入

  1. 原始材料資料夾路徑(裡面可能是 jpg/png/pdf/ofd/excel/各種格式混在一起,可能有子目錄)。
  2. 報銷模板 .xlsx 路徑。
  3. 身份資訊(姓名、部門、提交日期、幣種、默認所屬部門、默認所屬專案編碼、預支現金)。
    • 先檢查 過程文件/身份資訊.json 是否已存在(上次跑存下的);存在就讀取復用,並跟用戶確認一句是否沿用。
    • 不存在或不全,向用戶索取缺的欄位後,寫入 過程文件/身份資訊.json 供下次復用。

模板欄位、列含義、事由必填要素見 references/模板與欄位映射.md,開工前先讀它。


可調的三個默認行為(用戶一句話即可改)

  • 自主程度(預設:拿不準才問)。置信度高的自動歸類歸桶;分不清差旅交通 vs 市內交通、看不清金額、疑似私人消費、事由要素缺失的,攢成存疑清單一次性問用戶。用戶也可要求全自動或逐條確認。
  • 身份資訊(預設:第一次問,存碟復用)。見上。
  • 多幣種(預設:換算成 RMB 入表)。外幣票據(USD/KRW 等,如境外 Uber 收據)按用戶指定匯率換算,沒給匯率不要自己拍——先列存疑問用戶(或按票面日期的中國銀行牌價並註明來源);原幣種/金額/匯率/結果寫進 額外說明/,並在台帳「原幣種金額/匯率」列填好。也可改成按原幣種填、匯率用戶自理。

工作流

第 0 步:搭工作區 + 備份(腳本)

python3 scripts/setup_workspace.py --source <原始材料資料夾> [--out <工作區根目錄>] [--template <報銷模板.xlsx>]
  • --out 可不給:預設在原始材料資料夾旁邊(其父目錄=默認位置)新建一個有具體含義的工作區 <原資料夾名>_報銷整理_<YYYYMMDD>;也可用 --out 指定到用戶要的目錄。
  • --template 可不給:不同用戶的模板可能不一樣、甚至沒有。沒模板就走「無模板」分支(見第 6 步),最後用 make_default_table.py 生成一份通用費用明細表。 它會:建十個子資料夾(有票/無票/輔助材料/待核實/替票/額外說明/過程文件/備份/補充材料/無關)、把原始材料全量備份進 備份/(模板本身和 *.skill 不當作材料、會被自動跳過)、有模板時把模板原件存進 備份/_模板原件/ 並生成可寫副本 <原名>_已填寫.xlsx、生成 過程文件/manifest.json。 工作區建在原始材料資料夾之外。stdout 回傳各關鍵路徑(workspace/writable_template,無模板時 writable_template 為 null)。所有腳本均純 python3、跨平台(mac/linux/windows 通用),不依賴系統專有命令。

第 1 步:逐份讀取與理解材料

按 manifest.json 順序逐份讀,按類型選讀法:

  • 圖片(jpg/png/webp 等):直接用視覺看圖理解(本模型可讀圖),不必先 OCR。讀出:消費日期、商戶/項目、金額、是否正式發票、起止地點/人數等要素。
  • PDF:先 extract-text 或 pdf-reading skill 取文字;掃描件/版式票據取不到文字時,轉成圖片再用視覺讀(參考 pdf-reading skill 的柵格化方法)。
  • OFD(國標電子發票):
    python3 scripts/extract_ofd.py <file.ofd> --json
    
    取不到文字時(純圖層 OFD),兜底:轉圖片後視覺識別。
    • 鐵路電子客票:讀出「票價」(正常乘車的應報額)還是「退票費/差額退票」(退票,金額很小),注意「始發改簽」標記。
    • 增值稅發票:入表金額取價稅合計(含稅),不是不含稅的「金額」(見 references/模板與欄位映射.md)。
  • Excel/CSV:extract-text file.xlsx 或 pandas 讀,常見於話費單、對帳單、明細匯總。
  • 其他/不認識的格式:先 file <path> 探類型,再選合適讀法;實在讀不了就列入存疑清單。

每份材料把提取到的要素寫進 過程文件/extracted/<原名>.json。

第 2 步:歸桶 + 歸類 + 關聯事件

依據 references/歸類與命名規範.md:

  • 判進 有票 / 無票 / 輔助材料 哪個桶(判據見參考文件第一節)。關鍵:只有截圖、沒正式發票的真實消費進「無票」(它就是主證據),不是「輔助材料」(第 1.1 節);輔助材料旁邊必須有主證據。一旦出現無票項,記得在溝通裡提醒客戶放替票到 替票/(見『特殊目錄·替票/』)。
  • 判屬於 12 類費用中的哪一類→對應模板的哪一列(列映射見 references/模板與欄位映射.md)。注意 J 差旅交通 vs Q 市內交通 的區分。
  • 給同一筆消費的多份材料分配同一個事件號(發票 + 支付截圖 + 行程單 + 退款截圖 都串到同一事件號)。改簽前後、企業代付/個人墊付也串到同一事件(第 3.1–3.3 節)。
  • 疑似私人/與本行程無關(個人訂閱、無關國家簽證、無票高額單據等)進存疑清單,默認不計入(第五節);經用戶確認與本次無關/不報/跨期的,移入 無關/(不計入本期)。
  • 拿不準的別硬塞:桶/類別/能否報判不準的材料,先放 待核實/,不要先放進 有票/ 或 無票/;攢成存疑清單問用戶,確認後再從 待核實/ 移到正確的桶。

第 3 步:建台帳(過程文件)

在 過程文件/物料台帳.csv(UTF-8-SIG)裡,每份原始材料一行,列結構見 references/歸類與命名規範.md 第四節。台帳是後續回填和審閱報告的唯一數據源——先把台帳做對。

第 4 步:複製 + 重新命名 + 歸桶

按命名規範 日期_費用類型_關鍵資訊_金額,從 備份/ 複製材料到對應桶並重新命名。同事件跨桶同名、同桶加語義後綴(規則見參考文件)。把新文件名回填進台帳。

第 5 步:寫額外說明(按需)

凡有合併、部分退費、外幣換算、拆分/AA、或材料金額≠入表金額的,按 references/額外說明寫法.md 在 額外說明/ 寫 txt,並在台帳「備註」裡指向它。

第 6 步:台帳 → 去重勾稽 → 生成 ledger → 回填模板副本(腳本)

先做去重勾稽(references/歸類與命名規範.md 第六節):按事件號把台帳折疊成「每事件一行」——發票/無票主證據出金額,輔助材料和退款截圖不單獨成行;退票只計退票費;企業代付只計個人墊付;外幣換算成 RMB。記下 Σ(ledger 金額) 作為勾稽基準。

按時間順序排列:模板表頭要求「按時間順序依次填寫」。ledger 裡的 items 應按消費發生日升序排列(同日多筆可按「先正票後退票/補差」排)。fill_template.py 默認也會按 月/日 穩定升序兜底排序(如需保留你給的順序用 --no-sort)。

再整理成 過程文件/ledger.json(結構見 scripts/fill_template.py 頂部註釋:identity + items,每條給「列」或「類別」+ 金額 + 事由 + 起止/部門/項目編碼)。事由必須按 references/模板與欄位映射.md 補齊財務批註要的要素。然後:

python3 scripts/fill_template.py --xlsx <writable_template> --ledger 過程文件/ledger.json

fill_template.py 會自動處理超 31 行的插行與 SUM 擴展,並在輸出的 computed 裡直接給出各列小計/總額的預期值——先核對它與你的勾稽基準一致。

再重算公式(二選一):

# 首選: xlsx skill(需 LibreOffice)
python3 /mnt/skills/public/xlsx/scripts/recalc.py <writable_template>
# 沒有 LibreOffice / 無該路徑時, 用本 skill 自帶兜底(--write 把數值寫回, 交付件直接顯示數字):
python3 scripts/recalc_fallback.py <writable_template> --write

必須確認 total_errors 為 0,且重算結果與 fill_template 的 computed、與台帳加總三者一致。

無模板分支:用戶沒有模板時,跳過 fill_template.py/recalc,改用腳本生成一份通用費用明細表(直接寫好數值與合計,並附 .md 預覽):

python3 scripts/make_default_table.py --ledger 過程文件/ledger.json --out <工作區>/<有意義的名字>.xlsx

此時 ledger.json 用「無模板版」結構(見 make_default_table.py 頂部註釋:identity 可含標題/報銷人/部門等,items 每條給 日期/類別/事由/商戶/幣種/原金額/匯率/金額(RMB)/備註)。生成的 xlsx 總額應與台帳加總一致。

第 7 步:審閱報告 + 交付

在工作區根目錄寫 審閱報告.md:

  • 按費用類別匯總金額、總報銷額;
  • 勾稽核對:台帳加總 = 模板總額 = 各桶材料金額之和(逐項列出,不一致要標紅說明);
  • 存疑清單:需用戶補充的項(招待人數、出差天數、匯率、看不清的金額、疑似私人消費等);
  • 各桶文件計數、額外說明清單。 把 <writable_template> 放第一個(有 present_files 之類的呈現工具就用,沒有就直接給出工作區路徑和文件清單),連同審閱報告一起呈現給用戶,並把存疑清單當面問清。

特殊目錄(按需處理,都不污染主流程勾稽)

除上面 0–7 的核心流程外,還有四個目錄按需啟用;它們各自獨立,不影響 有票/無票/輔助材料 的台帳與勾稽。

待核實/ —— 拿不準的先存這裡

判不準(進哪個桶、算哪類、能不能報)的材料,先放 待核實/,絕不先塞進 有票/、無票/。攢成存疑清單一次性問用戶;用戶拍板後再從 待核實/ 移到正確的桶併入帳。交付時 待核實/ 最好為空;若仍有未決項,在審閱報告裡點名。

無關/ —— 與本次無關 / 本期不報 / 跨期

經用戶確認與本次報銷無關、本期不報或跨到下一期的材料(跨期機票、與本行程無關的簽證等),從備份複製一份到 無關/ 單獨存放,不計入本期台帳與模板;審閱報告裡列明「已移入無關」。既不污染勾稽,也不丟材料。

替票/ —— 可選的替票池(不轉有票、不計金額)

有些「無票」項是真實消費但拿不到正式發票(公司租房水電費、零星個人代付等)。客戶可選提供平時其他消費的正規發票放進 替票/,在金額上大致湊齊這些無票項、給財務附發票——也可以不提供。 最關鍵:替票與無票不是一一對應的真票,只是金額接近。 所以:

  • 替票絕不轉入 有票/,無票項也絕不改判為「有票」——無票始終按無票管理(它才是這筆真實消費的記錄)。
  • 替票留在 替票/ 單獨附給財務,不進台帳費用行、不計入報銷金額(否則與無票項重複計錢)。
  • 只在 過程文件/替票池.csv 記替票清單與池總額,和無票總額做粗略覆蓋對比;不做 1:1 映射、不改桶、不改 ledger。
  • 只要出現無票項,就在溝通裡提醒客戶一句可選地放替票(列出無票項與合計金額,說明「可給可不給」)。不替客戶硬湊、不假設一定會補。

補充材料/ —— 客戶後續補的材料(處理後清空)

客戶後續補的材料(之前缺的發票、漏的票據)放進 補充材料/。再次運行時按下面處理,做完 補充材料/ 應清空:

  1. 備份留存:每份複製進 備份/_補充_<日期>/(原件不丟)。
  2. 理解 + 關聯事件:用第 1 步讀法識別,掛到已有事件號或新建事件。
  3. 補發票動作:某筆原是「無票(待補發票)」,補來正式發票後——發票進 有票/、原截圖改歸 輔助材料/,台帳該事件的桶/置信度/金額(改用價稅合計)一併更新,刪掉對應存疑項。
  4. 重新去重勾稽 + 回填:按第 6 步重算,確認總額更新、仍三方一致。
  5. 清空 補充材料/:處理完移除文件(備份與各桶已有副本),保持為空便於下次。

完成後的目錄長這樣

<工作區>/
├── <原名>_已填寫.xlsx        ← 填好的費用明細表(交付物)
├── 審閱報告.md
├── 有票/        有正式票據、能獨立作證的(確認無誤才放進來)
├── 無票/        真實消費但無正式發票的主證據(確認無誤才放進來)
├── 輔助材料/    側面佐證(下單/支付/行程截圖)
├── 待核實/      拿不準(桶/類別/能否報)的先放這裡,不要急著塞進 有票/無票;核實後再移走
├── 替票/        可選的替票池:大致湊齊無票金額給財務,不轉有票、不計金額(見『特殊目錄』)
├── 額外說明/    給財務看的 txt(合併/退費/外幣/拆分)
├── 過程文件/    身份資訊.json、manifest.json、extracted/、物料台帳.csv、ledger.json、(替票池.csv)
├── 備份/        原始材料 1:1 備份 + _模板原件/(模板與 *.skill 不計入材料備份)
├── 補充材料/    客戶後續補的材料丟這裡;處理後會清空(見『特殊目錄』)
└── 無關/        經確認與本次無關/本期不報/跨期的材料,單獨存放,不計入本期

收尾自檢

  • 原始材料與原模板均未被改動(只動備份件/副本)
  • 每份材料都進了某個目錄,且在台帳裡有一行
  • 無重複計費:每個事件號在 ledger 裡只有一行;發票+支付截圖、改簽前後、退款沖減都沒被算成多筆
  • 增值稅發票按**價稅合計(含稅)**入表;退票只計退票費;企業代付只計個人墊付
  • 外幣已換算且匯率有來源(或已列存疑)
  • 模板按時間順序填;recalc 後零公式錯誤,且 模板總額 = ledger 加總 = fill_template 的 computed
  • 事由都滿足對應批註要求(人數/時間/起止/天數等)
  • 待核實/ 已清空(都已落定)、補充材料/ 已清空;替票/(若有)不計入金額
  • 疑似私人/無關項與其它存疑項已全部當面向用戶確認

相關技能