# 機能設計書 58-ホーム画面設定

## 概要

本ドキュメントは、InvenTreeモバイルアプリにおけるホーム画面設定機能の設計を記述する。

### 本機能の処理概要

ホーム画面に表示する項目（サブスクライブ、発注、受注、出荷、サプライヤー、顧客）の表示/非表示を設定する機能を提供する。

**業務上の目的・背景**：在庫管理業務において、ユーザーの役割や業務内容によって必要な情報は異なる。例えば、購買担当者は発注情報が重要であり、営業担当者は受注情報を優先的に確認したい。ホーム画面の表示項目をカスタマイズできることで、各ユーザーが自分の業務に必要な情報に素早くアクセスでき、作業効率が向上する。

**機能の利用シーン**：設定画面からホーム画面設定メニューを選択してホーム画面設定画面へ遷移する。各項目のスイッチを操作して表示/非表示を切り替える。変更は即座にホーム画面に反映される。

**主要な処理内容**：
1. 現在の表示設定をローカルDBから読み込む
2. 設定項目をListTile+Switch形式で表示する
3. スイッチ操作で設定値を変更・保存する
4. ホーム画面の表示に反映される

**関連システム・外部連携**：ローカルDB（Sembast）との連携を行う。

**権限による制御**：認証は不要。表示設定はユーザーが自由に変更可能。

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 6 | 設定画面 | 遷移先機能 | ホーム画面設定メニュー押下時にホーム画面設定へ遷移 |
| 11 | ホーム画面設定 | 主機能 | ホーム画面に表示する項目の設定変更 |

## 機能種別

設定管理 / CRUD操作

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| homeShowSubscribed | bool | - | サブスクライブ項目表示 | - |
| homeShowPo | bool | - | 発注項目表示 | - |
| homeShowSo | bool | - | 受注項目表示 | - |
| homeShowShipments | bool | - | 出荷項目表示 | - |
| homeShowSuppliers | bool | - | サプライヤー項目表示 | - |
| homeShowCustomers | bool | - | 顧客項目表示 | - |
| homeShowManufacturers | bool | - | 製造元項目表示（現在非表示） | - |

### 入力データソース

- ユーザー操作（スイッチ）
- ローカルDB（初期値読み込み）

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| 設定値 | bool | 各項目の表示/非表示 |

### 出力先

- ローカルDB（Sembast）
- ホーム画面（表示項目の制御）

## 処理フロー

### 処理シーケンス

```
1. 画面初期化
   └─ initStateでloadSettings()呼び出し
2. 設定読み込み
   └─ InvenTreeSettingsManager().getValue()で各設定値取得
3. UI表示
   └─ ListView内にSwitch付きListTile配置
4. 設定変更
   └─ Switch操作 → setValue()でDB保存 → setState()
5. ホーム画面反映
   └─ ホーム画面表示時に設定値を参照
```

### フローチャート

```mermaid
flowchart TD
    A[ホーム画面設定画面表示] --> B[initState]
    B --> C[loadSettings]
    C --> D[ローカルDBから設定読込]
    D --> E[ListView表示]
    E --> F{スイッチ操作}
    F -->|ON/OFF| G[setValue]
    G --> H[ローカルDB保存]
    H --> I[setState]
    I --> J[UI更新]
    J --> K[ホーム画面に反映]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-58-01 | デフォルト表示 | 全ての項目はデフォルトでtrue（表示） | 初期状態 |
| BR-58-02 | 即時反映 | 設定変更は即座にUIに反映 | 設定変更時 |
| BR-58-03 | 永続化 | 設定はローカルDBに保存され、アプリ再起動後も維持 | 設定変更時 |
| BR-58-04 | 製造元非表示 | 製造元項目は現在機能改善中のため非表示 | 常時 |

### 計算ロジック

該当なし

## データベース操作仕様

### 操作別データベース影響一覧

| 操作 | 対象テーブル | 操作種別 | 概要 |
|-----|-------------|---------|------|
| 設定読込 | settings | SELECT | 各表示設定値の取得 |
| 設定保存 | settings | UPDATE | 表示設定値の永続化 |

### テーブル別操作詳細

#### settings（Sembast）

| 操作 | 項目（キー） | 更新値・取得条件 | 備考 |
|-----|-----------------|-----------------|------|
| GET/SET | INV_HOME_SHOW_SUBSCRIBED | bool | デフォルト: true |
| GET/SET | INV_HOME_SHOW_PO | bool | デフォルト: true |
| GET/SET | INV_HOME_SHOW_SO | bool | デフォルト: true |
| GET/SET | INV_HOME_SHOW_SHIPMENTS | bool | デフォルト: true |
| GET/SET | INV_HOME_SHOW_SUPPLIERS | bool | デフォルト: true |
| GET/SET | INV_HOME_SHOW_CUSTOMERS | bool | デフォルト: true |
| GET/SET | INV_HOME_SHOW_MANUFACTURERS | bool | デフォルト: true（未使用） |

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | DB読込エラー | Sembast読込失敗 | デフォルト値（true）を使用 |

### リトライ仕様

エラー発生時は画面を再表示することで再試行可能

## トランザクション仕様

各設定は独立して保存。トランザクション制御なし。

## パフォーマンス要件

- 設定読込は1秒以内
- 設定変更は即座に反映

## セキュリティ考慮事項

- 設定はローカルDBに暗号化なしで保存
- 表示/非表示の制御のみであり、データアクセス権限には影響しない

## 備考

製造元表示設定（homeShowManufacturers）はコード上に存在するが、UIからは現在非表示（コメントアウト）となっている。

---

## コードリーディングガイド

本機能を理解するために参照すべきファイルと、推奨する読み解き順序を以下に示す。

### 推奨読解順序

#### Step 1: 設定キー定義を理解する

ホーム画面表示設定のキー定数を確認。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | preferences.dart | `lib/preferences.dart` | INV_HOME_SHOW_*定数 |

**読解のコツ**: INV_HOME_SHOW_から始まる定数がホーム画面表示設定のキー。

**主要処理フロー**:
- **10行目**: INV_HOME_SHOW_SUBSCRIBED
- **11行目**: INV_HOME_SHOW_PO
- **12行目**: INV_HOME_SHOW_SO
- **13行目**: INV_HOME_SHOW_SHIPMENTS
- **14行目**: INV_HOME_SHOW_MANUFACTURERS
- **15行目**: INV_HOME_SHOW_CUSTOMERS
- **16行目**: INV_HOME_SHOW_SUPPLIERS

#### Step 2: ウィジェット構造を理解する

ホーム画面設定画面の構造を確認。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | home_settings.dart | `lib/settings/home_settings.dart` | HomeScreenSettingsWidget |

**主要処理フロー**:
- **8-11行目**: StatefulWidgetの定義
- **13-27行目**: 状態変数の定義
- **29-33行目**: initStateでloadSettings呼び出し
- **35-69行目**: loadSettings()で設定値読込

#### Step 3: UIの実装を理解する

ListView内の各設定項目を確認。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | home_settings.dart | `lib/settings/home_settings.dart` | build()内のListView |

**主要処理フロー**:
- **72-200行目**: build()メソッド
- **82-98行目**: サブスクライブ表示設定
- **99-112行目**: 発注表示設定
- **113-126行目**: 受注表示設定
- **127-143行目**: 出荷表示設定
- **144-160行目**: サプライヤー表示設定
- **161-178行目**: 製造元表示設定（コメントアウト）
- **179-195行目**: 顧客表示設定

#### Step 4: 設定の使用箇所を理解する

ホーム画面での設定値参照を確認。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 4-1 | home.dart | `lib/widget/home.dart`（想定） | 設定値による表示制御 |

**読解のコツ**: ホーム画面のウィジェットで各設定値を読み込み、表示/非表示を制御する。

### プログラム呼び出し階層図

```
HomeScreenSettingsWidget (home_settings.dart)
    │
    └─ _HomeScreenSettingsState
           │
           ├─ initState()
           │      └─ loadSettings()
           │             └─ InvenTreeSettingsManager().getValue() x 7
           │                    └─ Sembast DB読込
           │
           ├─ build()
           │      └─ ListView
           │             ├─ ListTile (サブスクライブ)
           │             │      └─ Switch (onChanged)
           │             │             └─ setValue()
           │             │                    └─ setState()
           │             │
           │             ├─ ListTile (発注)
           │             ├─ ListTile (受注)
           │             ├─ ListTile (出荷)
           │             ├─ ListTile (サプライヤー)
           │             └─ ListTile (顧客)
           │
           └─ setState()
                  └─ UI再描画
```

### データフロー図

```
[入力]                    [処理]                         [出力]

initState       ───▶  loadSettings()              ───▶  UI状態更新
                          │
                          └─ getValue() x 7
                                 └─ Sembast DB
                                        │
                                        ▼
スイッチ操作    ───▶  onChanged                   ───▶  設定変更
                          │
                          ├─ setValue()
                          │      └─ Sembast DB書込
                          │
                          └─ setState()
                                 │
                                 ▼
ホーム画面      ◀───  設定値参照                  ───▶  項目表示/非表示
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| home_settings.dart | `lib/settings/home_settings.dart` | ソース | ホーム画面設定画面 |
| preferences.dart | `lib/preferences.dart` | ソース | 設定キー定義・永続化 |
| home.dart | `lib/widget/home.dart` | ソース | ホーム画面（設定参照元） |
| l10.dart | `lib/l10.dart` | ソース | 多言語対応（ラベル） |
