現金や預金の帳簿残高が実際の手許現金・通帳残高と合っているかを確認したい。そのための土台として、資産・負債・資本の残高を集計する機能を追加した。
損益集計とは別のcalculatorに分ける
今までのFiscalYearSummaryCalculatorは売上・経費(損益)の集計はできても、残高は返さなかった。損益集計と残高集計は役割が違うので、既存のcalculatorに機能を足すのではなく、FiscalYearBalanceCalculatorという別のサービスとして分離する。
やることは「帳簿上の残高を返す」ことだけに絞る。実際の手許現金や通帳残高との突合(差分計算)はこのcalculatorの仕事にしない。実残高がどこから来るか(手入力、銀行明細取込など)はUIレイヤーの責務として切り離す。
対象は実績のみ
is_planned=falseかつis_active=trueの取引だけを見る。予定取引を含めた残高(資金繰り予測)は「いつ時点の残高か」という基準日の概念が必要になるので、今回は扱わない。
集計対象はfiscal_year基準
集計対象はfiscal_year_id基準にした。日付の期間条件では絞らない。損益集計(FiscalYearSummaryCalculator)がwhereBelongsTo($fiscalYear)で絞っているのと同じ基準に揃えることで、両者の対象範囲がズレないようにする。
金額はgross基準
金額はnetではなくgross(net + tax)で集計する。TransactionRegistrarの貸借一致チェックがそもそも税込ベースで成立しているので、netだけで集計すると、税額が片方の仕訳行にしか乗っていない取引で残高が実際のお金の動きと合わなくなる。
残高の符号はtypeごとの自然な向きで正規化
残高の符号は勘定科目のtypeごとの「自然な向き」で正規化する。assetは借方を正、liability/equityは貸方を正。科目名(「現金」など)による特別扱いは一切せず、typeだけで正方向を決める。
ここで割り切ったのが「事業主貸」の扱い。事業主貸のtypeはequityなので貸方が正の向きだが、実務上は借方残高が普通(家事用に引き出したお金は借方に積み上がる)。だから貸方正の正規化ではほぼ常にマイナスの値で返ってくる。これは異常値ではなく期待どおりの状態として、calculator側では補正しない。表示側で絶対値にするか借方側に置くかは、UIレイヤーの仕事にする。
この割り切りのおかげで、equityのtotal_balanceは「元入金 + 事業主借 − 事業主貸」を単純合計するだけで正しい正味資本になる。科目ごとに正方向のメタデータを個別に持たせずに済んでいる。
返り値の形
返り値は資産・負債・資本の3分類を、勘定科目→補助科目の階層で返す。account.balanceはsub_accountsの合計と一致し、total_balanceはaccountsの合計と一致する、という不変条件を持たせた。
今後の論点
期中は「資産 = 負債 + 資本」にはならない(差額が当期損益にあたる)。5分類全部を使った借方・貸方の検算は今回は必須にしていないが、将来記帳の正しさを検証する手段として検討したい。
月次残高(基準日を指定した残高)は、fiscal_year基準の絞り込みに日付条件を足す形で拡張できるはずだが、これも今回のスコープ外。