# データベース設計書

## 概要

本ドキュメントは、InvenTree Appのデータベース設計を記載したものです。

InvenTree AppはFlutterで構築されたモバイルアプリケーションであり、以下の2種類のデータストレージを使用しています。

1. **ローカルストレージ（sembast）**: ユーザープロファイル情報やアプリ設定をデバイス上に保存するNoSQLデータベース
2. **リモートAPI（InvenTree Server）**: 在庫管理に関するコアデータ（部品、在庫、注文など）はInvenTreeサーバーのAPIを通じてアクセス

本アプリはクライアントアプリケーションであり、サーバー側のデータベースに直接アクセスするのではなく、APIエンドポイントを通じてデータを取得・更新します。そのため、本設計書ではローカルデータベースのテーブル定義と、APIを通じてアクセスするサーバー側のエンティティモデルの両方を記載します。

## テーブル一覧

### ローカルストレージ（sembast NoSQL Database）

| テーブル名 | 対応エンティティ | 説明 |
| --- | --- | --- |
| profiles | UserProfile | ユーザーのサーバー接続プロファイル情報 |
| settings | InvenTreeSettings | アプリケーション設定情報 |

### サーバー側エンティティ（API経由でアクセス）

| テーブル名（APIエンドポイント） | 対応エンティティ | 説明 |
| --- | --- | --- |
| part/ | InvenTreePart | 部品情報 |
| part/category/ | InvenTreePartCategory | 部品カテゴリ |
| part/test-template/ | InvenTreePartTestTemplate | 部品テストテンプレート |
| stock/ | InvenTreeStockItem | 在庫アイテム |
| stock/location/ | InvenTreeStockLocation | 在庫ロケーション |
| stock/test/ | InvenTreeStockItemTestResult | 在庫アイテムのテスト結果 |
| stock/track/ | InvenTreeStockItemHistory | 在庫アイテムの履歴 |
| company/ | InvenTreeCompany | 会社（サプライヤー/顧客/メーカー） |
| company/part/ | InvenTreeSupplierPart | サプライヤー部品 |
| company/part/manufacturer/ | InvenTreeManufacturerPart | メーカー部品 |
| order/po/ | InvenTreePurchaseOrder | 発注書 |
| order/po-line/ | InvenTreePOLineItem | 発注書明細 |
| order/po-extra-line/ | InvenTreePOExtraLineItem | 発注書追加明細 |
| order/so/ | InvenTreeSalesOrder | 受注書 |
| order/so-line/ | InvenTreeSOLineItem | 受注書明細 |
| order/so-extra-line/ | InvenTreeSOExtraLineItem | 受注書追加明細 |
| order/so/shipment/ | InvenTreeSalesOrderShipment | 受注出荷 |
| order/so-allocation/ | InvenTreeSalesOrderAllocation | 受注在庫引当 |
| bom/ | InvenTreeBomItem | 部品表（BOM）アイテム |
| project-code/ | InvenTreeProjectCode | プロジェクトコード |
| attachment/ | InvenTreeAttachment | 添付ファイル |
| parameter/ | InvenTreeParameter | パラメータ |
| notifications/ | InvenTreeNotification | 通知 |
| plugins/ | InvenTreePlugin | プラグイン |
| settings/global/ | InvenTreeGlobalSetting | グローバル設定 |
| settings/user/ | InvenTreeUserSetting | ユーザー設定 |

## 各テーブル定義

### 1 profiles（ユーザープロファイル）

ローカルデバイスに保存されるユーザーのサーバー接続プロファイル情報を管理します。複数のInvenTreeサーバーへの接続情報を保存できます。

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| key | int | NO | プロファイルの一意識別子（主キー） |
| name | String | NO | プロファイル名 |
| server | String | NO | InvenTreeサーバーのベースURL |
| token | String | YES | API認証トークン |
| selected | bool | NO | 現在選択中のプロファイルかどうか |

### 2 settings（アプリケーション設定）

ローカルデバイスに保存されるアプリケーション設定情報を管理します。Key-Value形式で各種設定を保存します。

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| key | String | NO | 設定キー（主キー） |
| value | dynamic | YES | 設定値 |

主要な設定キー:
- `homeShowSubscribed`: ホーム画面に購読部品を表示
- `homeShowPo`: ホーム画面に発注書を表示
- `homeShowSo`: ホーム画面に受注書を表示
- `barcodeSounds`: バーコードスキャン音の有効化
- `reportErrors`: エラーレポートの有効化
- `strictHttps`: 厳格なHTTPS検証
- `barcodeScanDelay`: バーコードスキャン遅延
- `customLocale`: カスタムロケール

### 3 InvenTreePart（部品）

部品マスターデータを表現するエンティティです。APIエンドポイント `part/` を通じてアクセスします。

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| pk | int | NO | 主キー |
| name | String | NO | 部品名 |
| description | String | YES | 説明 |
| IPN | String | YES | 内部部品番号 |
| revision | String | YES | リビジョン |
| keywords | String | YES | キーワード |
| link | String | YES | 外部リンク |
| category | int | YES | カテゴリID（外部キー） |
| default_location | int | YES | デフォルト保管場所ID |
| units | String | YES | 単位 |
| active | bool | NO | アクティブフラグ |
| assembly | bool | NO | アセンブリフラグ |
| component | bool | NO | コンポーネントフラグ |
| purchaseable | bool | NO | 購入可能フラグ |
| salable | bool | NO | 販売可能フラグ |
| trackable | bool | NO | 追跡可能フラグ |
| is_template | bool | NO | テンプレートフラグ |
| virtual | bool | NO | 仮想部品フラグ |
| testable | bool | NO | テスト可能フラグ |
| variant_of | int | YES | バリアント元部品ID |
| image | String | YES | 画像URL |
| thumbnail | String | YES | サムネイルURL |
| starred | bool | NO | お気に入りフラグ |
| in_stock | double | NO | 在庫数 |
| ordering | double | NO | 発注中数量 |
| building | double | NO | 製造中数量 |
| suppliers | int | NO | サプライヤー数 |

### 4 InvenTreePartCategory（部品カテゴリ）

部品カテゴリを表現するエンティティです。階層構造を持ちます。

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| pk | int | NO | 主キー |
| name | String | NO | カテゴリ名 |
| description | String | YES | 説明 |
| parent | int | YES | 親カテゴリID |
| pathstring | String | YES | パス文字列 |
| part_count | int | NO | 所属部品数 |
| structural | bool | NO | 構造カテゴリフラグ |

### 5 InvenTreeStockItem（在庫アイテム）

在庫アイテムを表現するエンティティです。

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| pk | int | NO | 主キー |
| part | int | NO | 部品ID（外部キー） |
| location | int | YES | 保管場所ID（外部キー） |
| quantity | double | NO | 数量 |
| serial | String | YES | シリアル番号 |
| batch | String | YES | バッチ番号 |
| status | int | NO | ステータス |
| packaging | String | YES | 梱包情報 |
| purchase_price | double | YES | 購入価格 |
| purchase_price_currency | String | YES | 購入価格通貨 |
| purchase_order | int | YES | 発注書ID |
| supplier_part | int | YES | サプライヤー部品ID |
| link | String | YES | 外部リンク |
| in_stock | bool | NO | 在庫ありフラグ |
| is_building | bool | NO | 製造中フラグ |
| allocated | double | NO | 引当済数量 |
| sales_order | int | YES | 受注書ID |
| customer | int | YES | 顧客ID |
| expiry_date | DateTime | YES | 有効期限 |
| updated | DateTime | YES | 更新日時 |
| stocktake_date | DateTime | YES | 棚卸日 |

### 6 InvenTreeStockLocation（在庫ロケーション）

在庫の保管場所を表現するエンティティです。階層構造を持ちます。

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| pk | int | NO | 主キー |
| name | String | NO | ロケーション名 |
| description | String | YES | 説明 |
| parent | int | YES | 親ロケーションID |
| pathstring | String | YES | パス文字列 |
| items | int | NO | 所属アイテム数 |
| structural | bool | NO | 構造ロケーションフラグ |

### 7 InvenTreeCompany（会社）

取引先会社（サプライヤー、顧客、メーカー）を表現するエンティティです。

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| pk | int | NO | 主キー |
| name | String | NO | 会社名 |
| description | String | YES | 説明 |
| website | String | YES | Webサイト |
| phone | String | YES | 電話番号 |
| email | String | YES | メールアドレス |
| is_supplier | bool | NO | サプライヤーフラグ |
| is_manufacturer | bool | NO | メーカーフラグ |
| is_customer | bool | NO | 顧客フラグ |
| active | bool | NO | アクティブフラグ |
| currency | String | YES | 通貨 |
| image | String | YES | 画像URL |
| thumbnail | String | YES | サムネイルURL |

### 8 InvenTreeSupplierPart（サプライヤー部品）

サプライヤーが提供する部品情報を表現するエンティティです。

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| pk | int | NO | 主キー |
| part | int | NO | 部品ID（外部キー） |
| supplier | int | NO | サプライヤーID（外部キー） |
| SKU | String | NO | サプライヤー品番 |
| manufacturer_part | int | YES | メーカー部品ID |
| link | String | YES | 外部リンク |
| note | String | YES | 備考 |
| packaging | String | YES | 梱包情報 |
| pack_quantity | String | YES | パック数量 |
| active | bool | NO | アクティブフラグ |
| in_stock | double | NO | 在庫数 |
| on_order | double | NO | 発注中数量 |

### 9 InvenTreeManufacturerPart（メーカー部品）

メーカーが製造する部品情報を表現するエンティティです。

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| pk | int | NO | 主キー |
| part | int | NO | 部品ID（外部キー） |
| manufacturer | int | NO | メーカーID（外部キー） |
| MPN | String | NO | メーカー品番 |
| link | String | YES | 外部リンク |

### 10 InvenTreePurchaseOrder（発注書）

発注書を表現するエンティティです。

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| pk | int | NO | 主キー |
| reference | String | NO | 発注書番号 |
| description | String | YES | 説明 |
| supplier | int | NO | サプライヤーID（外部キー） |
| supplier_reference | String | YES | サプライヤー参照番号 |
| status | int | NO | ステータス |
| project_code | int | YES | プロジェクトコードID |
| destination | int | YES | 納品先ロケーションID |
| start_date | String | YES | 開始日 |
| target_date | String | YES | 目標日 |
| creation_date | String | YES | 作成日 |
| issue_date | String | YES | 発行日 |
| complete_date | String | YES | 完了日 |
| link | String | YES | 外部リンク |
| responsible | int | YES | 担当者ID |
| contact | int | YES | 連絡先ID |
| total_price | double | YES | 合計金額 |
| order_currency | String | YES | 通貨 |
| line_items | int | NO | 明細数 |
| overdue | bool | NO | 期限超過フラグ |

### 11 InvenTreePOLineItem（発注書明細）

発注書の明細行を表現するエンティティです。

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| pk | int | NO | 主キー |
| order | int | NO | 発注書ID（外部キー） |
| part | int | NO | サプライヤー部品ID（外部キー） |
| reference | String | YES | 参照番号 |
| quantity | double | NO | 発注数量 |
| received | double | NO | 入荷済数量 |
| purchase_price | double | YES | 購入単価 |
| purchase_price_currency | String | YES | 通貨 |
| destination | int | YES | 納品先ロケーションID |
| notes | String | YES | 備考 |
| link | String | YES | 外部リンク |
| target_date | String | YES | 目標日 |
| overdue | bool | NO | 期限超過フラグ |

### 12 InvenTreeSalesOrder（受注書）

受注書を表現するエンティティです。

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| pk | int | NO | 主キー |
| reference | String | NO | 受注書番号 |
| description | String | YES | 説明 |
| customer | int | NO | 顧客ID（外部キー） |
| customer_reference | String | YES | 顧客参照番号 |
| status | int | NO | ステータス |
| project_code | int | YES | プロジェクトコードID |
| start_date | String | YES | 開始日 |
| target_date | String | YES | 目標日 |
| creation_date | String | YES | 作成日 |
| shipment_date | String | YES | 出荷日 |
| link | String | YES | 外部リンク |
| responsible | int | YES | 担当者ID |
| contact | int | YES | 連絡先ID |
| total_price | double | YES | 合計金額 |
| order_currency | String | YES | 通貨 |
| line_items | int | NO | 明細数 |
| shipments_count | int | NO | 出荷数 |
| overdue | bool | NO | 期限超過フラグ |

### 13 InvenTreeSOLineItem（受注書明細）

受注書の明細行を表現するエンティティです。

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| pk | int | NO | 主キー |
| order | int | NO | 受注書ID（外部キー） |
| part | int | NO | 部品ID（外部キー） |
| reference | String | YES | 参照番号 |
| quantity | double | NO | 受注数量 |
| allocated | double | NO | 引当済数量 |
| shipped | double | NO | 出荷済数量 |
| sale_price | double | YES | 販売単価 |
| sale_price_currency | String | YES | 通貨 |
| notes | String | YES | 備考 |
| link | String | YES | 外部リンク |
| target_date | String | YES | 目標日 |
| available_stock | double | NO | 利用可能在庫 |
| overdue | bool | NO | 期限超過フラグ |

### 14 InvenTreeSalesOrderShipment（受注出荷）

受注の出荷情報を表現するエンティティです。

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| pk | int | NO | 主キー |
| order | int | NO | 受注書ID（外部キー） |
| reference | String | NO | 出荷参照番号 |
| tracking_number | String | YES | 追跡番号 |
| invoice_number | String | YES | 請求書番号 |
| link | String | YES | 外部リンク |
| shipment_date | String | YES | 出荷日 |
| delivery_date | String | YES | 配送日 |
| checked_by | int | YES | 確認者ID |

### 15 InvenTreeSalesOrderAllocation（受注在庫引当）

受注に対する在庫引当を表現するエンティティです。

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| pk | int | NO | 主キー |
| order | int | NO | 受注書ID（外部キー） |
| line | int | NO | 受注明細ID（外部キー） |
| item | int | NO | 在庫アイテムID（外部キー） |
| shipment | int | YES | 出荷ID（外部キー） |
| quantity | double | NO | 引当数量 |

### 16 InvenTreeBomItem（部品表アイテム）

部品表（BOM）の構成アイテムを表現するエンティティです。

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| pk | int | NO | 主キー |
| part | int | NO | 親部品ID（外部キー） |
| sub_part | int | NO | 子部品ID（外部キー） |
| reference | String | YES | 参照 |
| quantity | double | NO | 数量 |

### 17 InvenTreePartTestTemplate（部品テストテンプレート）

部品のテストテンプレートを表現するエンティティです。

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| pk | int | NO | 主キー |
| part | int | NO | 部品ID（外部キー） |
| test_name | String | NO | テスト名 |
| key | String | NO | テストキー |
| required | bool | NO | 必須フラグ |
| requires_value | bool | NO | 値必須フラグ |
| requires_attachment | bool | NO | 添付必須フラグ |

### 18 InvenTreeStockItemTestResult（在庫テスト結果）

在庫アイテムのテスト結果を表現するエンティティです。

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| pk | int | NO | 主キー |
| stock_item | int | NO | 在庫アイテムID（外部キー） |
| template | int | NO | テストテンプレートID（外部キー） |
| test | String | YES | テスト名（レガシー） |
| result | bool | NO | 合否 |
| value | String | YES | 値 |
| notes | String | YES | 備考 |
| attachment | String | YES | 添付ファイル |
| date | String | YES | テスト日 |
| user | int | YES | テスト実施者ID |

### 19 InvenTreeAttachment（添付ファイル）

各種モデルに添付されるファイルを表現するエンティティです。

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| pk | int | NO | 主キー |
| model_type | String | NO | モデルタイプ |
| model_id | int | NO | モデルID |
| attachment | String | YES | ファイルパス |
| link | String | YES | 外部リンク |
| comment | String | YES | コメント |
| upload_date | DateTime | YES | アップロード日時 |

### 20 InvenTreeProjectCode（プロジェクトコード）

プロジェクトコードを表現するエンティティです。

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| pk | int | NO | 主キー |
| code | String | NO | コード |
| description | String | YES | 説明 |

### 21 InvenTreeNotification（通知）

ユーザーへの通知を表現するエンティティです。

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| pk | int | NO | 主キー |
| name | String | NO | 通知名 |
| message | String | NO | メッセージ |
| creation | DateTime | YES | 作成日時 |
| read | bool | NO | 既読フラグ |

### 22 InvenTreeParameter（パラメータ）

各種モデルに関連付けられるパラメータを表現するエンティティです。

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| pk | int | NO | 主キー |
| model_type | String | NO | モデルタイプ |
| model_id | int | NO | モデルID |
| template | int | NO | テンプレートID |
| data | String | YES | データ値 |

## 備考

### アーキテクチャに関する注意事項

1. **クライアント-サーバーアーキテクチャ**: 本アプリはInvenTreeサーバーのモバイルクライアントです。サーバー側のデータベースには直接アクセスせず、RESTful APIを通じてデータを操作します。

2. **ローカルストレージ**: ユーザープロファイルとアプリ設定のみがデバイス上のsembastデータベースに保存されます。

3. **オフライン対応**: 現在のアーキテクチャではオフラインでのデータ操作はサポートされていません。サーバーへの接続が必要です。

4. **APIバージョン互換性**: コード内にはAPIバージョンによる条件分岐が多数存在し、異なるバージョンのInvenTreeサーバーとの互換性を維持しています。

### データ型のマッピング

| Dart型 | サーバー側想定型 | 説明 |
| --- | --- | --- |
| int | INTEGER | 整数値 |
| double | DECIMAL/FLOAT | 浮動小数点数 |
| String | VARCHAR/TEXT | 文字列 |
| bool | BOOLEAN | 真偽値 |
| DateTime | DATETIME | 日時 |

### 外部キー関連

サーバー側では以下のような外部キー制約が想定されます。

- Part.category -> PartCategory.pk
- StockItem.part -> Part.pk
- StockItem.location -> StockLocation.pk
- SupplierPart.part -> Part.pk
- SupplierPart.supplier -> Company.pk
- PurchaseOrder.supplier -> Company.pk
- SalesOrder.customer -> Company.pk
- POLineItem.order -> PurchaseOrder.pk
- SOLineItem.order -> SalesOrder.pk
- BomItem.part -> Part.pk
- BomItem.sub_part -> Part.pk
