• #cashflow
  • #excel
  • #vue
  • #refactoring
  • #accounting
開発financial-dataメモ

CF精算表エコシステムの大改善

2026-02-11に行ったCF精算表まわりの改善をまとめる。範囲が広いので項目ごとに要点だけ。

1. 財務三表シートにExcel計算式を組み込み

buildFinancialSheetを全面書き換えした。これまで値をベタ打ちしていた合計欄や差し引き項目に、Excelの数式(SUM, 減算式など)を入れるようにした。

Excel側で値を変えても合計が自動で追従するので、「エクスポートしたExcelを手で微調整する」ユースケースに対応できる。

2. isPLAccountバグ修正

売上原価_棚卸資産評価損棚卸資産への部分一致でBS勘定と誤判定されていた。

// Before: 部分一致でBSカテゴリに引っかかる
if (Object.values(BS_CATEGORIES).some(list => list.some(bs => acc.includes(bs)))) return false

// After: 完全一致に変更
if (Object.values(BS_CATEGORIES).some(list => list.some(bs => acc === bs))) return false

isPLAccountでBS勘定との照合を完全一致にすることで、売上原価_棚卸資産評価損のようなPL勘定がBSに引きずられなくなった。27テスト全パス。

3. CF精算表ワークシートUI改善

列幅の均等化

CF精算表は列数が多く、列幅がバラバラだと見づらかった。

  • 全列を90px固定に統一(colgroupで全列定義)
  • table-layout: fixedを適用

1列目スティッキー

勘定科目名(1列目)を横スクロール時に固定表示にした。

  • border-collapse: separateに変更(collapseだとスティッキーのborderが消える)
  • overflow: visibleに修正(hiddenだとスティッキー要素が切れる)

4. CF精算表ロジックの統一

cashflow-statement側(cf-builder.ts)とcashflow-worksheet側(useCashflowWorksheet.ts)で、同じCF精算表ロジックが微妙に分岐していた。

  • cashflow-worksheet最新版をベースにcashflow-statement側を合わせた
  • operatingPostSubtotalItemsの分割ロジックを統一
  • crossCheckDiffの計算式を修正

5. CF計算書の間接法化

CF計算書を間接法の表示形式に整えた。表示用の型としてCfDisplayItemを導入し、同名のCF項目を集約して表示する。

export interface CfDisplayItem {
  name: string
  amount: number
  items?: CfLineItem[]  // 元のCF項目(ナビゲーション用)
}

間接法の表示順序:

  1. 税引前当期純利益
  2. 減価償却費(非資金項目の加算)
  3. 営業CF小計
  4. 利息の支払額・受取額
  5. 法人税等の支払額
  6. 営業活動によるCF
  7. 投資活動によるCF
  8. 財務活動によるCF
  9. 現金の増減額 → 期末残高

6. CF計算書とCF精算表の双方向リンク

CF計算書の金額をクリックすると、CF精算表の該当行にジャンプしてハイライト表示される。逆も同様。

NavigateActionの判別共用体で遷移先を型安全に表現している:

export type NavigateAction =
  | { type: 'schedule'; loanId: string }
  | { type: 'worksheet'; highlightKey: string }
  | { type: 'statement' }
  // ...

7. B/S増減符号のリファクタリング

従来は資産・負債・純資産で増減の計算方向がバラバラだった。

  • 負債・純資産: 期首 - 期末に統一(増加がマイナス = CF流出方向と一致)
  • チェック列を「全部足してゼロになるか」の単純な足し算に簡素化

これによりrowTotalのチェックロジックが読みやすくなった。

8. 減価償却費の統合

建物と備品の減価償却費を1項目「減価償却費」に統合した。CF計算書では個別の資産区分を出す意味が薄いため、aggregateByNameで同名項目を合算する方式にした。

9. Q3-2仕訳表示バグ修正

Q3-2シートで前提仕訳(開始残高)が当期仕訳に混ざって表示されるバグがあった。

原因: isPremiseEntrykey === 'x1_period'のエントリを前提と判定していなかった。section名が●前提で始まるかどうかで分岐するロジックに修正。

const isPremiseEntry = (entry) =>
  isOpeningBalanceEntry(entry) || isIgnoredEntry(entry) || entry.section?.startsWith('●前提')

10. テーブルのtbody追加

CF精算表のテーブルに<tbody>タグが抜けていた。HTML仕様上は暗黙的に追加されるが、明示的に書くことでバリデーション警告を消した。

11. 借入金2本追加

前提条件に、みずほ銀行と三菱UFJ銀行の借入金スケジュールを追加した。財務活動CFに「借入金の返済による支出」「借入れによる収入」が複数本で表示されるようになった。

振り返り

一日でやった量としてはかなり多い。CF精算表・CF計算書・Excel出力・テストの4箇所が密結合しているので、1つ直すと芋づる式に他も直す必要が出てくる。operatingPostSubtotalItemsの分割ロジック統一とisPLAccountのバグ修正が、地味だが影響範囲の大きい修正だった。