fix: [작업지시] syncOrderStatus 집계 방식으로 변경
- 기존: 단일 작업지시 상태만 보고 수주 상태 매핑 (첫 WO 완료 시 즉시 PRODUCED) - 변경: 수주의 모든 비보조 작업지시 상태를 집계하여 결정 - 전부 shipped → SHIPPED - 전부 completed/shipped → PRODUCED - 하나라도 진행중/완료/출하 → IN_PRODUCTION - 감사 로그에 집계 내역(work_order_counts) 포함
This commit is contained in:
@@ -836,14 +836,38 @@ private function syncOrderStatus(WorkOrder $workOrder, int $tenantId): void
|
||||
return;
|
||||
}
|
||||
|
||||
// 작업지시 상태 → 수주 상태 매핑
|
||||
$statusMap = [
|
||||
WorkOrder::STATUS_IN_PROGRESS => Order::STATUS_IN_PRODUCTION,
|
||||
WorkOrder::STATUS_COMPLETED => Order::STATUS_PRODUCED,
|
||||
WorkOrder::STATUS_SHIPPED => Order::STATUS_SHIPPED,
|
||||
];
|
||||
// 해당 수주의 모든 비보조 작업지시 상태 집계
|
||||
$allWorkOrders = WorkOrder::where('tenant_id', $tenantId)
|
||||
->where('sales_order_id', $workOrder->sales_order_id)
|
||||
->where('status', '!=', WorkOrder::STATUS_CANCELLED)
|
||||
->get();
|
||||
|
||||
$newOrderStatus = $statusMap[$workOrder->status] ?? null;
|
||||
// 보조 공정 제외
|
||||
$mainWorkOrders = $allWorkOrders->filter(fn ($wo) => ! $this->isAuxiliaryWorkOrder($wo));
|
||||
|
||||
if ($mainWorkOrders->isEmpty()) {
|
||||
return;
|
||||
}
|
||||
|
||||
$totalCount = $mainWorkOrders->count();
|
||||
$statusCounts = $mainWorkOrders->groupBy('status')->map->count();
|
||||
|
||||
$shippedCount = $statusCounts->get(WorkOrder::STATUS_SHIPPED, 0);
|
||||
$completedCount = $statusCounts->get(WorkOrder::STATUS_COMPLETED, 0);
|
||||
$inProgressCount = $statusCounts->get(WorkOrder::STATUS_IN_PROGRESS, 0);
|
||||
|
||||
// 집계 기반 수주 상태 결정
|
||||
// 전부 출하 → SHIPPED
|
||||
// 전부 완료(또는 완료+출하) → PRODUCED
|
||||
// 하나라도 진행중/완료/출하 → IN_PRODUCTION
|
||||
$newOrderStatus = null;
|
||||
if ($shippedCount === $totalCount) {
|
||||
$newOrderStatus = Order::STATUS_SHIPPED;
|
||||
} elseif (($completedCount + $shippedCount) === $totalCount) {
|
||||
$newOrderStatus = Order::STATUS_PRODUCED;
|
||||
} elseif ($inProgressCount > 0 || $completedCount > 0 || $shippedCount > 0) {
|
||||
$newOrderStatus = Order::STATUS_IN_PRODUCTION;
|
||||
}
|
||||
|
||||
// 매핑되는 상태가 없거나 이미 동일한 상태면 스킵
|
||||
if (! $newOrderStatus || $order->status_code === $newOrderStatus) {
|
||||
@@ -861,8 +885,13 @@ private function syncOrderStatus(WorkOrder $workOrder, int $tenantId): void
|
||||
'order',
|
||||
$order->id,
|
||||
'status_synced_from_work_order',
|
||||
['status_code' => $oldOrderStatus, 'work_order_id' => $workOrder->id],
|
||||
['status_code' => $newOrderStatus, 'work_order_id' => $workOrder->id]
|
||||
['status_code' => $oldOrderStatus, 'work_order_id' => $workOrder->id, 'aggregated' => true],
|
||||
['status_code' => $newOrderStatus, 'work_order_counts' => [
|
||||
'total' => $totalCount,
|
||||
'shipped' => $shippedCount,
|
||||
'completed' => $completedCount,
|
||||
'in_progress' => $inProgressCount,
|
||||
]]
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user