最終更新: 2026/06/22 18:56
法人税等 自動計算・計上
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-2 | YTD 差分方式継続 | 冪等性自然・仕訳不要 | — | 採用(現行と同方式) |
| 2-2' | 月次直接計算方式 | シンプル | 月ごとブレークで複雑化 | 不採用 |
| 2-3 | Constants.TAX_RATES 集約 | 既存パターン・高速 | コード変更必要 | 採用 |
| 2-4 | dmCalcPl_() 内で完結 | 仕訳不要・Action 独立 | — | 採用 |
2-1 詳細:
TAX_RATES.localMinimumAnnualをデフォ 0 で定義(均等割有効化時は月割 = 年額/12 を毎月加算)。 2-2 詳細: 「YTD 累積 × 税率 − 前月計上済額」方式。Action A/B フローと独立。
3. 変更内容
3.1 勘定科目
既存の 11_mst_account に必要な科目は登録済み:
| 主科目コード | 諸表区分 | 表示区分 | 正式科目名 | 科目名 |
|---|---|---|---|---|
| 800 | PL | 法人税等 | 法人税、住民税及び事業税 | 法人税、住民税及び事業税 |
| 212 | BS | 未払税金 | 未払法人税等 | 未払法人税等 |
科目の追加・分割は不要。P/L の
auto_taxセクション内で国税・地方税を行分けして表示する。
3.2 ロジック
税率マスタの構造
002_constants.js の Constants.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.1 | YTD税額計算 | 税引前利益_YTD[m] | 変数: martPl | calcBracketTax(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.local | nationalTax, 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. 影響範囲
| # | ファイル | 関数/対象 | 変更内容 |
|---|---|---|---|
| 1 | 002_constants.js | Constants.TAX_RATES | 新規追加(DEFAULT_TAX_RATE は非推奨) |
| 2 | 603_datamart_pl.js | dmBuildPlSections_() | auto_tax 1 行 → 国税+地方税 2 行 |
| 3 | 603_datamart_pl.js | dmCalcPl_() | 国税・地方税分離 + 均等割月割対応 |
| 4 | 603_datamart_pl.js | dmBuildPlOutput_() | 新セクションフォーマット |
| 5 | 604_datamart_bs.js | dmCalcBs_() | 国税+地方税合算を 未払法人税等 に加算 |
| 6 | 602_datamart_main.js | ctx | TAX_RATE → TAX_RATES、引数変更 |
| 7 | 605_datamart_cf.js | CF 間接法 | 国税+地方税合算で支払額計算 |
| 8 | 901_test_runner.js | T4-13 | 合算検証 + 新 T4-14(国/地方行の存在確認) |
5. テスト仕様
| # | テスト内容 | 確認方法 |
|---|---|---|
| 1 | P/L に国税行・地方税行が表示される | 61_pl_monthly を目視 |
| 2 | 税引前利益 × 国税率 + 地方税率 ≒ 旧みなし法人税額 | 通期列の合算比較 |
| 3 | YTD 赤字月は所得割=0 | 62_pl_ytd の赤字月を確認 |
| 4 | B/S 未払法人税等 = 国税 + 地方税の累積 | 71_bs で確認 |
| 5 | B/S 貸借差額 = 0 | テストランナー T4-06 |
| 6 | CF 期末残高 = B/S 現預金 | テストランナー T4-08/T4-42 |
| 7 | P/L 当期純利益 = 税引前 − (国税 + 地方税) | テストランナー T4-13 |
| 8 | 均等割=0 設定で従来と同じ動作 | TAX_RATES.localMinimumAnnual=0 で確認 |