150 lines
4.5 KiB
Markdown
150 lines
4.5 KiB
Markdown
あなたは業務用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可)
|
||
* owner_type(company/personal/pending)
|
||
* note(備考)
|
||
* source(CSV種別:idemitsu 等)
|
||
* source_hash(行ハッシュ)
|
||
* ai_score(将来用、NULL可)
|
||
* human_confirmed(人間確定フラグ)
|
||
* is_canceled(取り消しフラグ)
|
||
* 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装飾やフロントフレームワークは不要。
|
||
業務実装として堅牢・拡張可能なコードを優先する。
|
||
|
||
---
|
||
|
||
## サブスク判定ルール案(暫定)
|
||
|
||
### 候補リスト(利用先文字列 + 金額)
|
||
|
||
- APPLE COM BILL 480 -> 事務用品費、ウェザーニュース
|
||
- APPLE COM BILL 150 -> 事務用品費、iCloud 追加Disk
|
||
- APPLE COM BILL 1200 -> 未設定、アップルニュージック
|
||
- ABEMAプレミアム 1080 -> 未設定、個人の娯楽
|
||
- OPENAI *CHATGPT SUBSCR 3305 -> 事務用品費、GPT
|
||
- エックスサ−バ−/M 2200 -> 通信費 //文字の揺らぎ 下と同じ
|
||
- エックスサ-バ-/M 2200 -> 通信費、Nextcloud運営VPS
|
||
- お名前.com ドメインサービス 268/270 -> 通信費、ドメインサービス
|
||
- お名前.comレンタルサ−バ− 2153 -> 通信費、レンタルサーバー(価格変動あり/表記揺れあり)
|
||
- お名前.comレンタルサ-バ- 2612 -> 通信費、レンタルサーバー(価格変動あり/表記揺れあり)
|
||
- アット・ニフティ 5361 -> (要確認)
|