# 機能設計書 60-パーツ設定

## 概要

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

### 本機能の処理概要

パーツ詳細画面での表示項目（BOM、価格情報、要件情報）の表示/非表示を設定する機能を提供する。

**業務上の目的・背景**：在庫管理業務において、ユーザーの業務内容や必要な情報レベルによって、パーツ詳細画面に表示すべき情報は異なる。例えば、生産担当者はBOM情報が重要であり、購買担当者は価格情報を優先的に確認したい。パーツ詳細画面の表示項目をカスタマイズすることで、各ユーザーが自分の業務に必要な情報に素早くアクセスでき、画面の視認性と作業効率が向上する。

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

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

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

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

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 6 | 設定画面 | 遷移先機能 | パーツ設定メニュー押下時にパーツ設定画面へ遷移 |
| 13 | 部品設定画面 | 主機能 | BOM、価格、要件の表示/非表示設定の変更 |

## 機能種別

設定管理 / CRUD操作

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| partShowBom | bool | - | BOM表示設定 | - |
| partShowPricing | bool | - | 価格情報表示設定 | - |
| partShowRequirements | bool | - | 要件情報表示設定 | - |

### 入力データソース

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

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| partShowBom | bool | BOM表示/非表示 |
| partShowPricing | bool | 価格情報表示/非表示 |
| partShowRequirements | bool | 要件情報表示/非表示 |

### 出力先

- ローカルDB（Sembast）
- パーツ詳細画面（表示項目の制御）

## 処理フロー

### 処理シーケンス

```
1. 画面初期化
   └─ initStateでloadSettings()呼び出し
2. 設定読み込み
   └─ InvenTreeSettingsManager().getBool()で各設定値取得
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-60-01 | BOMデフォルト表示 | BOMはデフォルトでtrue（表示） | 初期状態 |
| BR-60-02 | 価格デフォルト表示 | 価格情報はデフォルトでtrue（表示） | 初期状態 |
| BR-60-03 | 要件デフォルト非表示 | 要件情報はデフォルトでfalse（非表示） | 初期状態 |
| BR-60-04 | 即時反映 | 設定変更は即座にUIに反映 | 設定変更時 |
| BR-60-05 | 永続化 | 設定はローカルDBに保存され、アプリ再起動後も維持 | 設定変更時 |

### 計算ロジック

該当なし

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

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

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

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

#### settings（Sembast）

| 操作 | 項目（キー） | 更新値・取得条件 | 備考 |
|-----|-----------------|-----------------|------|
| GET/SET | INV_PART_SHOW_BOM | bool | デフォルト: true |
| GET/SET | INV_PART_SHOW_PRICING | bool | デフォルト: true |
| GET/SET | INV_PART_SHOW_REQUIREMENTS | bool | デフォルト: false |

## エラー処理

### エラーケース一覧

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

### リトライ仕様

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

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

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

## パフォーマンス要件

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

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

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

## 備考

要件情報（partShowRequirements）はデフォルトでfalseに設定されており、他の設定項目とは異なるデフォルト値を持つ。これは要件情報が一部のユーザーにのみ必要とされる情報であるためと推測される。

---

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

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

### 推奨読解順序

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

パーツ表示設定のキー定数を確認。

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

**読解のコツ**: INV_PART_SHOW_から始まる定数がパーツ表示設定のキー。

**主要処理フロー**:
- **35行目**: INV_PART_SHOW_BOM = "partShowBom"
- **36行目**: INV_PART_SHOW_PRICING = "partShowPricing"
- **37行目**: INV_PART_SHOW_REQUIREMENTS = "partShowRequirements"

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

パーツ設定画面の構造を確認。

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

**主要処理フロー**:
- **8-11行目**: StatefulWidgetの定義
- **13-14行目**: Stateクラスの定義
- **16-18行目**: 状態変数の定義（デフォルト値付き）
- **20-25行目**: initStateでloadSettings呼び出し
- **27-44行目**: loadSettings()で設定値読込

#### Step 3: 設定読み込みを理解する

loadSettings()メソッドの実装を確認。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | part_settings.dart | `lib/settings/part_settings.dart` | loadSettings() |

**主要処理フロー**:
- **28-31行目**: partShowBomの読込（デフォルト: true）
- **32-35行目**: partShowPricingの読込（デフォルト: true）
- **36-39行目**: partShowRequirementsの読込（デフォルト: false）
- **41-43行目**: mountedチェック後にsetState()

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

build()メソッドのListView構造を確認。

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

**主要処理フロー**:
- **46-108行目**: build()メソッド
- **56-69行目**: BOM表示設定ListTile
- **70-86行目**: 価格表示設定ListTile
- **87-103行目**: 要件表示設定ListTile

#### Step 5: 設定保存の流れを理解する

Switchのコールバックでの設定保存を確認。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 5-1 | part_settings.dart | `lib/settings/part_settings.dart` | onChanged |

**主要処理フロー**:
- **62-67行目**: BOM設定のonChanged（setValue → setState）
- **76-84行目**: 価格設定のonChanged（setValue → setState）
- **93-100行目**: 要件設定のonChanged（setValue → setState）

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

```
InvenTreePartSettingsWidget (part_settings.dart)
    |
    +-- _InvenTreePartSettingsState
           |
           +-- initState()
           |      +-- loadSettings()
           |             +-- InvenTreeSettingsManager().getBool() x 3
           |                    +-- Sembast DB読込
           |
           +-- build()
           |      +-- Scaffold
           |             +-- AppBar (タイトル: "partSettings")
           |             +-- ListView
           |                    +-- ListTile (BOM)
           |                    |      +-- Switch (onChanged)
           |                    |             +-- setValue()
           |                    |                    +-- setState()
           |                    |
           |                    +-- ListTile (価格)
           |                    |      +-- Switch (onChanged)
           |                    |             +-- setValue()
           |                    |                    +-- setState()
           |                    |
           |                    +-- ListTile (要件)
           |                           +-- Switch (onChanged)
           |                                  +-- setValue()
           |                                         +-- setState()
           |
           +-- setState()
                  +-- UI再描画
```

### データフロー図

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

initState       ---->  loadSettings()              ---->  UI状態更新
                          |
                          +-- getBool() x 3
                                 +-- Sembast DB
                                        |
                                        v
スイッチ操作    ---->  onChanged                   ---->  設定変更
                          |
                          +-- setValue()
                          |      +-- Sembast DB書込
                          |
                          +-- setState()
                                 |
                                 v
パーツ詳細画面  <----  設定値参照                  ---->  項目表示/非表示
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| part_settings.dart | `lib/settings/part_settings.dart` | ソース | パーツ設定画面 |
| preferences.dart | `lib/preferences.dart` | ソース | 設定キー定義・永続化 |
| part.dart | `lib/inventree/part.dart` | ソース | パーツモデル（設定参照元） |
| part_detail.dart | `lib/widget/part/part_detail.dart` | ソース | パーツ詳細画面（設定適用先） |
| l10.dart | `lib/l10.dart` | ソース | 多言語対応（ラベル） |
| app_colors.dart | `lib/app_colors.dart` | ソース | アプリカラー定義 |
