# 帳票設計書 2-Build Order Report

## 概要

本ドキュメントは、InvenTreeシステムにおける製造オーダーレポートの設計仕様を記載する。このレポートは製造指示書として使用され、製造オーダーの詳細情報をPDF形式で出力する帳票である。

### 本帳票の処理概要

本帳票は、製造現場への作業指示として使用される製造オーダー（Build Order）の詳細レポートを生成する。製造に必要な部品、数量、納期などの情報を一元化して提供する。

**業務上の目的・背景**：製造業において、製造指示は生産計画の実行フェーズで最も重要なドキュメントである。本帳票は、どの製品をいくつ製造するか、いつまでに完成させるか、誰が責任者かを明確にし、製造現場での作業の基準となる。また、関連する販売オーダーや親製造オーダーとの紐付けにより、トレーサビリティを確保する。

**帳票の利用シーン**：製造オーダー発行時の作業指示書、製造現場での進捗管理、品質管理部門での製造履歴確認、外部委託先への製造依頼書として利用される。

**主要な出力内容**：
1. 製造オーダーの基本情報（参照番号、対象部品、数量）
2. 製造スケジュール（発行日、目標日）
3. 関連オーダー情報（販売オーダー、親製造オーダー）
4. 責任者・発行者情報
5. 製造に関する備考（Notes）

**帳票の出力タイミング**：製造オーダー詳細画面から、製造開始前の作業指示書として出力される。

**帳票の利用者**：生産管理者、製造現場リーダー、品質管理担当者、外部委託管理者

## 帳票種別

指示書（製造指示書）

## 利用画面

| 画面No | 画面名 | URL/ルーティング | 出力操作 |
|--------|--------|-----------------|---------|
| - | 製造オーダー詳細画面 | /manufacturing/build-order/{build_id}/ | レポート出力ボタン |
| - | レポート印刷API | /api/report/print/ | POSTリクエスト |

## 出力形式

### 基本仕様

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

### PDF固有設定

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

## 帳票レイアウト

### レイアウト概要

ヘッダー部にロゴと製造オーダー情報、本文に詳細情報テーブルと部品画像、フッターに日付とバージョン情報を配置する。

```
┌─────────────────────────────────────┐
│  [ロゴ]    Build Order {reference}  │
│            {qty} x {part_name}      │
│  ────────────────────────────────   │
├─────────────────────────────────────┤
│  ┌─────────────────────────────┐   │
│  │ Build Order: {ref}          │   │
│  │ Part: {part}                │   │
│  │ Quantity: {qty}      [IMG]  │   │
│  │ Description: {title}        │   │
│  │ Issued: {date}              │   │
│  │ Target Date: {date}         │   │
│  │ Sales Order: {SO}           │   │
│  │ Required For: {parent}      │   │
│  │ Issued By: {user}           │   │
│  │ Responsible: {owner}        │   │
│  │ Link: {url}                 │   │
│  └─────────────────────────────┘   │
│                                     │
│  Notes                              │
│  {markdown content}                 │
├─────────────────────────────────────┤
│  v{revision} - {date}              │
└─────────────────────────────────────┘
```

### ヘッダー部

| No | 項目名 | 説明 | データ取得元 | 表示形式 |
|----|-------|------|-------------|---------|
| 1 | ロゴ | システムロゴ画像 | logo_image テンプレートタグ | 画像（高さ20mm） |
| 2 | タイトル | Build Order + 参照番号 | build.reference | テキスト（h3） |
| 3 | サブタイトル | 数量 x 部品名 | build.quantity, part.full_name | テキスト |

### 明細部

| No | 項目名 | 説明 | データ取得元 | 表示形式 | 列幅 |
|----|-------|------|-------------|---------|-----|
| 1 | Build Order | 製造オーダー参照 | build（internal_link） | リンク | - |
| 2 | Part | 対象部品 | part.full_name（internal_link） | リンク | - |
| 3 | Quantity | 製造数量 | build.quantity | 数値 | - |
| 4 | Description | 説明 | build.title | テキスト | - |
| 5 | Issued | 発行日 | build.creation_date | 日付 | - |
| 6 | Target Date | 目標完了日 | build.target_date | 日付（または"Not specified"） | - |
| 7 | Sales Order | 関連販売オーダー | build.sales_order（internal_link） | リンク（または"Not specified"） | - |
| 8 | Required For | 親製造オーダー | build.parent（internal_link） | リンク（条件付き表示） | - |
| 9 | Issued By | 発行者 | build.issued_by | テキスト（条件付き表示） | - |
| 10 | Responsible | 責任者 | build.responsible | テキスト（条件付き表示） | - |
| 11 | Link | 外部リンク | build.link | URL（条件付き表示） | - |
| 12 | Part Image | 部品画像 | part_image | 画像（40mm） | 30% |

### フッター部

| No | 項目名 | 説明 | データ取得元 | 表示形式 |
|----|-------|------|-------------|---------|
| 1 | リビジョン | テンプレートリビジョン | report_revision | v{number} |
| 2 | 日付 | 出力日 | date | 日付形式 |

## 出力条件

### 抽出条件

| 条件名 | 説明 | 必須 |
|-------|------|-----|
| build_id | 対象製造オーダーのID | Yes |

### ソート順

| 優先度 | 項目 | 昇順/降順 |
|-------|------|---------|
| - | - | 単一レコードのため該当なし |

### 改ページ条件

Notesが長い場合、ページ下端で自動改ページ

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

### 参照テーブル一覧

| テーブル名 | 用途 | 結合条件 |
|-----------|------|---------|
| build_build | 製造オーダー情報 | 直接参照 |
| part_part | 対象部品情報 | build.part_id |
| order_salesorder | 関連販売オーダー | build.sales_order_id |
| build_build (parent) | 親製造オーダー | build.parent_id |
| auth_user (issued_by) | 発行者 | build.issued_by_id |
| users_owner | 責任者 | build.responsible_id |

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

#### build_build

| 参照項目（カラム名） | 帳票項目との対応 | 取得条件 | 備考 |
|-------------------|----------------|---------|------|
| reference | Build Order参照番号 | - | - |
| quantity | 製造数量 | - | - |
| title | 説明 | - | - |
| creation_date | 発行日 | - | - |
| target_date | 目標日 | - | NULL許容 |
| notes | 備考 | - | Markdown形式 |
| link | 外部リンク | - | NULL許容 |

#### part_part

| 参照項目（カラム名） | 帳票項目との対応 | 取得条件 | 備考 |
|-------------------|----------------|---------|------|
| full_name | 部品名 | - | name + variantの組み合わせ |
| image | 部品画像 | - | - |

## 計算仕様

### 計算項目一覧

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

## 処理フロー

### 出力フロー

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

## エラー処理

### エラーケース一覧

| エラー種別 | 発生条件 | 表示メッセージ | 対処方法 |
|----------|---------|--------------|---------|
| データなし | 指定された製造オーダーが存在しない | No valid items provided to template | 有効な製造オーダーIDを指定 |
| テンプレートエラー | テンプレートファイルが存在しない | Template file does not exist | テンプレートファイルを確認 |
| 構文エラー | テンプレート構文エラー | Template syntax error | テンプレートの記述を修正 |

## パフォーマンス要件

| 項目 | 内容 |
|-----|------|
| 想定データ件数 | 1製造オーダー |
| 目標出力時間 | 3秒以内 |
| 同時出力数上限 | システム設定による |

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

- 認証済みユーザーのみがレポートを出力可能
- 製造オーダーデータへのアクセス権限は既存の権限モデルに従う
- 出力ログはDataOutputモデルに記録

## 備考

- テンプレートファイル: `src/backend/InvenTree/report/templates/report/inventree_build_order_report.html`
- 基底テンプレート: `inventree_report_base.html`を継承
- Markdownifyライブラリを使用してNotesをHTML変換
- i18n対応済み（多言語対応）

---

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

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

### 推奨読解順序

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

まず、帳票で使用されるデータ構造を理解することが重要である。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | models.py | `src/backend/InvenTree/build/models.py` | BuildReportContext（52-74行目）でレポートコンテキストの構造を確認 |
| 1-2 | models.py | `src/backend/InvenTree/build/models.py` | Buildクラス（76-500行目）でモデルフィールド定義を確認 |

**読解のコツ**: BuildReportContextのTypeDict定義で、帳票で使用可能な全データ項目を把握できる。build, part, quantity, reference, titleが主要な項目。

#### Step 2: エントリーポイントを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | api.py | `src/backend/InvenTree/report/api.py` | ReportPrint.post()がAPIエントリーポイント |
| 2-2 | models.py | `src/backend/InvenTree/build/models.py` | report_context()（221-232行目）でコンテキスト生成処理 |

**主要処理フロー**:
1. **221行目**: report_context()メソッド開始
2. **222-232行目**: bom_items, build, build_outputs, line_items, part, quantity, reference, titleを辞書で返却

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | inventree_build_order_report.html | `src/backend/InvenTree/report/templates/report/` | 帳票のHTMLテンプレート全体 |

**主要処理フロー**:
- **1行目**: 基底テンプレート継承
- **7行目**: markdownifyロード（Notes用）
- **80-92行目**: ヘッダー部（ロゴ、タイトル、サブタイトル）
- **94-170行目**: 詳細情報テーブル（条件分岐を含む）
- **172-176行目**: Notes表示（markdownify適用）

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

```
ReportPrint.post() [api.py:253]
    │
    └─ print() [api.py:271]
           │
           └─ ReportTemplate.print() [report/models.py:465]
                  │
                  ├─ get_context() [report/models.py:423]
                  │      │
                  │      └─ build.report_context() [build/models.py:221]
                  │             │
                  │             ├─ part.get_bom_items()
                  │             ├─ build_outputs.all()
                  │             └─ build_lines.all()
                  │
                  └─ render() [report/models.py:263]
                         │
                         └─ render_to_string() + markdownify
```

### データフロー図

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

Build ID ─────────▶ Build.objects.get() ─────────▶ Build インスタンス
                           │
                           ▼
                    build.report_context()
                           │
                           ├─▶ build (Build)
                           ├─▶ part (Part)
                           ├─▶ quantity
                           ├─▶ reference
                           ├─▶ title
                           └─▶ bom_items, build_outputs, line_items
                           │
                           ▼
                    render_to_string() + markdownify
                           │
                           ▼
                    HTML → PDF (WeasyPrint)
                           │
                           ▼
                    DataOutput ──────────────────▶ PDF ファイル
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| inventree_build_order_report.html | `src/backend/InvenTree/report/templates/report/` | テンプレート | 製造オーダーレポートのHTMLテンプレート |
| inventree_report_base.html | `src/backend/InvenTree/report/templates/report/` | テンプレート | レポート共通基底テンプレート |
| models.py | `src/backend/InvenTree/build/` | ソース | Build, BuildLineモデル定義 |
| models.py | `src/backend/InvenTree/report/` | ソース | ReportTemplateモデル定義 |
| api.py | `src/backend/InvenTree/report/` | ソース | レポートAPI定義 |
| models.py | `src/backend/InvenTree/part/` | ソース | Partモデル定義 |
