集約: 外注手配 / Aggregate: Procurement
バウンデッドコンテキスト: bc-procurement
PurchaseOrder(手配)
PurchaseOrder (集約ルート) ├── → SalesOrder (受注への参照) ├── → Supplier (仕入先への参照) └── → GoodsReceipt[] (受入 — 別集約)
| プロパティ | 型 | 説明 |
|---|---|---|
| poNumber | string | 注文番号 |
| orderNumber | string | 紐付く受注番号 |
| supplierCode | string | 仕入先コード |
| procurementStatus | ProcurementStatus | 手配状況 |
| procurementType | ProcurementItemType | 手配品区分 (材料/部品/購入品/外注) |
| isOrdered | boolean | 発注済みフラグ |
| expenseCategory | ExpenseCategory | 費目区分 |
| poOutputMethod | POOutputMethod | 注文書出力方法 (紙/FAX/メール/出力なし) |
不変条件 (Invariants)
- 1 つの受注に対して複数の手配が存在可能 (1:N)
- 発注済み (`isOrdered = true`) の手配は変更不可 (注文書発行後)
- 手配不要は受注直後のみ設定可能
- 仕入先コードは仕入先マスタに存在する必要がある
- 手配品区分 (材料/部品/購入品/外注) は必須
- **ルーティング分岐**: 同一入力の行が手配品種別 + 社内外区分の組合せで保存先が3分岐: ①購入品 → 外注手配、②製作品+社外仕入先 → 外注手配、③製作品+社内部署 → 製作指示 (ProductionInstruction 集約へ)
- **購入品に社内仕入先は不可**: 購入品の行に社内部署を仕入先として選択することは禁止
- **工事完了ロック**: 受注の完了日が設定済みの場合、全操作を無効化
計算フィールド
| フィールド | 計算式 | トリガー |
|---|---|---|
| 手配金額 | `quantity × purchaseUnitPrice` | 数量・単価は小数2桁、金額は整数 |
| 行番号 (SEQ) | `MAX(既存SEQ)` | 手動追加行は SEQ >= 90000、Excel インポート行は < 90000。手動行のみ削除可能 |
自動入力
- **型式入力時**: 過去の受入実績から価格履歴をリアルタイム検索。候補選択で品番・品名・型式・材質・単価・仕入先を一括自動入力
- **ユニットコード入力時**: 部品表マスタからユニット名を取得し、明細にデータロード
- **受注番号入力時**: 得意先名・納入先名・品名・納期を受注マスタから自動表示
- **新規行追加時**: ステータス=作成中、種別=製作品、社内外=社外、確認者=ログインユーザー
コマンド
| コマンド | ガード条件 | アクション |
|---|---|---|
| 登録 (Save) | 入力検証通過 | 手配品種別+社内外区分に基づき外注手配 or 製作指示にルーティング保存 |
| Excel取込 | 受注番号+ユニットコード必須 | Excel インポート (SEQ < 90000) |
| 行削除 | 手動追加行 (SEQ >= 90000) AND 作成中のみ | インポート行は削除不可 |
| 確定 | 入力検証通過 | ステータス→確定済、確認者コード+確認日を記録 |
| 承認 | 承認検証通過 (金額上限チェック含む) | ステータス→承認済、承認者コード+承認日を記録 |
| 発注 | 発注検証通過 | 仕入先+納期でグルーピング → 注文書発行へ |
| 見積依頼 | 保存済み + 部品情報あり + 未発注 + 手配不要でない + 社内でない | 仕入先に見積依頼を送信 |
| 一括設定 | 選択行あり | 選択行に仕入先・納期を一括設定 |
| 注文書発行 | 選択あり + 同一ユニットコード | 注文書番号を採番、ステータス→発注済、発注済みフラグON、バーコード生成。出力方法は仕入先マスタの設定に従う (印刷/FAX/メール/出力なし) |
ライフサイクル (State Machine)
新システムでは承認ワークフローを汎用サブシステムとして切り出し、手配固有のステータスは「作成中→発注済→受入→検収→手配不要」に簡素化することを検討。