# 帳票設計書 3-Purchase Order Report

## 概要

本ドキュメントは、InvenTreeシステムにおける購買オーダーレポートの設計仕様を記載する。このレポートは仕入先への発注書として使用され、発注明細と合計金額をPDF形式で出力する帳票である。

### 本帳票の処理概要

本帳票は、サプライヤー（仕入先）への発注書として使用される購買オーダー（Purchase Order）の詳細レポートを生成する。発注品目、数量、単価、合計金額などの情報を一覧形式で出力する。

**業務上の目的・背景**：調達業務において、サプライヤーへの正式な発注書は取引の基本ドキュメントである。本帳票は、発注内容を明確に伝達し、納品後の検収作業や支払い処理の基準となる。また、発注履歴の記録として監査対応にも使用される。

**帳票の利用シーン**：サプライヤーへの発注時の正式発注書、社内の発注承認プロセス、納品時の検収照合、経理部門での支払い処理の根拠資料として利用される。

**主要な出力内容**：
1. 購買オーダーの基本情報（参照番号、サプライヤー名）
2. 発注日・納期情報
3. 発注明細（部品、数量、単価、小計）
4. 追加ライン項目（送料等）
5. 合計金額

**帳票の出力タイミング**：購買オーダー詳細画面から、発注確定後にサプライヤーへ送付する発注書として出力される。

**帳票の利用者**：調達担当者、購買管理者、経理担当者、サプライヤー

## 帳票種別

発注書

## 利用画面

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

## 出力形式

### 基本仕様

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

### PDF固有設定

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

## 帳票レイアウト

### レイアウト概要

ヘッダー部にサプライヤーロゴと購買オーダー情報、本文にオーダー詳細と明細一覧、フッターに合計金額と日付を配置する。

```
┌─────────────────────────────────────┐
│  [Supplier Logo]  Purchase Order    │
│                   {prefix}{ref}     │
│                   {supplier_name}   │
├─────────────────────────────────────┤
│  Order Details                      │
│  - Issue Date: {date}               │
│  - Target Date: {date}              │
│                                     │
│  Line Items                         │
│  ┌─────────────────────────────┐   │
│  │Part|Ref|Qty|Unit|Total|Note │   │
│  │----|---|---|----|----|------|   │
│  │... |...|...|... |... |...   │   │
│  ├─────────────────────────────┤   │
│  │Extra Line Items             │   │
│  │... |...|...|... |... |...   │   │
│  ├─────────────────────────────┤   │
│  │         Total: {amount}     │   │
│  └─────────────────────────────┘   │
├─────────────────────────────────────┤
│  {date}                            │
└─────────────────────────────────────┘
```

### ヘッダー部

| No | 項目名 | 説明 | データ取得元 | 表示形式 |
|----|-------|------|-------------|---------|
| 1 | サプライヤーロゴ | サプライヤー企業ロゴ | company_image supplier | 画像（幅150px） |
| 2 | タイトル | "Purchase Order" | 固定値 | テキスト（h3） |
| 3 | 参照番号 | プレフィックス + 参照番号 | prefix, reference | テキスト |
| 4 | サプライヤー名 | サプライヤー企業名（または"Supplier was deleted"） | supplier.name | テキスト |

### 明細部

| No | 項目名 | 説明 | データ取得元 | 表示形式 | 列幅 |
|----|-------|------|-------------|---------|-----|
| 1 | Part | 部品名 + サムネイル | line.part.part.full_name | テキスト+画像 | 自動 |
| 2 | Reference | 参照番号 | line.reference | テキスト | 自動 |
| 3 | Quantity | 数量 | line.quantity | 数値（小数） | 自動 |
| 4 | Unit Price | 単価 | line.price | 通貨（小数2桁） | 自動 |
| 5 | Total Price | 小計 | line.total_line_price | 通貨（小数2桁） | 自動 |
| 6 | Note | 備考 | line.notes | テキスト | 自動 |

### フッター部

| No | 項目名 | 説明 | データ取得元 | 表示形式 |
|----|-------|------|-------------|---------|
| 1 | Total | 合計金額 | order.total_price | 通貨（小数2桁）+ 通貨コード |
| 2 | 日付 | 出力日 | date | 日付形式 |

## 出力条件

### 抽出条件

| 条件名 | 説明 | 必須 |
|-------|------|-----|
| po_id | 対象購買オーダーのID | Yes |
| lines | 通常ライン項目 | - |
| extra_lines | 追加ライン項目 | - |

### ソート順

| 優先度 | 項目 | 昇順/降順 |
|-------|------|---------|
| 1 | ライン項目のデフォルト順序 | - |

### 改ページ条件

明細項目が多い場合、ページ下端で自動改ページ

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

### 参照テーブル一覧

| テーブル名 | 用途 | 結合条件 |
|-----------|------|---------|
| order_purchaseorder | 購買オーダー情報 | 直接参照 |
| company_company | サプライヤー情報 | purchaseorder.supplier_id |
| order_purchaseorderlineitem | 発注明細 | purchaseorderlineitem.order_id |
| order_purchaseorderextraline | 追加明細 | purchaseorderextraline.order_id |
| company_supplierpart | サプライヤー部品 | lineitem.part_id |
| part_part | 部品情報 | supplierpart.part_id |

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

#### order_purchaseorder

| 参照項目（カラム名） | 帳票項目との対応 | 取得条件 | 備考 |
|-------------------|----------------|---------|------|
| reference | 参照番号 | - | - |
| issue_date | 発注日 | - | NULL許容 |
| target_date | 納期 | - | NULL許容 |
| total_price | 合計金額 | - | 自動計算 |
| order_currency | 通貨 | - | - |

#### order_purchaseorderlineitem

| 参照項目（カラム名） | 帳票項目との対応 | 取得条件 | 備考 |
|-------------------|----------------|---------|------|
| part | サプライヤー部品 | - | ForeignKey |
| reference | 参照番号 | - | - |
| quantity | 数量 | - | - |
| price | 単価 | - | - |
| notes | 備考 | - | - |

## 計算仕様

### 計算項目一覧

| 項目名 | 計算式 | 端数処理 | 備考 |
|-------|-------|---------|------|
| Total Price (行) | quantity * price | 小数2桁 | total_line_priceプロパティ |
| Total (合計) | SUM(line.total_line_price) + SUM(extra_line.total_line_price) | 小数4桁 | TotalPriceMixin.calculate_total_price() |

## 処理フロー

### 出力フロー

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

## エラー処理

### エラーケース一覧

| エラー種別 | 発生条件 | 表示メッセージ | 対処方法 |
|----------|---------|--------------|---------|
| データなし | 指定された購買オーダーが存在しない | No valid items provided to template | 有効な購買オーダーIDを指定 |
| サプライヤー削除済み | サプライヤーが削除された | Supplier was deleted | 表示のみ（エラーではない） |
| 通貨換算エラー | 為替レートが未設定 | - | 換算せずNULL返却 |

## パフォーマンス要件

| 項目 | 内容 |
|-----|------|
| 想定データ件数 | 1購買オーダーあたり最大50明細 |
| 目標出力時間 | 5秒以内 |
| 同時出力数上限 | システム設定による |

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

- 認証済みユーザーのみがレポートを出力可能
- 購買オーダーデータへのアクセス権限は既存の権限モデルに従う
- 金額情報は社外秘扱いの可能性があるため取扱注意
- 出力ログはDataOutputモデルに記録

## 備考

- テンプレートファイル: `src/backend/InvenTree/report/templates/report/inventree_purchase_order_report.html`
- 基底テンプレート: `inventree_order_report_base.html`を継承（オーダー系共通）
- 通貨表示は`render_currency`テンプレートタグを使用
- i18n対応済み（多言語対応）

---

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

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

### 推奨読解順序

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | models.py | `src/backend/InvenTree/order/models.py` | PurchaseOrderReportContext（202-222行目）でコンテキスト構造を確認 |
| 1-2 | models.py | `src/backend/InvenTree/order/models.py` | TotalPriceMixin（65-179行目）で合計金額計算ロジック確認 |

**読解のコツ**: PurchaseOrderReportContextで、lines, extra_lines, order, supplierが主要なデータ項目。

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

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

**主要処理フロー**:
- **9-18行目**: ヘッダー部（サプライヤーロゴ、タイトル、参照番号）
- **20-27行目**: オーダー詳細（発注日、納期）
- **29-85行目**: 明細テーブル（通常ライン、追加ライン、合計）

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

```
ReportPrint.post() [api.py:253]
    │
    └─ ReportTemplate.print() [report/models.py:465]
           │
           ├─ get_context() [report/models.py:423]
           │      │
           │      └─ purchaseorder.report_context()
           │             │
           │             ├─ lines (PurchaseOrderLineItem QuerySet)
           │             ├─ extra_lines (PurchaseOrderExtraLine QuerySet)
           │             └─ supplier (Company)
           │
           └─ render() → HTML → PDF
```

### データフロー図

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

PO ID ────────────▶ PurchaseOrder.objects.get() ────▶ PO インスタンス
                           │
                           ▼
                    order.report_context()
                           │
                           ├─▶ lines (LineItem QuerySet)
                           ├─▶ extra_lines (ExtraLine QuerySet)
                           ├─▶ order (PurchaseOrder)
                           └─▶ supplier (Company)
                           │
                           ▼
                    render_to_string() + render_currency
                           │
                           ▼
                    HTML → PDF (WeasyPrint)
                           │
                           ▼
                    DataOutput ──────────────────▶ PDF ファイル
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| inventree_purchase_order_report.html | `src/backend/InvenTree/report/templates/report/` | テンプレート | 購買オーダーレポートのHTMLテンプレート |
| inventree_order_report_base.html | `src/backend/InvenTree/report/templates/report/` | テンプレート | オーダー系共通基底テンプレート |
| models.py | `src/backend/InvenTree/order/` | ソース | PurchaseOrder, PurchaseOrderLineItemモデル定義 |
| models.py | `src/backend/InvenTree/company/` | ソース | Companyモデル定義 |
