計画B/S 修正 — 73_bs_plan
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 | 現預金 |
|---|---|---|
| pYm | B/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 段階のロジック改善 (d748ed5 → 3aaa04e → c21c3dc → 1f04ef5 で確定):
mas/600_report/601_datamart_ingest.js の dmIngestPlanData_ で 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 合流ブロックの削除 |