# 非機能要件定義書

## 概要

本ドキュメントは、InvenTree Mobileアプリケーション（Flutter/Dart）の非機能要件を定義する。本アプリケーションは、InvenTree在庫管理サーバーと連携するモバイルクライアントとして、iOS/Androidプラットフォームで動作する。

## 性能要件

### レスポンスタイム

| 処理種別 | 目標値 | 備考 |
| --- | --- | --- |
| API接続確立 | 10秒以内 | `client.openUrl`のタイムアウト設定（lib/api.dart:1254） |
| APIリクエスト完了 | 10秒以内 | `request.close().timeout`の設定（lib/api.dart:1331） |
| ファイルダウンロード | 10秒以内 | 接続タイムアウト（lib/api.dart:926） |
| ファイルアップロード | 120秒以内 | 大容量ファイル対応（lib/api.dart:1036） |
| 画像キャッシュ取得 | 60秒以内 | ネットワーク画像のストリームタイムアウト（lib/api.dart:148） |
| 検索デバウンス | 300ms | ユーザー入力後の待機時間（lib/widget/search.dart:133） |
| ページネーションデバウンス | 500ms | スクロール時の待機時間（lib/widget/paginator.dart:406） |

### スループット

| 項目 | 目標値 | 備考 |
| --- | --- | --- |
| 同時接続数 | シングルセッション | シングルトンAPI設計による1サーバー1接続（lib/api.dart:172-179） |
| 通知ポーリング間隔 | 60秒 | 定期的な通知更新（lib/api.dart:690） |
| バーコードスキャン間隔 | 250ms以上 | 連続スキャン防止（lib/barcode/wedge_controller.dart:75） |

## 可用性要件

| 項目 | 目標値 | 備考 |
| --- | --- | --- |
| 稼働率 | サーバー依存 | モバイルアプリ自体の可用性はサーバー接続状態に依存 |
| オフライン対応 | 限定的 | ローカルキャッシュによる画像表示のみ対応 |
| 障害復旧時間（RTO） | 即時 | 再接続による自動復旧（接続状態監視機能あり） |
| 目標復旧時点（RPO） | N/A | ローカルデータ永続化は設定情報のみ |

### 接続管理

- 接続タイムアウト: 30秒（lib/api.dart:1196）
- 接続状態コールバック機能による状態変化通知（lib/api.dart:182-192）
- サーバーエラー時の音声通知オプション（lib/settings/app_settings.dart）

## セキュリティ要件

### 認証・認可

| 要件 | 実装内容 | 根拠 |
| --- | --- | --- |
| トークンベース認証 | APIトークンによる認証 | lib/api.dart:1526-1532 |
| ユーザー名/パスワード認証 | Basic認証ヘッダーでトークン取得 | lib/api.dart:586-587 |
| ロールベースアクセス制御 | サーバーから取得したロール情報による権限チェック | lib/api.dart:763-807 |
| パーミッション管理 | モデル単位の権限チェック機能 | lib/api.dart:813-856 |

### 通信セキュリティ

| 要件 | 実装内容 | 根拠 |
| --- | --- | --- |
| HTTPS通信 | 標準でHTTPS使用 | lib/api.dart全般 |
| 厳格なHTTPS検証 | オプションで有効化可能（INV_STRICT_HTTPS） | lib/preferences.dart:54 |
| 自己署名証明書対応 | 厳格モードOFF時に許可 | lib/api.dart:1180-1193 |
| 証明書エラー処理 | HandshakeException/CertificateExceptionの適切な処理 | lib/api.dart:1279-1288 |

### データ保護

| 要件 | 実装内容 | 根拠 |
| --- | --- | --- |
| ユーザープロファイル保存 | Sembast NoSQLデータベースによるローカル保存 | lib/user_profile.dart, lib/preferences.dart |
| トークン管理 | プロファイルに紐づくトークンのローカル保存 | lib/user_profile.dart:39 |
| エラーレポート匿名化 | Sentry送信時のURL情報からサーバーアドレス除去 | lib/inventree/sentry.dart:96-109 |

## 拡張性要件

### アーキテクチャ

| 要件 | 実装内容 | 根拠 |
| --- | --- | --- |
| APIバージョン対応 | 最小API版100、機能別バージョンチェック | lib/api.dart:196, 291-358 |
| プラグインシステム | サーバーサイドプラグインの動的検出・利用 | lib/api.dart:361-384 |
| 国際化対応 | 40言語以上のロケールサポート | lib/l10n/, pubspec.yaml |
| テーマ対応 | ダークモード/ライトモード切替 | lib/main.dart:158-168 |

### 互換性

| 要件 | 実装内容 | 根拠 |
| --- | --- | --- |
| Flutter SDK | ^3.8.1 | pubspec.yaml:7 |
| マルチプラットフォーム | iOS, Android, macOS, Linux, Windows対応 | lib/api.dart:561-570 |
| 画面方向 | ポートレート/ランドスケープ/システム設定対応 | lib/preferences.dart:21-23 |

## 保守性要件

### コード品質

| 要件 | 実装内容 | 根拠 |
| --- | --- | --- |
| 静的解析 | lint: ^2.1.2による静的解析 | pubspec.yaml:51 |
| ユニットテスト | flutter_testによるテスト基盤 | pubspec.yaml:49-50 |
| デバッグモード | isInDebugMode()関数によるモード判定 | lib/inventree/sentry.dart:75-81 |

### ログ・デバッグ

| 要件 | 実装内容 | 根拠 |
| --- | --- | --- |
| デバッグ出力 | debug()関数による統一ログ出力 | lib/helpers.dart（複数箇所で使用） |
| API通信ログ | リクエスト/レスポンスのデバッグ出力 | lib/api.dart全般 |

## 運用・監視要件

### エラー監視

| 要件 | 実装内容 | 根拠 |
| --- | --- | --- |
| エラーレポート | Sentry統合によるクラッシュレポート | pubspec.yaml:43, lib/inventree/sentry.dart |
| ユーザーオプトアウト | エラーレポート送信の有効/無効切替 | lib/preferences.dart:53 |
| コンテキスト情報 | デバイス情報、サーバー情報、アプリ情報の送信 | lib/inventree/sentry.dart:91-94 |
| ソースマップ | デバッグシンボル・ソースマップのアップロード | pubspec.yaml:76-78 |

### キャッシュ管理

| 要件 | 実装内容 | 根拠 |
| --- | --- | --- |
| 画像キャッシュ | CachedNetworkImage/FlutterCacheManagerによるキャッシュ | pubspec.yaml:17, 24, lib/api.dart:1574-1576 |
| 設定キャッシュ | グローバル/ユーザー設定の5分間キャッシュ | lib/api.dart:1604, 1636 |

### 通知

| 要件 | 実装内容 | 根拠 |
| --- | --- | --- |
| 通知カウンター更新 | 60秒間隔の定期ポーリング | lib/api.dart:690-691, 1770-1778 |
| 音声フィードバック | バーコードスキャン時・サーバーエラー時の音声再生 | lib/preferences.dart:25-26 |

### ユーザー通知

| 要件 | 実装内容 | 根拠 |
| --- | --- | --- |
| スナックバー通知 | 5-10秒間の表示（アクション有無で変動） | lib/widget/snacks.dart:78 |
| エラーダイアログ | HTTPステータスコード別のエラーメッセージ | lib/widget/dialogs.dart:272-300 |
| タイムアウト通知 | タイムアウト専用のエラー表示 | lib/widget/dialogs.dart:306-308 |

## 備考

### タイムアウト設定一覧

| 設定項目 | 値 | ファイル位置 |
| --- | --- | --- |
| HTTP接続タイムアウト | 30秒 | lib/api.dart:1196 |
| APIリクエストタイムアウト | 10秒 | lib/api.dart:1254, 1331 |
| ファイルアップロードタイムアウト | 120秒 | lib/api.dart:1036 |
| 画像ストリームタイムアウト | 60秒 | lib/api.dart:148 |

### キャッシュ設定一覧

| 設定項目 | 値 | ファイル位置 |
| --- | --- | --- |
| グローバル設定キャッシュ | 5分 | lib/api.dart:1604 |
| ユーザー設定キャッシュ | 5分 | lib/api.dart:1636 |

### 制限事項

- ローカルでのデータ永続化は設定情報のみ対応
- オフラインモードでの在庫操作は非対応
- リトライ機能は明示的に実装されていない（手動再試行が必要）
- レートリミット制御はサーバーサイドに依存（429エラー時にユーザー通知）
