• #日記
  • #tax-assistant
  • #Square
  • #Vue.js
  • #リファクタリング
daily-log

2026年1月20日の開発日記

今日はtax-assistantプロジェクトで大きな進展があった。Square決済の明細データをインポートして手書き売上伝票と突き合わせる機能を実装し、手動で売上伝票を登録する機能も追加した。さらに、肥大化していたindex.vueをタブごとに分割し、URLクエリパラメータで状態管理するリファクタリングも行った。

今日やったこと

1. Square明細インポートと突き合わせ機能

Square決済の明細CSVをインポートし、手書き売上伝票と突き合わせて不一致を検出する機能を実装した。

主な成果:

  • import_square.pyでCSVインポート機能を実装
  • 日付・金額ベースの突き合わせチェック機能
  • 日付フォーマット不一致の修正(YYYY-MM-DD vs M/D形式)
  • 売上伝票が存在する月のみをチェック対象にする改善
  • 建設的なエラーメッセージ(「Square 1件に対し売上伝票が0件。売上計上漏れの可能性」など)

詳細: Square明細インポートと売上伝票突き合わせ機能の実装


2. 手動売上伝票登録機能

OCRでスキャンできない伝票(紛失、汚れ、特殊形式など)に対応するため、手動で売上伝票を登録する機能を追加した。

主な成果:

  • manualバッチの概念を導入
  • 読取一覧タブに「📝 手動登録」ボタンを追加
  • ReceiptFormの手動モード対応
  • 登録と閲覧・編集のUI分離(Square明細タブは閲覧専用)

詳細: 手動売上伝票登録機能の実装


3. Vue.jsタブ分割とURLクエリパラメータ

700行超に肥大化していたindex.vueを分割し、URLクエリパラメータで状態管理するリファクタリングを実施した。

主な成果:

  • ResultTab.vueへの分割とuseResultItems composableの作成
  • 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に表示したいエントリ(「📝 手動登録」など)は仮想バッチとして追加できる

関連記事