diff --git a/app/Http/Controllers/Sales/AdminProspectController.php b/app/Http/Controllers/Sales/AdminProspectController.php index a5554545..cd7fadf2 100644 --- a/app/Http/Controllers/Sales/AdminProspectController.php +++ b/app/Http/Controllers/Sales/AdminProspectController.php @@ -77,12 +77,19 @@ public function index(Request $request): View|Response $prospects = $query->orderByDesc('created_at')->paginate(20); - // 각 가망고객의 진행률 계산 + // 각 가망고객의 진행률 계산 및 상태 자동 전환 foreach ($prospects as $prospect) { $progress = SalesScenarioChecklist::getProspectProgress($prospect->id); $prospect->sales_progress = $progress['sales']['percentage']; $prospect->manager_progress = $progress['manager']['percentage']; + // 진행률 100% 시 상태 자동 전환 체크 + if ($progress['sales']['percentage'] === 100 && $progress['manager']['percentage'] === 100) { + SalesScenarioChecklist::checkAndConvertProspectStatus($prospect->id); + // 상태가 변경되었을 수 있으므로 다시 로드 + $prospect->refresh(); + } + // management 정보 $management = SalesTenantManagement::where('tenant_prospect_id', $prospect->id)->first(); $prospect->hq_status = $management?->hq_status ?? 'pending'; diff --git a/app/Http/Controllers/Sales/SalesScenarioController.php b/app/Http/Controllers/Sales/SalesScenarioController.php index a5235b28..8a1ad2f4 100644 --- a/app/Http/Controllers/Sales/SalesScenarioController.php +++ b/app/Http/Controllers/Sales/SalesScenarioController.php @@ -299,10 +299,18 @@ public function toggleProspectChecklist(Request $request): JsonResponse $management = SalesTenantManagement::findOrCreateByProspect($prospectId); $management->updateProgress($scenarioType, $progress['percentage']); + // 가망고객 상태 조회 (자동 전환이 발생했을 수 있음) + $prospect = TenantProspect::find($prospectId); + $fullProgress = SalesScenarioChecklist::getProspectProgress($prospectId); + return response()->json([ 'success' => true, 'progress' => $progress, 'checked' => $checked, + 'prospect_status' => $prospect?->status, + 'prospect_status_label' => $prospect?->status_label, + 'is_converted' => $prospect?->status === TenantProspect::STATUS_CONVERTED, + 'full_progress' => $fullProgress, ]); } diff --git a/app/Models/Sales/SalesScenarioChecklist.php b/app/Models/Sales/SalesScenarioChecklist.php index 2e4264ce..7b9a4a0d 100644 --- a/app/Models/Sales/SalesScenarioChecklist.php +++ b/app/Models/Sales/SalesScenarioChecklist.php @@ -131,9 +131,39 @@ public static function toggleByProspect(int $prospectId, string $scenarioType, i $checklist->checked_by = $checked ? $currentUserId : null; $checklist->save(); + // 체크 완료 시 진행률 100% 확인 후 상태 자동 전환 + if ($checked) { + self::checkAndConvertProspectStatus($prospectId, $currentUserId); + } + return $checklist; } + /** + * 진행률 100% 시 가망고객 상태를 '계약완료'로 자동 전환 + */ + public static function checkAndConvertProspectStatus(int $prospectId, ?int $userId = null): bool + { + $progress = self::getProspectProgress($prospectId); + + // 영업 시나리오와 매니저 시나리오 모두 100%인 경우에만 전환 + if ($progress['sales']['percentage'] === 100 && $progress['manager']['percentage'] === 100) { + $prospect = TenantProspect::find($prospectId); + + if ($prospect && $prospect->status !== TenantProspect::STATUS_CONVERTED) { + $prospect->update([ + 'status' => TenantProspect::STATUS_CONVERTED, + 'converted_at' => now(), + 'converted_by' => $userId ?? auth()->id(), + ]); + + return true; + } + } + + return false; + } + /** * 특정 테넌트/시나리오의 체크리스트 조회 */