# 実装優先順位とマイルストーン ## 🎯 MVP(Phase 1)の完成定義 以下の全てが完了したら、Phase 1は完成とする: ### 機能完成基準 - [ ] ログイン・認証機能 - [ ] 作付け計画の一覧表示(PC/スマホ) - [ ] 作付け計画の編集(個別・一括) - [ ] 水稲共済細目書のCSV出力 - [ ] 中山間交付金のCSV出力 - [ ] 前年度作付けのコピー機能 - [ ] 3種類のマスタデータインポート ### 品質基準 - [ ] PCで快適に操作できる(レスポンス1秒以内) - [ ] スマホで見やすい(文字16px以上) - [ ] 出力されるCSVが正確(手動検証でOK) ### ユーザビリティ基準 - [ ] 作付け計画の登録が10分以内で完了 - [ ] 申請書のダウンロードが3クリック以内 - [ ] スマホでの圃場検索が3タップ以内 **目標完成日: 2025年2月末(水稲共済の1回目申請に間に合わせる)** --- ## 📅 実装スケジュール(10日間想定) ### Day 1-2: 環境構築 & 基盤実装 **Day 1: プロジェクトセットアップ** - [ ] Dockerコンテナの構築 - PostgreSQL (PostGIS拡張) - Django (バックエンド) - Next.js (フロントエンド) - [ ] Djangoプロジェクト初期化 - `django-admin startproject` - GIS設定 (`GDAL`, `GEOS`) - 環境変数管理 (`.env`) - [ ] Next.jsプロジェクト初期化 - `create-next-app` - Tailwind CSS設定 - 環境変数管理 **Day 2: 認証機能** - [ ] Django: ユーザーモデル (メール認証) - [ ] Django: JWT認証設定 (`djoser`, `djangorestframework-simplejwt`) - [ ] Next.js: ログイン画面 - [ ] Next.js: 認証コンテキスト (`AuthContext`) - [ ] 動作確認: ログイン→ダッシュボード遷移 --- ### Day 3-4: データモデル & インポート機能 **Day 3: データベース設計** - [ ] Django: モデル定義 - `Field` (実圃場) - `OfficialKyosaiField` (共済マスタ) - `OfficialChusankanField` (中山間マスタ) - `Plan` (作付け計画) - `Crop` (作物マスタ) - `Variety` (品種マスタ) - [ ] マイグレーション実行 - [ ] 管理画面での動作確認 **Day 4: インポート機能** - [ ] Django: インポートAPI実装 - `pandas` + `odfpy` でODS読み込み - 共済マスタインポート - 中山間マスタインポート - 吉田農地台帳インポート(紐付け処理含む) - [ ] Next.js: データ管理画面 - ファイルアップロードUI - プレビュー表示 - インポート実行ボタン - [ ] 動作確認: 実際のODSファイルをインポート --- ### Day 5-6: 作付け計画機能(コア機能) **Day 5: 作付け計画API** - [ ] Django: 作物・品種マスタの初期データ投入 - [ ] Django: 作付け計画API - 一覧取得 (`GET /api/plans/?year=2025`) - 作成・更新 (`POST /api/plans/`, `PATCH /api/plans/{id}/`) - 一括更新 (`POST /api/plans/bulk/`) - 前年度コピー (`POST /api/plans/copy_from_previous_year/`) - [ ] API動作確認 (Postman or curl) **Day 6: 作付け計画UI** - [ ] Next.js: 作付け計画一覧画面 - テーブル表示 - 検索・フィルタ機能 - 未割当のハイライト - [ ] Next.js: 作付け計画編集モーダル - 作物選択(ドロップダウン) - 品種選択(動的に変化) - 一括割当対応 - [ ] Next.js: 前年度コピーボタン - [ ] 動作確認: 作付け計画を実際に入力 --- ### Day 7-8: 申請書出力機能 **Day 7: 申請書ロジック実装** - [ ] Django: 水稲共済細目書PDF生成 - 共済マスタをベースに集約 - 紐づく実圃場の作付けを名寄せ - HTMLテンプレート作成 - WeasyPrintでPDF変換 - [ ] Django: 中山間交付金PDF生成 - 中山間マスタをベースに集約 - HTMLテンプレート作成 - [ ] 動作確認: PDFの内容と見た目を手動チェック **Day 8: 申請書ダウンロードUI** - [ ] Next.js: 申請書ダウンロード画面 - 年度選択 - プレビュー表示(新しいタブでPDF) - PDFダウンロードボタン - [ ] 動作確認: PDFをダウンロードして印刷してみる --- ### Day 9: スマホ対応 & UI調整 **Day 9: レスポンシブ対応** - [ ] Next.js: スマホ用レイアウト調整 - 作付け計画一覧(カード型) - 圃場詳細画面 - タップ領域の調整 - [ ] 文字サイズ・余白の調整 - [ ] 動作確認: 実機またはChrome DevToolsのモバイルビュー --- ### Day 10: テスト & 微調整 **Day 10: 総合テスト** - [ ] 全機能の動作確認 - ログイン→作付け計画編集→申請書ダウンロードの一連の流れ - 前年度コピー→編集→保存 - スマホでの参照 - [ ] バグ修正 - [ ] ドキュメント整備(README.md、使い方ガイド) - [ ] 本番デプロイ準備(Dockerイメージのビルド) --- ## 🔧 技術スタックの詳細 ### バックエンド (Django) | 項目 | 採用技術 | 理由 | |------|---------|------| | フレームワーク | Django 5.0 | 安定性、豊富なエコシステム | | REST API | Django REST Framework | 標準的なAPI構築ツール | | 認証 | djoser + SimpleJWT | JWT認証の簡単な実装 | | GIS | GeoDjango (PostGIS) | 地理情報の扱いに最適 | | ファイル解析 | pandas + odfpy | ODS/Excelの読み込みに対応 | | PDF生成 | WeasyPrint | HTML→PDF変換、日本語対応 | | データベース | PostgreSQL 16 + PostGIS 3.4 | 空間データの保存・検索 | ### フロントエンド (Next.js) | 項目 | 採用技術 | 理由 | |------|---------|------| | フレームワーク | Next.js 14 (App Router) | SSR/SSG対応、モダンな開発体験 | | スタイリング | Tailwind CSS | 高速なUI開発 | | 状態管理 | React Context API | シンプルな認証状態管理 | | HTTPクライアント | fetch API (native) | 軽量、標準API | | テーブル | react-table (TanStack Table) | 高機能なテーブルコンポーネント | ### インフラ (Docker) | 項目 | 採用技術 | 理由 | |------|---------|------| | コンテナ化 | Docker Compose | 開発・本番環境の統一 | | データベース | postgis/postgis:16-3.4 | PostGIS公式イメージ | | リバースプロキシ | Nginx (開発環境) | 静的ファイル配信 | --- ## 📦 実装の粒度(コードレベル) ### 最小限の実装で済むもの - ログイン画面: メール+パスワードのみ(パスワードリセットは後回し) - ダッシュボード: サマリー表示のみ(グラフは不要) - 地図機能: Phase 1では不要(住所テキストのみ) ### しっかり作り込むもの - 作付け計画一覧: 検索・フィルタ・ソート機能 - 編集モーダル: 入力バリデーション、エラー表示 - 申請書CSV: 正確なデータ集計ロジック ### Phase 2以降に回すもの - 栽培履歴(播種日、作業記録) - カレンダー表示 - 資材計画 - 過去年度の比較 --- ## 🚀 デプロイ計画 ### 開発環境 - ローカルマシン: Docker Compose - URL: `http://localhost:3000` ### 本番環境(Phase 1後) - サーバー: VPS or クラウド(AWS/GCP/さくらVPS) - ドメイン: `keina.example.com` (仮) - HTTPS: Let's Encrypt - リバースプロキシ: Traefik or Nginx ### バックアップ戦略 - データベース: 毎日自動バックアップ(`pg_dump`) - ファイル: CSVエクスポートでユーザー自身がバックアップ --- ## 🧪 テスト戦略 ### Phase 1では自動テスト不要 - **理由**: シングルユーザー、手動検証で十分 - **代わりに**: 手動チェックリストで品質保証 ### 手動チェックリスト #### 機能テスト - [ ] ログインできる - [ ] 作付け計画を登録できる - [ ] 作付け計画を編集できる - [ ] 一括割当ができる - [ ] 前年度コピーができる - [ ] 水稲共済PDFをダウンロードできる - [ ] 中山間PDFをダウンロードできる - [ ] PDFをプレビュー表示できる - [ ] スマホで圃場詳細を見られる #### データ整合性テスト - [ ] 共済PDFの耕地番号が正しい - [ ] 中山間PDFのIDが正しい - [ ] 作物の名寄せが正しい(重複排除) - [ ] 未割当の圃場が適切に扱われる - [ ] PDFの表レイアウトが整っている - [ ] PDFをA4用紙に印刷して見やすい #### UI/UXテスト - [ ] PCで見やすい(文字サイズ、余白) - [ ] スマホで見やすい(タップ領域、スクロール) - [ ] エラーメッセージがわかりやすい - [ ] ローディング中の表示 --- ## 🔍 潜在的な技術的課題と対策 ### 課題1: PostGISの設定 **問題**: Dockerコンテナ内でGDAL/GEOSのパスが通らない **対策**: 公式PostGISイメージを使用、Djangoの`GDAL_LIBRARY_PATH`を明示的に設定 ### 課題2: ODSファイルの文字コード **問題**: 日本語の文字化け **対策**: `pd.read_excel(..., engine='odf')` でUTF-8として読み込み ### 課題3: 作物の名寄せロジック **問題**: 複数の実圃場が1つの共済区画に紐づく場合の集約 **対策**: Pythonのセットで重複排除 → カンマ区切りで結合 ### 課題4: スマホでのテーブル表示 **問題**: 横スクロールが発生 **対策**: カード型レイアウトに変更(Tailwindの`@media`クエリ) ### 課題5: 大量データのパフォーマンス **問題**: Phase 2以降、栽培履歴が増えると遅くなる **対策**: ページネーション、インデックス最適化(Phase 2で対応) --- ## 📝 開発時の注意点 ### コーディング規約 - **Python**: PEP 8準拠、型ヒント推奨 - **JavaScript**: ESLint + Prettier、関数コンポーネント優先 - **命名**: 英語(camelCase or snake_case)、略語は避ける ### コミットメッセージ ``` feat: 作付け計画一覧APIを実装 fix: 共済CSVの面積計算バグを修正 docs: READMEにセットアップ手順を追加 style: Tailwindクラスを整理 ``` ### ブランチ戦略 - `main`: 本番環境 - `develop`: 開発環境 - `feature/*`: 機能開発 --- ## 🎉 Phase 1完成後の振り返り 完成したら、以下を実施: 1. **使用感チェック**: 実際に作付け計画を入力してみる 2. **申請書検証**: 出力されたCSVを役場の書式と照合 3. **改善点の洗い出し**: 「ここがもっとこうだったら...」を記録 4. **Phase 2の要件整理**: 栽培履歴機能の詳細を詰める