困りごと
AIに請求書を作らせると、品目ごとに消費税を出して足すことがあります。
| 品目(税抜・10%) | 金額 | 品目ごとの税(切捨て) |
|---|---|---|
| コピー用紙 | 1,999 | 199 |
| トナー | 2,999 | 299 |
| ボールペン | 999 | 99 |
| 合計 | 5,997 | 597 |
適格請求書では、端数処理は「一請求書当たり、税率ごとに1回ずつ」です(国税庁 https://www.nta.go.jp/publication/pamph/shohi/shohizei_11.pdf )。5,997 × 10% = 599.7 → 切捨てで 599 円。品目ごとに出すと 597 円になり、2円ずれます。
同じ資料で、適格請求書の記載事項は6つと決まっています(発行者名と登録番号・取引年月日・取引内容と軽減税率の印・税率ごとの合計と税率・税率ごとの消費税額・買い手の名称)。
作ったもの
JP Invoice Check(MIT・Python標準ライブラリのみ・外部通信なし)。
https://github.com/ayatrader/jp-invoice-check
Claude などの Agent Skill(SKILL.md)・コマンド・MCPサーバーの3つの形で使えます。スキルはAIに「税を暗算しないで、JSONにして検査を走らせる」よう指示します。
python -m jpinvoice examples/line_rounding_mistake.json
E_REDUCED_NOT_MARKED 8%の品目に軽減税率の対象である印(※など)がありません(記載事項3)。
E_TAX_LINE_ROUNDING 10%の税額 597 は品目ごとに端数処理した合計です。端数処理は1つの請求書につき税率ごとに1回: 正しくは 599(floor)。
E_TAX_LINE_ROUNDING 8%の税額 285 は品目ごとに端数処理した合計です。…正しくは 286(floor)。
E_BUYER_MISSING 交付を受ける事業者(買い手)の氏名・名称がありません(記載事項6)。
W_REGNO_CHECK_DIGIT 先頭の1桁が法人番号の検査用数字と合いません。…
- 切捨て・四捨五入・切上げは事業者が選べるので、指定がなければ3つのどれかに合えば通し、どれを使ったかを返します
- 登録番号は全角・ハイフンを整えて「T+13桁」と法人番号の検査用数字を確認します
- 日付は西暦・和暦(令和・平成)・期間に対応
- メッセージは英語と日本語の両方。テスト18件
できないこと
- 登録番号が今も有効かは確かめません(通信しないため)。国税庁の公表サイトで確認してください
- 個人事業者の番号では、検査用数字が合わないときも「注意」までにしています
- 適格簡易請求書・返還インボイスなどの特例は対象外。税務の助言ではありません
足りない書式や、誤判定した請求書(架空の値で)を Issue で教えてもらえると、テストに足します。