input('step', 1); $icons = config('sales_scenario.icons'); // 테넌트 영업 관리 정보 조회 또는 생성 $management = SalesTenantManagement::findOrCreateByTenant($tenantId); // 체크리스트 진행 상태 조회 (DB에서) $progress = SalesScenarioChecklist::calculateProgress($tenantId, 'sales', $steps); // 진행률 업데이트 $management->updateProgress('sales', $progress['percentage']); // HTMX 요청이면 단계 콘텐츠만 반환 if ($request->header('HX-Request') && $request->has('step')) { return view('sales.modals.scenario-step', [ 'tenant' => $tenant, 'steps' => $steps, 'currentStep' => $currentStep, 'step' => collect($steps)->firstWhere('id', $currentStep), 'progress' => $progress, 'scenarioType' => 'sales', 'icons' => $icons, 'management' => $management, ]); } return view('sales.modals.scenario-modal', [ 'tenant' => $tenant, 'steps' => $steps, 'currentStep' => $currentStep, 'progress' => $progress, 'scenarioType' => 'sales', 'icons' => $icons, 'management' => $management, ]); } /** * 매니저 시나리오 모달 뷰 */ public function managerScenario(int $tenantId, Request $request): View|Response { $tenant = Tenant::findOrFail($tenantId); $steps = config('sales_scenario.manager_steps'); $currentStep = (int) $request->input('step', 1); $icons = config('sales_scenario.icons'); // 테넌트 영업 관리 정보 조회 또는 생성 $management = SalesTenantManagement::findOrCreateByTenant($tenantId); // 체크리스트 진행 상태 조회 (DB에서) $progress = SalesScenarioChecklist::calculateProgress($tenantId, 'manager', $steps); // 진행률 업데이트 $management->updateProgress('manager', $progress['percentage']); // HTMX 요청이면 단계 콘텐츠만 반환 if ($request->header('HX-Request') && $request->has('step')) { return view('sales.modals.scenario-step', [ 'tenant' => $tenant, 'steps' => $steps, 'currentStep' => $currentStep, 'step' => collect($steps)->firstWhere('id', $currentStep), 'progress' => $progress, 'scenarioType' => 'manager', 'icons' => $icons, 'management' => $management, ]); } return view('sales.modals.scenario-modal', [ 'tenant' => $tenant, 'steps' => $steps, 'currentStep' => $currentStep, 'progress' => $progress, 'scenarioType' => 'manager', 'icons' => $icons, 'management' => $management, ]); } /** * 체크리스트 항목 토글 (HTMX) */ public function toggleChecklist(Request $request): JsonResponse { $request->validate([ 'tenant_id' => 'required|integer|exists:tenants,id', 'scenario_type' => 'required|in:sales,manager', 'step_id' => 'required|integer', 'checkpoint_id' => 'required|string', 'checked' => 'required|boolean', ]); $tenantId = $request->input('tenant_id'); $scenarioType = $request->input('scenario_type'); $stepId = $request->input('step_id'); $checkpointId = $request->input('checkpoint_id'); $checked = $request->boolean('checked'); // 체크리스트 토글 (DB에 저장) SalesScenarioChecklist::toggle( $tenantId, $scenarioType, $stepId, $checkpointId, $checked, auth()->id() ); // 진행률 재계산 $steps = config("sales_scenario.{$scenarioType}_steps"); $progress = SalesScenarioChecklist::calculateProgress($tenantId, $scenarioType, $steps); // 테넌트 영업 관리 정보 업데이트 $management = SalesTenantManagement::findOrCreateByTenant($tenantId); $management->updateProgress($scenarioType, $progress['percentage']); return response()->json([ 'success' => true, 'progress' => $progress, 'checked' => $checked, ]); } /** * 진행률 조회 */ public function getProgress(int $tenantId, string $type): JsonResponse { $steps = config("sales_scenario.{$type}_steps"); $progress = SalesScenarioChecklist::calculateProgress($tenantId, $type, $steps); return response()->json([ 'success' => true, 'progress' => $progress, ]); } // ============================================ // 가망고객(Prospect) 기반 메서드 // ============================================ /** * 가망고객 영업 시나리오 모달 뷰 */ public function prospectSalesScenario(int $prospectId, Request $request): View|Response { $prospect = TenantProspect::findOrFail($prospectId); $steps = config('sales_scenario.sales_steps'); $currentStep = (int) $request->input('step', 1); $icons = config('sales_scenario.icons'); // 가망고객 영업 관리 정보 조회 또는 생성 $management = SalesTenantManagement::findOrCreateByProspect($prospectId); // 체크리스트 진행 상태 조회 (DB에서) $progress = SalesScenarioChecklist::calculateProgressByProspect($prospectId, 'sales', $steps); // 진행률 업데이트 $management->updateProgress('sales', $progress['percentage']); // HTMX 요청이면 단계 콘텐츠만 반환 if ($request->header('HX-Request') && $request->has('step')) { return view('sales.modals.scenario-step', [ 'prospect' => $prospect, 'steps' => $steps, 'currentStep' => $currentStep, 'step' => collect($steps)->firstWhere('id', $currentStep), 'progress' => $progress, 'scenarioType' => 'sales', 'icons' => $icons, 'management' => $management, 'isProspect' => true, ]); } return view('sales.modals.scenario-modal', [ 'prospect' => $prospect, 'steps' => $steps, 'currentStep' => $currentStep, 'progress' => $progress, 'scenarioType' => 'sales', 'icons' => $icons, 'management' => $management, 'isProspect' => true, ]); } /** * 가망고객 매니저 시나리오 모달 뷰 */ public function prospectManagerScenario(int $prospectId, Request $request): View|Response { $prospect = TenantProspect::findOrFail($prospectId); $steps = config('sales_scenario.manager_steps'); $currentStep = (int) $request->input('step', 1); $icons = config('sales_scenario.icons'); // 가망고객 영업 관리 정보 조회 또는 생성 $management = SalesTenantManagement::findOrCreateByProspect($prospectId); // 체크리스트 진행 상태 조회 (DB에서) $progress = SalesScenarioChecklist::calculateProgressByProspect($prospectId, 'manager', $steps); // 진행률 업데이트 $management->updateProgress('manager', $progress['percentage']); // HTMX 요청이면 단계 콘텐츠만 반환 if ($request->header('HX-Request') && $request->has('step')) { return view('sales.modals.scenario-step', [ 'prospect' => $prospect, 'steps' => $steps, 'currentStep' => $currentStep, 'step' => collect($steps)->firstWhere('id', $currentStep), 'progress' => $progress, 'scenarioType' => 'manager', 'icons' => $icons, 'management' => $management, 'isProspect' => true, ]); } return view('sales.modals.scenario-modal', [ 'prospect' => $prospect, 'steps' => $steps, 'currentStep' => $currentStep, 'progress' => $progress, 'scenarioType' => 'manager', 'icons' => $icons, 'management' => $management, 'isProspect' => true, ]); } /** * 가망고객 체크리스트 항목 토글 (HTMX) */ public function toggleProspectChecklist(Request $request): JsonResponse { $request->validate([ 'prospect_id' => 'required|integer|exists:tenant_prospects,id', 'scenario_type' => 'required|in:sales,manager', 'step_id' => 'required|integer', 'checkpoint_id' => 'required|string', 'checked' => 'required|boolean', ]); $prospectId = $request->input('prospect_id'); $scenarioType = $request->input('scenario_type'); $stepId = $request->input('step_id'); $checkpointId = $request->input('checkpoint_id'); $checked = $request->boolean('checked'); // 체크리스트 토글 (DB에 저장) SalesScenarioChecklist::toggleByProspect( $prospectId, $scenarioType, $stepId, $checkpointId, $checked, auth()->id() ); // 진행률 재계산 $steps = config("sales_scenario.{$scenarioType}_steps"); $progress = SalesScenarioChecklist::calculateProgressByProspect($prospectId, $scenarioType, $steps); // 영업 관리 정보 업데이트 $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, ]); } /** * 가망고객 진행률 조회 */ public function getProspectProgress(int $prospectId, string $type): JsonResponse { $steps = config("sales_scenario.{$type}_steps"); $progress = SalesScenarioChecklist::calculateProgressByProspect($prospectId, $type, $steps); return response()->json([ 'success' => true, 'progress' => $progress, ]); } }