0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

インボイスの「端数処理ミス」と源泉徴収の「10%計算ミス」をPythonで一括検出する

0
Posted at

はじめに(開示)
記事後半で紹介する Apify Actor 2本は、筆者(AutoWorks JP)が開発・公開している有料ツールです。前半のPythonコードは、ツールを使わずにそのままコピーして使えます。

この記事でわかること

  • 適格請求書(インボイス)で見落とされがちな「税率ごとに1回」の端数処理ルールと、そのチェック方法
  • フリーランスへの報酬で起きやすい源泉徴収税額の計算ミス(10%で計算、税込金額で計算、100万円超の部分)と、正しい計算式
  • 何百枚もの請求書をまとめてチェックする方法(Python / ノーコード)

※税務の判断が必要なケースは、税理士や税務署に確認してください。本記事は計算方法の解説であり、税務アドバイスではありません。


1. インボイスの端数処理は「明細ごと」ではなく「税率ごとに1回」

適格請求書では、消費税額の端数処理を1つの請求書につき、税率ごとに1回行うことになっています。明細1行ずつ端数処理して合計する方法は認められていません。

よくあるミスの例

8%の商品を3つ、それぞれ333円で販売した場合を考えます。

計算方法 計算 消費税額
✅ 正しい(税率ごとに1回) (333 + 333 + 333) × 8% = 79.92 → 切り捨て 79円
❌ 誤り(明細ごとに処理) 26.64 → 26円 を3行分合計 78円

差は1円ですが、受け取った側は要件を満たさない請求書を保存することになります。

Pythonでのチェック

切り捨て・四捨五入・切り上げのどれを採用していても、「明細ごとの端数処理の合計」と一致していたら疑わしい、と判定できます。

from decimal import Decimal, ROUND_FLOOR, ROUND_HALF_UP, ROUND_CEILING

def expected_taxes(amount: int, rate: int) -> dict:
    """税率ごとの合計金額から、許容される消費税額を3通り計算する"""
    raw = Decimal(amount) * Decimal(rate) / 100
    return {
        "floor": int(raw.to_integral_value(ROUND_FLOOR)),
        "round_half_up": int(raw.to_integral_value(ROUND_HALF_UP)),
        "ceil": int(raw.to_integral_value(ROUND_CEILING)),
    }

def check_rate_summary(line_amounts: list[int], rate: int, reported_tax: int) -> str:
    total = sum(line_amounts)
    ok = expected_taxes(total, rate)
    if reported_tax in ok.values():
        return "OK"
    per_line = sum(int(Decimal(a) * rate / 100) for a in line_amounts)  # 明細ごとに切り捨て
    if reported_tax == per_line:
        return "NG: 明細ごとに端数処理している可能性"
    return f"NG: 税額が合わない(許容値 {sorted(set(ok.values()))})"

print(check_rate_summary([333, 333, 333], 8, 79))  # OK
print(check_rate_summary([333, 333, 333], 8, 78))  # NG: 明細ごとに端数処理している可能性

ほかにも、インボイスには次のような記載事項があります。

  • 登録番号(T + 13桁)
  • 軽減税率の対象品目である旨(「※」などの記号と、その説明)
  • 税率ごとに区分した合計金額と消費税額

2. 源泉徴収税額でよくある3つのミス

個人(フリーランス・個人事業主)に原稿料、デザイン料、講演料などを支払うときは、源泉徴収が必要です(所得税法第204条)。

正しい計算式

支払金額 源泉徴収税額
100万円以下 支払金額 × 10.21%
100万円超 (支払金額 − 100万円) × 20.42% + 102,100円
  • 1円未満は切り捨てます。
  • 10.21%は、所得税10%に復興特別所得税(2.1%分)を上乗せした税率です。
  • 2027年1月から防衛特別所得税(1%)が始まりますが、同時に復興特別所得税が2.1%から1.1%に下がるため、合計の10.21%・20.42%は変わりません。

ミス1:10%で計算している

報酬100,000円の場合、正しくは 10,210円 です。10,000円で計算しているケースがよくあります。

ミス2:税込金額で計算している

請求書で報酬と消費税が区分して記載されている場合は、税抜金額を基に計算できます。

計算 源泉徴収税額
税抜で計算(区分記載あり) 100,000 × 10.21% 10,210円
税込で計算 110,000 × 10.21% 11,231円

区分記載されているのに税込で計算すると、受け取る側の手取りが減ってしまいます。

ミス3:100万円を超える部分の税率

報酬150万円の場合、正しくは次のとおりです。

(1,500,000 − 1,000,000) × 20.42% + 102,100 = 204,200円

全額に10.21%をかけると153,150円になり、5万円以上も少なくなります。

Pythonで計算する

from decimal import Decimal, ROUND_FLOOR

def withholding(fee: int) -> int:
    base = Decimal(fee)
    if base <= 1_000_000:
        tax = base * Decimal("0.1021")
    else:
        tax = (base - 1_000_000) * Decimal("0.2042") + 102_100
    return int(tax.to_integral_value(ROUND_FLOOR))

for fee in (100_000, 222_222, 1_500_000):
    print(f"{fee:>9,}円 → 源泉徴収 {withholding(fee):>7,}円")
#   100,000円 → 源泉徴収  10,210円
#   222,222円 → 源泉徴収  22,688円
# 1,500,000円 → 源泉徴収 204,200円

司法書士の報酬(1回の支払につき1万円を控除)や、外交員の報酬(月12万円を控除)は、計算式が別になります。


3. 大量の請求書をまとめてチェックする

上のコードを自分で拡張してもよいのですが、記載事項のチェックや例外処理まで含めると、意外と手間がかかります。そこで、同じロジックをクラウドで実行できる形にまとめ、Apify Storeで公開しています。

ツール できること 料金
Japan Qualified Invoice (インボイス) Compliance Checker 記載事項、登録番号の形式、軽減税率の表示、税率ごとの合計、端数処理ルールのチェック 1,000件あたり$3
Japan Withholding Tax (源泉徴収) Calculator 源泉徴収税額と振込額の計算、請求書の記載額の検証 1,000件あたり$3
  • どちらも計算だけで完結し、スクレイピングや外部への通信は行いません。
  • 氏名などの個人情報を入力する必要はありません(源泉徴収のほうは、金額と区分だけで計算できます)。
  • Apifyには毎月の無料枠があるので、少量なら費用をかけずに試せます。

Pythonから呼び出す例

# pip install apify-client
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")

run = client.actor("autoworks-jp/japan-withholding-tax-calculator").call(run_input={
    "payments": [
        {"id": "PAY-001", "fee": 100000, "consumptionTax": 10000, "statedWithholding": 10000},
        {"id": "PAY-002", "fee": 1500000, "consumptionTax": 150000},
    ]
})

for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["id"], item["status"], item["withholdingTax"], item["netPayment"])
    for issue in item["issues"]:
        print("  ", issue["messageJa"])

実行結果の例です。

PAY-001 MISMATCH 10210 99790
   記載の源泉徴収税額10,000円は計算値10,210円と-210円異なります。復興特別所得税(2.1%)を含めず10%で計算している可能性があります。
PAY-002 CALCULATED 204200 1445800
   100万円を超える部分には20.42%が適用されます。

Make、n8n、Zapierなどのノーコードツールからも呼び出せます。OCRで読み取った請求書データをインボイスチェッカーに通し、そのあと源泉徴収を計算する、という流れにすると、支払承認の前に一通りの確認を自動化できます。


まとめ

  • インボイスの消費税は、税率ごとに1回だけ端数処理する
  • 源泉徴収税額は 10.21%(100万円超の部分は 20.42%)。2027年以降も合計税率は変わらない
  • 区分記載があれば、税抜金額で計算できる
  • 件数が多い場合は、スクリプトやクラウドツールで機械的にチェックすると、ミスと手間を減らせる

ご意見や「この計算も自動化してほしい」という要望があれば、コメントやActorページのIssuesでお知らせください。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?