diff --git a/app/Services/WorkOrderService.php b/app/Services/WorkOrderService.php index ba39c09..bbb5ed0 100644 --- a/app/Services/WorkOrderService.php +++ b/app/Services/WorkOrderService.php @@ -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, + ]] ); }