• #accounting
  • #bug-fix
  • #journal-entry
  • #refund
  • #sqlite
  • #vue
開発tax-assistantメモ

クレカ明細の返品仕訳バグ修正

バグの発覚

クレカ明細のインポート処理をテストしていたら、返品(プラス値)の行で仕訳が通常と同じ方向に切られていることに気づいた。画面を二度見した。

通常のクレカ仕訳は「借方: 費用科目 / 貸方: カード」だが、返品時はこれが逆転して「借方: カード / 貸方: 費用科目」にならなければいけない。プラス値の明細がそのまま通常仕訳として処理されていたので、費用が二重計上される形になっていた。

対応の流れ

1. is_refund フラグの追加

DBに is_refund カラムを追加するところから着手した。

ALTER TABLE credit_card_entries ADD COLUMN is_refund INTEGER DEFAULT 0;

インポート処理で金額がプラスなら is_refund = 1 をセットする。MF形式パーサーと補助元帳パーサーの両方にこの判定を入れた。API型定義にも is_refund: boolean を追加。

2. Codexレビューでの指摘

マイグレーション方式について、Codexレビューで手が止まる指摘をもらった。

既存のマイグレーションに SELECT * でデータを移行する処理があり、CREATE TABLE で新カラムを追加すると INSERT INTO ... SELECT * FROM ... の列数が合わなくなる。ALTER TABLE ADD COLUMN 方式のみに統一して回避した。

3. 仕訳ビューアの借方/貸方反転

ExpenseViewerView.vueuseExpenseViewer.ts_isRefund フラグを持たせ、表示と編集の制御を切り替えた。

// 返品フラグでUI制御を分岐
const isCreditEditable = computed(() => _isRefund.value)
const isDebitEditable = computed(() => !_isRefund.value)

saveEntry も credit 側の保存に対応させた。

4. ユーザーフィードバックからのUI修正

動作確認で「返品時は貸方(費用科目)が編集可能で、借方(カード)は固定であるべき」というフィードバックをもらった。最初の実装では編集可能な側が逆だった。

通常時と返品時でUI要素の disabled 状態を反転させる修正を入れて、意図通りの操作感になった。

学んだこと

  • SQLiteで ALTER TABLE ADD COLUMN は安全だが、既存マイグレーションの SELECT * と組み合わさると列数不一致で壊れる。マイグレーション全体を俯瞰してから手を入れるべきだった
  • 会計の仕訳は「どちらが増えてどちらが減るか」の方向が全て。フラグ1つで借方貸方が反転する設計にしたことで、通常処理と返品処理のコードパスを分離せずに済んだ
  • UIの編集可能/固定の切り替えは、実際に触ってみるまで正解がわからない。早めにフィードバックをもらえたので手戻りが小さかった