fix: [작업지시] syncOrderStatus 집계 방식으로 변경

- 기존: 단일 작업지시 상태만 보고 수주 상태 매핑 (첫 WO 완료 시 즉시 PRODUCED)
- 변경: 수주의 모든 비보조 작업지시 상태를 집계하여 결정
  - 전부 shipped → SHIPPED
  - 전부 completed/shipped → PRODUCED
  - 하나라도 진행중/완료/출하 → IN_PRODUCTION
- 감사 로그에 집계 내역(work_order_counts) 포함
This commit is contained in:
2026-03-11 17:35:24 +09:00
parent b55cbc2ec4
commit 3bae303447

View File

@@ -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,
]]
);
}