集約: 製作指示・作業日報 / Aggregate: Internal Production
バウンデッドコンテキスト: bc-production
ProductionInstruction(製作指示)
ProductionInstruction (集約ルート)
├── → SalesOrder (受注への参照)
└── WorkReport[] (作業日報 — 子エンティティ)
| プロパティ | 型 | 説明 |
|---|
| productionOrderNumber | string | 指示番号 (SIJI_NO) |
| orderNumber | string | 紐付く受注番号 |
| productionStatus | ProductionStatus | 指示状況 |
| productionType | ProductionType | 指示区分 |
| departmentCode | string | 指示先部署 |
不変条件 (Invariants)
- 1 つの受注に対して複数の製作指示が存在可能 (工程別)
- 作業日報は製作指示の子エンティティ (指示なしの日報は禁止)
- 製作指示の完了は全日報の作業時間合計で判定しない (手動完了)
- 完了済み製作指示への日報追加は禁止
- **工事完了ロック**: 受注の完了日が設定済みの場合、着手・完了・実績削除・指示取消のすべての操作を無効化
- **取消は完了前のみ**: 完了済み (ステータス >= 完了) の製作指示は取消不可
- **残数量**: `remainingQty = orderedQty - producedQty` (0 未満にならない)
- **完了時に累計実績を記録**: `totalProduced = 今回数量 + 前回までの累計`、最終単価・最終日を記録
WorkReport(作業日報)
| プロパティ | 型 | 説明 |
|---|
| productionOrderNumber | string | 親の指示番号 |
| employeeCode | string | 作業者 |
| workDate | Date | 作業日 |
| workStartTime | Time | 開始時間 |
| workEndTime | Time | 終了時間 |
| workHours | number | 作業時間 (時間) |
| amount | Money | 労務費 (workHours × Employee.chargeRate) |
不変条件 (Invariants)
- `workHours` = 休憩控除済み作業時間。算出: ①深夜跨ぎ時は終了時刻に+24h、②rawMinutes = end - start、③テナント設定の各休憩区間との重複分を控除、④netMinutes = rawMinutes - breakOverlap (0の場合はrawMinutesにフォールバック)、⑤小数時間に変換 (分→時は小数2桁で round-half-up)
- `amount` = `workHours` × 作業者の時間単価 (社員マスタの chargeRate から自動取得)。ただし更新モード時は保存済み単価が 0 でなければ保存済み単価を使用 (過去の単価レートを保全)
- 同一作業者の同一日の作業時間合計は 24h を超えない
入力検証
| 検証 | 条件 |
|---|
| 工事完了チェック | 受注の完了日が空であること |
| 担当者必須 | 作業者が選択されていること |
| 指示番号必須 | 空でないこと |
| 作業日必須 | 空でないこと |
| 工程必須 | 工程コードが選択されていること |
| 作業区分必須 | 作業区分 (着手/完了) が入力されていること |
| 指示存在チェック | 入力された指示番号に対応する製作指示が存在すること |
自動入力
- **フォーム表示時**: 担当者=ログインユーザー、日付=当日
- **受注番号入力時**: 受注名・納期・得意先名を自動表示
- **指示番号入力時**: 品名・型式・材質・仕入先・単位・残数量・製作実績数量を自動入力
- **作業単価**: 担当者の社員マスタの時間単価 (CHARGE レート) を自動取得
コマンド
| コマンド | ガード条件 | アクション |
|---|
| 着手 (Start) | 入力検証通過 + 作業区分=着手 | 実績を保存、ステータス→着手済 |
| 完了 (Complete) | 工事完了チェック + 入力検証通過 + 作業区分=完了 | 実績を保存、ステータス→完了済、累計実績・最終単価・最終日を記録 |
| 実績削除 | 工事完了チェック + 更新モード | 実績レコードを論理削除 |
| 指示取消 | 工事完了チェック + ステータス < 完了済 | ステータス→取消、取消フラグON |