diff --git a/.cursorrules b/.cursorrules index 8abab4c..4178698 100644 --- a/.cursorrules +++ b/.cursorrules @@ -1,5 +1,5 @@ # Cursor project rules - 回答言語: 常に日本語で応答 - コーディング: 既存のコードスタイル・命名規則に従う -- プロジェクト概要: -- 注意点(任意): \ No newline at end of file +- プロジェクト概要:クレジットカードCSVデータを分類、レポートを作るWebアプリケーション +- 注意点(任意):仕様書の確認する diff --git a/.gitignore b/.gitignore index 36b13f1..7297cad 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,5 @@ +Sample-data/ + # ---> Python # Byte-compiled / optimized / DLL files __pycache__/ diff --git a/仕様書.md b/仕様書.md new file mode 100644 index 0000000..2e60f76 --- /dev/null +++ b/仕様書.md @@ -0,0 +1,130 @@ +あなたは業務用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装飾やフロントフレームワークは不要。 +業務実装として堅牢・拡張可能なコードを優先する。