Topics

需要采购单,所以用 Claude Code 制作了采购单生成工具(桌面应用)的相关经验分享

  • column

在日常工作中,只要发现"这样手工继续做下去有点累啊"的事务,就能用 Claude Code 快速搭建一个小工具来解决,这已经成了我们的常规做法。

这次恰好是一个典型的例子,契机就是公司增加了资本金。

我们公司的财年始于2月,此次增资也在2月进行。随着资本金的增加,我们需要进一步完善对外部合作伙伴和协力公司的发包业务流程和管理体系。

所谓的下包法,在现行制度下从2026年01月起将被称为"取适法"的领域。订单内容的明示、交易文件的制作和保存、付款期限的设定等,作为发包方需要对应的事项增加了。

当然,这不仅仅是"因为法律要求,所以被迫去做"这样的问题!

既然将工作委托给外部合作伙伴,明确订单内容、金额、日期以及与报价单的对应关系就变得尤为重要。这对发包方和承包方双方来说都至关重要。(キリ)

这是一个甚至会计工具都不具备的功能

我们公司在会计、报价和发票相关工作中使用 MoneyForward(以下简称 manefo)工具。
虽然在日常会计和发票业务中很便利,但这次我们想做的事情有些不同。

根据从外部合作伙伴收到的报价单 PDF 生成 Liberogic 方面的订单 PDF

至少在我们使用的范围内,Manefo 没有完全合适的功能,而且仅为此目的签约服务也太浪费了。

如果必须手工操作的话,

  • 创建订单格式
  • 查看报价单,将数据手工转录到订单格式中
  • 填写订单日期
  • 转录报价单号
  • 转录明细行项目
  • 确认总金额等内容
  • 整理文件名
  • 其他其他……

很烦人,任务增加……因此我们决定开发它。

使用 Claude Code 在不到一小时内实现

时机也恰好。

2月的财政年度开始、2月的融资,以及 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的外观参考了我公司使用的Manefo格式的发票和报价单PDF。
备注栏中包含以下内容。

本采购单为正式采购。根据报价单编号XXX发出采购。

采购单编号采用以下格式。

{公司简称}样 采购单{YYYY}{MM}{3位序号}

例如,对于〇〇公司2026年02月的第1份采购单,

某某 采购单202602001

看起来会是这样。

公司和月份的序列号由 purchase_order_counter.json 管理,发单日期从报价单日期自动计算后的 5 个工作日。(这里只是暂定规格!以后会在管理人员的监督下进行修改!)
为了不仅排除周六日,还要排除日本的公共假日,我们使用了 Python 的 jpholiday 库。

只是略微有点难的地方

发票估价单是从外部合作伙伴或协作公司获取的,所以每家公司的格式都不同。
单纯地"在这个坐标有公司名称""在这个位置有合计金额"这样硬性规定是无法应对的。

到头来就是使用正则表达式,尽可能灵活地提取供应商名称/地址/电话/估价单号/估价日期/主题/明细/小计/消费税/合计等信息,对于带有"御中"的公司作为自公司对待,其他的作为发包方处理之类的,从 PDF 提取文本时,视觉上分开的信息在文本中却会连在一起等等。

由于在某些情况下"楼宇名称"或"楼层"等信息会混入标题后面,因此我们还添加了使用"楼"、"层"等标记作为线索来删除不必要的地址信息的处理。

无论是 AI 还是其他什么,这一块仍然是 PDF 处理的常见问题。

传递给 Claude Code 的提示词

与其笼统地提出需求,不如
尽可能具体地描述文件夹结构、处理流程、页面布局、编号规则、营业日计算、PDF提取项目等,这样可以更经济地消耗tokens。让我们一起读一读示例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赋予本地环境的执行权限,确实还是有点害怕呢😨

将终端操作和文件操作托付给AI的情况下,有可能会发生意想不到的文件创建、覆盖或删除,所以

  • 确认许可的内容!
  • 进行备份!
  • 对于可以用git管理的文件,要确认差异!
  • 分离工作用文件夹!

诸如此类的基本对策是很重要的。如果在开发业务中使用,可能更好的做法是通过 1password 来读取 .env 文件。虽然有点麻烦,但这样确实会有很大的不同。(由 我们的 CTO 提供)

另一方面,如果像这次一样仅在本地环境中运行,风险相对有限。通过网络向外部传播的影响很少,在大多数情况下都"最多只会影响自己的环境"。

虽然还有很多其他需要注意的地方,但"开发快"和"使用安全"是两回事。在推进 AI 助力开发时,请一边确认执行权限、文件操作、外部库和输入数据的处理方式,一边逐步推进!

今后将推进员工共享和 Supabase 集成

那么,这次我们创建的是一个在本地环境中运行的简单采购单生成工具。

在最初的阶段,我们使用 purchase_order_counter.json 来管理按公司和月份划分的序列号,但考虑到未来将与员工共享使用,仅使用本地 JSON 文件来管理序列号自然会出现采购订单编号重复等各种问题。

所以在 Supabase 端设置公司别、月别的计数器,即使多人使用也不会出现编号重复。另外,我还计划实现采购单发行历史、采购商、报价单号、采购金额、采购日期以及 PDF 保存位置等功能!

本文作者

既是公司代表,也始终是合作伙伴。喜欢理解新技术,享受事物变得便捷的那一刻,是个痴迷于现场工作的人。对未来技术充满期待,无论多大年纪都想继续体验新事物。

森本

项目经理 / 创意总监 / 2007年创立

查看本员工的文章

安心的团队体制和迅速的反应能力是我们的优势

Liberogic 拥有经验丰富的员工团队,积极推进项目,因此获得了客户的高度评价。
我们会妥善分配项目经理和总监,确保整个项目顺利进行。 通过避免不必要的全职投入导致的成本增加,并采用适当配置人力资源的方式,从把握业务内容到估价的制作和提交速度都赢得了良好的口碑。

* 本公司不积极开展SES驻场工作等业务,敬请谅解。

Slack、Teams、Redmine、Backlog、Asana、Jira、Notion、Google Workspace、Zoom、Webex 等,您可以使用几乎所有主要的项目管理工具和沟通协作工具。

请咨询我们的网站相关问题。

案例分析