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項目(ナビゲーション用)
}
間接法の表示順序:
- 税引前当期純利益
- 減価償却費(非資金項目の加算)
- 営業CF小計
- 利息の支払額・受取額
- 法人税等の支払額
- 営業活動によるCF
- 投資活動によるCF
- 財務活動によるCF
- 現金の増減額 → 期末残高
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シートで前提仕訳(開始残高)が当期仕訳に混ざって表示されるバグがあった。
原因: isPremiseEntryがkey === '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のバグ修正が、地味だが影響範囲の大きい修正だった。