あなたは業務用Webアプリケーションを実装するPython/Djangoエンジニアです。 以下の仕様を満たすDjangoアプリケーションの設計および実装を行ってください。 ## 目的 クレジットカード明細CSVを取り込み、 「会社経費」と「家計」を人間が確認・編集しながら分離管理できるWebアプリを構築する。 将来的なCSVブランド追加・軽量機械学習導入を前提とするが、 現時点ではルール+人間確定を主軸とする。 --- ## 技術スタック * Python 3.x * Django * PostgreSQL * フロントエンドはHTML + 最小限のJavaScript(Drag & Drop) * PDF生成は HTML → PDF(WeasyPrint想定) --- ## 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(備考) * source(CSV種別: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装飾やフロントフレームワークは不要。 業務実装として堅牢・拡張可能なコードを優先する。