From 3bd5550bb1a17f7c54db25ddb7f5147b5926273d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EB=B3=B4=EA=B3=A4?= Date: Mon, 2 Feb 2026 12:46:53 +0900 Subject: [PATCH] =?UTF-8?q?feat:=EC=98=81=EC=97=85/=EB=A7=A4=EB=8B=88?= =?UTF-8?q?=EC=A0=80=20=EC=8B=9C=EB=82=98=EB=A6=AC=EC=98=A4=20100%=20?= =?UTF-8?q?=EC=99=84=EB=A3=8C=20=EC=8B=9C=20=EA=B3=84=EC=95=BD=EC=99=84?= =?UTF-8?q?=EB=A3=8C=20=EC=9E=90=EB=8F=99=20=EC=A0=84=ED=99=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - SalesScenarioChecklist에 checkAndConvertProspectStatus() 메서드 추가 - toggleByProspect()에서 체크 완료 시 자동 전환 로직 호출 - AdminProspectController에서 목록 조회 시 기존 100% 데이터 자동 전환 - API 응답에 상태 변경 정보 포함 Co-Authored-By: Claude Opus 4.5 --- .../Sales/AdminProspectController.php | 9 +++++- .../Sales/SalesScenarioController.php | 8 +++++ app/Models/Sales/SalesScenarioChecklist.php | 30 +++++++++++++++++++ 3 files changed, 46 insertions(+), 1 deletion(-) 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; + } + /** * 특정 테넌트/시나리오의 체크리스트 조회 */