Topics

発注書が必要になったのでClaude Codeで発注書生成ツール(デスクトップアプリ)を作った話

  • column

日々の業務の中で「手作業でやり続けるのはちょっとしんどいな」というものが出てきたら、Claude Codeで小さく仕組みを作ってしまえ!が当たり前になってまいりました。

今回はまさにその典型のような話できっかけは会社の資本金を増やしたことでした。

弊社は2月が期首で今回の増資も2月に行いましたが、資本金を増やしたことで外部パートナーや協力会社への発注業務についてもこれまで以上にきちんと整備していく必要が出てきました。

いわゆる下請法、現在の制度上では2026年1月から「取適法」と呼ばれるようになった領域です。発注内容の明示 / 取引書類の作成・保存、支払期日の設定など発注側として対応すべきことが増えちゃうんですよね。

もちろんこれは「法律があるから仕方なくやる」というだけの話ではありませんよ!

外部パートナーに仕事をお願いする以上、発注内容、金額、日付、見積書との対応関係を明確にしておくことは、発注側・受注側の双方にとって大切なことなのです。(キリ)

会計ツールに付いている機能でもなかった

弊社では会計 / 見積 / 請求まわりでMoneyForward(以下マネフォ)のツールを利用しています。
日常的な会計・請求業務では便利なのですが今回やりたかったことは少し違いました。

外部パートナーから受け取った見積書PDFをもとにリベロジック側の発注書PDFを作る

少なくとも弊社が利用している範囲でマネフォにちょうどよい機能がなく、またそのためにサービスを契約するのも勿体ないっですよね。

仮に手作業となると、

  • 発注書のフォーマットを作る
  • 見積書を見ながら発注書のフォーマットに手作業で転記する
  • 発注日を記載する
  • 見積書番号を転記する
  • 明細を転記する
  • 合計金額等、内容を確認する
  • ファイル名を整える
  • その他その他.…

面倒ですよね、このタスクが増えるの..…ということで作ることにしました。

Claude Codeで1時間弱で実用化

タイミングもよかったです。

2月の期首、2月の増資、そしてClaude Codeのリリースと弊社スタッフへの浸透が重なりました。

社内でもちょうどClaude Codeなどを使いながら業務改善ツールや小さな社内アプリ、勝手アイデアのデプロイまで完成しよう!というハッカソン的な流れが始まっていた時期です。

超簡単な仕様整理からClaude Codeへの指示、細かな調整を含めて…

1時間弱ほどで実用できるところまで持っていくことができました。

まぁ何でもAIに丸投げすれば完成するわけではありませんが、きちんとプロンプトに落とし込めばスピーディーで便利ですね〜!

デスクトップアプリの完成

おそらく皆さんもやっているOS上で動くシンプルな発注書生成ツールです。

見積書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の見た目は弊社で使っているマネフォ形式の請求書・見積書PDFに寄せました。
備考欄には、以下のような文言を入れています。

本発注書をもって正式な発注とします。 見積書番号XXXに基づき発注いたします。

発注書番号は以下の形式にしました。

{会社略称}様 発注書{YYYY}{MM}{3桁連番}

たとえば、〇〇様向けの2026年2月の1件目であれば、

〇〇様 発注書202602001

のようになります。

会社別・月別の連番は purchase_order_counter.jsonで管理し、発注日は見積書の日付から5営業日後を自動計算します。(ここはあくまで暫定仕様ですよ!あとで管理のもと変更しますから!)
土日だけでなく、日本の祝日も除外するため、Pythonの jpholidayを利用しました。

ほんのちょっとだけ難しい箇所

発注書の元になる見積書は、外部パートナーや協力会社からいただくものなので、会社ごとにフォーマットが異なります。
単純に「この座標に会社名がある」「この位置に合計金額がある」と決め打ちするだけでは対応できないのです。

結局のところ正規表現を使いながら、ベンダー名 / 住所 / TEL / 見積書番号 / 見積日 / 件名 / 明細 / 小計 / 消費税 / 合計などをできるだけ柔軟に抽出するようにして、「御中」が付いている会社を自社、それ以外を発注先として扱うようにしたりとか、PDFからテキストを抽出すると見た目上は分かれている情報がテキスト上ではくっついてしまったりとかとかとか。

件名の後ろにビル名や階数が混入してしまうようなケースもあったため「ビル」「階」などの表記を手がかりに不要な住所情報を切る処理も入れています。

AIだろうがなんだろうが、このあたりは相変わらずのPDF処理あるあるです。

Claude Codeに渡したプロンプト

ざっくりしたお願いではなく、フォルダ構成 / 処理フロー / レイアウト / 採番ルール / 営業日計算 / PDF抽出項目等、できるだけ具体的に書いたほうが経済的なトークン消費だったりします。
サンプルの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さんに頑張ってもらう必要はありますが、それでも速いからいいかなと。
(弊社がお願いしている外部スタッフや協力パートナーは足しても2桁の数に届かないので大した話ではないです!)

便利だからこそセキュリティ面も気にする

一方でAI開発支援を使う場合、便利さだけでなくセキュリティ面も気にする必要があります。

Claude Codeに指示を出しながら作業を進める中で、ローカル環境に対していくつかの操作が行われます。

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

今回はたいしたお話ではないのですが、AIにローカル環境での実行権限を与える以上やっぱり怖いですよね😨

ターミナル操作やファイル操作を任せる場合、意図しないファイルの作成 / 上書き / 削除が起きる可能性があるので、

  • 許可する内容を確認する!
  • バックアップを取る!
  • git管理できるものは差分を確認する!
  • 作業用フォルダを分ける!

といった基本的な対策が大切です。 開発業務で利用するなら .env ファイルを 1password で経由で読み込むようにした方いいかもしれません。面倒ですがこれでもだいぶ違います。(by 弊社CTO

一方で、今回のようにローカル環境でのみ実行する用途であれば、リスクは比較的限定的です。 ネットワーク経由で外部に影響が広がることは少なく、「最悪でも自分の環境に影響が出る範囲」に収まるケースがほとんどです。

他にも留意点はたくさんありますが「早く作れる」ことと「安全に使える」ことは別問題なのです。AIを活用した開発を進める際には、実行権限 / ファイル操作 / 外部ライブラリ / 入力データの扱いを確認しながら進めましょう!

今後はスタッフ共有とSupabase連携へ

さて、今回作ったものはローカル環境で動くシンプルな発注書生成ツールです。

最初の段階では、purchase_order_counter.json を使って、会社別・月別の連番を管理する形にしましたが、今後スタッフと共有して使うことを考えると、ローカルのJSONファイルだけで連番を管理すると当然、発注書番号が重複してしたりとかいろいろでてきますよね。

なのでSupabase側に会社別・月別のカウンターを持たせて複数人で使っても連番かぶり無し、追加で発注書の発行履歴 / 発注先 / 見積書番号 / 発注金額 / 発注日 / PDFの保存先なども実装しよう思います!

この記事を書いた人

社長でありながら常にカウンターパート。新しい技術を理解したり、何かが便利になる瞬間に喜びを感じ、ひたすら没頭する現場大好き人間。未来の技術にもわくわくしながら、いくつになっても新しい体験を楽しんでいたい。

森本さん

プロジェクトマネージャー / ディレクター / 2007年創業

このスタッフの記事を見る

安心のチーム体制とスピードのある対応力が自慢

リベロジックでは、ベテランスタッフが積極的にプロジェクトを推進するため、お客様から高く評価されています。
プロジェクトマネージャー、ディレクターをきちんとアサインし、プロジェクト全体をスムーズに進行することを心掛けています。 不必要なフルコミットでのコスト増加を防ぎ、適材適所にリソースを配分するスタイルで、業務内容の把握から見積作成/提出の速さにも定評があります。

当社はSES的な常駐業務等は積極的に行っておりませんので予めご了承ください。

Slack、Teams、Redmine、Backlog、Asana、Jira、Notion、Google Workspace、Zoom、Webexなど、ほぼすべての主要なプロジェクト管理ツールやチャットツールをご利用いただけます。

Webのお悩みご相談ください。

ケーススタディ