Topics

因需要订单书而用 Claude Code 制作了订单书生成工具(桌面应用)的经过

  • column

在日常工作中,每当出现“手动重复操作实在太累人”的事情时,用 Claude Code 快速搭建一套小工具,就成了理所当然的做法!

这次正是这种典型情况的经过,起因是公司增加了注册资本。

本公司的会计年度从2月开始,这次增资也是在2月进行的。增加注册资本后,我们需要比以往更加规范地管理向外部合作伙伴和协作公司下订单的相关业务。

即所谓的《转包法》,在现行制度下,自2026年1月起该领域被称为“适当交易法”。发包方需要处理的事项增多了,例如明确订单内容、制作和保存交易文件,以及设定付款期限等。

当然,这并不只是“因为有法律规定所以不得不做”的问题!

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

也不是会计工具自带的功能

本公司在会计、报价和请款相关工作中使用MoneyForward(以下简称 MF)的工具。
日常的会计和请款工作确实很方便,但这次我们想实现的功能略有不同。

根据外部合作伙伴提供的报价单PDF,制作Liberogic方的采购订单PDF

至少在本公司使用的范围内,MF没有合适的功能,而且为此专门签约也有些可惜,您说是吧?

如果改为手工操作,

  • 制作采购订单的格式
  • 对照报价单,手动将内容誊写到采购订单格式中
  • 记载采购日期
  • 誊写报价单编号
  • 誊写明细
  • 确认合计金额等内容
  • 整理文件名
  • 其他其他……

这类任务越来越多,确实很麻烦……于是我们决定自己做一个工具。

借助 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 拖放小程序作为入口,实际的PDF生成处理则由 Python 完成。

简而言之,这是一款只需拖放报价单PDF,即可生成采购单PDF的桌面应用。无需打开终端,便于在公司内部的管理工作中使用。

采购单PDF的版式参照了我们公司在用的 Manefo 格式的请求书和报价单PDF。
备注栏中填写了如下内容。

本采购单即为正式采购。 依据报价单编号XXX进行采购。

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

{会社略称} 様 发注书{YYYY}{MM}{3桁连番}

例如,如果是面向〇〇様的2026年2月第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 方面的烦恼,欢迎随时咨询。

案例分析