daily-log
2026年1月20日の開発日記
今日はtax-assistantプロジェクトで大きな進展があった。Square決済の明細データをインポートして手書き売上伝票と突き合わせる機能を実装し、手動で売上伝票を登録する機能も追加した。さらに、肥大化していたindex.vueをタブごとに分割し、URLクエリパラメータで状態管理するリファクタリングも行った。
今日やったこと
1. Square明細インポートと突き合わせ機能
Square決済の明細CSVをインポートし、手書き売上伝票と突き合わせて不一致を検出する機能を実装した。
主な成果:
import_square.pyでCSVインポート機能を実装- 日付・金額ベースの突き合わせチェック機能
- 日付フォーマット不一致の修正(
YYYY-MM-DDvsM/D形式) - 売上伝票が存在する月のみをチェック対象にする改善
- 建設的なエラーメッセージ(「Square 1件に対し売上伝票が0件。売上計上漏れの可能性」など)
詳細: Square明細インポートと売上伝票突き合わせ機能の実装
2. 手動売上伝票登録機能
OCRでスキャンできない伝票(紛失、汚れ、特殊形式など)に対応するため、手動で売上伝票を登録する機能を追加した。
主な成果:
manualバッチの概念を導入- 読取一覧タブに「📝 手動登録」ボタンを追加
- ReceiptFormの手動モード対応
- 登録と閲覧・編集のUI分離(Square明細タブは閲覧専用)
詳細: 手動売上伝票登録機能の実装
3. Vue.jsタブ分割とURLクエリパラメータ
700行超に肥大化していたindex.vueを分割し、URLクエリパラメータで状態管理するリファクタリングを実施した。
主な成果:
ResultTab.vueへの分割とuseResultItemscomposableの作成- URLクエリパラメータによる状態管理(
?tab=receipt&batch=xxx) - ブラウザの戻る/進むボタン対応
- DuplicateViewからの遷移・戻り機能
詳細: Vue.js タブ分割とURLクエリパラメータによる状態管理
4. クレジットカード明細インポートと突き合わせ機能
Square明細に続いて、クレジットカード明細のインポートと突き合わせ機能を実装した。経費計上漏れを検出する目的で、クレカ明細とスキャン済みレシートを日付・金額ベースでマッチングする。
主な成果:
creditcard_transactionsテーブルの設計と実装- TSV形式のクレカ明細インポート機能
- 私的利用(
private)と返金(refund)のステータス管理 - レシートが存在する日付範囲内のみをチェック対象にする改善
- Codexレビューによる一意キー更新・返金自動判定の修正
詳細: クレジットカード明細インポートとレシート突き合わせ機能の実装
5. その他の改善
- 読取一覧のソート機能追加(日/ファイル名でソート可能に)
- faviconをロボットアイコンに変更
- 結果タブのカラム順序変更(日付を先頭に)
- StatusMarkerコンポーネントの共通化(確定/未確定の統一表示)
- 科目別一覧のソート機能追加(日付/金額でソート可能に)
- 重複チェックのグループ数表示対応
- Alt+矢印キーのブラウザ戻る機能の修正
詳細: 読取一覧のソートUI改善
今日の学び
- 日付フォーマットの罠: SQLiteの日付比較では、
strftimeを使って両側を同じ形式に揃える必要がある - localStorageとURLパラメータの役割分担: URLは「共有可能な状態」、localStorageは「ローカルな快適性」と使い分ける
- 仮想バッチの活用: 実データがなくてもUIに表示したいエントリ(「📝 手動登録」など)は仮想バッチとして追加できる