Topics

因需要採購單而用 Claude Code 開發採購單產生工具(桌面應用程式)的經過

  • column

在日常工作中,若出現「手動重複做這件事實在有點累」的情況,就用 Claude Code 小規模建立機制吧!這已成為我們的常態。

這次正是這種典型情況,起因是公司增加了資本額。

本公司的會計年度自 2 月開始,此次增資也於 2 月進行。隨著資本額增加,我們需要比以往更嚴謹地整頓對外部合作夥伴與協力廠商的採購業務。

這就是所謂的轉包法,現行制度下自 2026 年 1 月起已改稱為「適正交易法」的領域。採購方需要處理的事項增加了,例如明確標示採購內容、製作並保存交易文件,以及設定付款期限等。

當然,這並不只是「因為有法律所以不得不做」的問題喔!

既然要委託外部合作夥伴工作,明確釐清採購內容、金額、日期以及與報價單的對應關係,對採購方與承接方雙方都很重要。(キリ)

也不是會計工具內建的功能

敝公司在會計、報價、請款相關工作中使用 MoneyForward(以下簡稱「Money Forward」)的工具。
日常的會計與請款作業確實很方便,但這次我們想做的事情稍有不同。

根據外部合作夥伴提供的報價單 PDF,製作 Liberogic 端的採購單 PDF

就敝公司目前使用的範圍而言,Money Forward 並沒有符合需求的功能,而為此另外簽約又實在可惜,對吧?

如果改為手動作業,

  • 製作採購單格式
  • 對照報價單,手動將內容謄寫到採購單格式中
  • 填寫採購日期
  • 謄寫報價單編號
  • 謄寫明細
  • 確認總金額等內容
  • 整理檔案名稱
  • 其他其他...

這類瑣事會越來越多,真的很麻煩呢…所以決定自己做一個。

用 Claude Code 不到一小時就達到實際可用

時機也剛剛好。

二月的期初、二月的增資,加上 Claude Code 的發布,以及它在本公司員工之間逐漸普及,這些事情恰好同時發生。

當時公司內部正好也開始出現一股類似黑客松的風氣,大家一邊使用 Claude Code 等工具,一邊開發業務改善工具、小型內部應用程式,甚至想把自己的點子直接部署上線!

從非常簡單的規格整理、向 Claude Code 下達指示,到細部調整為止……

大約一小時左右,就做到了可以實際使用的程度。

雖然並不是什麼都丟給 AI 就能完成,但只要把需求好好整理成提示詞,就會非常快速又方便呢~!

桌面應用程式完成

這是一個在作業系統上運作的簡易採購單產生工具,相信各位也都有在使用類似的工具。

只要將報價單 PDF 拖放到專用的 .app 上,就會執行 Python 腳本,讀取報價單 PDF 的內容,並在同一資料夾中產生採購單 PDF。
完成後會顯示 macOS 通知,並自動開啟產生的採購單 PDF,是一個相當簡單的工具。

架構大致如下。

~/Desktop/発注書生成/
 見積書をドロップ→発注書生成.app
 _lib/
  generate_purchase_order.py
  liberogic_logo.png
  liberogic_seal.png
  purchase_order_counter.json

為了讓會計、管理等行政人員也能在不開啟終端機的情況下使用,我們將 AppleScript 的 Droplet 作為入口,實際的 PDF 產生處理則交由 Python 負責。

簡單來說,這是一款桌面應用程式,只要將報價單 PDF 拖放進去,就會產生採購單 PDF。由於不需要開啟終端機,因此也便於在公司內部的管理業務中使用。

採購單 PDF 的版面設計參考了本公司使用的 Money Forward 格式之帳單與報價單 PDF。
備註欄中加入了以下文字。

本採購單即為正式採購。 依據報價單編號 XXX 進行採購。

採購單編號採用以下格式。

{會社略稱}敬啟 採購單{YYYY}{MM}{3位數流水號}

例如,若是給〇〇客戶的 2026年02月第1筆,

〇〇 客戶 採購單 202602001

就會產生這樣的編號。

公司別與月別的流水號由 purchase_order_counter.json管理,採購日則自動從報價單日期往後計算 5 個工作天。(這裡只是暫定規格!之後會依管理層的決定再調整!)
為了排除週末以外的日本國定假日,我使用了 Python 的 jpholiday。

稍微有點難的部分

採購單的依據報價單來自外部合作夥伴與協力廠商,因此每家公司的格式都不同。
光是硬性假設「這個座標會有公司名稱」「這個位置會有總金額」是無法應付的。

最後還是得搭配正規表示式,盡可能彈性地擷取廠商名稱、地址、TEL、報價單編號、報價日、主旨、明細、小計、消費稅、總計等資訊,並把帶有「御中」的公司視為自家公司、其餘視為採購對象。另外,從 PDF 擷取文字時,視覺上分開的資訊在文字層面常會黏在一起,真的是各種狀況都有。

也曾發生主旨後面混入大樓名稱或樓層的情況,因此我加入了處理邏輯,以「ビル」「階」等標示作為線索,裁掉多餘的地址資訊。

不管是不是 AI,這一塊還是老樣子,就是 PDF 處理的經典難題。

交給 Claude Code 的提示詞

與其給出籠統的要求,不如盡可能具體地寫明資料夾結構、處理流程、版面配置、編號規則、營業日計算、PDF 擷取項目等,這樣反而更能節省 Token 消費。
也請讓它閱讀範例 PDF 吧!

以下の条件で、見積書PDFを発注書PDFに自動変換するツールをmacOS向けに作ってください。

## 環境

- macOS / Python3(pip可)
- フォント:`~/Library/Fonts/NotoSansJP-Regular.ttf` / `NotoSansJP-Bold.ttf`

## フォルダ構成

`~/Desktop/発注書生成/
  見積書をドロップ→発注書生成.app
  _lib/
    generate_purchase_order.py
    liberogic_logo.png
    liberogic_seal.png
    purchase_order_counter.json`

## 処理フロー

1. `.app` に見積書PDFをドラッグ&ドロップ
2. Pythonスクリプトを実行し発注書PDFを生成
3. 完了通知(macOS通知)を出して発注書PDFを自動で開く
4. 発注書PDFは見積書と同じフォルダに保存

## 発注書の仕様

出力フォーマットは添付のMoneyForward形式のPDFに合わせること。

このPDFから以下を抽出して使う:

- ロゴ画像
- 押印画像
- レイアウト座標
- 列幅
- 余白
- フォントサイズ

## 自社情報

リベロジック株式会社
登録番号:T2010401081132
〒108-0073 東京都港区三田1-3-37 板金会館2F
TEL: 03-6809-4366 / FAX: 03-6809-4367

## 発注書番号

- 形式:`{会社略称}様 発注書{YYYY}{MM}{3桁連番}`
- 会社別・月別の連番を `purchase_order_counter.json` で管理
- 出力ファイル名もこの発注書番号に揃える

## 発注日

- 見積書の日付から5営業日後
- 土日と日本の祝日を除外する

## 見積書からの情報抽出

- どんな会社のフォーマットでも対応できる柔軟な正規表現で抽出
- 抽出項目:ベンダー名・住所・TEL、見積書番号、見積日、件名、明細、小計・消費税・合計
- ベンダー判定:「御中」の付いた会社=自社、それ以外=発注先
- 件名に住所の建物名が混入するケースに対応

## 発注書レイアウト

- タイトル「発注書」中央大文字
- 左:発注先の社名・住所・TEL
- 右:自社情報+ロゴ+押印+発注書番号・発注日・見積書番号・見積日
- 件名・発注金額を大きく表示
- 明細テーブル:品目/単価/数量/単位/価格
- 交互グレー背景
- 最低8行
- 合計エリア:小計・消費税・合計のみ
- 備考欄を枠付きで表示
- ページ番号なし

這幾乎就是一份簡易規格書,重點在於不要只說「做得好一點」,而是盡可能具體地提供業務上的限制與完成後的預期樣貌。
話雖如此,如果讓它讀取其他格式的檔案,還是常常失敗,因此仍需要請 Claude 再多努力一下,不過整體來說速度很快,我覺得還是值得的。
(我們委託的外部人員與合作夥伴加起來也不到兩位數,所以這不是什麼大問題!)

正因為方便,更需要留意安全性

另一方面,使用 AI 開發輔助工具時,除了便利性,也必須留意安全性方面的問題。

在向 Claude Code 下達指令、推進工作的過程中,會對本機環境執行一些操作。

- ~/Desktop へのファイル読み書き
- ~/Library/Services/ へのアクセス検討
- pip install によるPythonライブラリの追加
- osacompile によるAppleScriptアプリの生成
- ~/Library/Fonts/ にあるフォントファイルの読み取り

這次的內容不是什麼大道理,但既然讓 AI 擁有本機環境的執行權限,老實說還是會覺得可怕呢😨

若委託終端機操作或檔案操作,可能會發生非預期的檔案建立、覆寫或刪除,因此

  • 先確認允許的範圍!
  • 先備份!
  • 可以用 git 管理的內容,先確認差異!
  • 先把工作資料夾分開!

像這類基本的防範措施很重要。如果是用於開發工作,建議考慮透過 1Password 來讀取 .env 檔案。雖然麻煩,但這樣做還是會有很大的差別。(by 本公司 CTO)

另一方面,如果像這次一樣僅在本機環境中執行,風險相對有限。透過網路對外擴散影響的情況很少,大多數情況下,影響範圍最多只會限於「自己的環境」。

當然還有許多需要留意的地方,但「能快速完成」與「能安全使用」是兩回事。在進行 AI 輔助開發時,請一邊確認執行權限、檔案操作、外部函式庫以及輸入資料的處理方式,再穩步推進!

未來將延伸至團隊共用與 Supabase 整合

這次做的是一個在本機環境執行、功能簡單的採購單產生工具。

初期階段,我使用 purchase_order_counter.json 來依公司與月份管理流水編號。但若考慮到之後要與同仁共用,光靠本機的 JSON 檔案管理編號,採購單編號重複等各種問題自然就會接連出現。

因此,我打算在 Supabase 端為每間公司、每個月份保存計數器,即使多人使用也不會出現編號重複。此外,也會新增採購單的開立紀錄、採購對象、估價單編號、採購金額、採購日期,以及 PDF 儲存位置等功能!

關於撰寫本文的人

身為社長,卻始終站在第一線。理解新技術,當某件事變得更方便的那一刻就會感到喜悅,並全心投入。對未來的技術充滿期待,無論年紀多大,都想享受新的體驗。

森本 忠典

專案經理 / 導演 / 2007 年創立

查看此員工的文章

我們的優勢在於穩健的團隊體制與快速的應對能力

Liberogic 由經驗豐富的資深人員積極推動專案,因此獲得客戶的高度評價。
我們會妥善指派專案經理與總監,致力於順利推進整體專案。 我們採取依據專案需求適才適所分配資源的方式,避免因全程投入而增加不必要的成本,並且在掌握業務內容、製作與提交估價方面的速度也廣受好評。

注: 本公司不積極承接類似 SES 的駐點業務等,敬請事先諒解。

可搭配 Slack、Teams、Redmine、Backlog、Asana、Jira、Notion、Google Workspace、Zoom、Webex 等幾乎所有主要的專案管理工具與聊天工具使用。

歡迎諮詢您的 Web 相關問題。

案例分析