1. 概要

焦点質問: 73タブの計画B/Sにどのようなバグがあり、どう修正するか?

背景・課題

32タブの全INVを無差別に読み込む dmIngestPlanData_ のフィルター不足、および実績消込STLデータの二重計上により、計画B/Sに不正なデータが混入している。本改修では実績PHASE 1と同等のフィルターを計画側にも適用し、fromSTL合流を削除することで計画B/Sの正確性を確保する。

2. 設計判断

選択肢メリットデメリット選定
dmIngestPlanData_ に実績同等フィルターを追加実績と計画でデータ取込ルールが統一される追加の列読み取り(決済手段)が必要
fromSTL 合流を維持し重複排除ロジックを追加実績STLデータを明示的に反映できる予算側の期ずれ処理と機能が重複し複雑化する
fromSTL 合流を削除予算側期ずれ処理で売掛金の計上+解消が自動生成されるため不要。シンプル化実績STLデータの明示的な反映がなくなる

3. 変更内容

3.1 問題一覧

問題1: dmIngestPlanData_ のフィルター不足

32タブの全INVを無差別に読み込んでいるため、計画に入るべきでないデータが混入する。

INVの種類実績(PHASE 1)計画(現状)計画(あるべき姿)
P/L科目 + 承認済/決済完了✓ 計上✓ 計上✓ 計上
P/L科目 + 未処理✗ スキップ✓ 計上✓ 計上(計画として必要)
仕訳振替✗ スキップ✓ 計上✗ スキップ(STL消込まで発生しない)
B/S科目 + 資産計上✓ 計上✓ 計上✓ 計上
B/S科目 + 非資産計上✗ スキップ✓ 計上✗ スキップ(STL消込経由でのみ計上)

問題2: fromSTL データの二重計上

実績の消込済STLデータ(fromSTL=true, booked=true)を計画に合流させているが、 同じINVが dmIngestPlanData_ でも booked=false として既に計上されている。

例: INV_0201(決済完了、消込済STL有り)

  • dmIngestPlanData_ → 売上高 +1,435,500(booked:false → 予算側期ずれで売掛金計上+解消)
  • fromSTL → 売掛金 -1,435,500(booked:true → 実績側でB/S直接計上)

結果: 売掛金が二重に解消される

問題3: みなし法人税のB/S計上

実績B/S(71)で追加した未払法人税等の自動計上は、計画B/S(73)でも同じ dmCalcBs_ を使うため自動的に適用される。これは正しい動作。

→ 修正不要

3.2 修正箇所

修正A: dmIngestPlanData_ にフィルター追加(601_datamart_ingest.js)

読み取り列の追加:
  - idxPay(決済手段)
  
フィルター追加:
  - 仕訳振替 → continue
  - B/S科目 + 決済手段≠資産計上 → continue

修正B: fromSTL 合流の削除(602_datamart_main.js)

// 削除: 以下のブロック
for (var pi = 0; pi < ctx.finalUnionData.length; pi++) {
  var row = ctx.finalUnionData[pi];
  if (row.fromSTL) planData.push(row);
}

4. 影響範囲

4.1 P/L科目 + 期ずれありの売上INV

P/L売掛金現預金(cashPlug)
pYm(発生月)売上高 +amt+amt(計上)変動なし
sYm(入金月)-amt(解消)+amt

4.2 P/L科目 + 期ずれありの費用INV

P/L未払金現預金(cashPlug)
pYm(発生月)費用 +amt+amt(計上)変動なし
sYm(支払月)-amt(解消)-amt

4.3 B/S科目 + 資産計上(CAPEX初回)

B/S現預金
pYmB/S直接計上cashPlugで反映

5. テスト仕様

テストIDテスト名前提条件期待結果
T1売掛金の入金解消マート更新を実行し73タブを確認売掛金が入金予定月で解消されること
T2未払金の支払解消同上未払金が支払予定月で解消されること
T3現預金の妥当性同上現預金がマイナスにならないこと(合理的な範囲で)
T4仕訳振替INVの除外同上仕訳振替INV(預り金等)がB/Sに表示されないこと
T5貸借一致同上貸借差額が常に0であること
T6 (PR #460)計画 B/S と実績 B/S の現預金乖離 ±50K 以内71_bs と 73_bs_plan を月次比較現預金差分が ±50K 以内 (地代家賃前払等の表示差を許容)
T7 (PR #460)決済日_実績 起点の期ずれ計算INV の 決済日_実績 を記入 → マート更新73 計画 B/S で実績 PHASE 2 と同月で期ずれ解消・未消込 INV は cash plug として正しく現預金マイナス・未払金プラスに反映

5.1 期ずれ計算ロジック (PR #460・案 A 改 2 で確定)

問題の経緯: 当初実装は「計画 = 全 INV 即決済前提」の単純化で 決済日_計画 のみを使っていたが、73_bs_plan の現預金が実績 71_bs と乖離 (2026-02 で約 -605K)。未払系負債が計画 B/S に積み上がらず現預金がマイナス側に振れる構造的バグが発覚 (詳細は failure_patterns.md #34 + BUG_tracking.md MAS-300)。

3 段階のロジック改善 (d748ed53aaa04ec21c3dc1f04ef5 で確定):

mas/600_report/601_datamart_ingest.jsdmIngestPlanData_ で INV の 決済日_実績 列を期ずれ解消月の判定起点とする (案 A 改 2):

条件sStr (期ずれ解消月)意図
決済日_実績 記入済settleActStr (実績 PHASE 2 と同月)実績 PHASE 2 と整合させる (二重計上防止 + 一貫性)
決済日_実績 空 + 決済日_計画 ≤ 当月'9999-12' (未消込のまま残す)未消込 INV を cash plug として B/S に滞留させる (実績の未払金/未収金と同等の効果)
それ以外決済日_計画 をそのまま通常の計画通り決済予定月で解消

残乖離 ±30K: 地代家賃の前払 INV 表示差で許容 (71 では「未払費用 -30K」・73 計画では「前払費用 +30K」となるが cash plug 効果は同値)。

設計原則: 計画 B/S 生成時は実績側の決済日 (決済日_実績) を SSoT として優先し、計画日 (決済日_計画) は補助情報として扱う。実績 PHASE 2 と PHASE 1 (計画) で同じ期ずれ解消月を使うことで、実績→計画の連続性を保証。

付録

付録A: 改修ファイル一覧

ファイル修正内容
601_datamart_ingest.js修正A: dmIngestPlanData_ にフィルター追加
602_datamart_main.js修正B: fromSTL 合流ブロックの削除