• #accounting
  • #journal-entry
  • #trial-balance
  • #cashflow-statement
  • #vue
  • #composable
  • #vitest
開発financial-dataメモ

仕訳ベース会計データシステムの構築

CF精算表の各科目がどこから来ているのか追いにくくなってきたので、仕訳帳を起点にしたデータフローに作り直した。

やったことの全体像

  1. useAccountingData.ts composable新規作成
  2. AccountingSheet.vue で仕訳帳・試算表をUI表示
  3. AssumptionsEditor.vue を読み取り専用ビュワーに改修
  4. loan-calculator.ts の端数処理修正
  5. BS現金行の減価償却費混入バグ修正
  6. buildCfWorksheetData の netIncome をプラグ値に変更
  7. デッドコード削除、テスト25件追加

useAccountingData.ts

会計データの生成を1つのcomposableに集約した。入口は generateAllAccountingEntries で、期首残高仕訳と期中仕訳をまとめて返す。

export const generateAllAccountingEntries = (
  bsBeginBalances, loans, schedules, assets, period,
): AccountingEntries => ({
  openingEntries: generateOpeningBalanceEntries(bsBeginBalances),
  periodEntries: [
    ...generateLoanBorrowingEntries(loans, period.startDate),
    ...generateAssetAcquisitionEntries(assets, period.startDate, period.endDate),
    ...generateLoanRepaymentEntries(loans, schedules, period),
    ...generateDepreciationEntries(assets, period),
  ],
})

期首残高仕訳では、BS科目ごとに 諸口 / 科目 または 科目 / 諸口 の開始仕訳を生成する。貸方科目(長期借入金、利益剰余金)は isCredit フラグで判定。

残高試算表(computeTrialBalance)

期首残高・借方合計・貸方合計・期末残高の4列構成。各列で貸借一致をチェックする。

endBalance: begin + totals.debit - totals.credit

AccountingSheet.vue 側で列ごとの合計を算出し、一致していれば checkmark、不一致なら差額を表示する仕組みにした。

loan-calculator.ts の端数処理

元のコードは payment = Math.round(principal + interest) のように合計を丸めていた。これだと principalPart + interestPart の合計と payment に1円のズレが生じる場合がある。

修正後:

payment: roundedPrincipal + Math.round(interestPart)

個別に丸めた値の合計をpaymentにすることで、payment === principalPart + interestPart を保証した。1円ズレでも仕訳の貸借が合わなくなるので、端数処理は地味だが大事。

BS現金行の減価償却費バグ

computeBsAccounts が現金の期末残高を算出するとき、減価償却費(非現金費用)のCfLineItemも含めて集計していた。減価償却費はP/L上の費用であって現金は動かないので、cashAccountsからdepreciationを除外するように修正した。

修正前は「BS現金期末残高 != CF期末残高」になっていて、精算表のcrossCheckDiffが0にならなかった。

buildCfWorksheetData の netIncome 変更

CF精算表の当期純利益(netIncome)をBS増減から逆算するプラグ値に変更した。これにより crossCheckDiff = 0 が構造的に保証される。

利益剰余金の期首残高もプラグ値(資産合計 - 負債合計)なので、BS→PL→CFの循環参照を避けつつ整合性を保っている。

AssumptionsEditor.vue の改修

投資・財務のassumptions入力セクションを削除し、B/S期首残高をテーブル表示する読み取り専用ビュワーに変更した。投資・財務の数値は全てローン返済予定表と固定資産マスタから自動導出されるので、手入力が不要になった。

テスト

accounting-data.test.ts に25件のテストを追加した。主な検証ポイント:

  • computeAssetBeginBalance: 期前取得で償却後残高、期中取得で0
  • computeLoanBeginBalance: 期中借入で0、期前借入で直前残高
  • deriveBsBeginBalances: 貸借一致、利益剰余金がプラグ値
  • computeTrialBalance: 期首残高の貸借一致、諸口勘定の除外
  • CF精算表整合性: crossCheckDiff === 0、BS現金期末 === CF期末残高

特に「BS現金 = CF期末残高」のテストは、減価償却費バグの再発防止として入れた。

振り返り

仕訳帳を起点にしたことで、各科目の動きが追いやすくなった。以前はCfLineItemの集計結果だけ見ていたので、数字が合わないときにどこで狂ったか特定しにくかった。試算表を挟むことで「期首は合っている、期中の仕訳も合っている、でも期末が合わない」のように切り分けができる。

端数処理の1円ズレは、合計を丸めるか個別を丸めるかで結果が変わる。会計では「個別を丸めてから合計」が正しい。