# 機能設計書 59-バーコード設定

## 概要

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

### 本機能の処理概要

バーコードスキャン方式（カメラ/ウェッジスキャナ）、スキャン遅延時間、シングルスキャンモードなどのバーコード関連設定を管理する機能を提供する。

**業務上の目的・背景**：バーコードスキャンは在庫管理業務の効率化において重要な機能である。使用環境に応じて内蔵カメラまたは外部ウェッジスキャナを選択でき、スキャン精度を調整するための遅延設定も可能。連続スキャンかシングルスキャンかを選択することで、様々な作業パターンに対応できる。これらの設定により、倉庫作業者の作業効率を最大化できる。

**機能の利用シーン**：設定画面からバーコード設定メニューを選択してバーコード設定画面へ遷移する。スキャン方式の変更、遅延時間の調整、シングルスキャンモードのON/OFFを設定する。

**主要な処理内容**：
1. 現在の設定値をローカルDBから読み込む
2. 設定項目をListTile形式で表示する
3. ダイアログやスイッチで設定値を変更する
4. 変更をローカルDBに永続化する
5. バーコードスキャン処理で設定値を参照する

**関連システム・外部連携**：ローカルDB（Sembast）、バーコードスキャン機能との連携を行う。

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

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 6 | 設定画面 | 遷移先機能 | バーコード設定メニュー押下時にバーコード設定画面へ遷移 |
| 12 | バーコード設定画面 | 主機能 | バーコードスキャン方式（カメラ/ウェッジ）の設定変更 |

## 機能種別

設定管理 / CRUD操作

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| barcodeScanDelay | int | - | スキャン遅延時間（ms） | 100-2500 |
| barcodeScanType | int | - | スキャン方式（0:カメラ/1:ウェッジ） | 0-1 |
| barcodeScanSingle | bool | - | シングルスキャンモード | - |

### 入力データソース

- ユーザー操作（ダイアログ、タップ、スイッチ）
- ローカルDB（初期値読み込み）

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| barcodeScanDelay | int | スキャン遅延時間（100-2500ms） |
| barcodeScanType | int | スキャン方式（0:カメラ/1:ウェッジ） |
| barcodeScanSingle | bool | シングルスキャンモード |

### 出力先

- ローカルDB（Sembast）
- バーコードスキャン処理（設定参照）

## 処理フロー

### 処理シーケンス

```
1. 画面初期化
   └─ initStateでloadSettings()呼び出し
2. 設定読み込み
   └─ InvenTreeSettingsManager().getValue()で各設定値取得
3. UI表示
   └─ ListView内にListTile配置
4. 設定変更
   ├─ スキャン方式 → choiceDialog() → setValue()
   ├─ スキャン遅延 → AlertDialog → setValue()
   └─ シングルスキャン → Switch → setValue()
5. バーコードスキャン時
   └─ 設定値を参照して動作を制御
```

### フローチャート

```mermaid
flowchart TD
    A[バーコード設定画面表示] --> B[initState]
    B --> C[loadSettings]
    C --> D[ローカルDBから設定読込]
    D --> E[ListView表示]
    E --> F{設定操作}
    F -->|スキャン方式| G[choiceDialog]
    F -->|スキャン遅延| H[AlertDialog]
    F -->|シングルスキャン| I[Switch]
    G --> J[setValue]
    H --> K{入力値検証}
    K -->|100-2500| J
    K -->|範囲外| L[範囲内に補正]
    L --> J
    I --> J
    J --> M[ローカルDB保存]
    M --> N[setState]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-59-01 | 遅延範囲制限 | スキャン遅延は100ms〜2500msの範囲 | 遅延時間設定時 |
| BR-59-02 | スキャン方式 | カメラ（0）またはウェッジスキャナ（1） | スキャン方式設定時 |
| BR-59-03 | デフォルト値 | 遅延:500ms、方式:カメラ、シングル:false | 初期状態 |

### 計算ロジック

遅延時間の範囲補正:
- 入力値 < 100 → 100
- 入力値 > 2500 → 2500

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

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

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

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

#### settings（Sembast）

| 操作 | 項目（キー） | 更新値・取得条件 | 備考 |
|-----|-----------------|-----------------|------|
| GET/SET | INV_BARCODE_SCAN_DELAY | int | デフォルト: 500 |
| GET/SET | INV_BARCODE_SCAN_TYPE | int | デフォルト: 0（カメラ） |
| GET/SET | INV_BARCODE_SCAN_SINGLE | bool | デフォルト: false |

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | DB読込エラー | Sembast読込失敗 | デフォルト値を使用 |
| - | 入力エラー | 数値以外の入力 | 変更を適用しない |

### リトライ仕様

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

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

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

## パフォーマンス要件

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

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

- 設定はローカルDBに暗号化なしで保存
- バーコード設定は動作に影響するが、セキュリティリスクは低い

## 備考

スキャン遅延時間は連続スキャン時の誤読防止に使用。ウェッジスキャナは外部ハードウェアスキャナをキーボード入力として受け取る方式。

---

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

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

### 推奨読解順序

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

バーコード設定のキー定数を確認。

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

**読解のコツ**: INV_BARCODE_から始まる定数がバーコード設定のキー。BARCODE_CONTROLLER_*がスキャン方式の定数。

**主要処理フロー**:
- **57行目**: INV_BARCODE_SCAN_DELAY
- **58行目**: INV_BARCODE_SCAN_TYPE
- **59行目**: INV_BARCODE_SCAN_SINGLE
- **62行目**: BARCODE_CONTROLLER_CAMERA = 0
- **63行目**: BARCODE_CONTROLLER_WEDGE = 1

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

バーコード設定画面の構造を確認。

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

**主要処理フロー**:
- **10-14行目**: StatefulWidgetの定義
- **16-25行目**: 状態変数の定義
- **27-31行目**: initStateでloadSettings呼び出し
- **33-51行目**: loadSettings()で設定値読込

#### Step 3: スキャン遅延設定を理解する

遅延時間編集ダイアログの実装を確認。

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

**主要処理フロー**:
- **55-107行目**: _editBarcodeScanDelay()メソッド
- **61-104行目**: AlertDialogの構築
- **85-87行目**: 入力値のパースとデフォルト値
- **90-91行目**: 範囲制限（100-2500）
- **93-96行目**: 設定の保存

#### Step 4: スキャン方式設定を理解する

スキャン方式選択ダイアログの実装を確認。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 4-1 | barcode_settings.dart | `lib/settings/barcode_settings.dart` | build()内のスキャン方式ListTile |

**主要処理フロー**:
- **130-162行目**: スキャン方式ListTileとchoiceDialog
- **136-148行目**: カメラとウェッジの選択肢
- **150-158行目**: onSelectedで設定保存

#### Step 5: UI全体を理解する

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

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

**主要処理フロー**:
- **109-196行目**: build()メソッド
- **112-120行目**: スキャン方式アイコンの決定
- **130-162行目**: スキャン方式設定
- **163-173行目**: スキャン遅延設定
- **174-191行目**: シングルスキャン設定

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

```
InvenTreeBarcodeSettingsWidget (barcode_settings.dart)
    │
    └─ _InvenTreeBarcodeSettingsState
           │
           ├─ initState()
           │      └─ loadSettings()
           │             └─ InvenTreeSettingsManager().getValue() x 3
           │                    └─ Sembast DB読込
           │
           ├─ build()
           │      └─ ListView
           │             ├─ ListTile (スキャン方式)
           │             │      └─ choiceDialog()
           │             │             └─ setValue()
           │             │
           │             ├─ ListTile (スキャン遅延)
           │             │      └─ _editBarcodeScanDelay()
           │             │             └─ AlertDialog
           │             │                    └─ setValue()
           │             │
           │             └─ ListTile (シングルスキャン)
           │                    └─ Switch (onChanged)
           │                           └─ setValue()
           │
           └─ setState()
```

### データフロー図

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

initState       ───▶  loadSettings()              ───▶  UI状態更新
                          │
                          └─ getValue() x 3
                                 └─ Sembast DB
                                        │
                                        ▼
スキャン方式    ───▶  choiceDialog()              ───▶  設定変更
タップ                    │
                          └─ setValue()
                                 └─ Sembast DB
                                        │
                                        ▼
スキャン遅延    ───▶  AlertDialog                 ───▶  設定変更
タップ                    │
                          ├─ 入力検証（100-2500）
                          │
                          └─ setValue()
                                 │
                                 ▼
バーコードスキャン ◀─── 設定値参照              ───▶  スキャン動作制御
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| barcode_settings.dart | `lib/settings/barcode_settings.dart` | ソース | バーコード設定画面 |
| preferences.dart | `lib/preferences.dart` | ソース | 設定キー定義・永続化 |
| barcode.dart | `lib/barcode/barcode.dart` | ソース | バーコードスキャン処理（設定参照元） |
| camera_controller.dart | `lib/barcode/camera_controller.dart` | ソース | カメラスキャン制御 |
| wedge_controller.dart | `lib/barcode/wedge_controller.dart` | ソース | ウェッジスキャン制御 |
| dialogs.dart | `lib/widget/dialogs.dart` | ソース | choiceDialog |
