- 모델 추가: SalesPartner, SalesTenantManagement, SalesScenarioChecklist, SalesConsultation - 모델 위치 이동: app/Models/ → app/Models/Sales/ - 컨트롤러 수정: 캐시 대신 DB 모델 사용 - 뷰 수정: Eloquent 모델 속성 사용 Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
168 lines
5.7 KiB
PHP
168 lines
5.7 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers\Sales;
|
|
|
|
use App\Http\Controllers\Controller;
|
|
use App\Models\Sales\SalesScenarioChecklist;
|
|
use App\Models\Sales\SalesTenantManagement;
|
|
use App\Models\Tenants\Tenant;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Http\Response;
|
|
use Illuminate\Http\JsonResponse;
|
|
use Illuminate\View\View;
|
|
|
|
/**
|
|
* 영업 시나리오 관리 컨트롤러
|
|
*
|
|
* 영업 진행 및 매니저 상담 프로세스의 시나리오 모달과 체크리스트를 관리합니다.
|
|
* 데이터는 sales_scenario_checklists 테이블에 저장됩니다.
|
|
*/
|
|
class SalesScenarioController extends Controller
|
|
{
|
|
/**
|
|
* 영업 시나리오 모달 뷰
|
|
*/
|
|
public function salesScenario(int $tenantId, Request $request): View|Response
|
|
{
|
|
$tenant = Tenant::findOrFail($tenantId);
|
|
$steps = config('sales_scenario.sales_steps');
|
|
$currentStep = (int) $request->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,
|
|
]);
|
|
}
|
|
}
|