MAS-073: 未払法人税等の適切な処理
概要
| 項目 | 内容 |
|---|---|
| 案件ID | MAS-073 |
| カテゴリ | 経費・仕訳 |
| Phase | P1 |
| 優先度 | ★★ |
| 所要時間 | 1〜2時間 |
| 対象ファイル | 600_report/602_datamart_main.js, 600_report/604_datamart_bs.js |
| 前提案件 | spec_corporate_tax.md(累進課税・国税/地方税分離: 実装済み) |
目的
みなし法人税(auto_tax による月次自動見積)から、確定申告後の正式な税金仕訳への移行を可能にする。具体的には、手動で法人税INVを計上した際にB/Sの経過勘定が「未払金」ではなく「未払法人税等」に正しく分類されるようコードを修正し、確定申告後の納付フローを既存の Action A → Action B パイプラインで処理できるようにする。
現在のコード
1. みなし法人税の自動計算(603_datamart_pl.js L133-184)
// L133-137: 手動計上チェック
} else if (sec.type === 'auto_tax') {
const taxMonthly = Array(13).fill(0);
let hasManualTax = false;
if (martPl['tax']) for (const a in martPl['tax']) if (martPl['tax'][a][0] !== 0) hasManualTax = true;
if (!hasManualTax) {
// ... 累進課税ブラケットに基づくYTD差分方式で月次税額を自動計算
}
sectionTotalsPl[sec.id] = taxMonthly;
}
ポイント: hasManualTax=true(42_trn_journal に法人税科目の手動仕訳が存在)の場合、auto_tax_national / auto_tax_local は全月ゼロになる。→ この仕組み自体は正しく動作する。
2. B/S 未払法人税等の自動計上(604_datamart_bs.js L44-49)
// 法人税等(国税+地方税)をB/S未払法人税等(流動負債)に自動計上
var autoTaxNat = sectionTotalsPl['auto_tax_national'] || Array(13).fill(0);
var autoTaxLoc = sectionTotalsPl['auto_tax_local'] || Array(13).fill(0);
if (!martBs['liab_cl']['未払法人税等']) martBs['liab_cl']['未払法人税等'] = Array(13).fill(0);
for (var ti = 1; ti <= 12; ti++) martBs['liab_cl']['未払法人税等'][ti] += autoTaxNat[ti] + autoTaxLoc[ti];
問題: hasManualTax=true の場合、autoTaxNat / autoTaxLoc はゼロ → B/S に未払法人税等が計上されない。
3. 期ずれの経過勘定マッピング(602_datamart_main.js L94-101)
// L94-101: 実績INVの期ずれ処理
if (pYm !== sYm && !acc.includes('減価償却') && (!isBs || secIdBs === 'asset_nca')) {
if (isActual) {
const isSalesActual = (!isBs && (secIdPl === 'sales' || secIdPl === 'non_op_inc' || secIdPl === 'ext_inc'));
const lagAccId = isSalesActual ? 'asset_ca' : 'liab_cl';
const lagAccName = isSalesActual ? '売掛金' : dmIsAccruedExpense_(acc) ? '未払費用' : '未払金';
// ★ 問題箇所: 法人税もここに来るが「未払金」に分類される
核心的問題: 手動で法人税INVを計上し期ずれがある場合(P/L計上日と決済日が異なる月)、B/S上の経過勘定が「未払金」に分類される。正しくは「未払法人税等」(科目コード 212)であるべき。
現在のデータフロー(手動法人税INVの場合)
手動INV (科目=法人税、住民税及び事業税)
├─ P/L: martPl['tax']['法人税、住民税及び事業税'] に計上 ✅
├─ hasManualTax=true → auto_tax スキップ ✅
├─ B/S auto_tax → 0 (未払法人税等に計上されない) ❌
└─ 期ずれ → B/S '未払金' に分類 ❌ (→ '未払法人税等' であるべき)
修正方針
Step 1: 期ずれの経過勘定マッピング修正(602_datamart_main.js)
processEvent 内の期ずれ経過勘定マッピング(L101)に、P/L 'tax' セクションの判定を追加する。
修正前(L101):
const lagAccName = isSalesActual ? '売掛金' : dmIsAccruedExpense_(acc) ? '未払費用' : '未払金';
修正後:
const lagAccName = isSalesActual ? '売掛金'
: secIdPl === 'tax' ? '未払法人税等'
: dmIsAccruedExpense_(acc) ? '未払費用' : '未払金';
Step 2: B/S 未払法人税等の計上ロジック拡張(604_datamart_bs.js)
dmCalcBs_ の auto_tax ブロック(L44-49)を拡張し、hasManualTax=true の場合は P/L tax セクション合計を使って未払法人税等を計上する。
修正後(L44-49 を置換):
// 法人税等のB/S未払法人税等(流動負債)計上
// (A) auto_tax(みなし法人税)の計上
var autoTaxNat = sectionTotalsPl['auto_tax_national'] || Array(13).fill(0);
var autoTaxLoc = sectionTotalsPl['auto_tax_local'] || Array(13).fill(0);
if (!martBs['liab_cl']['未払法人税等']) martBs['liab_cl']['未払法人税等'] = Array(13).fill(0);
for (var ti = 1; ti <= 12; ti++) martBs['liab_cl']['未払法人税等'][ti] += autoTaxNat[ti] + autoTaxLoc[ti];
// (B) 手動計上された法人税があり、かつ期ずれなし(pYm=sYm)の場合の補完
// 期ずれありの場合は Step 1 で '未払法人税等' にマッピング済み。
// 期ずれなし(同月決済)の場合は cashPlug で処理されるため追加計上不要。
設計判断: 期ずれなし(P/L計上月 = 決済月)の手動法人税INVは、cashPlug(現預金の逆算)で自動的にバランスされるため、B/S 側の追加処理は不要。期ずれあり(決算月に計上・翌期に納付)の場合のみ Step 1 の修正で「未払法人税等」が正しく計上される。
確定申告後の納付フロー(運用手順)
フロー全体像
① 決算: auto_tax が月次みなし法人税を見積(現行動作)
↓
② 確定申告: 正式な税額が確定
↓
③ 手動INV作成: 32_wrk_invoice に法人税INVを登録
↓
④ Action A: INV → 42_trn_journal に自動仕訳(hasManualTax=true で auto_tax 停止)
↓
⑤ 納付: 銀行で法人税を納付
↓
⑥ STL登録: 33_wrk_bank に決済レコードを登録
↓
⑦ Action B: STL → INV消込 → 未払法人税等が解消
③ 手動INV作成の入力ガイド
| 列名 | 入力値 | 備考 |
|---|---|---|
| 科目名 | 法人税、住民税及び事業税 | 科目マスタ(11_mst_account)に登録済み(コード 800) |
| 収支区分 | 支出 | |
| 申請種別 | 請求書受領(AP) | デフォルト値 |
| 取引先名 | 税務署 / 都道府県税事務所 | 国税・地方税で分けるのが望ましい |
| 発生日(P/L計上日) | 決算月末日(例: 2026-07-31) | 期末に費用計上 |
| 決済日_計画 | 納付期限日(例: 2026-09-30) | 確定申告期限=決算日から2ヶ月以内 |
| 税区分 | 対象外 | 法人税に消費税は課されない |
| 税抜金額_実績 | 確定税額 | |
| 消費税額_実績 | 0 | |
| 税込金額_実績 | 確定税額 | 税抜=税込 |
| 決済手段 | 銀行振込 | 口座振替でも可 |
| 摘要 | 第1期 法人税(国税)/ 第1期 法人住民税・事業税(地方税) |
推奨: 国税と地方税で 2行 に分けてINVを作成する。理由:
- 納付先が異なる(税務署 vs 都道府県税事務所)
- 納付タイミングが異なる場合がある
- 内訳の追跡が容易
hasManualTax の挙動
| 状態 | auto_tax | B/S 未払法人税等 |
|---|---|---|
| 手動INVなし(通常) | 月次自動見積 | auto_tax 合計を累積 |
| 手動INVあり(確定申告後) | 全月ゼロ | 期ずれ経由で手動INV金額を計上 |
注意:
hasManualTaxは年間を通じて全月に影響する(all-or-nothing)。手動INVを1件でも作成すると、全月の auto_tax が停止する。月次P/Lでは法人税が手動INVの計上月にのみ集中する形になるが、通期では正しい合計になる。
影響範囲
| ファイル | 変更箇所 | 変更量 |
|---|---|---|
600_report/602_datamart_main.js | processEvent 内 L101 の経過勘定マッピング | 1行修正 |
600_report/604_datamart_bs.js | dmCalcBs_ L44-49 にコメント追記 | コメント追加のみ |
- 既存ロジックへの影響:
processEventの期ずれ処理に1条件を追加するだけ。secIdPl === 'tax'に該当するのは「法人税等」表示区分の科目のみで、通常の経費INVには影響しない - P/L: 変更なし(hasManualTax の動作は既存通り)
- B/S: 手動法人税INVの期ずれが「未払金」→「未払法人税等」に正しく分類される
- C/F: 変更なし(
sectionTotalsPl['tax']+auto_taxの合算で正しく動作)
注意事項
hasManualTaxは通期の合計値(martPl['tax'][a][0] !== 0)でチェックされるため、1件でも手動法人税INVがあると全月の auto_tax が停止する。将来的に月次精度が必要な場合は、月別の切替ロジックへの拡張を検討(本案件のスコープ外)- 手動INVの科目名は
法人税、住民税及び事業税の完全一致が必要(科目マスタ 11_mst_account にコード 800 として登録済み) - 法人税は消費税対象外のため、税区分は「対象外」、消費税額は 0 とする
- 中間納付(予定納税)がある場合は、各納付時点で別INVとして計上する。中間納付のINVも hasManualTax をトリガーするため、中間納付を入力するタイミングには注意が必要
dmIsAccruedExpense_は法人税に対して false を返すため、修正前は「未払金」に分類される。修正後はsecIdPl === 'tax'の判定が先に評価され「未払法人税等」に分類される
エッジケース
| 条件 | 動作 | 理由 |
|---|---|---|
| 手動INV金額 = 0 | auto_tax が動作 | martPl['tax'][a][0] !== 0 のチェックで 0 は false |
| 手動INVの期ずれなし(pYm = sYm) | B/S 未払法人税等に計上されない | 同月決済は cashPlug で処理。未払法人税等は発生しない(即納付) |
| 年度途中で手動INVを追加 | 全月の auto_tax が停止 | hasManualTax は通期チェック。月次P/Lは手動INV計上月に集中 |
| auto_tax 動作中に「法人税等」グループの手動INVが存在 | auto_tax 停止 + 手動金額が P/L に計上 | 二重計上は発生しない(hasManualTax で排他制御) |
| 赤字決算(確定税額 = 均等割のみ) | 均等割分のINVを手動作成 | auto_tax 停止。国税は 0 円INV不要、地方税の均等割のみINV作成 |
| 科目マスタに「未払法人税等」が未登録 | processEvent で例外スロー | 科目マスタにコード 212 として登録済みのため通常は発生しない |
実データ検証(MCP でのデータ確認が必要な場合)
| 確認項目 | 確認方法 | 期待値 |
|---|---|---|
| 11_mst_account に「法人税、住民税及び事業税」が存在するか | MCP: get_sheet_data(11_mst_account) | コード 800, 諸表区分=PL, 表示区分=法人税等 |
| 11_mst_account に「未払法人税等」が存在するか | MCP: get_sheet_data(11_mst_account) | コード 212, 諸表区分=BS, 表示区分=未払税金 |
| 現在の auto_tax 出力を確認 | MCP: get_sheet_data(61_pl_monthly) | 国税行・地方税行が存在し、通期列に非ゼロ値 |
| B/S 未払法人税等の現在値 | MCP: get_sheet_data(71_bs) | auto_tax 合計と一致 |
関連ドキュメント
| 仕様書 | 関連箇所 |
|---|---|
| spec_corporate_tax.md | 累進課税ブラケット・auto_tax の設計判断 |
| CLAUDE.md | 会計ロジック: 科目マスタ未登録の禁止、期ずれ処理ルール |
| mst_account.md | 科目コード 212(未払法人税等)、800(法人税、住民税及び事業税) |
人間が検討すべき事項
- 税理士との確認: 納付タイミング・仕訳パターン(国税と地方税の分割粒度、中間納付の要否)を税理士と確認する(TODO_future.md 記載事項)
- 中間納付の運用: 中間納付(予定納税)が発生する場合、hasManualTax の全月停止を許容するか、中間納付は別の仕組みで管理するかを決定する必要がある
- 月次P/Lの見え方: 手動INV計上後は全月の auto_tax が停止し、法人税が計上月に集中する。管理会計としてこれを許容するか、月次按分の仕組みが必要かを判断する
実装プロンプト(Claude Code 用)
あなたはGAS会計システム(bizlp-gas-accounting)のシニア開発者です。
案件 MAS-073「未払法人税等の適切な処理」を実装してください。
## 実行前タスク
以下のファイルを読み込んでください:
1. `600_report/602_datamart_main.js` — `processEvent` 関数(L40-137)。特にL94-101の期ずれ経過勘定マッピングを確認
2. `600_report/603_datamart_pl.js` — `dmCalcPl_` 関数(L115-189)。L133-137の `hasManualTax` チェックを確認
3. `600_report/604_datamart_bs.js` — `dmCalcBs_` 関数(L38-49)。auto_tax の B/S 計上ロジックを確認
4. `CLAUDE.md` — コーディング規約・会計ロジックルール
5. `docs/dev/dev_mas-073_corporate_tax_formal.md` — 本仕様書
## 修正対象ファイル
`600_report/602_datamart_main.js` のみ。
## 実装内容
### A: 期ずれ経過勘定マッピングの修正(L101)
`processEvent` 内の期ずれ経過勘定名(lagAccName)の決定ロジックに、P/L 'tax' セクションの判定を追加する。
**修正前(L101):**
```js
const lagAccName = isSalesActual ? '売掛金' : dmIsAccruedExpense_(acc) ? '未払費用' : '未払金';
```
**修正後:**
```js
const lagAccName = isSalesActual ? '売掛金'
: secIdPl === 'tax' ? '未払法人税等'
: dmIsAccruedExpense_(acc) ? '未払費用' : '未払金';
```
これにより、法人税科目(P/L section = 'tax')のINVに期ずれがある場合、B/Sの経過勘定が「未払金」ではなく「未払法人税等」に正しく分類される。
## 制約
- `processEvent` の期ずれ処理(L94-134)の構造を変更しない(条件分岐の追加のみ)
- `604_datamart_bs.js` の auto_tax ブロック(L44-49)は変更しない
- `603_datamart_pl.js` の hasManualTax ロジック(L133-137)は変更しない
- 他ファイルの変更は行わない
## 動作確認
`npm run push:dev` 後:
1. 現在の状態でマート更新を実行し、71_bs の「未払法人税等」行に auto_tax 由来の値が表示されることを確認(既存動作の維持)
2. 32_wrk_invoice に以下のテスト用INVを追加:
- 科目名: 法人税、住民税及び事業税
- 発生日: 決算月末(例: 2026-07-31)
- 決済日_計画: 納付期限(例: 2026-09-30)
- 税込金額_実績: 任意の金額(例: 100000)
- 請求ステータス: 承認済
3. Action A を実行 → 42_trn_journal に仕訳が作成されることを確認
4. マート更新を再実行し、以下を確認:
- 61_pl_monthly: auto_tax行が0になり、「法人税等」グループに手動金額が表示される
- 71_bs: 「未払法人税等」行に手動INVの金額が表示される(「未払金」ではない)
- B/S貸借差額 = 0(テストランナー T4-06 で検証)
5. テスト用INVを削除し、元の状態に戻す
### 拡張思考の使用状況
| フェーズ | 拡張思考 | 備考 |
|---------|:--------:|------|
| 期ずれマッピング修正 | なし | 1行の条件追加のみ |
推奨実行モデル
| 工程 | 推奨モデル | 理由 |
|---|---|---|
| 仕様書作成(本ドキュメント) | Claude Opus 4.6 | 会計ロジック(期ずれ・cashPlug・hasManualTax)の相互作用の分析 |
| 実装 | Claude Haiku 4.5 | 1行の条件追加のみ。仕様書でコードが完全定義済み |
| 動作確認 | 人間 | 実データでの検証。テスト用INV作成→マート更新→B/S確認の手動操作が必要 |
変更履歴
| 日付 | 変更内容 |
|---|---|
| 2026-04-16 | 初版作成。期ずれ経過勘定マッピング修正 + 確定申告後の納付フロー設計 |