新機能実装準備

This commit is contained in:
Akira
2026-02-21 16:44:36 +09:00
parent f520e13d02
commit 24fa9b4e64
8 changed files with 145 additions and 0 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,156 @@
# プロダクトビジョン
## 🎯 システムの目的
**「作付け計画を起点とした農業経営データの一元管理」**
このシステムは、年間の作付け計画を中心に、以下の3つの課題を解決する
1. **申請書類の作成負担を減らす**
- 水稲共済細目書年2回: 2月・5月
- 中山間地域等直接支払交付金年1回: 5月
- これらの申請に必要なデータを、作付け計画から自動生成
2. **実圃場と申請区画のずれを管理する**
- 実際に作業する圃場39筆と、申請書上の区画共済31区画、中山間71区画が異なる
- 実圃場と申請区画の紐づき関係M:Nを明示的に管理
- 紐付けは半自動化するが、手動修正も可能にする
3. **将来の拡張を見据えた設計**
- Phase 2: 栽培履歴(播種日、農薬・肥料の散布記録)
- Phase 3: 資材計画(種苗・肥料・農薬の必要量計算)
- Phase 4: 収穫管理・販売管理との連携
---
## 👤 ユーザー像
**主要ユーザーSole User:**
- 65歳の農家元プログラマー、50歳まで従事
- ITリテラシー: 高い(自分でシステムを設計・実装できるレベル)
- 経営規模: 39筆の圃場を管理
**利用デバイス:**
- 🖥️ **PC**: 作付け計画の登録・編集、申請書のダウンロード(メイン操作)
- 📱 **スマホ/タブレット**: 圃場での参照(品種確認、面積確認、将来的には栽培履歴)
**利用シーズン:**
- **11月3月**: 作付け計画の策定・修正(前年度コピー→微調整)
- **2月**: 水稲共済細目書の提出1回目
- **5月**: 水稲共済細目書2回目中山間交付金の申請
- **通年**: スマホでの現場参照
---
## 📊 現状の課題とシステムによる解決
| 課題 | 現状Before | システム導入後After |
|------|---------------|----------------------|
| 申請書作成 | 紙の台帳から手作業で転記・集計 | ボタン1つでPDFダウンロード→印刷 |
| 圃場と申請区画の対応 | Excelで手動管理、照合が大変 | 自動紐付けUI上で視覚的に確認・修正 |
| 前年度データの再利用 | 前年のExcelをコピー→手作業で修正 | 年度コピー機能で一括複製 |
| 作物の変更履歴 | 紙のメモ、記憶頼み | 過去年度の作付け計画を参照可能 |
| 現場での情報確認 | 家に戻って紙の台帳を確認 | スマホでその場で品種・面積を確認 |
---
## ✅ 成功の定義KPI
**Phase 1MVPの成功指標:**
1. **申請書作成時間の短縮**
- 水稲共済: 手作業2時間 → システム5分96%削減)
- 中山間: 手作業1時間 → システム3分95%削減)
2. **データの正確性向上**
- 転記ミスゼロ(自動集計のため)
- 圃場と申請区画の対応ミスゼロUIで視覚的に確認
3. **使いやすさ**
- 作付け計画の登録・修正が、PCで10分以内に完了
- スマホでの圃場情報参照が、3タップ以内で完了
- PDFを印刷してそのまま提出できる品質レイアウト調整不要
**Phase 2以降の展望:**
- 栽培履歴の記録により、GAP認証の取得が可能に
- 資材計画の自動化により、発注漏れ・過剰在庫を削減
- 収穫実績と計画の比較により、翌年の計画精度が向上
---
## 🔐 非機能要件
**シンプルさ最優先:**
- シングルユーザー(マルチテナント不要)
- 認証は最小限(メール+パスワード)
- 複雑な権限管理は不要
**レスポンシブ対応:**
- PC: 作付け計画の編集、申請書ダウンロード
- スマホ/タブレット: 参照メイン(将来的には簡易な記録入力も)
**データの永続性:**
- 最低5年分のデータを保持補助金の監査対応
- バックアップ機能CSV/Excelでのエクスポート
**パフォーマンス:**
- 圃場一覧の表示: 1秒以内
- 申請書PDFの生成: 3秒以内
- スマホでの圃場詳細表示: 2秒以内
---
## 🚫 やらないことNon-Goals
**Phase 1では以下は含めない:**
- マルチユーザー対応(将来的にも不要の可能性高)
- 地図上での圃場描画・編集GeoJSON等は後回し
- 自動ジオコーディング住所→座標変換は手動でOK
- リアルタイム同期(オフライン対応は不要)
- モバイルアプリPWAで十分
---
## 🎨 デザイン原則
1. **シンプル・イズ・ベスト**
- 1画面1機能を徹底
- 複雑なUIコンポーネントは避けるドラッグ&ドロップ、カレンダーなど)
2. **情報の優先順位を明確に**
- 最もよく使う情報を最も目立つ位置に
- 圃場一覧では「名称」「作付け作物」「面積」を最優先表示
3. **エラーを起こしにくい設計**
- 入力必須項目は最小限に
- 選択式(ドロップダウン)を優先、自由入力は最小限
4. **スマホファースト(参照時)**
- 文字サイズ: 最低16px
- タップ領域: 最低44px×44px
- 横スクロールは避ける
5. **既存データを尊重**
- 役場データ(共済・中山間)の面積不整合は「そういうもの」として扱う
- ユーザーの運用を変えさせない(紙の台帳と同じ感覚で使える)
---
## 📅 開発フェーズ
**Phase 1MVP: 2025年2月まで**
- 作付け計画の登録・編集
- 申請書水稲共済・中山間のPDF出力
- 圃場一覧の参照PC/スマホ)
**Phase 2: 2025年3月**
- 栽培履歴の記録(播種日、農薬散布など)
- 作業予定のカレンダー表示
**Phase 3: 2025年度中**
- 資材計画(種苗・肥料・農薬の必要量計算)
- 収穫記録
**Phase 4: 将来**
- お米販売システムとの連携API経由
- スマート農業機器との連携(センサーデータ取込)

View File

@@ -0,0 +1,312 @@
# ユーザーストーリー
## 📖 ストーリー記法
```
【優先度】タイトル
As a ユーザー(役割)
I want ◯◯したい
So that △△できる(目的・価値)
【受け入れ基準】
- [ ] 条件1
- [ ] 条件2
```
---
## 🔴 Phase 1MVP- 必須機能
### P1-1: 作付け計画の一覧表示
**As a** 農家(システムの唯一のユーザー)
**I want** 全ての圃場と、それぞれに何を作付けしたかを一覧で見たい
**So that** 今年の作付け状況を俯瞰でき、未割当の圃場を見つけられる
**【受け入れ基準】**
- [ ] 全39筆の圃場が一覧表示される
- [ ] 各圃場に「名称」「面積」「今年の作付け作物」が表示される
- [ ] 作付け未設定の圃場は警告色(赤/黄)でハイライトされる
- [ ] 年度を切り替えられる2024年度、2025年度など
- [ ] PC・スマホ両方で見やすいレイアウト
**【UIイメージ】**
```
┌────────────────────────────────┐
│ 📅 2025年度 作付け計画 │
├────────────────────────────────┤
│ 🔍 検索: [___________] 🔽絞込 │
├────────────────────────────────┤
│┌────┬──────┬────┬──────────┐│
││名称 │面積 │作付 │操作 ││
│├────┼──────┼────┼──────────┤│
││田A │1.2反 │米 │ [編集] ││
││田B │0.5反 │❗未設定│ [割当] ││
│└────┴──────┴────┴──────────┘│
└────────────────────────────────┘
```
---
### P1-2: 圃場への作物割当
**As a** 農家
**I want** 各圃場に作物を割り当てたい
**So that** 今年の作付け計画を記録できる
**【受け入れ基準】**
- [ ] 圃場を選択して「作物」を設定できる
- [ ] 作物は以下から選択:
- 作付けしない: 休耕、緑肥、景観作物、その他野菜
- 作付けする: 米(品種選択)、トウモロコシ、エンドウ、野菜
- [ ] 品種も選択できる(例: 米 → にこまる、たちはるか、たちはるか特栽)
- [ ] 複数の圃場を一括選択して、同じ作物を割り当てられる
- [ ] 割当後、一覧画面に即座に反映される
**【作物マスタ】**
```
作物リスト:
- 米
- トウモロコシ
- エンドウ
- 野菜
- その他(休耕・緑肥・景観作物など)
品種の登録方法:
- すべての作物で統一
- プリセット品種 + その場で追加
- 例:
┌─────────────────────────┐
│ 品種: [にこまる ▼] │
│ - にこまる │
│ - たちはるか │
│ - たちはるか(特栽)│
│ │
│ [+ 新しい品種を追加] │
└─────────────────────────┘
作物「その他」の品種例:
- 完全休耕
- 緑肥(ヘアリーベッチ)
- 緑肥(レンゲ)
- 景観作物(コスモス)
- 景観作物(ヒマワリ)
※「作付けしない」系も特別扱いせず、「その他」として統一
```
---
### P1-3: 水稲共済細目書のPDF出力
**As a** 農家
**I want** 水稲共済細目書に必要なデータをPDFでダウンロードしたい
**So that** 2月と5月の申請時に、印刷してそのまま役場に提出できる
**【受け入れ基準】**
- [ ] 年度を指定してPDFをダウンロードできる
- [ ] PDFは表形式で、以下の列を含む:
```
耕地番号 | 分筆番号 | 地名地番 | 漢字地名 | 本地面積(m2) | 作付品目 | 品種 | 備考
```
- [ ] A4サイズ、縦向き、見やすいフォントサイズ10pt以上
- [ ] ヘッダーに「水稲共済細目書2025年度」などのタイトル
- [ ] ページ番号(複数ページになる場合)
- [ ] 共済マスタ31区画をベースに、紐づく実圃場の作付け情報を集約
- [ ] 複数の実圃場が1つの共済区画に紐づく場合、作物をカンマ区切りで列挙例: "米,野菜"
- [ ] 作付け未設定の共済区画も出力(空欄または「未設定」)
- [ ] ダウンロード前にプレビュー表示できる
**【集計ロジック】**
1. 共済マスタ(`水稲共済細目用.ods`の31区画をループ
2. 各共済区画に紐づく実圃場を取得(`吉田農地台帳`の`細目_耕地番号`/`細目_分筆番号`で結合)
3. 紐づく実圃場の作付け情報を集約(作物名をユニーク化してカンマ区切り)
4. HTMLテンプレートで表を生成 → PDF変換
---
### P1-4: 中山間交付金申請のPDF出力
**As a** 農家
**I want** 中山間地域等直接支払交付金の申請に必要なデータをPDFでダウンロードしたい
**So that** 5月の申請時に、印刷してそのまま役場に提出できる
**【受け入れ基準】**
- [ ] 年度を指定してPDFをダウンロードできる
- [ ] PDFは表形式で、以下の列を含む:
```
ID | 大字 | 字 | 地番 | 農地面積(m2) | 作付品目 | 品種 | 備考
```
- [ ] A4サイズ、縦向き、見やすいフォントサイズ10pt以上
- [ ] ヘッダーに「中山間地域等直接支払交付金2025年度」などのタイトル
- [ ] 中山間マスタ71区画をベースに、紐づく実圃場の作付け情報を集約
- [ ] 作付け未設定の区画も出力(空欄または「未設定」)
- [ ] ダウンロード前にプレビュー表示できる
**【集計ロジック】**
- 水稲共済と同様、中山間マスタをループして実圃場を集約 → PDF生成
---
### P1-5: 前年度作付け計画のコピー
**As a** 農家
**I want** 前年度の作付け計画を丸ごと新年度にコピーしたい
**So that** 毎年ゼロから入力せずに、微調整だけで済む
**【受け入れ基準】**
- [ ] 「前年度をコピー」ボタンを押すと、前年度の作付け情報が新年度に複製される
- [ ] 圃場マスタはコピーしない(マスタは共通)
- [ ] コピー後、作物の種類を個別に変更できる
- [ ] コピー前に確認ダイアログを表示(上書き防止)
---
### P1-6: スマホでの圃場情報参照
**As a** 農家
**I want** 田んぼにいるときに、スマホでその圃場の情報を見たい
**So that** 「この田んぼに植えた品種は何だっけ?」「面積はいくつだっけ?」をその場で確認できる
**【受け入れ基準】**
- [ ] スマホで圃場一覧を見られる
- [ ] 検索・絞り込み機能で目的の圃場を素早く見つけられる
- [ ] 圃場詳細画面で以下を確認:
- 名称
- 住所
- 面積
- 今年の作付け作物・品種
- (将来)過去の作付け履歴
- [ ] 文字サイズ: 16px以上
- [ ] タップ領域: 44px×44px以上
---
## 🟡 Phase 2 - 栽培履歴機能
### P2-1: 播種日・定植日の記録
**As a** 農家
**I want** 各圃場の播種日(種まき日)や定植日を記録したい
**So that** スマホで「いつ植えたか」を確認でき、次の作業(追肥など)のタイミングを判断できる
**【受け入れ基準】**
- [ ] 圃場ごとに「播種日」「定植日」を入力できる
- [ ] カレンダーUIで日付を選択
- [ ] スマホで過去の記録を閲覧できる
---
### P2-2: 農薬・肥料散布の記録
**As a** 農家
**I want** 除草剤や肥料をまいた日を記録したい
**So that** スマホで「いつ除草剤まいたか」を確認でき、次回の散布タイミングを判断できる
**【受け入れ基準】**
- [ ] 圃場ごとに「作業日」「作業内容」「使用資材」を入力
- [ ] 作業内容は選択式(播種、定植、除草剤散布、追肥、収穫など)
- [ ] スマホで作業履歴を時系列で閲覧
---
### P2-3: 作業予定のカレンダー表示
**As a** 農家
**I want** 今後の作業予定をカレンダーで見たい
**So that** 「来週は何をする予定だっけ?」を俯瞰できる
**【受け入れ基準】**
- [ ] 月間カレンダーで作業予定を表示
- [ ] 各圃場の作業予定を色分け
- [ ] 日付をクリックすると、その日の作業一覧を表示
---
## 🟢 Phase 3 - 資材計画機能
### P3-1: 種苗必要量の自動計算
**As a** 農家
**I want** 今年の作付け計画から、必要な種苗の量を自動計算してほしい
**So that** 種の発注漏れや過剰発注を防げる
**【受け入れ基準】**
- [ ] 作物ごとに「面積あたり必要量」をマスタ登録
- [ ] 作付け計画から、作物別の合計面積を算出
- [ ] 必要量を一覧表示(例: にこまる 30kg、トウモロコシ 5袋
---
### P3-2: 肥料・農薬の必要量計算
**As a** 農家
**I want** 施肥計画や農薬散布計画を立てたい
**So that** 資材の購入計画を立てられる
**【受け入れ基準】**
- [ ] 作物ごとの施肥基準をマスタ登録
- [ ] 作付け面積から必要な肥料量を計算
- [ ] 農薬も同様に計算
---
## 🔵 Phase 4 - 収穫・販売管理
### P4-1: 収穫記録
**As a** 農家
**I want** 収穫量を記録したい
**So that** 計画と実績を比較し、来年の計画精度を上げられる
---
### P4-2: お米販売システムとの連携
**As a** 農家
**I want** 作付け計画と収穫実績を、お米販売システムに自動連携したい
**So that** 在庫管理や販売計画を効率化できる
---
## 📊 優先度マトリクス
| ストーリー | 優先度 | Phase | 工数(想定) |
|-----------|--------|-------|------------|
| P1-1: 作付け計画一覧 | 🔴 高 | 1 | 2日 |
| P1-2: 作物割当 | 🔴 高 | 1 | 3日 |
| P1-3: 水稲共済PDF出力 | 🔴 高 | 1 | 3日 |
| P1-4: 中山間PDF出力 | 🔴 高 | 1 | 2日 |
| P1-5: 前年度コピー | 🔴 高 | 1 | 1日 |
| P1-6: スマホ参照 | 🔴 高 | 1 | 1日 |
| P2-1: 播種日記録 | 🟡 中 | 2 | 2日 |
| P2-2: 作業履歴 | 🟡 中 | 2 | 3日 |
| P2-3: カレンダー | 🟡 中 | 2 | 3日 |
| P3-1: 種苗計算 | 🟢 低 | 3 | 2日 |
| P3-2: 資材計算 | 🟢 低 | 3 | 2日 |
| P4-1: 収穫記録 | 🔵 将来 | 4 | TBD |
| P4-2: 販売連携 | 🔵 将来 | 4 | TBD |
---
## 🎯 Phase 1 完成の定義
以下が全て完了したら、Phase 1MVPは完成とする
1. **機能要件**
- [ ] 作付け計画を登録・編集できる
- [ ] 水稲共済細目書のPDFを出力できる
- [ ] 中山間交付金申請のPDFを出力できる
- [ ] 前年度の作付けをコピーできる
- [ ] スマホで圃場情報を参照できる
2. **品質要件**
- [ ] PCで快適に操作できるレスポンス1秒以内
- [ ] スマホで見やすい文字サイズ16px以上
- [ ] 出力されるPDFが正確で見やすい手動検証でOK
- [ ] PDFをA4用紙に印刷してそのまま提出できる
3. **ユーザビリティ**
- [ ] 作付け計画の登録が10分以内で完了する
- [ ] 申請書のダウンロードが3クリック以内で完了する
- [ ] スマホでの圃場検索が3タップ以内で完了する

View File

@@ -0,0 +1,453 @@
# データ仕様書
> **最終更新**: 2026-02-16
> **変更履歴**: M:N関係に更新、中山間モデル全17列対応、面積単位統一、帳票仕様追加
## 📊 データ構造の全体像
このシステムで扱うデータは3種類
1. **実圃場データ**(吉田農地台帳.ods- 実際に作業する農地
2. **共済マスタ**(水稲共済細目用.ods- 申請書用の区画
3. **中山間マスタ**(中山間.ods- 申請書用の区画
**紐付けの関係:**
- 実圃場 ↔ 共済区画: **M対N**複数の実圃場が1つの共済区画に対応、また1つの実圃場が複数の共済区画に対応するケースもある
- 実圃場 ↔ 中山間区画: **M対N**(同上)
```mermaid
erDiagram
実圃場 }o--o{ 共済区画 : "紐づく(M:N)"
実圃場 }o--o{ 中山間区画 : "紐づく(M:N)"
実圃場 ||--o{ 作付け計画 : "持つ(1:N)"
作付け計画 }o--|| 作物 : "参照"
作付け計画 }o--o| 品種 : "参照(任意)"
作物 ||--o{ 品種 : "持つ"
実圃場 {
int id PK
string 名称
string 住所
decimal 面積_反
int 面積_m2
string 地主
string グループ名
int 表示順
string 細目_耕地番号 "共済紐付けキー(raw)"
string 細目_分筆番号 "共済紐付けキー(raw)"
string 中山間_ID "中山間紐付けキー(raw)"
}
共済区画 {
int id PK
string 地名_地番
int 耕地番号
int 分筆番号
decimal 本地面積_m2
string 漢字地名
}
中山間区画 {
int id PK
string 中山間ID
string 中山間フラグ
string 大字
string 字
string 地番
string 枝番
string 地目
int 農地面積_m2
int 植栽面積_m2
string 作付け品目_元
string 協定管理者
string 所有者
string 傾斜度
int 基本金額
decimal 超急傾斜加算額
decimal スマート農業加算額
int 交付金額
}
作付け計画 {
int id PK
int 実圃場_id FK
int 年度
int 作物_id FK
int 品種_id FK_nullable
text 備考
}
作物 {
int id PK
string 作物名
}
品種 {
int id PK
int 作物_id FK
string 品種名
}
```
---
## 1. 実圃場データ(吉田農地台帳.ods
### ファイル情報
- **行数:** 39行39筆の圃場
- **列数:** 7列
### カラム定義
| カラム名 | データ型 | 必須 | 説明 | 例 |
|---------|---------|-----|------|---|
| 名称 | string | ○ | 圃場の名称(自由記述) | "口神 1反2畝" |
| 住所 | string | ○ | 圃場の住所 | "口神笹ヶ谷374-1)" |
| 面積(反) | float | ○ | 面積(単位: 反※1反=1000m2=10a | 1.20 |
| 地主 | string | ○ | 地主の氏名 | "山崎 出祥" |
| 細目_耕地番号 | int | ○ | 共済マスタとの紐付けキー1/2 | 2 |
| 細目_分筆番号 | int | ○ | 共済マスタとの紐付けキー2/2 | 1 |
| 中山間_ID | int | △ | 中山間マスタとの紐付けキー | 50 |
### DBモデルField
| フィールド名 | データ型 | 説明 |
|-------------|---------|------|
| name | CharField(100) | 圃場名 |
| address | CharField(255) | 住所 |
| area_tan | DecimalField(6,4) | 面積(反) |
| area_m2 | IntegerField | 面積m2= area_tan × 1000 |
| owner_name | CharField(100) | 所有者名 |
| group_name | CharField(50), nullable | グループ名(エリアや用途による分類) |
| display_order | IntegerField, default=0 | リスト表示時の順序 |
| raw_kyosai_k_num | CharField(20), nullable | 細目_耕地番号インポート元の値 |
| raw_kyosai_s_num | CharField(20), nullable | 細目_分筆番号インポート元の値 |
| raw_chusankan_id | CharField(20), nullable | 中山間_IDインポート元の値 |
| kyosai_fields | ManyToManyField → OfficialKyosaiField | 関連共済マスタM:N |
| chusankan_fields | ManyToManyField → OfficialChusankanField | 関連中山間マスタM:N |
| location | PointField, nullable | 位置情報Phase 1では未使用 |
### データサンプル
```
名称 住所 面積(反) 細目_耕地番号 細目_分筆番号 中山間_ID
口神 1反2畝 口神笹ヶ谷374-1) 1.20 2 1 50
口神 北東 口神笹ヶ谷374-1) 0.40 2 2 50
口神 北中 口神笹ヶ谷374-1) 0.43 2 2 50
```
### 特記事項
- **中山間_IDは一部NULL**: 39筆中2筆が中山間の対象外`NaN`
- **同じ共済区画に複数の実圃場**: 例えば共済キー「2-2」には3つの実圃場が紐づく
- **1つの実圃場が複数の申請区画に紐づくケースもある**: M:N関係で対応
- **面積単位**: DB内部では「反DecimalField」と「m2IntegerField」の両方を保持する変換: 1反=1000m2
- **グループ機能**: group_name でエリア分け、display_order で表示順を制御
---
## 2. 共済マスタ(水稲共済細目用.ods
### ファイル情報
- **行数:** 31行31区画
- **列数:** 5列
### カラム定義
| カラム名 | データ型 | 必須 | 説明 | 例 |
|---------|---------|-----|------|---|
| 地名 地番 | string | ○ | 地名と地番(スペース区切り) | "四万十町 ササガタニ 374-1" |
| 耕地番号 | int | ○ | 共済区画の識別子1/2 | 2 |
| 分筆番号 | int | ○ | 共済区画の識別子2/2 | 1 |
| 本地面積 (m2) | float | ○ | 申請上の面積(単位: m2 | 25.4 |
| 漢字地名 | string | ○ | 漢字表記の地名 | "四万十町 笹ヶ谷 374-1" |
### DBモデルOfficialKyosaiField
| フィールド名 | データ型 | 説明 |
|-------------|---------|------|
| k_num | IntegerField | 耕地番号 |
| s_num | IntegerField | 分筆番号 |
| address | CharField(200) | 地名地番 |
| kanji_name | CharField(200) | 漢字地名 |
| area | IntegerField | 本地面積m2 |
**制約:** (k_num, s_num) のペアで一意unique_together
### データサンプル
```
地名 地番 耕地番号 分筆番号 本地面積(m2) 漢字地名
四万十町 ササガタニ 374-1 2 1 25.4 四万十町 笹ヶ谷 374-1
四万十町 ササガタニ 374-1 2 2 12.0 四万十町 笹ヶ谷 374-1
```
### 特記事項
- **面積の不整合は許容**: 役場データが古いため、実圃場の合計面積と一致しないことがある
- 例: 共済キー「2-2」の面積は12.0m2だが、実圃場の合計は1.33反=1330m2
- これは「そういうもの」として扱い、システム側で修正しない
- **重複キーなし**: (耕地番号, 分筆番号)の組み合わせは一意
---
## 3. 中山間マスタ(中山間.ods
### ファイル情報
- **行数:** 71行71区画
- **列数:** 17列全列をDBに保存
### カラム定義全17列
| カラム名 | データ型 | 必須 | 説明 | 例 |
|---------|---------|-----|------|---|
| ID | int | ○ | 中山間区画の識別子 | 1 |
| 中山間 | string | ○ | 中山間フラグ | "" |
| 大字 | string | ○ | 大字名 | "口神ノ川" |
| 字 | string | ○ | 字名 | "壱町切" |
| 地番 | string | ○ | 地番(数値でないケースあり:イ、ロ等) | "1694" |
| 枝番 | string | △ | 枝番(-, 1, イ, ロ等) | "-" |
| 地目 | string | ○ | 地目 | "田" |
| 農地面積 | int | ○ | 農地面積m2 | 2900 |
| 植栽面積 | int | ○ | 植栽面積m2 | 2748 |
| 作付け品目 | string | △ | 役場が記入した作付け品目 | "ニラ" |
| 協定管理者 | string | ○ | 協定管理者名 | "神山倫子" |
| 所有者 | string | △ | 所有者名NULLあり | "谷脇史男" |
| 傾斜度 | string | ○ | 傾斜度 | "1/29" |
| 基本金額 | int | ○ | 基本金額(円) | 23200 |
| 超急傾斜加算額 | decimal | △ | 超急傾斜加算額(円) | 0.0 |
| スマート農業加算額 | decimal | △ | スマート農業加算額(円) | 14500 |
| 交付金額 | int | ○ | 交付金額合計(円) | 37700 |
### DBモデルOfficialChusankanField
| フィールド名 | データ型 | 説明 |
|-------------|---------|------|
| c_id | CharField(20), unique | 中山間ID |
| chusankan_flag | CharField(10), nullable | 中山間フラグ(〇等) |
| oaza | CharField(100) | 大字 |
| aza | CharField(100) | 字 |
| chiban | CharField(50) | 地番(文字列:イ、ロ等があるため) |
| branch_num | CharField(20), nullable | 枝番(-, 1, イ, ロ等) |
| land_type | CharField(20), nullable | 地目(田, 畑等) |
| area | IntegerField | 農地面積m2 |
| planting_area | IntegerField, nullable | 植栽面積m2 |
| original_crop | CharField(100), nullable | 作付け品目(役場記入の元データ) |
| manager | CharField(100), nullable | 協定管理者 |
| owner | CharField(100), nullable | 所有者 |
| slope | CharField(20), nullable | 傾斜度 |
| base_amount | IntegerField, nullable | 基本金額(円) |
| steep_slope_addition | DecimalField, nullable | 超急傾斜加算額(円) |
| smart_agri_addition | DecimalField, nullable | スマート農業加算額(円) |
| payment_amount | IntegerField, nullable | 交付金額(円) |
### データサンプル
```
ID 中山間 大字 字 地番 枝番 地目 農地面積 植栽面積 作付け品目 協定管理者 所有者 傾斜度 基本金額 交付金額
1 口神ノ川 壱町切 1694 - 田 2900 2748 ニラ 神山倫子 1/29 23200 37700
2 口神ノ川 大窪 490 1 田 652 490 野菜 谷脇誠一 谷脇史男 1/20 15204 18824
```
### 特記事項
- **全17列をDBに保存**: 将来どの列が必要になるかわからないため全保存
- **地番・枝番は文字列型**: 「イ」「ロ」などの非数値データが入る
- **作付け品目は参考情報**: 役場が記入した値。システムの作付け計画Planとは別
- **面積の不整合は許容**: 共済マスタと同様、実圃場との差異は受け入れる
---
## 4. 作付け計画データ(システム内部)
### DBモデルPlan
| フィールド名 | データ型 | 必須 | 説明 |
|-------------|---------|-----|------|
| id | int (自動) | ○ | 主キー |
| field | FK → Field | ○ | 実圃場(外部キー) |
| year | IntegerField | ○ | 年度2025など |
| crop | FK → Crop, nullable | △ | 作物(外部キー) |
| variety | FK → Variety, nullable | △ | 品種外部キー、NULLあり |
| notes | TextField, nullable | △ | 備考 |
### 制約
- **ユニーク制約**: (field, year) - 1つの圃場に対して1年度につき1つの作付け計画のみ
- Phase 2で二毛作対応する場合は、この制約を見直す
### 備考
- planting_date播種日、harvest_date収穫日は Phase 2 で追加予定
- crop, variety は外部キー(文字列ではなくリレーション)
---
## 5. 作物マスタ
### DBモデルCrop
| フィールド名 | データ型 | 説明 |
|-------------|---------|------|
| id | int (自動) | 主キー |
| name | CharField(50), unique | 作物名 |
### DBモデルVariety
| フィールド名 | データ型 | 説明 |
|-------------|---------|------|
| id | int (自動) | 主キー |
| crop | FK → Crop | 所属する作物 |
| name | CharField(100) | 品種名 |
**制約:** (crop, name) のペアで一意
### 作物・品種の管理方針
- 初期データは投入しない管理画面またはUIから登録
- すべての作物で品種選択UIは統一
- 「作付けしない」系も特別扱いしない(「その他」作物の品種として扱う)
- 品種の追加・削除は作付け計画画面から可能
---
## 6. データインポート仕様
### 初期セットアップ時
1. **共済マスタのインポート**
- `水稲共済細目用.ods` を読み込み
- `OfficialKyosaiField` テーブルに保存
2. **中山間マスタのインポート**
- `中山間.ods` を読み込み
- `OfficialChusankanField` テーブルに全17列を保存
3. **実圃場データのインポート**
- `吉田農地台帳.ods` を読み込み
- `Field` テーブルに保存
- 同時に共済・中山間マスタとの紐付けを確立ManyToMany:
- `細目_耕地番号` + `細目_分筆番号``OfficialKyosaiField` を検索して M:N 関連に追加
- `中山間_ID``OfficialChusankanField` を検索して M:N 関連に追加
### 紐付けロジック
```python
# 共済マスタとの紐付けM:N
kyosai_record = OfficialKyosaiField.objects.get(
k_num=row['細目_耕地番号'],
s_num=row['細目_分筆番号']
)
field.kyosai_fields.add(kyosai_record)
# 中山間マスタとの紐付けM:N
if pd.notna(row['中山間_ID']):
chusankan_record = OfficialChusankanField.objects.get(
c_id=str(int(row['中山間_ID']))
)
field.chusankan_fields.add(chusankan_record)
```
---
## 7. 申請書PDF出力ロジック
### 水稲共済細目書
**出力形式:**
- A4サイズ、縦向き
- ヘッダー: 「水稲共済細目書YYYY年度
- 表形式罫線あり、1行1区画31行
- フォントサイズ: 10pt
- ページ番号あり
**表の列:**
| 列名 | データ元 | 備考 |
|------|---------|------|
| 漢字地名 | OfficialKyosaiField.kanji_name | 例: 四万十町 笹ヶ谷 374-1 |
| 耕地-分筆 | k_num + "-" + s_num | 例: 2-1 |
| 本地面積 (m2) | OfficialKyosaiField.area | |
| 作付品目 | Plan.crop.name | システムの作付け計画から |
| 品種 | Plan.variety.name | 〃 |
| 圃場名称 | Field.name | 吉田農地台帳の名称 |
**集計ロジック:**
1. 共済マスタ31区画をループ
2. 各共済区画に紐づく実圃場を取得M:N関係
3. 紐づく実圃場の作付け情報を集約(作物名・品種名・圃場名をカンマ区切り)
4. HTMLテンプレートで表を生成 → WeasyPrint で PDF変換
5. 複数の実圃場が紐づく場合 → 作物・品種・圃場名をカンマ区切りで列挙
6. 作付け未設定の場合 → 「未設定」と表示
### 中山間交付金申請
**出力形式:**
- A4サイズ、横向き列が多いため
- ヘッダー: 「中山間地域等直接支払交付金YYYY年度
- 表形式罫線あり、1行1区画71行
- ページ番号あり
**表の列:**
| 列名 | データ元 | 備考 |
|------|---------|------|
| 所在地 | 大字+字+地番+枝番 連結 | 例: 口神ノ川 壱町切 1694 |
| 植栽面積 | OfficialChusankanField.planting_area | m2 |
| 作付け品目(元) | OfficialChusankanField.original_crop | 役場記入の値 |
| 協定管理者 | OfficialChusankanField.manager | |
| 所有者 | OfficialChusankanField.owner | |
| 作物 | Plan.crop.name | システムの作付け計画から |
| 品種 | Plan.variety.name | 〃 |
| 圃場名称 | Field.name | 吉田農地台帳の名称 |
**集計ロジック:**
- 水稲共済と同様、中山間マスタをループして実圃場を集約 → HTMLテンプレート → PDF
---
## 8. データ移行・メンテナンス
### 年度更新
- **圃場マスタ**: 年度をまたいで共通(更新不要)
- **作付け計画**: 年度ごとに独立(前年度コピー機能で複製)
### マスタデータの更新
- **共済・中山間マスタ**: 役場から新しいファイルをもらった場合、再インポート
- 既存データは上書きせず、差分を確認してマージ
- または、全削除→再インポートの2段階処理
### バックアップ
- 全テーブルをCSV/Excelでエクスポート可能にするサーバー移行時にも利用
- 最低5年分のデータを保持補助金監査対応
---
## 9. 面積単位の扱い
システム内部では以下のように統一:
| 用途 | 単位 | DB型 | 変換式 |
|-----|------|------|--------|
| 実圃場の面積DB保存 | 反 + m2 | DecimalField + IntegerField | 1反 = 1000m2 |
| 共済マスタの面積DB保存 | m2 | IntegerField | - |
| 中山間マスタの面積DB保存 | m2 | IntegerField | - |
| 画面表示 | 反 | - | area_m2 / 1000 |
**実装方針:**
- 実圃場: `area_tan`DecimalField`area_m2`IntegerFieldの両方を保持
- 共済・中山間マスタ: `area` は m2IntegerFieldで保存
- 表示時は「反」に統一1反 = 10a = 1000m2
- 入力時は「反」で受け付け、内部で `m2` に変換
---
## 10. データ整合性チェック
### チェック項目
1. **紐付けの存在確認**
- 実圃場の `細目_耕地番号`/`細目_分筆番号` が共済マスタに存在するか
- 実圃場の `中山間_ID` が中山間マスタに存在するか
2. **面積の整合性(参考情報)**
- 1つの共済区画に紐づく実圃場の合計面積と、共済マスタの面積を比較
- ⚠️ 不整合があっても警告のみ(修正はしない)
3. **作付け未設定の検出**
- 指定年度で作付け計画が未設定の圃場をリストアップ
### 実装
- インポート時にバリデーションを実行
- 管理画面で「データ整合性レポート」を表示

View File

@@ -0,0 +1,815 @@
# 画面設計書
> **最終更新**: 2026-02-16
> **変更履歴**: 実装済み機能との差異を解消B-1〜B-5, C-6, E-1 反映)
## 🎨 デザイン原則(再掲)
1. **シンプル・イズ・ベスト**: 1画面1機能
2. **情報の優先順位**: 最重要情報を最も目立つ位置に
3. **エラーを起こしにくい**: 選択式優先、自由入力最小限
4. **スマホファースト(参照時)**: 文字16px以上、タップ領域44px以上
5. **既存データを尊重**: 紙の台帳と同じ感覚で使える
---
## 🧭 共通ナビゲーションNavbar
### PC レイアウト
上部に水平ナビゲーションバーを常時表示。ブランド名「KeinaSystem」と主要画面へのリンクを配置。
```
┌──────────────────────────────────────────────────────────────┐
│ 🌾 KeinaSystem [作付け計画] [圃場管理] [帳票出力] [データ取込] [ログアウト] │
└──────────────────────────────────────────────────────────────┘
```
### ナビゲーション項目
| アイコン | ラベル | パス | 説明 |
|---------|--------|------|------|
| 🌾 (Wheat) | 作付け計画 | `/allocation` | 作付け計画編集画面(メイン) |
| 📍 (MapPin) | 圃場管理 | `/fields` | 圃場一覧・編集 |
| 📄 (FileText) | 帳票出力 | `/reports` | 申請書PDFダウンロード |
| ⬆️ (Upload) | データ取込 | `/import` | マスタインポート |
### 仕様
- アクティブなページのリンクは緑背景でハイライト
- ログアウトボタンは右端に配置
- スマホではレスポンシブにタブバーまたはハンバーガーメニューに切り替え
---
## 📱 画面一覧
### Phase 1MVP
1. **ログイン画面** (`/login`)
2. **ダッシュボード** (`/`) — 将来拡張用、Phase 1では簡易版
3. **作付け計画一覧・編集** (`/allocation`) — メイン画面、インライン編集方式
4. **圃場管理一覧** (`/fields`) — 圃場の一覧表示・グループ管理・表示順管理
5. **圃場詳細・編集** (`/fields/[id]`) — 個別圃場の情報編集
6. **圃場新規作成** (`/fields/new`) — 手動での圃場登録
7. **申請書ダウンロード** (`/reports`) — PDFダウンロード
8. **データ取込** (`/import`) — インポート
### Phase 2以降
9. 栽培履歴入力
10. 作業カレンダー
11. 資材計画
---
## 画面1: ログイン画面
### 目的
シンプルな認証(ユーザー名+パスワード)
### レイアウトPC/スマホ共通)
```
┌─────────────────────────────────────┐
│ │
│ 🌾 Keina System │
│ 作付け計画管理システム │
│ │
│ ┌───────────────────────┐ │
│ │ ユーザー名 │ │
│ │ [___________________] │ │
│ └───────────────────────┘ │
│ │
│ ┌───────────────────────┐ │
│ │ パスワード │ │
│ │ [___________________] │ │
│ └───────────────────────┘ │
│ │
│ [ ログイン ] │
│ │
└─────────────────────────────────────┘
```
### 機能要件
- [x] ユーザー名とパスワードで認証JWT
- [x] ログイン成功 → 作付け計画画面へ遷移
- [x] ログイン失敗 → エラーメッセージ表示
- [ ] 「パスワードを忘れた」リンクPhase 2
---
## 画面2: ダッシュボード
### 目的
システムの入り口Phase 1では簡易版、将来拡張
### 現在の実装
- `/` アクセス時、トークンの有無で `/allocation`(ログイン済み)か `/login`(未ログイン)にリダイレクト
- ダッシュボード画面自体は未実装
### レイアウト将来実装予定、PC
```
┌────────────────────────────────────────────────────┐
│ 🌾 KeinaSystem [作付け計画] [圃場管理] ... │
├────────────────────────────────────────────────────┤
│ │
│ 📊 概要 │
│ ┌────────────────┬────────────────┬─────────────┐│
│ │ 全圃場数 │ 作付け済み │ 未割当 ││
│ │ 39筆 │ 35筆 │ 4筆 ❗ ││
│ └────────────────┴────────────────┴─────────────┘│
│ │
│ 🔗 クイックアクセス │
│ ┌──────────────────────────────────────────────┐│
│ │ [📝 作付け計画を編集] [📄 申請書ダウンロード] ││
│ └──────────────────────────────────────────────┘│
│ │
│ 📌 最近の変更 │
│ • 2025/02/10: 田A に「米(にこまる)」を割当 │
│ • 2025/02/09: 田B を「休耕」に変更 │
│ │
└────────────────────────────────────────────────────┘
```
### 機能要件(将来実装予定)
- [ ] 年度選択(ドロップダウン)
- [ ] 作付け状況のサマリー表示
- [ ] 「作付け計画を編集」→ 画面3へ
- [ ] 「申請書ダウンロード」→ 画面7へ
- [ ] 将来の機能追加時にボタンを追加していく想定
---
## 画面3: 作付け計画一覧・編集(メイン画面)
### 目的
全圃場の作付け状況を一覧で確認し、**インライン**で直接編集
### 編集方式
**インライン編集**を採用モーダルではない。テーブル行内のドロップダウンで作物・品種を選択し、変更は即座にAPIに保存される。
### レイアウトPC
```
┌──────────────────────────────────────────────────────────────────┐
│ 🌾 KeinaSystem [作付け計画] [圃場管理] [帳票出力] [データ取込] │
├──────┬───────────────────────────────────────────────────────────┤
│ │ │
│ 📊 │ 年度: [2025 ▼] 並び順: [カスタム順 ▼] │
│ 集計 │ │
│ │ ──────────────────────────────────────────────────────── │
│ ──── │ グループ 圃場名 面積 作物 品種 備考 順序│
│ 合計 │ ──────────────────────────────────────────────────────── │
│20.0反│ [口神_▼] おまけ 0.2反 [米 ▼] [にこまる▼] [___] ↑↓│
│ │ [口神_▼] 口神1反 1.2反 [米 ▼] [にこまる▼] [___] ↑↓│
│ 米 │ [口神_▼] 口神北東 0.4反 [野菜 ▼] [トマト▼] [___] ↑↓│
│15.3反│ [南__▼] 口神北中 0.4反 [-- ▼] [---------] [___] ↑↓│
│┣にこ │ [南__▼] 口神北西 0.5反 [その他 ▼] [完全休耕▼] [___] ↑↓│
││10.2反│ │
│┗たち │ ... (39行) │
││5.1反│ │
│ │ │
│未設定│ │
│2.0反❗ │
└──────┴───────────────────────────────────────────────────────────┘
```
**サイドバー(集計パネル、開閉可能):**
```
┌──────────────┐
│ 集計 [×] │← 閉じるボタン
├──────────────┤
│ 合計 20.0反 │
│ │
│ 米 │
│ 15.3反 │
│ ├にこまる │
│ │ 10.2反 │
│ └たちはるか │
│ 5.1反 │
│ │
│ 野菜 │
│ 3.2反 │
│ │
│ その他 │
│ 1.5反 │
│ │
│ ❗未設定 │
│ 2.0反 │
└──────────────┘
```
### レイアウト(スマホ)
```
┌────────────────────────────────────┐
│ 🌾 作付け計画 [2025▼] [集計] ☰ │
├────────────────────────────────────┤
│ 並び順: [カスタム順 ▼] │
├────────────────────────────────────┤
│ ┌────────────────────────────────┐│
│ │ おまけ 0.2反 ││
│ │ グループ: [口神___▼] ││
│ │ 作物: [米 ▼] 品種: [にこまる▼]││
│ │ 備考: [___________________] ││
│ └────────────────────────────────┘│
│ │
│ ┌────────────────────────────────┐│
│ │ 口神 北中 0.4反 ││
│ │ グループ: [南___▼] ││
│ │ 作物: [-- ▼] 品種: [------] ││
│ │ 備考: [___________________] ││
│ └────────────────────────────────┘│
│ │
│ ... (39圃場) │
└────────────────────────────────────┘
```
**スマホ: 集計モーダル**[集計]ボタンで表示)
```
┌────────────────────────────────┐
│ 集計 [×] │
├────────────────────────────────┤
│ 合計面積: 20.0反 │
│ │
│ 米: 15.3反 │
│ ├ にこまる: 10.2反 │
│ └ たちはるか: 5.1反 │
│ │
│ 野菜: 3.2反 │
│ │
│ その他: 1.5反 │
│ │
│ ❗未設定: 2.0反 │
│ │
│ [閉じる] │
└────────────────────────────────┘
```
### 機能要件
- [x] 全圃場を一覧表示39行
- [x] 各行に以下を表示:
- グループ名インライン編集可能、datalist補完付き
- 圃場名
- 面積(反)
- 作物(ドロップダウン、インライン選択)
- 品種(ドロップダウン、作物選択後に有効化)
- 備考(テキスト入力)
- 表示順変更ボタン(↑↓、カスタム順モード時のみ)
- [x] 年度切り替え(ドロップダウン)
- [x] 並び替え機能:
- カスタム順display_order
- グループ順group_name
- 作付け順crop別
- [x] **インライン即時保存**: 作物・品種・備考を変更すると即座にAPIに保存画面遷移なし、スクロール位置維持
- [x] **集計サイドバーPC**:
- 閉じるボタンで非表示可能
- 作物別の合計面積
- 品種別の内訳(ツリー表示、展開可能)
- 未設定の面積を警告表示
- 作付け変更時にリアルタイム更新
- [x] **集計モーダル(スマホ)**:
- [集計]ボタンでサイドパネル表示
- PC版と同じ内容
- [ ] 検索機能(圃場名・住所で部分一致検索)— **未実装**
- [ ] フィルタ機能(作物で絞り込み、未割当のみトグル)— **未実装**
- [ ] チェックボックスによる一括操作 — **未実装**
- [ ] [前年度をコピー]ボタン — **Backend APIあり、Frontendボタン未実装**
### デザインノート
- **未割当の強調**: 作物未設定の行は目立つ表示
- **即時保存**: ユーザーが選択を変更するたびにバックグラウンドで保存(ローディングスピナーなし)
- **スクロール維持**: 保存時に画面がリセットされない
- **サイドバーの幅**: 約200px固定
---
## 画面4: 圃場管理一覧
### 目的
圃場マスタの管理(一覧表示、グループ編集、表示順変更、削除)。
**対応表モード**で共済・中山間マスタとの紐づけを一覧確認・直接編集。
### レイアウトPC— 通常モード
```
┌──────────────────────────────────────────────────────────────────┐
│ 🌾 KeinaSystem [作付け計画] [圃場管理] [帳票出力] [データ取込] │
├──────────────────────────────────────────────────────────────────┤
│ │
│ 並び順: [表示順 ▼] 表示: [通常] [対応表] [+ 新規作成] │
│ │
│ ───────────────────────────────────────────────────────────── │
│ 順序 圃場名 グループ 住所 面積 所有者 共済 中山間 操作│
│ ───────────────────────────────────────────────────────────── │
│ 1 おまけ [口神__▼] 口神ノ川... 0.2反 吉田 1件 - ✏️🗑│
│ 2 口神1反 [口神__▼] 口神ノ川... 1.2反 吉田 1件 1件 ✏️🗑│
│ │
│ ... (39行) │
└──────────────────────────────────────────────────────────────────┘
```
### レイアウトPC— 対応表モード
```
┌──────────────────────────────────────────────────────────────────────────┐
│ 🌾 KeinaSystem [作付け計画] [圃場管理] [帳票出力] [データ取込] │
├──────────────────────────────────────────────────────────────────────────┤
│ │
│ 並び順: [表示順 ▼] 表示: [通常] [対応表] [+ 新規作成] │
│ │
│ ───────────────────────────────────────────────────────────────────── │
│ 圃場名 面積 共済(漢字地名) 中山間(所在地) │
│ ───────────────────────────────────────────────────────────────────── │
│ おまけ 0.2反 1-1 四万十町 足川 351 [×] - │
│ [+] [+]│
│ 口神 1反2畝 1.2反 2-2 四万十町 笹ヶ谷 374-1 [×] ID50 笹ヶ谷374 [×]│
│ [+] [+]│
│ ソーラーの上 0.8反 21-1 四万十町 大窪 592-1 [×] ID62 大窪592 [×]│
│ ID61 大窪592 [×]│
│ [+] [+]│
│ ───────────────────────────────────────────────────────────────────── │
│ ... (39行) │
└──────────────────────────────────────────────────────────────────────────┘
```
**対応表モードの特徴:**
- 各行に圃場名・面積・共済の漢字地名・中山間の所在地を横並び表示
- 複数紐づけがある場合は同一セル内で改行表示
- 各紐づけレコードの横に [×] ボタンで紐づけ解除
- 各セルの末尾に [+] ボタンで紐づけ追加(モーダル表示)
- 通常モードの順序・グループ・削除操作は非表示(対応表モードは紐づけ管理に集中)
### 機能要件
- [x] 全圃場を一覧表示(テーブル形式)
- [x] 表示列: 順序番号、圃場名、グループ名、住所、面積(反)、面積(m2)、所有者、操作
- [x] **グループ名のインライン編集**: datalist による候補表示付きテキスト入力
- [x] **表示順変更**: ↑↓ ボタンで順序入れ替え(表示順モード時)
- [x] 並び順の切り替え(グループ順、表示順、登録順)
- [x] [新規作成]ボタン → 画面6へ遷移
- [x] [✏️ 編集]ボタン → 画面5圃場詳細へ遷移
- [x] [🗑 削除]ボタン → 確認ダイアログ後に削除
- [x] **紐づけ状況列E-2** — 通常モードに「共済」「中山間」件数列を表示
- [ ] **対応表モードE-2****未実装**
- [ ] 表示切替トグル: [通常] [対応表] ボタン
- [ ] 対応表モードの表示列: 圃場名、面積(反)、共済(漢字地名)、中山間(所在地)
- [ ] 共済列: 耕地-分筆 + 漢字地名を表示。複数あれば改行
- [ ] 中山間列: ID + 大字+字+地番を表示。複数あれば改行
- [ ] 各紐づけレコードに [×] ボタン(確認ダイアログ付き紐づけ解除)
- [ ] 各セルに [+] ボタン(追加モーダル表示 → 画面5と同じLinkModal
- [ ] 紐づけなしの場合は「-」をグレー表示
---
## 画面5: 圃場詳細・編集
### 目的
個別の圃場情報を確認・編集。共済/中山間マスタとの紐づけ管理。田んぼにいるときにスマホで確認する用途も想定。
### レイアウトPC
```
┌────────────────────────────────────────────────────────────┐
│ ← 一覧に戻る │
├────────────────────────────────────────────────────────────┤
│ │
│ 圃場名 住所 │
│ [口神 北中___________] [口神笹ヶ谷374-1)___] │
│ │
│ 面積(反) 面積m2 所有者 グループ名 │
│ [0.4___] [400___] [吉田___] [口神___] │
│ │
│ [保存] │
│ │
├────────────────────────────────────────────────────────────┤
│ │
│ 📋 共済情報 (2件 / 計800m2) [+追加] │
│ ─────────────────────────────────────────────────────── │
│ 耕地-分筆 漢字地名 住所 面積(m2) 操作│
│ ─────────────────────────────────────────────────────── │
│ 2-1 四万十町 笹ヶ谷 374-1 笹ヶ谷... 400 [×]│
│ 2-2 四万十町 笹ヶ谷 374-2 笹ヶ谷... 400 [×]│
│ │
├────────────────────────────────────────────────────────────┤
│ │
│ 📋 中山間情報 (1件 / 計400m2) [+追加] │
│ ─────────────────────────────────────────────────────── │
│ ID 所在地 面積(m2) 支払金額 操作 │
│ ─────────────────────────────────────────────────────── │
│ 50 口神ノ川 壱町切 1694 400 ¥8,000 [×] │
│ │
└────────────────────────────────────────────────────────────┘
```
**[+追加]ボタン押下時 — 紐づけ追加モーダル:**
```
┌────────────────────────────────────────────┐
│ 共済区画を追加 [×] │
├────────────────────────────────────────────┤
│ │
│ 🔍 [検索: 地番・漢字地名で絞り込み____] │
│ │
│ ─────────────────────────────────────── │
│ □ 3-1 四万十町 笹ヶ谷 375 300m2 │
│ □ 4-1 四万十町 笹ヶ谷 376 250m2 │
│ □ 5-1 四万十町 口神ノ川 198 500m2 │
│ ─────────────────────────────────────── │
│ ※ 既に他の圃場に紐づいている区画は │
│ (🔗 圃場名) で表示 │
│ │
│ [選択した区画を追加] │
│ │
└────────────────────────────────────────────┘
```
### レイアウト(スマホ)
```
┌────────────────────────────────────┐
│ ← 一覧に戻る │
├────────────────────────────────────┤
│ │
│ 圃場名 │
│ [口神 北中________________] │
│ 住所 │
│ [口神笹ヶ谷374-1)__] │
│ 面積(反) 面積m2
│ [0.4___] [400___] │
│ 所有者 グループ名 │
│ [吉田___] [口神___] │
│ │
│ [保存] │
│ │
├────────────────────────────────────┤
│ 📋 共済情報 (2件/計800m2) [+追加] │
│ ┌──────────────────────────────┐│
│ │ 2-1 四万十町笹ヶ谷374-1 ││
│ │ 400m2 [×] ││
│ └──────────────────────────────┘│
│ ┌──────────────────────────────┐│
│ │ 2-2 四万十町笹ヶ谷374-2 ││
│ │ 400m2 [×] ││
│ └──────────────────────────────┘│
│ │
├────────────────────────────────────┤
│ 📋 中山間情報 (1件/計400m2)[+追加]│
│ ┌──────────────────────────────┐│
│ │ ID50 口神川壱町切1694 ││
│ │ 400m2 ¥8,000 [×] ││
│ └──────────────────────────────┘│
│ │
└────────────────────────────────────┘
```
### 機能要件
- [x] 圃場の基本情報を編集フォームで表示
- [x] 編集可能フィールド: 圃場名、住所、面積(反)、面積(m2)、所有者、グループ名
- [x] [保存]ボタン → PATCH API で更新
- [x] [← 一覧に戻る] → `/fields` へ遷移
- [x] エラーメッセージ表示
- [x] 共済情報の読み取り専用テーブル表示A-8 完了)
- [x] 中山間情報の読み取り専用テーブル表示A-8 完了)
- [ ] **紐づけ管理機能E-2: 対応付け可視化・編集)****未実装**
- [ ] 共済/中山間セクションに [+追加] ボタン
- [ ] 追加モーダル: 未紐づけの区画一覧から選択して追加
- [ ] 検索フィルタ地番、漢字地名、IDで絞り込み
- [ ] 既に他の圃場に紐づいている区画は紐づけ先を表示M:N のため追加は可能)
- [ ] 各行に [×] ボタンで紐づけ解除(区画自体は削除しない)
- [ ] 確認ダイアログ: 「この紐づけを解除しますか?」
- [ ] **面積参考表示E-2****未実装**
- [ ] セクション見出しに紐づけ区画の合計面積を小さく併記(例: 「共済情報 (2件 / 計800m2)」)
- [ ] ※ M:N関係の特性上、圃場面積と一致しないのが通常。警告アイコンやハイライトは表示しない
- [ ] 面積はあくまで参考情報として、件数と合計面積を淡いグレー文字で表示するのみ
- [ ] 将来的に栽培履歴も表示Phase 2
### 必要なAPIE-2 用)
| メソッド | エンドポイント | 説明 |
|---------|---------------|------|
| GET | `/api/kyosai-fields/` | 共済マスタ全件取得(紐づけ追加モーダル用) |
| GET | `/api/chusankan-fields/` | 中山間マスタ全件取得(紐づけ追加モーダル用) |
| POST | `/api/fields/{id}/kyosai-links/` | 共済紐づけ追加 `{ kyosai_field_ids: [1,2,3] }` |
| DELETE | `/api/fields/{id}/kyosai-links/{kyosai_id}/` | 共済紐づけ解除 |
| POST | `/api/fields/{id}/chusankan-links/` | 中山間紐づけ追加 `{ chusankan_field_ids: [1,2,3] }` |
| DELETE | `/api/fields/{id}/chusankan-links/{chusankan_id}/` | 中山間紐づけ解除 |
### デザインノート
- [+追加] ボタンはセクション見出しの右端に配置
- [×] ボタンは各行の右端、テキストリンクスタイル(赤系)
- **面積表示は控えめに**: 件数と合計面積をセクション見出しにグレー小文字で表示するのみ。M:N関係の特性上、圃場面積と合計面積は基本的に一致しないため、警告アイコンやハイライト色は一切使わない
- モーダルの区画一覧はチェックボックス選択式(複数同時追加可能)
---
## 画面6: 圃場新規作成
### 目的
手動で圃場を1件ずつ新規登録インポート以外の方法
### レイアウト
```
┌────────────────────────────────────┐
│ ← 一覧に戻る │
├────────────────────────────────────┤
│ │
│ 圃場名 │
│ [____________________________] │
│ │
│ 住所 │
│ [____________________________] │
│ │
│ 面積(反) │
│ [________] │
│ │
│ 面積m2
│ [________] │
│ │
│ 所有者 │
│ [____________________________] │
│ │
│ [作成] │
│ │
└────────────────────────────────────┘
```
### 機能要件
- [x] 各フィールドを入力して圃場を新規作成
- [x] [作成]ボタン → POST API で作成
- [x] 作成成功 → 圃場一覧へ遷移
- [x] バリデーションエラー → エラーメッセージ表示
### 補足
- インポートODS/Excelとの使い分け: 大量登録はインポート、1件追加は手動作成
- グループ名は新規作成時には設定不可(作成後に圃場一覧から設定)
---
## 画面7: 申請書ダウンロード
### 目的
水稲共済細目書・中山間交付金のPDFをダウンロード
### レイアウトPC
```
┌────────────────────────────────────────────────────┐
│ 🌾 KeinaSystem [作付け計画] [圃場管理] ... │
├────────────────────────────────────────────────────┤
│ │
│ 年度: [2025年度 ▼] │
│ │
│ ┌────────────────────────────────────────────────┐│
│ │ 📄 水稲共済細目書 ││
│ │ ││
│ │ 区画数: 31区画 ││
│ │ ││
│ │ ⚠️ 未割当の圃場: 4筆 ││
│ │ → 作付け計画を完成させてください ││
│ │ ││
│ │ [プレビュー] [PDFダウンロード] ││
│ └────────────────────────────────────────────────┘│
│ │
│ ┌────────────────────────────────────────────────┐│
│ │ 📄 中山間地域等直接支払交付金 ││
│ │ ││
│ │ 区画数: 71区画 ││
│ │ ││
│ │ ✅ 全て割当済み ││
│ │ ││
│ │ [プレビュー] [PDFダウンロード] ││
│ └────────────────────────────────────────────────┘│
│ │
└────────────────────────────────────────────────────┘
```
### 機能要件
- [x] 年度を選択
- [x] 各申請書について:
- [x] [PDFダウンロード]ボタン → ファイルダウンロード
- [ ] 区画数の表示 — **未実装**
- [ ] 未割当の警告表示 — **未実装**
- [ ] [プレビュー]ボタン → 新しいタブでPDF表示 — **未実装A-5**
- [ ] ダウンロードされるPDFのファイル名:
- 水稲共済: `水稲共済細目書_2025年度.pdf`
- 中山間: `中山間交付金_2025年度.pdf`
- [ ] PDFはA4サイズ、印刷してそのまま提出可能
---
## 画面7-A: PDF帳票フォーマット仕様
### 7-A-1: 水稲共済細目書 PDF
**基本仕様:**
- 用紙: A4 縦
- 表形式1行1区画、全31行
- ヘッダー: 「水稲共済細目書YYYY年度
- ページ番号あり
- 印刷してそのまま提出可能
**列定義:**
| # | 列名 | データ元 | 備考 |
|---|------|---------|------|
| 1 | 漢字地名 | OfficialKyosaiField.kanji_name | 例: 四万十町 笹ヶ谷 374-1 |
| 2 | 耕地-分筆 | k_num + "-" + s_num | 例: 2-1 |
| 3 | 本地面積 (m2) | OfficialKyosaiField.area | 内部 m2 で保存 |
| 4 | 作付品目 | Plan.crop.name | 作付け計画から取得 |
| 5 | 品種 | Plan.variety.name | 〃nullの場合は空欄 |
| 6 | 圃場名称 | Field.name | 吉田農地台帳の名称 |
**複数圃場紐づき時の扱い:**
- 1つの共済区画に複数の実圃場Fieldが紐づく場合 → 作物・品種・圃場名をカンマ区切りで列挙
- 例: 「米, 野菜」「にこまる, トマト」「口神北東, 口神北中」
**未設定時の扱い:**
- 作付け未設定の場合 → 作付品目列に「未設定」と表示
---
### 7-A-2: 中山間地域等直接支払交付金 PDF
**基本仕様:**
- 用紙: A4 横(列が多いため)
- 表形式1行1区画、全71行
- ヘッダー: 「中山間地域等直接支払交付金YYYY年度
- ページ番号あり
- 印刷してそのまま提出可能
**列定義:**
| # | 列名 | データ元 | 備考 |
|---|------|---------|------|
| 1 | 所在地 | 大字+字+地番+枝番 連結 | 例: 口神ノ川 壱町切 1694 |
| 2 | 植栽面積 | OfficialChusankanField.planting_area | m2 |
| 3 | 作付け品目(元) | OfficialChusankanField.original_crop | ODS「作付け品目」列役場記入の値 |
| 4 | 協定管理者 | OfficialChusankanField.manager | |
| 5 | 所有者 | OfficialChusankanField.owner | |
| 6 | 作物 | Plan.crop.name | 作付け計画から取得 |
| 7 | 品種 | Plan.variety.name | 〃nullの場合は空欄 |
| 8 | 圃場名称 | Field.name | 吉田農地台帳の名称 |
**複数圃場紐づき時の扱い:**
- 共済と同様、カンマ区切りで列挙
---
## 画面8: データ取込
### 目的
圃場マスタや申請マスタのインポート
### レイアウトPC
```
┌────────────────────────────────────────────────────┐
│ 🌾 KeinaSystem [作付け計画] [圃場管理] ... │
├────────────────────────────────────────────────────┤
│ │
│ 📥 データインポート │
│ │
│ ┌────────────────────────────────────────────────┐│
│ │ 吉田農地台帳(圃場マスタ) ││
│ │ ││
│ │ ファイルを選択: [ファイルを選択] 📎 ││
│ │ ││
│ │ ⚠️ 既存データは上書きされます ││
│ │ ││
│ │ [インポート実行] ││
│ └────────────────────────────────────────────────┘│
│ │
│ ┌────────────────────────────────────────────────┐│
│ │ 共済マスタ ││
│ │ ││
│ │ ファイルを選択: [ファイルを選択] 📎 ││
│ │ [インポート実行] ││
│ └────────────────────────────────────────────────┘│
│ │
│ ┌────────────────────────────────────────────────┐│
│ │ 中山間マスタ ││
│ │ ││
│ │ ファイルを選択: [ファイルを選択] 📎 ││
│ │ [インポート実行] ││
│ └────────────────────────────────────────────────┘│
│ │
│ 📤 データエクスポート │
│ • [全圃場データ (CSV)] ※バックアップ用 │
│ • [作付け計画 (CSV)] ※バックアップ用 │
│ │
└────────────────────────────────────────────────────┘
```
### 機能要件
- [x] 3種類のマスタを縦並びで表示タブではなく各セクション形式
- [x] ファイルアップロードODS/Excel対応
- [x] インポート実行(結果メッセージ表示)
- [ ] プレビュー機能(インポート前に確認)— **未実装**
- [ ] エクスポート機能CSV**未実装A-6**
---
## 🎨 UI共通仕様
### カラーパレット
```
プライマリカラー(緑系):
#2E7D32 濃い緑(ヘッダー、ボタン)
#4CAF50 緑(アクセント、アクティブなナビ項目)
#81C784 淡い緑(ホバー)
セカンダリカラー(土系):
#8D6E63 茶色(サブヘッダー)
#BCAAA4 淡い茶(背景)
警告・状態色:
#F44336 赤(エラー、未設定)
#FF9800 オレンジ(警告)
#4CAF50 緑(成功)
#2196F3 青(情報)
グレースケール:
#212121 ダークグレー(テキスト)
#757575 グレー(サブテキスト)
#E0E0E0 ライトグレー(ボーダー)
#FAFAFA ホワイト(背景)
```
### タイポグラフィ
```
フォント:
- システムフォント優先
- 日本語: "Noto Sans JP", "Hiragino Sans", "Yu Gothic", sans-serif
- 英数字: Inter, "Roboto", "Helvetica", sans-serif
サイズ:
- 見出し(h1): 28px / 太字
- 見出し(h2): 22px / 太字
- 本文: 16px / 通常
- 小文字: 14px / 通常
行間:
- 本文: 1.6
- 見出し: 1.3
```
### スペーシング
```
余白の基本単位: 8px
8px: 最小余白
16px: 標準余白(要素間)
24px: セクション間
32px: 画面の上下余白
```
### レスポンシブブレークポイント
```
スマートフォン: 〜767px
タブレット: 768px〜1023px
PC: 1024px〜
```
---
## 🖱️ インタラクション
### ボタン
- **プライマリボタン**: 緑背景、白文字、影付き
- **セカンダリボタン**: 白背景、緑文字、ボーダー付き
- **ホバー**: 10%明るく、カーソルpointer
- **押下**: 5%暗く、影を小さく
### インライン編集(作付け計画)
- **ドロップダウン**: 選択変更と同時にバックグラウンド保存
- **テキスト入力**: blurフォーカスアウト時に保存
- **保存中**: ローディングスピナーは表示しない(スクロールリセット防止のため)
- **エラー時**: トースト通知でエラー表示
### トースト通知
- **位置**: 画面右上
- **表示時間**: 3秒自動消去
- **種類**: 成功(緑)、エラー(赤)、警告(オレンジ)、情報(青)
---
## 📱 スマホ特有の配慮
### タップ領域
- **最小サイズ**: 44px × 44px
- **余白**: ボタン間は最低8px
### スクロール
- **慣性スクロール**: `-webkit-overflow-scrolling: touch`
- **無限スクロール**: 不要全39筆なので一覧でOK
### 入力
- **キーボードタイプ**: 適切に指定email, number, textなど
- **オートコンプリート**: 有効化
### ナビゲーション
- **Navbar**: PC版と同じ項目をレスポンシブに配置
- **戻るボタン**: 画面左上に配置(詳細画面など)

View File

@@ -0,0 +1,321 @@
# 実装優先順位とマイルストーン
## 🎯 MVPPhase 1の完成定義
以下の全てが完了したら、Phase 1は完成とする
### 機能完成基準
- [ ] ログイン・認証機能
- [ ] 作付け計画の一覧表示PC/スマホ)
- [ ] 作付け計画の編集(個別・一括)
- [ ] 水稲共済細目書のPDF出力
- [ ] 中山間交付金のPDF出力
- [ ] 前年度作付けのコピー機能
- [ ] 3種類のマスタデータインポート
### 品質基準
- [ ] PCで快適に操作できるレスポンス1秒以内
- [ ] スマホで見やすい文字16px以上
- [ ] 出力されるPDFが正確手動検証で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: 作付け計画API作物・品種はUIまたは管理画面から登録
- 一覧取得 (`GET /api/plans/?year=2025`)
- 作成・更新 (`POST /api/plans/`, `PATCH /api/plans/{id}/`)
- 一括更新 (`POST /api/plans/bulk/`)
- 前年度コピー (`POST /api/plans/copy_from_previous_year/`)
- **品種追加API** (`POST /api/varieties/`) - その場で品種を追加
- **集計API** (`GET /api/plans/summary/?year=2025`) - サイドバー用
- [ ] 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.2 | 安定性、豊富なエコシステム |
| 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では不要住所テキストのみ
### しっかり作り込むもの
- 作付け計画一覧: 検索・フィルタ・ソート機能
- インライン編集: 即時保存、スクロール維持
- 申請書PDF: 正確なデータ集計ロジック、A4印刷対応
### 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: 共済PDFの面積計算バグを修正
docs: READMEにセットアップ手順を追加
style: Tailwindクラスを整理
```
### ブランチ戦略
- `main`: 本番環境
- `develop`: 開発環境
- `feature/*`: 機能開発
---
## 🎉 Phase 1完成後の振り返り
完成したら、以下を実施:
1. **使用感チェック**: 実際に作付け計画を入力してみる
2. **申請書検証**: 出力されたPDFを役場の書式と照合
3. **改善点の洗い出し**: 「ここがもっとこうだったら...」を記録
4. **Phase 2の要件整理**: 栽培履歴機能の詳細を詰める

View File

@@ -0,0 +1,243 @@
# ドキュメント vs 実装 差異レポート
> **作成日**: 2026-02-16
> **最終更新**: 2026-02-17
> **目的**: ドキュメントと実装の差異を洗い出し、対応方針を決定する
---
## A. ドキュメントに書かれているが実装されていないもの
### ~~A-1: ダッシュボード画面~~ ✅ 対応済み
- **対応内容**:
- `/dashboard` にダッシュボード画面を新設。`/` はログイン済みなら `/dashboard` にリダイレクト
- 概要サマリー: 全圃場数、作付け済み筆数、未割当筆数(警告アイコン付き)
- 作物別集計テーブル: 作物名、筆数、面積(反)、合計行
- クイックアクセス: 作付け計画・圃場管理・帳票出力・データ取込への4ボタン
- 年度セレクタで年度切替可能
- Navbarに「ホーム」ボタン追加、KeinaSystemロゴクリックでダッシュボードに遷移
- バックエンド: summary APIに `total_fields`, `assigned_fields`, `unassigned_fields` を追加
- **対応日**: 2026-02-19
---
### ~~A-2: チェックボックスによる一括操作~~ ✅ 対応済み
- **対応内容**:
- バックエンド: `POST /api/plans/bulk_update/` API追加field_ids, year, crop, variety を受けて一括 update_or_create
- フロントエンド: 作付け計画画面(/allocationにチェックボックス列追加、全選択/個別選択
- 一括操作バー: 選択件数表示、作物・品種セレクタ、「一括設定」ボタン、確認ダイアログ付き
- **対応日**: 2026-02-19
---
### ~~A-3: 前年度コピー機能(フロントエンド)~~ ✅ 対応済み
- **対応内容**: 作付け計画画面(/allocationの年度セレクタ横に[前年度コピー]ボタンを追加。確認ダイアログ付き、既存プランはスキップignore_conflicts
- **対応日**: 2026-02-18
---
### ~~A-4: 品種のインライン追加・削除~~ ✅ 対応済み
- **対応内容**:
- 品種セレクトに「+ 新しい品種を追加...」オプション追加。選択するとインライン入力に切り替わり、Enter/追加ボタンでAPI経由で即登録&自動選択
- ヘッダーに「品種管理」ボタン追加。モーダルで作物別の品種一覧表示、追加・削除が可能
- Plan.variety の on_delete を CASCADE → SET_NULL に変更品種削除時に計画が消えない安全策、マイグレーション0003
- **対応日**: 2026-02-19
---
### ~~A-5: PDFプレビュー機能~~ ✅ 対応済み
- **対応内容**: 帳票出力画面(/reportsをカード形式にリニューアル。各帳票にプレビュー新タブでPDF表示とダウンロードのボタンを配置。プレビューからブラウザの印刷機能で直接印刷可能
- **対応日**: 2026-02-19
---
### ~~A-6: エクスポート機能CSV/ZIP~~ ✅ 対応済み
- **対応内容**: データ取込画面(/import下部に「データエクスポート」セクション追加。全データ圃場・共済・中山間・作付け計画・品種・M:N紐づけを6つのCSVファイルとしてZIPアーカイブでダウンロード。バックエンドAPI `GET /api/fields/export/zip/`
- **対応日**: 2026-02-19
---
### ~~A-7: 作付け計画画面の検索・フィルタ~~ ✅ 対応済み
- **対応内容**:
- テキスト検索: 圃場名・住所で部分一致検索(リアルタイムフィルタリング)
- 作物フィルタ: ドロップダウンで特定の作物に絞り込み
- 未割当トグル: チェックボックスで未割当の圃場のみ表示
- フィルタ結果件数表示(例: 5/39件
- クライアントサイドフィルタ39筆のためAPI不要
- **対応日**: 2026-02-19
---
### ~~A-8: 圃場詳細画面の共済/中山間情報表示~~ ✅ 対応済み
- **対応内容**: 圃場詳細画面 (`/fields/[id]`) に共済情報テーブルと中山間情報テーブルを追加
- **対応日**: 2026-02-17
- **確認**: Playwright E2E テストで検証済み
---
## B. 実装されているがドキュメントに記載がないもの
### B-1〜B-5: ドキュメント追記対応 ✅ 対応済み
以下の項目は 2026-02-17 のドキュメント一斉更新で対応済み:
- **B-1**: グループ機能 → データ仕様書・CLAUDE.md に記載済み
- **B-2**: 圃場管理画面(/fields → 画面設計書に追記済み
- **B-3**: 圃場新規作成画面(/fields/new → 画面設計書に追記済み
- **B-4**: インライン編集方式(作付け計画) → 画面設計書をモーダル→インラインに更新済み
- **B-5**: Navbar → 画面設計書に追記済み
---
## C. ドキュメントと実装で食い違っているもの
### C-1: Field と共済/中山間の関係M:1 vs M:N ✅ 対応済み
- **対応内容**: データ仕様書を M:N に更新
- **対応日**: 2026-02-17
---
### ~~C-2: 共済マスタのフィールド型~~ ✅ 対応済み
- **対応内容**: `k_num` = CharField, `s_num` = CharField に統一。`unique_together = [['k_num', 's_num']]` を設定マイグレーション0005
- **対応日**: 2026-02-17
- **確認**: Playwright E2E テストで重複拒否を検証済み
---
### C-3: 中山間マスタのフィールド型 ✅ 対応済み
- **対応内容**: `c_id` = CharField, `chiban` = CharField で実装。データ仕様書も CharField に更新済み
- **理由**: 地番に「イ」「ロ」等の非数値データが入るため
---
### ~~C-4: 面積フィールドの単位~~ ✅ 対応済み
- **対応内容**:
- 共済マスタ・中山間マスタの `area` は IntegerFieldm2に統一
- 共済インポート時に ODS のアール値を m2 に変換 (×100)
- PDF テンプレートの面積表示を m2 に修正
- **対応日**: 2026-02-17
- **発見したバグ**: ODS カラム名 `本地面積 (m2)` のスペース有無でインポートが失敗し全件 area=0 になっていた → 修正済み
---
### C-5: 作物マスタの初期データ ✅ 対応済み
- **対応内容**: `init_crops.py` を削除。作物・品種は管理画面やUIから登録する運用
- **対応日**: 2026-02-17D-2 と同時対応)
---
### C-6: 申請書の出力形式CSV vs PDF ✅ 対応済み
- **対応内容**: 全ドキュメントを PDF に統一
- **対応日**: 2026-02-17
---
### C-7: Django バージョン ✅ 対応済み
- **対応内容**: ドキュメントを Django 5.2 に更新
- **対応日**: 2026-02-17
---
### ~~C-8: DEFAULT_PERMISSION_CLASSES~~ ✅ 対応済み
- **対応内容**: `AllowAny``IsAuthenticated` に変更
- **対応日**: 2026-02-17D-4 と同時対応)
- **確認**: Playwright E2E テストで未認証時 401 を検証済み
---
## D. 潜在的な不具合
### ~~D-1: PDF生成時の variety/crop が null でクラッシュ~~ ✅ 修正済み
- **修正内容**: `plan.crop.name if plan.crop else '未設定'` / `plan.variety.name if plan.variety else ''` の null チェック追加
- **修正日**: 2026-02-17
- **確認**: Playwright E2E テストで PDF 生成200 応答)を検証済み
---
### ~~D-2: init_crops.py の不正データ~~ ✅ 修正済み
- **修正内容**: `init_crops.py` 自体を削除
- **修正日**: 2026-02-17
---
### ~~D-3: settings.py の二重定義~~ ✅ 修正済み
- **修正内容**: 前の `LANGUAGE_CODE = 'en-us'` / `TIME_ZONE = 'UTC'` を削除。`LANGUAGE_CODE = 'ja'` / `TIME_ZONE = 'Asia/Tokyo'` のみ残す
- **修正日**: 2026-02-17
---
### ~~D-4: AllowAny で全API公開~~ ✅ 修正済み
- **修正内容**: `DEFAULT_PERMISSION_CLASSES``IsAuthenticated` に変更
- **修正日**: 2026-02-17
- **確認**: Playwright E2E テストで検証済み
---
## E. 追加で修正の要望
### ~~E-1: PDF帳票フォーマットの再設計~~ ✅ 対応済み
**対応日**: 2026-02-17
**対応内容:**
- E-1a: 水稲共済細目書 PDF — A4 縦、表形式1行1区画@page 設定、ページ番号、日本語タイトルに修正
- E-1b: 中山間交付金 PDF — A4 横、表形式1行1区画@page 設定、ページ番号、日本語タイトルに修正
- E-1c: OfficialChusankanField モデル拡張 — 6→17 フィールドに拡張マイグレーション0006
- 中山間インポート修正 — ODS 17 列すべて読み込み対応
- 共済インポートバグ修正 — 面積カラム名スペース不一致 + アール→m2 変換(×100)
- reports/views.py — ロジック全面書き直しフラットテーブル、null 安全、prefetch_related
- シリアライザ — OfficialChusankanFieldSerializer に 11 フィールド追加
**確認**: Playwright E2E テストPDF 200 応答、中山間 17 フィールド返却、共済面積 > 0で検証済み
---
### ~~E-2: 対応付け可視化・紐づけ管理機能~~ ✅ 対応済み
**対応日**: 2026-02-18
**対応内容:**
- バックエンドAPI 6本共済/中山間マスタ一覧、紐づけ追加・解除)
- 圃場詳細画面(/fields/[id]: +追加ボタン、×解除ボタン、検索付きモーダル、面積参考表示
- 圃場一覧 通常モード: 「共済」「中山間」件数列
- 圃場一覧「対応表」モード: [通常]/[対応表]トグルで切替、圃場名・住所・面積・共済漢字地名・中山間所在地を一覧表示、直接紐づけ追加・解除可能
- 共通コンポーネント: LinkModal検索付き複数選択モーダルを抽出
---
## 対応状況サマリー
| カテゴリ | 項目 | 状態 |
|---------|------|------|
| A-1 | ダッシュボード画面 | ✅ 完了 |
| A-2 | チェックボックス一括操作 | ✅ 完了 |
| A-3 | 前年度コピーボタン | ✅ 完了 |
| A-4 | 品種インライン追加・削除 | ✅ 完了 |
| A-5 | PDFプレビュー | ✅ 完了 |
| A-6 | エクスポート機能 | ✅ 完了 |
| A-7 | 検索・フィルタ | ✅ 完了 |
| A-8 | 圃場詳細 共済/中山間表示 | ✅ 完了 |
| B-1〜B-5 | ドキュメント追記 | ✅ 完了 |
| C-1〜C-8 | ドキュメント/実装の食い違い修正 | ✅ 全件完了 |
| D-1〜D-4 | 不具合修正 | ✅ 全件完了 |
| E-1 | PDF帳票再設計 | ✅ 完了 |
| E-2 | 対応付け可視化・紐づけ管理 | ✅ 完了 |