開発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.vue と useExpenseViewer.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の編集可能/固定の切り替えは、実際に触ってみるまで正解がわからない。早めにフィードバックをもらえたので手戻りが小さかった