• #簿記3級
  • #Vue
  • #残高試算表
  • #テスト先行
  • #サブエージェント
開発eurekapu-nuxt4

簿記3級ノートに財務影響モードを実装

朝、減損の例題を画面で開いて、右側合計の数字を二度見した。「資産400/負債・純資産400」になるはずのところで、純資産だけ繰越利益剰余金の分が膨らんで、貸借が合っていない。画面に出ている合計を目で追っていて違和感を拾った。そこから1日かけて、簿記3級ノートのインタラクティブ仕訳エンジンに財務影響モードを足し、▲表記・12月決算化・貸借一致バグ修正までまとめて反映した。

やったこと

HTMLドラフト(impairment.html ほか)と Vue 版の JournalExample.vue の両方に、同じ修正を二度反映した。共通ロジックは _journal-example.js / _journal-example.css 側にあるので、そこを data-mode 属性で切り替えられるようにして、財務影響モードと従来の仕訳練習モードを共存させている。

主な変更点:

  • _journal-example.{js,css}data-mode 属性で financial-impact モードに対応させた
  • 損益計算書セクションを追加し、特別損失内訳「減損損失」を勘定科目レベルまで降ろして表示
  • 仕訳帳を折りたたみ式にした。初期状態は閉じていて、トグルで開く
  • 売上総利益・経常利益などの段階小計には背景ハイライトを入れない skipHighlight: true オプションを追加した。借方/貸方の科目だけハイライトする
  • 全エントリーの決算日を3月終わりから12月終わりに統一(HTMLドラフト6ファイル)
  • マイナス表示を - から会計慣習の に揃えた。fmt 関数・CSSプレフィックス・差額ポップアップ・吸い込みpillまで全部揃える
  • BSヘッダーに「資産400/負債・純資産400」のように合計を出して、貸借が合っているか目視で確認できるようにした
  • 例題の金額単位を「○○万円」表記から円単位に変換。17論点をサブエージェント並列で一気に処理した(5論点バッチ → 12論点バッチ)

貸借不一致バグ:画面の数字を見て違和感を拾った

equity例題の残高試算表で、右辺だけ繰越利益剰余金の分だけ膨らんでいた。コードを追うと、UI側で re(繰越利益剰余金)を reOpen + reNi(期首残高 + 当期純利益)として二重カウントしていた。reNi は当期純利益として別途加算しているのに、re の中にも当期純利益が含まれていたという二重計上。

修正は純粋関数 buildTbViewModel を切り出して、テストを先に書いた。reOpenreNi をそれぞれ独立して扱い、合算は表示直前にだけ行う。テスト実行で失敗を確認してから、関数を直してパスさせる。Red → Green の順を守った。

// 純粋関数として切り出し。引数だけで結果が決まる
export const buildTbViewModel = (entries: Entry[], opening: Opening) => {
  const reOpen = opening.retainedEarnings
  const reNi = calcNetIncome(entries)
  // re は二度足さない。表示時に reOpen + reNi をその場で計算
  return {
    rows: [...],
    reOpen,
    reNi,
  }
}

UI 側はこの View Model を受け取って描画するだけにした。計算と副作用を切り離した結果、テストで貸借不一致を再現してから修正できる構造になった。

試行錯誤

最小行数5の的外れ修正

仕訳帳を折りたたみ式にしたとき、最初は「最小行数5を確保する」というアプローチで実装した。空行をダミーで埋めて見た目を整える発想。レビューで撥ねられた。「totalRows ロジックを潰すな」「プレースホルダー行の colspan セルにメッセージを差すだけでいい」と差し戻されて、書き直した。既存の行数計算を維持したまま、空のときだけメッセージ行を1行入れるパターンに収まった。

例題Cのレイアウト破綻

例題Cで7行入力したらモーダル内のレイアウトが破綻した。タブ番号がローマ数字だと幅が安定しなかったので算用数字に変更し、モーダルにスクロール設定を追加。グリッド側は grid-template-rows: minmax(0, 1fr) を入れて、内部スクロールを許可した。minmax(0, 1fr) を入れないと中身がはみ出すまでグリッドが膨らんで、外側に縦スクロールが発生する。

サブエージェント並列で17論点を一気に変換

例題の金額単位を「万円」から「円」に揃える作業は、17論点を全部手で変換すると半日かかる。同じ変換ルール(× 10000、桁区切りカンマ追加、fmt 関数の単位プレフィックス削除)を全例題に適用するだけなので、サブエージェント並列で5論点バッチと12論点バッチに分けて投げた。バッチ単位でレビューしてから本流にマージする運用にした。

学び

  • AIに計算ロジックを書かせても、簿記の貸借バランスは画面を見て自分が違和感を拾わないと事故る。今日は「資産400/負債・純資産400」の合計が画面に出ていたから二重カウントに気づけたが、合計表示がなければバグを見逃していた。BSヘッダーに合計を出す変更は、たまたま今日入れたものが、その場で自分を救った
  • バグ調査は「テスト先行で失敗を再現してから修正」が結果的に早い。先に純粋関数として切り出してテストで赤くしてから直すと、修正後の確認が一瞬で終わる
  • 「全例題に同じ変換ルールで一括展開」はサブエージェント並列が効く。17論点を直列で書き換えると半日溶ける作業が、バッチ並列で1時間に縮む
  • HTMLドラフトと Vue 版の両方に同じ修正を反映する作業は、共通ロジック側(_journal-example.{js,css})に寄せておくと差分が一箇所で済む。属性で切り替える設計に倒してよかった

明日やること

  • 財務影響モードの他例題(資産除去債務・社債)への展開
  • BSヘッダーの合計表示を、貸借不一致のときだけ赤字にする条件分岐を追加
  • サブエージェント並列で展開した17論点のうち、桁区切りが抜けている箇所がないか目視チェック