MAS-073: 未払法人税等の適切な処理
概要
| 項目 | 内容 |
|---|---|
| 案件ID | MAS-073 |
| カテゴリ | 経費・仕訳 |
| Phase | P1 |
| 優先度 | ★★ |
| 所要時間 | 2-3時間(コード変更)+ 税理士確認 |
| 対象ファイル | 604_datamart_bs.js, 601_datamart_ingest.js, 602_datamart_main.js, 901_test_runner.js |
| 前提案件 | なし(既存の auto_tax 機構が前提として稼働中) |
目的
みなし法人税(auto_tax)から確定申告後の正式な税金仕訳への移行をサポートする。現在の hasManualTax トグルは P/L 側のみ対応済みだが、B/S 側(未払法人税等の計上・消込)に未対応箇所があるため、手動法人税 INV → 決済(STL)の一連のフローで B/S が正しく表示されるようコードを修正する。
現在のコード
1. P/L: みなし法人税の自動計算と手動スキップ
603_datamart_pl.js L133-139:
} 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) {
// ... 累進課税ブラケットによる自動計算 (L140-183)
}
sectionTotalsPl[sec.id] = taxMonthly;
}
動作: martPl['tax'] に手動計上された法人税科目(通期合計 ≠ 0)があれば、auto_tax_national / auto_tax_local を全ゼロにする。P/L 側はこれで正しく切り替わる。
2. B/S: auto_tax → 未払法人税等への自動計上
604_datamart_bs.js L44-49:
// 法人税等(国税+地方税)をB/S未払法人税等(流動負債)に自動計上 → cashPlug中立化
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 未払法人税等にゼロが加算される。手動法人税の P/L 計上額が B/S 負債に反映されない。
3. STL消込時の期ずれ解消科目
601_datamart_ingest.js L186-187:
var lagResolveAcc = (invShushi === '収入') ? '売掛金'
: dmIsAccruedExpense_(invAccForLag) ? '未払費用' : '未払金';
問題: 法人税INVの期ずれ解消時、lagResolveAcc が「未払金」になる。正しくは「未払法人税等」であるべき。B/S の期ずれ計上(604)と消込(601 PHASE 2)で科目が不一致になり、B/S の内訳が歪む。
4. C/F: 法人税等の支払額
605_datamart_cf.js L24:
const taxOnly = Array(13).fill(0);
for(let i=1; i<=12; i++) {
var atNat = (sectionTotalsPl['auto_tax_national'] || Array(13).fill(0))[i];
var atLoc = (sectionTotalsPl['auto_tax_local'] || Array(13).fill(0))[i];
taxOnly[i] = -(sectionTotalsPl['tax'][i] + atNat + atLoc);
}
現状OK: sectionTotalsPl['tax'](手動)と auto_tax_*(自動)を合算しているため、どちらのモードでも C/F は正しく動作する。変更不要。
修正方針
Step 1: B/S 未払法人税等への手動法人税反映
604_datamart_bs.js L44-49 を修正し、sectionTotalsPl['tax'](手動計上分)も B/S 未払法人税等に加算する。
// 法人税等(国税+地方税)をB/S未払法人税等(流動負債)に自動計上 → cashPlug中立化
// S-01: 手動計上された法人税等(税グループ)も同科目に計上
var autoTaxNat = sectionTotalsPl['auto_tax_national'] || Array(13).fill(0);
var autoTaxLoc = sectionTotalsPl['auto_tax_local'] || Array(13).fill(0);
var manualTax = sectionTotalsPl['tax'] || 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] + manualTax[ti];
安全性: hasManualTax=false 時は sectionTotalsPl['tax'] が全ゼロのため既存動作に影響なし。hasManualTax=true 時は auto_tax_* が全ゼロのため手動分のみ加算される。
Step 2: 期ずれ解消科目の法人税対応
2-a: dmIsTaxExpense_() 関数の追加
602_datamart_main.js の dmIsAccruedExpense_() の直後に追加:
/**
* 科目名が「法人税等」に該当するか判定する
* 期ずれ解消時の B/S 科目を「未払法人税等」にルーティングするために使用
* @param {string} accName - 科目名
* @returns {boolean}
*/
function dmIsTaxExpense_(accName) {
if (!accName) return false;
var keywords = ['法人税', '住民税及び事業税'];
for (var i = 0; i < keywords.length; i++) {
if (accName.indexOf(keywords[i]) !== -1) return true;
}
return false;
}
2-b: lagResolveAcc の修正
601_datamart_ingest.js L186-187:
// Before
var lagResolveAcc = (invShushi === '収入') ? '売掛金'
: dmIsAccruedExpense_(invAccForLag) ? '未払費用' : '未払金';
// After (S-01: 法人税等の期ずれは未払法人税等で解消)
var lagResolveAcc = (invShushi === '収入') ? '売掛金'
: dmIsTaxExpense_(invAccForLag) ? '未払法人税等'
: dmIsAccruedExpense_(invAccForLag) ? '未払費用' : '未払金';
Step 3: テストランナー更新(任意)
901_test_runner.js の T4-50(B/S繰越利益 = 期首+P/L当期純利益)は既に法人税等のタイミング差を許容コメント付きで検証しているため、手動法人税時も既存テストでカバーされる。追加テストは手動法人税INVが実際に作成された後に検討。
影響範囲
| ファイル | 変更量 | 内容 |
|---|---|---|
604_datamart_bs.js | 2行追加 | sectionTotalsPl['tax'] を未払法人税等に加算 |
602_datamart_main.js | 10行追加 | dmIsTaxExpense_() 関数新設 |
601_datamart_ingest.js | 1行修正 | lagResolveAcc に法人税判定を挿入 |
- 既存動作への影響: 手動法人税INVが存在しない限り
sectionTotalsPl['tax']は全ゼロのため、現在の auto_tax 動作に一切影響なし - 財務諸表への影響: 手動法人税切替後、B/S の「未払法人税等」に正しい金額が表示される(現状は cashPlug に吸収され、現預金の逆算精度に影響)
注意事項
- hasManualTax の判定条件: 現在は
martPl['tax'][a][0] !== 0(通期合計が非ゼロ)で判定。1件でも手動法人税INVがあれば auto_tax が全月スキップされる。部分的な切替(途中月まで auto、以降 manual)は非対応 - 科目マスタの整合性: 手動法人税INVの科目名は
11_mst_accountに登録済みの法人税、住民税及び事業税(主科目コード800、表示区分「法人税等」)を使用すること。未登録の科目名を使うとデータマートがエラーになる - dmIsTaxExpense_ のキーワード:
法人税を含む科目名を広くマッチさせる。将来「法人事業税」等の細分科目を追加した場合も自動的に対象になる - 中間納付・予定納税: 本仕様では期末一括計上を想定。中間納付が必要な場合は、中間申告月に別のINVを追加して対応可能(追加コード変更不要)
- 消費税: 消費税の未払計上は別案件(MAS-089)。本案件では法人税・住民税・事業税のみ対象
実データ検証(MCP でのデータ確認が必要な場合)
| 確認項目 | 目的 |
|---|---|
11_mst_account で「法人税」を含む科目一覧 | 科目マスタの実データとDDL定義の一致確認。表示区分が「法人税等」であること |
11_mst_account で「未払法人税等」科目の存在 | B/S科目として存在し、大分類が「流動負債」であること |
32_wrk_invoice に既存の法人税関連INVがないか | hasManualTax が意図せず true になっていないことの確認 |
関連ドキュメント
| 仕様書 | 関連箇所 |
|---|---|
| spec_corporate_tax.md | 法人税等の自動計算・計上(auto_tax 機構の設計書) |
| spec_pl.md | §5.5 みなし法人税の計算、手動法人税ありでスキップ |
| spec_bs.md | B/S 未払法人税等への自動計上 |
| CLAUDE.md | 未決済残高は請求総額から再計算 / 科目マスタ未登録はエラー |
| spec_datamart_ingest.md | INV+STL→マートの取込フロー |
人間が検討すべき事項
- 税理士との確認(必須): 納付タイミング・仕訳パターンの確認
- 確定申告後の法人税・住民税・事業税の仕訳パターン(一括 or 内訳分離)
- 納付期限(事業年度終了後2ヶ月以内が原則、延長申請の有無)
- 中間納付・予定納税の要否(設立初年度は不要、2期目以降は前期実績ベース)
- 手動INVの作成タイミング: 確定申告書の完成後に26_bud_adhocに法人税INVを入力するフロー。税理士から確定税額を受領するタイミングに依存
- 科目の粒度: 現在の
法人税、住民税及び事業税(1科目一括)で十分か、国税・地方税を分離すべきか。分離する場合は科目マスタへの追加が必要 - 設立初年度の扱い: 2025年11月設立、初年度は2025年11月〜2026年7月の9ヶ月。均等割の月割計算は auto_tax で対応済みだが、確定申告時の金額との整合性確認が必要
実装プロンプト(Claude Code 用)
あなたはGAS会計システム(bizlp-gas-accounting)のシニア開発者です。
案件 MAS-073「未払法人税等の適切な処理」を実装してください。
## 実行前タスク
以下のファイルを読み込み、現在の実装を正確に把握してください。
1. `604_datamart_bs.js` — L44-49: auto_tax → B/S 未払法人税等の自動計上ブロック
2. `601_datamart_ingest.js` — L178-196: P/L科目INVの期ずれ解消ロジック(lagResolveAcc の決定)
3. `602_datamart_main.js` — L14-22: `dmIsAccruedExpense_()` 関数(新関数の配置場所の確認)
4. `603_datamart_pl.js` — L133-139: hasManualTax トグルの動作確認
5. `CLAUDE.md` — コーディング規約(科目マスタ未登録エラー、ヘッダー名ベースの列参照)
## 修正対象ファイル
- `604_datamart_bs.js` — L44-49 の修正
- `602_datamart_main.js` — `dmIsAccruedExpense_()` の直後に `dmIsTaxExpense_()` を追加
- `601_datamart_ingest.js` — L186-187 の `lagResolveAcc` 判定を修正
## 実装内容
### A: B/S 未払法人税等への手動法人税反映 (604_datamart_bs.js)
L44-49 の auto_tax 加算ブロックに `sectionTotalsPl['tax']`(手動計上分)を加算:
```js
var autoTaxNat = sectionTotalsPl['auto_tax_national'] || Array(13).fill(0);
var autoTaxLoc = sectionTotalsPl['auto_tax_local'] || Array(13).fill(0);
var manualTax = sectionTotalsPl['tax'] || 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] + manualTax[ti];
```
### B: dmIsTaxExpense_() 関数の追加 (602_datamart_main.js)
`dmIsAccruedExpense_()` の直後(L22の後)に追加:
```js
function dmIsTaxExpense_(accName) {
if (!accName) return false;
var keywords = ['法人税', '住民税及び事業税'];
for (var i = 0; i < keywords.length; i++) {
if (accName.indexOf(keywords[i]) !== -1) return true;
}
return false;
}
```
### C: lagResolveAcc の修正 (601_datamart_ingest.js)
L186-187 の lagResolveAcc 判定に法人税チェックを挿入:
```js
var lagResolveAcc = (invShushi === '収入') ? '売掛金'
: dmIsTaxExpense_(invAccForLag) ? '未払法人税等'
: dmIsAccruedExpense_(invAccForLag) ? '未払費用' : '未払金';
```
## 制約
- `603_datamart_pl.js` の hasManualTax ロジック(L133-139)は変更しない
- `605_datamart_cf.js` は変更しない(既に手動・自動両方を合算している)
- `000_infra/002_constants.js` の TAX_RATES は変更しない
- 科目マスタ(11_mst_account)への追加は本案件のスコープ外
## 動作確認
`npm run push:dev` 後:
1. 現在の auto_tax 動作に影響がないことを確認:
- マート更新を実行
- P/L: 🤖 法人税等・国税/地方税が従来通り表示されること
- B/S: 未払法人税等が従来通り表示されること
- テストランナー: T4-06(B/S貸借差額=0)、T4-08/T4-42(CF期末残高=B/S現預金)がPASS
2. 手動法人税INVの動作確認(任意、26_bud_adhocにテストINVを作成する場合):
- 科目: 法人税、住民税及び事業税 / 金額: テスト額 / 発生日: 期末月 / 決済日: 2ヶ月後
- Adhoc RPA → Action A → マート更新
- P/L: 🤖 auto_tax がゼロになり、手動法人税が「法人税等」セクションに表示されること
- B/S: 未払法人税等に手動法人税額が反映されること
### 拡張思考の使用状況
| フェーズ | 拡張思考 | 備考 |
|---------|:--------:|------|
| ファイル読み込み・構造理解 | なし | 仕様書でコード箇所が特定済み |
| 604 B/S修正 | なし | 1変数追加+ループ内に1項追加 |
| 602 関数追加 | なし | dmIsAccruedExpense_ のパターン踏襲 |
| 601 lagResolveAcc修正 | なし | 条件分岐に1行挿入 |
推奨実行モデル
| 工程 | 推奨モデル | 理由 |
|---|---|---|
| 仕様書作成(本ドキュメント) | Claude Opus 4.6 | auto_tax↔手動法人税の切替メカニズム、B/S期ずれ解消の科目ルーティング分析に高い推論力が必要 |
| 実装 | Claude Haiku 4.5 | 仕様書でコードが完全定義済み。3ファイルへの機械的な追加・修正のみ |
| 動作確認 | ユーザー手動 | マート更新 → P/L・B/S・テストランナーの目視確認 |
変更履歴
| 日付 | 変更内容 |
|---|---|
| 2026-04-16 | 初版作成 |