M. 관리 메뉴 컨트롤러 */ class ManagementController extends Controller { public function __construct( private SalesScenarioService $salesScenarioService ) {} /** * Presentation 레이아웃 페이지를 위한 HX-Redirect 처리 * (presentation 레이아웃은 #main-content가 없어서 HTMX swap 불가) */ private function handlePresentationPage(Request $request, string $routeName): ?Response { if ($request->header('HX-Request')) { return response('', 200)->header('HX-Redirect', route($routeName)); } return null; } // 바로빌 테넌트 관리 public function barobillTenant(Request $request): View|Response { if ($redirect = $this->handlePresentationPage($request, 'lab.management.barobill-tenant')) { return $redirect; } return view('lab.management.barobill-tenant'); } // 전자세금계산서 전략 public function taxInvoiceStrategy(Request $request): View|Response { if ($redirect = $this->handlePresentationPage($request, 'lab.management.tax-invoice-strategy')) { return $redirect; } return view('lab.management.tax-invoice-strategy'); } // 전자세금계산서 public function taxInvoice(Request $request): View|Response { if ($redirect = $this->handlePresentationPage($request, 'lab.management.tax-invoice')) { return $redirect; } return view('lab.management.tax-invoice'); } // 사업자등록번호 진위 확인 public function businessVerify(Request $request): View|Response { if ($redirect = $this->handlePresentationPage($request, 'lab.management.business-verify')) { return $redirect; } return view('lab.management.business-verify'); } // 영업관리 & 매니저 미팅관리 public function salesMeeting(Request $request): View|Response { if ($redirect = $this->handlePresentationPage($request, 'lab.management.sales-meeting')) { return $redirect; } return view('lab.management.sales-meeting'); } // 카드 세무항목 매칭 전략 public function cardTaxMatching(Request $request): View|Response { if ($redirect = $this->handlePresentationPage($request, 'lab.management.card-tax-matching')) { return $redirect; } return view('lab.management.card-tax-matching'); } // 카드 사용내역 수집 후 매칭 public function cardUsageMatching(Request $request): View|Response { if ($redirect = $this->handlePresentationPage($request, 'lab.management.card-usage-matching')) { return $redirect; } return view('lab.management.card-usage-matching'); } // 계좌입출금 내역 조회 API public function accountApi(Request $request): View|Response { if ($redirect = $this->handlePresentationPage($request, 'lab.management.account-api')) { return $redirect; } return view('lab.management.account-api'); } // 영업관리 시나리오 public function salesScenario() { $steps = SalesScenarioService::getScenarioSteps(); $user = auth()->user(); $checklist = $user ? $this->salesScenarioService->getUserChecklist($user) : []; $progress = $user ? $this->salesScenarioService->getOverallProgress($user) : ['total' => 0, 'checked' => 0, 'percent' => 0]; return view('lab.management.sales-scenario', compact('steps', 'checklist', 'progress')); } // 영업관리 시나리오 체크리스트 조회 API public function salesScenarioChecklist(): JsonResponse { $user = auth()->user(); if (! $user) { return response()->json(['success' => false, 'message' => '인증이 필요합니다.'], 401); } $data = $this->salesScenarioService->getUserChecklist($user); $progress = $this->salesScenarioService->getOverallProgress($user); return response()->json([ 'success' => true, 'data' => $data, 'progress' => $progress, ]); } // 영업관리 시나리오 체크포인트 토글 API public function salesScenarioToggle(Request $request): JsonResponse { $user = auth()->user(); if (! $user) { return response()->json(['success' => false, 'message' => '인증이 필요합니다.'], 401); } $validated = $request->validate([ 'step_id' => 'required|integer|min:1|max:6', 'checkpoint_index' => 'required|integer|min:0', 'is_checked' => 'required|boolean', ]); $checkedIndices = $this->salesScenarioService->toggleCheckpoint( $user, $validated['step_id'], $validated['checkpoint_index'], $validated['is_checked'] ); $progress = $this->salesScenarioService->getOverallProgress($user); return response()->json([ 'success' => true, 'data' => $checkedIndices, 'progress' => $progress, ]); } // 매니저 시나리오 public function managerScenario(Request $request): View|Response { if ($redirect = $this->handlePresentationPage($request, 'lab.management.manager-scenario')) { return $redirect; } return view('lab.management.manager-scenario'); } }