バイブコーディングで請求書を自動化|試作と税計算の落とし穴
毎月の請求書づくり、地味に時間を取られていませんか。バイブコーディングで請求書を自動化できたら楽になりそうだ、と考えたことがある方も多いと思います。
今回、Claude Codeとのバイブコーディングで「明細のCSVから請求書を作るツール」を2回の指示で試作しました。使ったプロンプト、1回目で見つかった消費税の計算ミス、直したこと、未確認の部分を正直にまとめます。
※バイブコーディングは、自然言語でAIにコードの生成・修正を依頼しながら開発を進める方法です。この記事では、コードと出力結果を確認しながら進めています。
※税金に関わる内容です。本記事は2026年10月時点で国税庁の公開情報を調べた範囲の内容で、税務の最終判断は税理士など専門家への確認をおすすめします。
バイブコーディングで請求書は自動化できるのか
結論から言うと、「明細を書いたCSVから、請求書のHTMLを作る」ところまでは2回の指示で形になりました。
ただし、今回の範囲は半自動化です。明細の入力、請求書番号の指定、PDFにする作業、送付は人の手で行います。「毎月の作業が完全に消えた」とはまだ言えません。
一番の学びは、1回目のツールが見た目は正しそうなのに、消費税の計算方法がインボイス制度のルールに合っていなかったことです。
1回目のプロンプトと、見つかった3つの問題
最初に伝えたのは、次のようなざっくりした内容です。
CSVの明細から請求書を作るPythonスクリプトを作ってください。
CSVの列: 日付・品名・数量・単価・税率
出力: 請求書をHTMLファイルで作成(宛先と合計金額、消費税を表示)
外部ライブラリは使わず、Python標準ライブラリだけで作ってください。
不明点があれば推測せず、確認事項として列挙してください。
すぐに動くスクリプトができ、架空の明細で合計金額の入った請求書が出力されました。
ここで、税抜98円の文房具3点(10%)と、税抜95円の食品2点(8%)を、数量1の明細5行として入れてみました。端数が出やすい明細です。すると、次の3つの問題が見つかりました。
1. 消費税を明細1行ごとに計算してPythonの `round()` で丸め、その合計を出していた。結果は消費税46円(10円×3+8円×2)。税率ごとに合計してから1回だけ端数処理すると、10%対象294円→29円、8%対象190円→15円で44円になり、2円ずれます。
2. 登録番号や税率ごとの内訳が出ない。適格請求書(インボイス)に必要な項目が足りません。
3. 同じファイル名で実行すると、前の請求書を黙って上書きする。発行済みの請求書が消えるのは困ります。
1つ目は、国税庁のQ&A(問57)で「一の適格請求書につき、税率ごとに1回の端数処理」と説明されている点に関わります。商品ごとに端数処理して合計する方法は認められない、と注記まであります。なお、切り捨て・四捨五入・切り上げといった端数処理の方法自体は任意とされています。たった2円ですが、ルールとして違う計算です。
あわせて、Pythonの `round()` は「ちょうど半分」のとき偶数側に丸めることも確認しました。手元で試すと `round(2.5)` は `2`、`round(3.5)` は `4` になります。いわゆる四捨五入とは違うので、丸め方を指定しないと意図しない結果になり得ます。
2回目のプロンプトで直したこと
見つかった問題と、調べたルールをそのまま伝えました。
次の点を修正してください。
1. 消費税は明細ごとに計算せず、1枚の請求書の中で税率(10%・8%)ごとに合計した税抜金額から、1回だけ端数処理してください
2. 端数処理の方法(切り捨て・四捨五入・切り上げ)は設定ファイルで選べるようにし、初期値は切り捨てにしてください。計算にはfloatではなくDecimalを使ってください
3. 請求書に、発行者名と登録番号、請求書番号、各明細の取引日・品名・金額、税率ごとの対象金額・適用税率・消費税額、軽減税率対象であることの印を表示してください
4. 発行者名と登録番号は設定ファイル(config.json)から読み込み、登録番号が「T+13桁」でなければ作成を中止してください
5. 出力先に同じ名前のファイルがあるときは、上書きせずに中止してください
6. CSVに数字でない値や想定外の税率があれば、何行目が問題かを表示して中止してください
7. 品名や宛先に入った文字は、HTMLとして解釈されないようエスケープしてください
既存ファイルを変更する前に、変更内容の要点を教えてください。
不明点があれば推測せず、確認事項として列挙してください。
修正版を、架空のデータで確かめた結果がこちらです。確認環境は2026年10月時点のmacOS 26.6.1、Python 3.14.0、Claude Code 2.1.268です。登録番号は `T0000000000000` というダミー値を使いました。
| 確認したこと | 結果 |
|---|---|
| 端数が出る明細(10%・8%混在) | 10%対象294円→29円、8%対象190円→15円、合計44円 |
| 同じ出力ファイル名で再実行 | 「既に存在します。上書きしません」で中止 |
| 単価に `abc` を入力 | 「3行目」と問題の行を表示して中止 |
| 登録番号が空・桁不足・数字以外を含む | 作成を中止 |
| 品名に `` タグを入力 | 太字にならず、文字としてそのまま表示 |
補足すると、「変更内容の要点を教えてください」だけでは承認待ちにならないため、後半の読者向けプロンプトでは承認まで実行しない条件を明記しました。また `Decimal` も標準は偶数丸めなので、「四捨五入なら `ROUND_HALF_UP`」と丸め方を明示するのがポイントです。
なお、登録番号のチェックは形式だけです。適格請求書を発行するには、適格請求書発行事業者として登録済みで、自分の正しい登録番号を記載する必要があります。
計算方法そのものは、国税庁Q&Aの記載例(税込60,000円の10%対象→5,454円、税込40,000円の8%対象→2,962円)と同じ考え方です。ただ、今回のツールは税抜金額の入力にしか対応していないため、この記載例をそのまま入れて照合することはできていません。
まだ試せていないこと・注意したいこと
- **PDF化**:HTMLをブラウザの印刷機能でPDFにする想定ですが、実際の見た目やページ分割は未確認です
- **税込入力への対応**:税込価格で管理している人は、そのままでは使えません
- **請求書番号の採番**:番号は毎回手で指定しています。重複チェックはまだありません
- **送付**:メール送信はしていません。自動送信は誤送信のリスクもあるので慎重に考えたいところです
もう1つ、調べて気になったのが保存のルールです。国税庁の資料(令和6年1月以降用)では、申告所得税・法人税に関して帳簿書類の保存義務がある方が、請求書などを電子データでやりとりした場合は、そのデータを保存する必要があり、受け取った場合だけでなく送った場合も対象だと説明されています。PDFで送るなら「どこにどう保存するか」も決めておく必要がありそうです(調査ベースの理解です)。
会計ソフトや請求書サービスには、こうした計算や電子保存を支援する製品もあります(対応範囲や必要な設定は製品ごとに確認が必要です)。自作が向いているのは「取引先が少なく、形式が決まっている」ような小さなケースだと、今回の試作で感じました。
読者が自分の請求書ツールを作るためのプロンプト例
作業用フォルダを1つ作って移動し、`claude` を起動してから以下を貼り付けます。macOSのターミナルなら、たとえば次の3行です(フォルダ名は一例です)。
mkdir invoice-demo
cd invoice-demo
claude
2回分の学びを最初から盛り込んだプロンプトがこちらです。
毎月の請求書を作るための、小さなPythonスクリプトを作りたいです。
目的: 明細を書いたCSVから、請求書のHTMLファイルを作りたい
対象範囲: 今いる作業フォルダの中だけで作業してください。スクリプト1つ、設定ファイル(config.json)1つ、サンプルCSV1つを新規作成してください
CSVの列: 取引日・品名・数量・税抜単価・税率(10か8)
必ず入れてほしいこと:
- 消費税は、1枚の請求書の中で税率ごとに合計した金額から1回だけ端数処理する(明細ごとに計算しない)
- 計算にはDecimalを使い、端数処理は1円単位で明示する。方法は設定で切り捨て・四捨五入(ROUND_HALF_UP)・切り上げから選べるようにし、初期値は切り捨てにする
- 発行者名・登録番号・請求書番号・宛先・各明細の取引日と品名と金額・税率ごとの対象金額と適用税率と消費税額・軽減税率対象の印を表示する
- 登録番号が「T+半角数字13桁」の形式でなければ作成を中止する
- 品名・宛先・発行者名など、HTMLに埋め込む文字はエスケープする
- 同じ名前のファイルがあれば上書きせずに中止する
- 入力値の誤りは何行目かを表示して中止する
外部ライブラリは使わず、Python標準ライブラリだけで作ってください。
サンプルデータは架空の会社名・ダミーの登録番号にしてください。
作成前に、ファイル構成と計算方法の案を教えてください。
作成後は、実際のファイル名を使って、設定の編集・CSVの入力・実行・HTMLの確認の手順を、私のOS向けに説明してください。
既存のファイルを変更・上書き・削除する場合は、作業前に対象ファイルと変更内容を表示し、私が承認するまで実行しないでください。
不明点があれば推測せず、確認事項として列挙してください。
できあがったら、端数が出る明細を入れて、電卓で計算した消費税額と一致するか確かめてみてください。実在の取引先を入れるのは、動作確認が済んでからが無難です。
`python3` が見つからないと表示された場合は、「このPCでPythonスクリプトを実行する方法を教えて」とClaude Codeに聞いてみてください。`sudo` をつけるよう案内されたら、何をインストールするのか確認してから実行しましょう。Windowsではコマンドが異なる場合があります。
なお、OSやPython、Claude Codeのバージョンによって挙動が変わる可能性があります(本記事の内容は2026年10月時点のものです)。
この記事のまとめ
- バイブコーディングで、CSVから請求書HTMLを作る半自動化ツールは2回の指示で形になった
- 1回目は消費税を明細ごとに丸めており、インボイス制度の端数処理ルールと合っていなかった
- ルールを具体的に伝えると、税率ごとの1回の端数処理・登録番号の表示・上書き防止まで直せた
- PDF化、税込入力、採番、送付、電子データの保存方法はまだ試せていない
- 税金が絡む部分は、AIの出力を電卓と公式情報で確かめるのが大切
「金額が出た」で安心せず、端数が出る明細を1つ入れてみる。それだけで見つかる問題がある、というのが今回の収穫でした。
小さく作って直していく進め方は、バイブコーディングで家計簿アプリを作った話や、バイブコーディングで名刺管理アプリを試作した記録でも紹介しています。あわせて読んでみてください。
なお、こうした「実際に手を動かして試す」体験は、学習アプリの形でも準備を進めています。公開時期は未定ですが、app.maahsachi.com(公開準備中)で試せるようになる予定です。
参考
- [インボイス制度について(国税庁)](https://www.nta.go.jp/taxes/shiraberu/zeimokubetsu/shohi/keigenzeiritsu/invoice_about.htm)
- [適格請求書等保存方式に関するQ&A 問57(国税庁・PDF)](https://www.nta.go.jp/taxes/shiraberu/zeimokubetsu/shohi/keigenzeiritsu/pdf/qa/57.pdf)
- [電子取引データの保存方法をご確認ください【令和6年1月以降用】(国税庁・PDF)](https://www.nta.go.jp/law/joho-zeikaishaku/sonota/jirei/tokusetsu/pdf/0023006-085_01.pdf)
- [組み込み関数 round()(Python公式ドキュメント)](https://docs.python.org/ja/3/library/functions.html#round)