1. 概要

焦点質問: 法人税等はどのように自動計算されB/Sに反映されるか?

背景・課題

月次決算において、税引前当期純利益 (P/L) に基づき法人税等の見積額を自動計算し、 「国税(法人税等)」と「地方税(法人住民税・事業税)」を区分して計上する。

現状 (Before)

  • Constants.DEFAULT_TAX_RATE = 0.30 の単一税率でみなし法人税を一括計算
  • P/L セクション auto_tax として1行で表示(🤖 みなし法人税等(自動計算: 30%)
  • B/S 未払法人税等 に累積加算
  • 計算は dmCalcPl_() 内の auto_tax タイプで処理
  • 税引前当期純利益の YTD(年度累積) に対して税率を掛け、前月との差分を当月計上

改修後 (After)

  • 国税・地方税を分離した2税率で計算
  • P/L に2行表示(国税 / 地方税)
  • B/S は既存科目 未払法人税等 に合算計上(内訳は摘要で区分可能)
  • 赤字時の所得割スキップ・均等割対応
  • 税率は Constants.TAX_RATES オブジェクトで管理(後日変更容易)

2. 設計判断

#選択肢メリットデメリット選定
2-1赤字: 所得割 0 + 均等割無視YTD 赤字で所得割=0 が正確均等割無視で実税額と乖離採用(見積として十分)
2-1'赤字でも均等割計上より正確自治体情報の管理コスト将来オプション
2-2YTD 差分方式継続冪等性自然・仕訳不要採用(現行と同方式)
2-2'月次直接計算方式シンプル月ごとブレークで複雑化不採用
2-3Constants.TAX_RATES 集約既存パターン・高速コード変更必要採用
2-4dmCalcPl_() 内で完結仕訳不要・Action 独立採用

2-1 詳細: TAX_RATES.localMinimumAnnual をデフォ 0 で定義(均等割有効化時は月割 = 年額/12 を毎月加算)。 2-2 詳細: 「YTD 累積 × 税率 − 前月計上済額」方式。Action A/B フローと独立。


3. 変更内容

3.1 勘定科目

既存の 11_mst_account に必要な科目は登録済み:

主科目コード諸表区分表示区分正式科目名科目名
800PL法人税等法人税、住民税及び事業税法人税、住民税及び事業税
212BS未払税金未払法人税等未払法人税等

科目の追加・分割は不要。P/L の auto_tax セクション内で国税・地方税を行分けして表示する。

3.2 ロジック

税率マスタの構造

002_constants.jsConstants.TAX_RATES オブジェクトに集約:

Constants.TAX_RATES = {
  /**
   * 累進課税ブラケット (中小法人・資本金1億円以下)
   * 所得の低い方から順にマッチし、上限を超えた部分は次のブラケットの税率を適用。
   * 各ブラケットの national / local は「実効税率」(法人税+地方法人税+住民税+事業税 込み)。
   *
   * bracket[0]: 所得 0〜800万円 → 実効税率 約21.4%
   *   内訳: 法人税15% × 地方法人税1.103 = 16.5% (国税) + 住民税割+事業税割 ≒ 4.9% (地方税)
   * bracket[1]: 所得 800万円超  → 実効税率 約33.6%
   *   内訳: 法人税23.2% × 地方法人税1.103 = 25.6% (国税) + 住民税割+事業税割 ≒ 8.0% (地方税)
   */
  brackets: [
    { upTo: 8000000, national: 0.165, local: 0.049 },  // 〜800万円
    { upTo: Infinity, national: 0.256, local: 0.080 },  // 800万円超
  ],

  // 地方税均等割 (年額、資本金1000万以下・従業員50人以下)
  localMinimumAnnual: 0,   // デフォルト0。有効化時は 70000 (7万円) を設定
};

: 仮の実効税率。後日 brackets 内の national / local を正確な値に変更すること。 ブラケットの追加・変更も配列を編集するだけで対応可能。

YTD税額計算・月次差分(処理マトリクス)

項番処理フェーズ入力(論理名)入力(物理名: タブ.列)処理詳細 / 変換ロジック出力(論理名)出力(物理名: タブ.列)例外処理
T1.1YTD税額計算税引前利益_YTD[m]変数: martPlcalcBracketTax(MAX(0, 利益_YTD), brackets) で累進課税適用国税_YTD, 地方税_YTD変数⚠️ YTD赤字→所得割=0
T1.2月次差分算出: 国税国税_YTD[m], [m-1]変数MAX(0, 国税_YTD[m] − 国税_YTD[m-1])国税_月次変数⚠️ MAX(0)でマイナス月をクランプ
T1.3月次差分算出: 地方税地方税_YTD[m], [m-1]変数MAX(0, 地方税_YTD[m] − 地方税_YTD[m-1]) + 均等割年額 ÷ 12地方税_月次変数⚠️ 均等割デフォルト0

累進課税のため、年間所得が800万円を超える月から実効税率が上がる。

累進課税の計算ロジック (calcBracketTax)

項番処理フェーズ入力(論理名)入力(物理名)処理詳細 / 変換ロジック出力(論理名)出力(物理名)例外処理
T2.1ブラケットループincome, brackets引数FOR EACH bracket: taxable = min(remaining, bracket.upTo - prevUpTo)taxable <= 0 → BREAK
T2.2税額加算taxable, bracket.national/local変数nationalTax += taxable × bracket.national, localTax += taxable × bracket.localnationalTax, localTax変数
T2.3残額更新remaining, taxable変数remaining -= taxable, prevUpTo = bracket.upTo → 次のブラケットへ

計算例 (所得 1,000万円の場合):

区間所得国税率国税額地方税率地方税額
0〜800万800万16.5%132万4.9%39.2万
800万超200万25.6%51.2万8.0%16万
合計1,000万183.2万55.2万
税額合計: 238.4万実効税率: 23.8%

パイプライン上の位置

buildBudgetTrendDataMart()
  ├─ 1. dmIngestData_()           ← データ取込
  ├─ 2. dmProcessAllEvents_()     ← P/L・B/S マート構築
  ├─ 3. dmCalcPl_()               ← ★ ここで国税・地方税を計算
  ├─ 4. dmCalcBs_()               ← ★ ここで未払法人税等に加算
  ├─ 5. dmCalcCf_()
  └─ 6. レンダリング・出力

3.3 P/Lレイアウト

Before (現行)

✨ 税引前当期純利益         384,826
 🤖 みなし法人税等(自動計算: 30%)  392,163
✨ 当期純利益 (最終着地)     △ 7,337

After (改修後)

✨ 税引前当期純利益                                     384,826
 🤖 法人税等・国税(〜800万:16.5% / 超:25.6%)            xx,xxx
 🤖 法人税等・地方税(〜800万:4.9% / 超:8.0%)            xx,xxx
✨ 当期純利益 (最終着地)                                 xxx,xxx

ラベルにブラケット情報を表示し、適用税率が一目でわかるようにする。


4. 影響範囲

#ファイル関数/対象変更内容
1002_constants.jsConstants.TAX_RATES新規追加(DEFAULT_TAX_RATE は非推奨)
2603_datamart_pl.jsdmBuildPlSections_()auto_tax 1 行 → 国税+地方税 2 行
3603_datamart_pl.jsdmCalcPl_()国税・地方税分離 + 均等割月割対応
4603_datamart_pl.jsdmBuildPlOutput_()新セクションフォーマット
5604_datamart_bs.jsdmCalcBs_()国税+地方税合算を 未払法人税等 に加算
6602_datamart_main.jsctxTAX_RATETAX_RATES、引数変更
7605_datamart_cf.jsCF 間接法国税+地方税合算で支払額計算
8901_test_runner.jsT4-13合算検証 + 新 T4-14(国/地方行の存在確認)

5. テスト仕様

#テスト内容確認方法
1P/L に国税行・地方税行が表示される61_pl_monthly を目視
2税引前利益 × 国税率 + 地方税率 ≒ 旧みなし法人税額通期列の合算比較
3YTD 赤字月は所得割=062_pl_ytd の赤字月を確認
4B/S 未払法人税等 = 国税 + 地方税の累積71_bs で確認
5B/S 貸借差額 = 0テストランナー T4-06
6CF 期末残高 = B/S 現預金テストランナー T4-08/T4-42
7P/L 当期純利益 = 税引前 − (国税 + 地方税)テストランナー T4-13
8均等割=0 設定で従来と同じ動作TAX_RATES.localMinimumAnnual=0 で確認