Files
Card-data-sorting/仕様書.md

3.4 KiB
Raw Blame History

あなたは業務用Webアプリケーションを実装するPython/Djangoエンジニアです。 以下の仕様を満たすDjangoアプリケーションの設計および実装を行ってください。

目的

クレジットカード明細CSVを取り込み、 「会社経費」と「家計」を人間が確認・編集しながら分離管理できるWebアプリを構築する。

将来的なCSVブランド追加・軽量機械学習導入を前提とするが、 現時点ではルール+人間確定を主軸とする。


技術スタック

  • Python 3.x
  • Django
  • PostgreSQL
  • フロントエンドはHTML + 最小限のJavaScriptDrag & Drop
  • PDF生成は HTML → PDFWeasyPrint想定

CSV仕様現状

  • 出光クレジットカードCSVを第一対応とする

  • CSV内には以下2種類の行が混在する

    • ヘッダ行(カード名称・支払日・請求額など)
    • 明細行(利用日・利用先・金額)
  • 行ごとに列数が異なる

  • ブランド判定はヘッダ文言で行う

  • 今後ブランド追加を想定し、CSVパーサは分離設計とする


アーキテクチャ要件

CSV処理

  1. CSVファイルをDrag & Dropでアップロード
  2. 文字コードを自動判定
  3. CSV内容からブランド種別を判定
  4. ブランド別パーサで明細を抽出
  5. 正規化したデータを共通expensesテーブルへ投入
  6. 行単位でハッシュを生成し、二重登録を防止する

データベース設計

expenses経費明細

  • id
  • use_date日付
  • description利用先・摘要
  • amount金額
  • store_id店舗区分、NULL可
  • expense_category_id経費区分、NULL可
  • is_business会社経費 / 家計フラグ、NULL可
  • note備考
  • sourceCSV種別idemitsu 等)
  • source_hash行ハッシュ
  • ai_score将来用、NULL可
  • human_confirmed人間確定フラグ
  • created_at / updated_at

UNIQUE(source, source_hash)

マスタ

  • stores本店・支店
  • expense_categories材料費・消耗品費など

画面仕様

1. CSV取込画面

  • Drag & Drop対応
  • 取込件数・重複件数を表示

2. 明細編集画面(最重要)

  • 明細一覧テーブル表示

  • 編集可能項目:

    • 店舗区分select
    • 経費区分select
    • 家計 / 経費フラグ
    • 備考
  • 金額・日付は原則readonly

  • 1行単位でAJAX保存

3. 月次レポート画面

  • 年月指定
  • 店舗別合計
  • 経費区分別合計
  • 未分類件数の警告表示

4. PDF出力

  • 月次レポートと同一HTMLをPDF化
  • A4縦、印刷可能レイアウト

設計思想・制約

  • CSV取り込み時点では自動判断しない
  • 人間が一度確定したデータを教師データとして将来活用可能にする
  • Pythonの軽量機械学習scikit-learn想定を後から追加できる構成にする
  • ロジックはViewに書かず、service層に分離する

成果物

  • Djangoプロジェクト構成案
  • models.py
  • CSVパーサ構成
  • views.py / services.py の役割分離
  • 主要HTMLテンプレート骨格で可
  • 集計クエリ例
  • PDF生成コード例

過剰なUI装飾やフロントフレームワークは不要。 業務実装として堅牢・拡張可能なコードを優先する。