# PURCHASE-001: 物品購入フロー（IM-Workflow）

## 概要

社員が業務に必要な物品（消耗品・備品・機材等）の購入を申請し、部門長承認を経て購買部が発注処理を行うシステム。
申請時に金額を案件プロパティへ設定し、合計金額が一定額以上の場合は経理部承認を経由する分岐ルートを構成する。最終承認完了時に発注データを業務テーブルへ記録する。

## 対象ユーザ

| ペルソナ     | 説明                                                                       |
| ------------ | -------------------------------------------------------------------------- |
| 一般社員     | 業務に必要な物品の購入を申請する社員。手軽に申請し、進捗を確認したい       |
| 部門長       | 部下の購入申請を承認する直属の部門長。業務妥当性と部門予算を考慮して判断する |
| 経理部担当   | 高額な購入申請の最終確認を行う。全社の購買実績と予算消化状況を管理する     |
| 購買部担当   | 承認済みの購入申請を受け、取引先への発注処理を行う                         |

## ユーザストーリー

### 一般社員として

- 必要な物品の品名・数量・単価・取引先を入力して購入申請ができる
- 部門長が未処理であれば申請を引き戻して修正・再申請できる
- 不要になった申請を取り止めることができる
- 差し戻された申請のコメントを確認し、修正して再申請できる

### 部門長として

- 部下の購入申請の内容（品目・金額・取引先・利用目的）を確認し、承認・差戻し・否認できる
- 差戻し・否認時はコメントで理由を伝えられる
- 処理を一時保留し、後から再開できる
- 後続ノードが未処理であれば承認を引き戻せる

### 経理部担当として

- 高額（合計50万円以上）の購入申請に対して内容を確認し、承認・差戻し・否認できる
- 差戻し先を申請者または部門長から選択できる
- 全社予算と照らして必要に応じて差戻しを行える

### 購買部担当として

- 全承認済みの購入申請を受け、取引先への発注処理を行える
- 発注処理の完了をもって案件を承認終了できる
- 承認終了時に発注データが業務テーブルへ自動的に記録される

## ワークフロー定義

> 各定義の詳細は個別のドキュメントを参照。
>
> - [フロー定義](flow_definition.md) - 機能設定・フローグループ・機能方針
> - [コンテンツ定義](content_definition.md) - 画面定義・ユーザプログラム・通知定義・分岐ルール
> - [ルート定義](route_definition.md) - ノード定義・処理権限者プラグイン・処理フロー

### フロー定義 基本情報

| 項目         | 値                                       |
| ------------ | ---------------------------------------- |
| フロー名     | 物品購入フロー                           |
| フローID     | purchase_request                         |
| フローグループ | テナント既定のグループ                 |
| 案件名ルール | `物品購入_[申請者名]_[取引先名]`         |

### ルート概要

```mermaid
flowchart LR
    Start(("開始")) --> Apply["申請ノード<br/>（申請者）"]
    Apply -- "申請" --> Approve1["承認ノード<br/>（部門長）"]
    Approve1 -- "承認" --> Branch{"金額判定"}
    Branch -- "50万円未満" --> Merge["分岐終了"]
    Branch -- "50万円以上" --> Approve2["承認ノード<br/>（経理部）"]
    Approve2 -- "承認" --> Merge
    Merge --> Order["承認ノード<br/>（購買部）"]
    Order -- "承認終了" --> End1(("完了<br/>可決"))
```

## 機能要件

### F-001: 購入申請

#### F-001-1: 申請入力

- 申請者は購入申請フォームに必要事項を入力し、申請を行える
- 申請に必要な情報:
  - 取引先（必須、取引先マスタからの選択式）
  - 利用目的（必須、選択式: 業務消耗品/開発機材/オフィス備品/書籍/イベント用品/その他）
  - 希望納期（必須、申請日の翌日以降）
  - 緊急度（必須、選択式: 通常/至急）
  - 明細行（必須、1〜20行）
    - 品名（必須、最大100文字）
    - 数量（必須、1以上の整数）
    - 単価（必須、1円以上の整数）
    - 小計（自動計算: 数量 × 単価）
  - 合計金額（自動計算: 全明細行の小計の合計）
  - 備考（任意、最大500文字）
- 申請時に明細行の合計金額を計算し、ユーザプログラムにより案件プロパティ `purchase_amount` へ設定する（分岐判定で使用）
- 申請完了時にユーザプログラムにより `purchase_request` および `purchase_request_item` テーブルへデータを保存する
- 申請完了時に部門長へ通知メールを送信する

#### F-001-2: 申請の引戻し

- 申請者は部門長が未処理の申請を引き戻すことができる
- 引戻し後、申請内容を修正して再申請が可能

#### F-001-3: 申請の取止め

- 申請者は未承認の申請を取り止めることができる
- 取止め後、案件は完了（取止め）となる

#### F-001-4: 差戻し後の再申請

- 差戻しされた申請を修正して再申請できる
- 差戻しコメントを確認したうえで修正を行う
- 再申請時にユーザプログラムにより `purchase_request` および `purchase_request_item` テーブルを更新し、案件プロパティ `purchase_amount` を再設定する

### F-002: 承認処理

#### F-002-1: 部門長承認

- 部門長は部下の購入申請を確認し、承認・差戻し・否認・保留・保留解除を行える
- 承認時の確認事項:
  - 申請内容（品目・数量・単価・取引先・合計金額）
  - 利用目的の業務妥当性
  - 部門予算との整合性
- 差戻し時は差戻しコメントの入力が必須（最大300文字）
- 差戻し先は申請ノードとする
- 否認時は否認理由の入力が必須（最大300文字）
- 保留時は本人以外の処理対象者の処理が禁止される
- 後続ノードが未処理の場合、部門長は引戻しが可能
- 処理完了時に申請者へ結果通知メールを送信する

#### F-002-2: 経理部承認（合計金額50万円以上の場合のみ）

- 経理部担当者は部門長承認済みの高額購入申請を確認し、承認・差戻し・否認・保留・保留解除を行える
- 経理部承認は分岐ルートにより、合計金額（案件プロパティ `purchase_amount`）が50万円以上の場合のみ経由する（BR-003）
- 承認時の確認事項:
  - 申請内容（品目・数量・単価・取引先・合計金額）
  - 全社購買予算との整合性
  - 取引先の与信・信頼性
- 差戻し時は差戻しコメントの入力が必須（最大300文字）
- 差戻し先は申請ノードまたは部門長承認ノード（任意の処理済みノード）を選択可能
- 否認時は否認理由の入力が必須（最大300文字）
- 保留時は本人以外の処理対象者の処理が禁止される
- 処理完了時に申請者へ結果通知メールを送信する

#### F-002-3: 購買部発注処理

- 購買部担当者は全承認済みの購入申請を受け、発注処理を承認終了として行える
- 承認終了時の確認事項:
  - 申請内容（品目・数量・単価・取引先・合計金額）
  - 取引先への発注内容
- 承認終了時にユーザプログラムにより `purchase_orders` テーブルへ発注データを INSERT する
- 差戻し時は差戻し先を申請ノードまたは経理部承認ノード（経由している場合）から選択可能
- 処理完了時に申請者へ結果通知メールを送信する

### F-003: 合計金額の自動計算

- 申請画面で明細行を入力するたびに小計（数量 × 単価）と合計金額をクライアント側で自動計算する
- 申請ボタン押下時にサーバ側で再計算し、案件プロパティ `purchase_amount` に確定値を設定する

## 非機能要件

### 性能要件

- 画面表示: 3秒以内
- 申請・承認処理: 2秒以内
- 同時接続ユーザ数: 300人

## ビジネスルール

| ID     | ルール                                                                                              |
| ------ | --------------------------------------------------------------------------------------------------- |
| BR-001 | 明細行は1〜20行の範囲でなければならない                                                             |
| BR-002 | 各明細行の数量は1以上の整数、単価は1円以上の整数でなければならない                                  |
| BR-003 | 合計金額が50万円以上の場合、経理部承認ノードを経由する（案件プロパティ `purchase_amount` で判定）   |
| BR-004 | 希望納期は申請日の翌日以降でなければならない                                                        |
| BR-005 | 取引先は取引先マスタに存在する取引先のみ選択可能                                                    |
| BR-006 | 合計金額は全明細行の小計の合計と一致しなければならない（サーバ側で再計算して保存）                  |
| BR-007 | 承認終了時にユーザプログラムにより `purchase_orders` テーブルへ発注データを記録する                 |
| BR-008 | 否認・取止めされた申請は発注データを生成しない。`purchase_request` のデータは履歴として保持する     |

## 画面一覧

| 画面ID  | 画面名   | IM-Workflow画面種別   | 概要                                                                       |
| ------- | -------- | --------------------- | -------------------------------------------------------------------------- |
| SCR-001 | 購入申請 | 申請画面 / 再申請画面 | 購入申請の入力フォーム。明細行の動的追加・削除に対応。再申請時は差戻しコメントを表示 |
| SCR-002 | 処理     | 処理画面              | 承認者が申請内容を確認し、承認・差戻し・否認・保留を行う画面               |
| SCR-003 | 処理詳細 | 処理詳細画面          | 処理対象者が案件の詳細を参照する画面                                       |
| SCR-004 | 参照詳細 | 参照詳細画面          | 参照者が案件の詳細を参照する画面                                           |

## 画面項目定義

### SCR-001: 購入申請画面（申請画面 / 再申請画面）

| 項目名         | 入力種別     | 必須 | 備考                                                  |
| -------------- | ------------ | ---- | ----------------------------------------------------- |
| 申請者         | 表示のみ     | -    | ログインユーザ名を自動表示                            |
| 所属組織       | 表示のみ     | -    | ログインユーザの所属組織を自動表示                    |
| 取引先         | セレクト     | ○    | 取引先マスタからの選択                                |
| 利用目的       | セレクト     | ○    | 業務消耗品/開発機材/オフィス備品/書籍/イベント用品/その他 |
| 希望納期       | 日付         | ○    | カレンダーピッカー。申請日の翌日以降                  |
| 緊急度         | ラジオ       | ○    | 通常/至急                                             |
| 明細行         | 動的テーブル | ○    | 品名/数量/単価/小計の行を1〜20行で追加・削除可能      |
| ┗ 品名         | テキスト     | ○    | 最大100文字                                           |
| ┗ 数量         | 数値         | ○    | 1以上の整数                                           |
| ┗ 単価         | 数値         | ○    | 1円以上の整数                                         |
| ┗ 小計         | 表示のみ     | -    | 数量 × 単価を自動計算                                 |
| 合計金額       | 表示のみ     | -    | 全明細行の小計の合計を自動計算                        |
| 備考           | テキスト     | -    | 最大500文字                                           |
| 差戻しコメント | 表示のみ     | -    | 再申請時のみ表示。承認者の差戻しコメントを表示        |

### SCR-002: 処理画面（承認者向け）

| 項目名     | 入力種別 | 必須 | 備考                              |
| ---------- | -------- | ---- | --------------------------------- |
| 申請者     | 表示のみ | -    | 申請者名                          |
| 所属組織   | 表示のみ | -    | 申請者の所属組織                  |
| 取引先     | 表示のみ | -    | 申請内容を表示                    |
| 利用目的   | 表示のみ | -    | 申請内容を表示                    |
| 希望納期   | 表示のみ | -    | 申請内容を表示                    |
| 緊急度     | 表示のみ | -    | 申請内容を表示                    |
| 明細行     | 表示のみ | -    | 品名/数量/単価/小計を一覧表示     |
| 合計金額   | 表示のみ | -    | 申請内容を表示                    |
| 備考       | 表示のみ | -    | 申請内容を表示                    |
| コメント   | テキスト | △    | 差戻し・否認時は必須。最大300文字 |

### SCR-003: 処理詳細画面（処理対象者向け）

| 項目名     | 入力種別 | 備考                       |
| ---------- | -------- | -------------------------- |
| 申請者     | 表示のみ | 申請者名                   |
| 所属組織   | 表示のみ | 申請者の所属組織           |
| 取引先     | 表示のみ | 申請内容を表示             |
| 利用目的   | 表示のみ | 申請内容を表示             |
| 希望納期   | 表示のみ | 申請内容を表示             |
| 緊急度     | 表示のみ | 申請内容を表示             |
| 明細行     | 表示のみ | 品名/数量/単価/小計を一覧表示 |
| 合計金額   | 表示のみ | 申請内容を表示             |
| 備考       | 表示のみ | 申請内容を表示             |
| 処理履歴   | 表示のみ | 各ノードの処理履歴を表示   |

### SCR-004: 参照詳細画面（参照者向け）

SCR-003（処理詳細画面）と同一のレイアウト・項目を使用する。

## データモデル（概要）

### ユーザデータ（ユーザコンテンツ管理範囲）

```
購入申請ヘッダ (purchase_request)
├── ユーザデータID (PK)
├── 申請者ユーザID
├── 取引先ID
├── 利用目的区分
├── 希望納期
├── 緊急度区分 (normal/urgent)
├── 合計金額
├── 備考
├── 作成日時
└── 更新日時

購入申請明細 (purchase_request_item)
├── 明細ID (PK)
├── ユーザデータID (FK)
├── 行番号
├── 品名
├── 数量
├── 単価
├── 小計
├── 作成日時
└── 更新日時

発注 (purchase_orders)
├── 発注ID (PK)
├── ユーザデータID (FK)
├── 取引先ID
├── 発注日
├── 合計金額
├── 発注者ユーザID（購買部担当）
├── 作成日時
└── 更新日時
```

### 案件プロパティ

| プロパティキー  | 設定タイミング | 用途                                            |
| --------------- | -------------- | ----------------------------------------------- |
| purchase_amount | 申請時         | 合計金額。分岐ルートの判定およびメール置換で使用 |
| vendor_name     | 申請時         | 取引先名。案件名生成およびメール置換で使用       |

## 用語集

| 用語       | 説明                                                                   |
| ---------- | ---------------------------------------------------------------------- |
| 取引先     | 物品を購入する仕入先。事前に取引先マスタへ登録された企業のみ選択可能   |
| 明細行     | 1つの購入申請に含まれる品目ごとの行。1申請につき1〜20行まで登録可能    |
| 高額申請   | 合計金額が50万円以上の購入申請。経理部承認ノードを経由する             |
| 発注       | 承認終了後に購買部が取引先に対して購入を依頼すること                   |
