# 帳票設計書 8-Stock Item Test Report

## 概要

本ドキュメントは、InvenTreeシステムにおける在庫品目テストレポートの設計仕様を記載する。このレポートは在庫品目のテスト結果を出力し、合格/不合格をPDF形式で表示する帳票である。

### 本帳票の処理概要

本帳票は、特定の在庫品目に対して実施されたテスト結果の詳細レポートを生成する。品質管理における検査記録として、テスト項目ごとの結果（Pass/Fail）、測定値、実施者、実施日を一覧表示する。

**業務上の目的・背景**：品質管理において、製品や部品のテスト結果を記録・追跡することは品質保証の基盤である。本帳票は、出荷前検査の証跡、顧客への品質保証書、不良品分析の資料として機能する。また、規制対応や監査対応における品質記録としても使用される。

**帳票の利用シーン**：出荷前の最終検査証明書、顧客への品質証明書添付、不良品発生時の原因調査資料、定期監査時の品質記録として利用される。

**主要な出力内容**：
1. 在庫品目の基本情報（部品名、説明、ロケーション、シリアル/数量）
2. テスト結果一覧（テスト名、結果、測定値、実施者、実施日）
3. インストール済み品目一覧（該当する場合）

**帳票の出力タイミング**：在庫品目詳細画面のテストタブから、テスト完了後や出荷前に出力される。

**帳票の利用者**：品質管理担当者、検査担当者、出荷担当者、顧客

## 帳票種別

検査成績書

## 利用画面

| 画面No | 画面名 | URL/ルーティング | 出力操作 |
|--------|--------|-----------------|---------|
| - | 在庫品目詳細画面 - テストタブ | /stock/item/{stock_id}/tests/ | レポート出力ボタン |
| - | レポート印刷API | /api/report/print/ | POSTリクエスト |

## 出力形式

### 基本仕様

| 項目 | 内容 |
|-----|------|
| ファイル形式 | PDF |
| 用紙サイズ | A4（設定により変更可能） |
| 向き | 縦 |
| ファイル名 | output.pdf（テンプレート設定により変更可能） |
| 出力方法 | ダウンロード |
| 文字コード | UTF-8 |

### PDF固有設定

| 項目 | 内容 |
|-----|------|
| パスワード保護 | 無 |
| 印刷制限 | 無 |
| 電子署名 | 無 |

## 帳票レイアウト

### レイアウト概要

```
┌─────────────────────────────────────┐
│  Stock Item Test Report             │
├─────────────────────────────────────┤
│  ┌─────────────────────────────┐   │
│  │ {part_name}          [IMG]  │   │
│  │ {description}               │   │
│  │ {location}                  │   │
│  │ Stock Item ID: {id}         │   │
│  │ Serial: {sn} / Qty: {qty}   │   │
│  └─────────────────────────────┘   │
│                                     │
│  Test Results                       │
│  ┌─────────────────────────────┐   │
│  │Test  |Result|Value|User|Date│   │
│  │------|------|-----|----|----|   │
│  │test1 |Pass  |10.5 |usr |date│   │
│  │test2 |Fail  |...  |... |... │   │
│  │*req* |No result (required)  │   │
│  └─────────────────────────────┘   │
│                                     │
│  Installed Items (if any)          │
│  ┌─────────────────────────────┐   │
│  │ [img] part  | Serial/Qty    │   │
│  └─────────────────────────────┘   │
├─────────────────────────────────────┤
│  {date}         {version}          │
└─────────────────────────────────────┘
```

### ヘッダー部

| No | 項目名 | 説明 | データ取得元 | 表示形式 |
|----|-------|------|-------------|---------|
| 1 | タイトル | "Stock Item Test Report" | 固定値（top_center） | テキスト |

### 明細部 - 在庫品目情報

| No | 項目名 | 説明 | データ取得元 | 表示形式 | 列幅 |
|----|-------|------|-------------|---------|-----|
| 1 | 部品名 | 部品のフルネーム | part.full_name | テキスト（h2） | - |
| 2 | 説明 | 部品の説明 | part.description | テキスト | - |
| 3 | ロケーション | 保管場所 | stock_item.location | テキスト（イタリック） | - |
| 4 | Stock Item ID | 在庫品目ID | stock_item.pk | テキスト（イタリック） | - |
| 5 | シリアル/数量 | シリアル品はシリアル番号、それ以外は数量 | stock_item.serial / stock_item.quantity | 条件付き表示 | - |
| 6 | 部品画像 | 部品の画像 | part_image | 画像（4cm） | - |

### 明細部 - テスト結果

| No | 項目名 | 説明 | データ取得元 | 表示形式 | 列幅 |
|----|-------|------|-------------|---------|-----|
| 1 | Test | テスト名 | test_template.test_name / test_result.test | テキスト（必須は太字） | 自動 |
| 2 | Result | 合否 | test_result.result | Pass（緑）/ Fail（赤） | 自動 |
| 3 | Value | 測定値 | test_result.value | テキスト | 自動 |
| 4 | User | 実施者 | test_result.user.username | テキスト | 自動 |
| 5 | Date | 実施日 | test_result.date.date | 日付形式 | 自動 |

### 明細部 - インストール済み品目

| No | 項目名 | 説明 | データ取得元 | 表示形式 | 列幅 |
|----|-------|------|-------------|---------|-----|
| 1 | 部品画像+名前 | インストール品目の部品 | sub_item.part | 画像+テキスト | 自動 |
| 2 | シリアル/数量 | シリアル品はシリアル、それ以外は数量 | sub_item.serial / sub_item.quantity | 条件付き表示 | 自動 |

### フッター部

| No | 項目名 | 説明 | データ取得元 | 表示形式 |
|----|-------|------|-------------|---------|
| 1 | 日付 | 出力日 | date | 日付形式 |
| 2 | バージョン | InvenTreeバージョン | inventree_version | テキスト |

## 出力条件

### 抽出条件

| 条件名 | 説明 | 必須 |
|-------|------|-----|
| stock_id | 対象在庫品目のID | Yes |
| test_keys | テストキーの一覧 | - |
| test_templates | テストテンプレート | - |
| results | テスト結果 | - |

### ソート順

| 優先度 | 項目 | 昇順/降順 |
|-------|------|---------|
| 1 | test_keysの順序 | - |

### 改ページ条件

テスト項目が多い場合、ページ下端で自動改ページ

## データベース参照仕様

### 参照テーブル一覧

| テーブル名 | 用途 | 結合条件 |
|-----------|------|---------|
| stock_stockitem | 在庫品目情報 | 直接参照 |
| part_part | 部品情報 | stockitem.part_id |
| part_parttesttemplate | テストテンプレート | parttesttemplate.part_id |
| stock_stockitemtestresult | テスト結果 | testresult.stock_item_id |
| auth_user | 実施者 | testresult.user_id |
| stock_stocklocation | ロケーション | stockitem.location_id |

### テーブル別参照項目詳細

#### stock_stockitemtestresult

| 参照項目（カラム名） | 帳票項目との対応 | 取得条件 | 備考 |
|-------------------|----------------|---------|------|
| test | テスト名 | - | テンプレートがない場合 |
| result | 合否 | - | Boolean |
| value | 測定値 | - | - |
| user | 実施者 | - | ForeignKey |
| date | 実施日 | - | DateTime |

#### part_parttesttemplate

| 参照項目（カラム名） | 帳票項目との対応 | 取得条件 | 備考 |
|-------------------|----------------|---------|------|
| test_name | テスト名 | - | - |
| required | 必須フラグ | - | Boolean |
| key | テストキー | - | ユニーク識別子 |

## 計算仕様

### 計算項目一覧

| 項目名 | 計算式 | 端数処理 | 備考 |
|-------|-------|---------|------|
| - | - | - | 本帳票に計算項目なし |

## 処理フロー

### 出力フロー

```mermaid
flowchart TD
    A[出力要求] --> B[パラメータ検証]
    B --> C[StockItem取得]
    C --> D[TestTemplates取得]
    D --> E[TestResults取得]
    E --> F[test_keys生成]
    F --> G[コンテキスト生成]
    G --> H[HTMLレンダリング]
    H --> I[WeasyPrintでPDF変換]
    I --> J[DataOutput保存]
    J --> K[ファイル返却]
```

## エラー処理

### エラーケース一覧

| エラー種別 | 発生条件 | 表示メッセージ | 対処方法 |
|----------|---------|--------------|---------|
| データなし | 指定された在庫品目が存在しない | No valid items provided to template | 有効な在庫品目IDを指定 |
| テストなし | テストが定義されていない | "No tests defined for this stock item" | テンプレート内で表示 |

## パフォーマンス要件

| 項目 | 内容 |
|-----|------|
| 想定データ件数 | 1在庫品目あたり最大50テスト項目 |
| 目標出力時間 | 5秒以内 |
| 同時出力数上限 | システム設定による |

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

- 認証済みユーザーのみがレポートを出力可能
- テスト結果データへのアクセス権限は既存の権限モデルに従う
- 品質記録として法的保存が必要な場合あり
- 出力ログはDataOutputモデルに記録

## 備考

- テンプレートファイル: `src/backend/InvenTree/report/templates/report/inventree_test_report.html`
- 基底テンプレート: `inventree_report_base.html`を継承
- テスト結果の色分け: Pass=緑(#5f5)、Fail=赤(#F55)
- 必須テストで結果なし: 赤背景で強調表示
- i18n対応済み（多言語対応）

---

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

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

### 推奨読解順序

#### Step 1: データ構造を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | models.py | `src/backend/InvenTree/stock/models.py` | StockItemReportContext（349-396行目）でコンテキスト構造を確認 |
| 1-2 | models.py | `src/backend/InvenTree/stock/models.py` | report_context()（481-510行目）でデータ取得処理確認 |
| 1-3 | models.py | `src/backend/InvenTree/stock/models.py` | get_test_keys()（463-479行目）でテストキー生成ロジック確認 |

**読解のコツ**: test_keys, test_templates, resultsの3つのデータ構造の関係を理解することが重要。

#### Step 2: テンプレートを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | inventree_test_report.html | `src/backend/InvenTree/report/templates/report/` | 帳票全体構造 |

**主要処理フロー**:
- **74-94行目**: 在庫品目情報表示（条件分岐でシリアル/数量切替）
- **96-150行目**: テスト結果テーブル（test_keysループ）
- **113-125行目**: getkey テンプレートタグでテンプレートと結果を取得
- **127-141行目**: 結果の条件分岐（Pass/Fail/No result）
- **152-177行目**: インストール済み品目セクション

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

```
ReportPrint.post() [api.py:253]
    │
    └─ ReportTemplate.print() [report/models.py:465]
           │
           ├─ get_context()
           │      │
           │      └─ stockitem.report_context() [stock/models.py:481]
           │             │
           │             ├─ get_test_keys() [stock/models.py:463]
           │             ├─ part.getTestTemplates()
           │             ├─ testResultMap()
           │             └─ get_installed_items()
           │
           └─ render() → HTML → PDF
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| inventree_test_report.html | `src/backend/InvenTree/report/templates/report/` | テンプレート | テストレポートのHTMLテンプレート |
| inventree_report_base.html | `src/backend/InvenTree/report/templates/report/` | テンプレート | レポート共通基底テンプレート |
| models.py | `src/backend/InvenTree/stock/` | ソース | StockItem, StockItemTestResultモデル定義 |
| models.py | `src/backend/InvenTree/part/` | ソース | Part, PartTestTemplateモデル定義 |
