getDashboardData($request); // 영업파트너 수당 정보 추가 $data = array_merge($data, $this->getCommissionData()); return view('sales.dashboard.index', $data); } /** * HTMX 부분 새로고침용 데이터 반환 */ public function refresh(Request $request): View { $data = $this->getDashboardData($request); return view('sales.dashboard.partials.data-container', $data); } /** * 대시보드 데이터 조회 */ private function getDashboardData(Request $request): array { // 기간 설정 $period = $request->input('period', 'month'); // month or custom $year = $request->input('year', now()->year); $month = $request->input('month', now()->month); // 기간 설정 모드일 경우 if ($period === 'custom') { $startDate = $request->input('start_date', now()->startOfMonth()->format('Y-m-d')); $endDate = $request->input('end_date', now()->format('Y-m-d')); } else { $startDate = now()->startOfMonth()->format('Y-m-d'); $endDate = now()->endOfMonth()->format('Y-m-d'); } // 통계 데이터 (임시 데이터 - 추후 실제 데이터로 교체) $stats = [ 'total_membership_fee' => 0, // 총 가입비 'total_commission' => 0, // 총 수당 'commission_rate' => 0, // 지급 승인 완료 비율 'total_contracts' => 0, // 전체 건수 'pending_membership_approval' => 0, // 가입 승인 대기 'pending_payment_approval' => 0, // 지급 승인 대기 ]; // 역할별 수당 상세 $commissionByRole = [ [ 'name' => '판매자', 'rate' => 20, 'amount' => 0, 'color' => 'green', ], [ 'name' => '관리자', 'rate' => 5, 'amount' => 0, 'color' => 'blue', ], [ 'name' => '매뉴제작 협업수당', 'rate' => null, // 별도 'amount' => null, // 운영팀 산정 'color' => 'red', ], ]; // 총 가입비 대비 수당 $totalCommissionRatio = 0; // 수익 및 테넌트 관리 통계 (임시 데이터 - 추후 실제 데이터로 교체) $tenantStats = [ 'total_tenants' => 0, // 관리 테넌트 'total_membership_revenue' => 0, // 총 가입비 실적 'total_commission_accumulated' => 0, // 누적 가입비 수당 'confirmed_commission' => 0, // 확정 가입비 수당 ]; // 테넌트 목록 (나와 연결된 계약만) // 1. 내가 등록하거나 내 하위 영업파트너가 등록한 가망고객 // 2. 내가 매니저로 지정된 계약 $currentUserId = auth()->id(); $childrenIds = auth()->user()->children()->pluck('id')->toArray(); $partnerIds = array_merge([$currentUserId], $childrenIds); // 1) 내가 등록한 가망고객에서 전환된 tenant_id (20% 수당) $registeredTenantIds = TenantProspect::whereNotNull('tenant_id') ->where('status', TenantProspect::STATUS_CONVERTED) ->whereIn('registered_by', $partnerIds) ->pluck('tenant_id') ->toArray(); // 2) 내가 매니저로 지정된 tenant_id (5% 수당) $managedTenantIds = SalesTenantManagement::where('manager_user_id', $currentUserId) ->pluck('tenant_id') ->toArray(); // 두 목록 합치기 (중복 제거) $convertedTenantIds = array_unique(array_merge($registeredTenantIds, $managedTenantIds)); // 전환된 테넌트만 조회 (최신순, 페이지네이션) $tenants = Tenant::whereIn('id', $convertedTenantIds) ->orderBy('created_at', 'desc') ->paginate(10) ->withQueryString(); // 각 테넌트의 영업 관리 정보 로드 $tenantIds = $tenants->pluck('id')->toArray(); $managements = SalesTenantManagement::whereIn('tenant_id', $tenantIds) ->with('manager') ->get() ->keyBy('tenant_id'); // 내가 유치한 영업파트너 목록 (드롭다운용) $allManagers = auth()->user()->children() ->where('is_active', true) ->get(['id', 'name', 'email']); return compact( 'stats', 'commissionByRole', 'totalCommissionRatio', 'tenantStats', 'tenants', 'managements', 'allManagers', 'period', 'year', 'month', 'startDate', 'endDate' ); } /** * 매니저 지정 변경 */ public function assignManager(int $tenantId, Request $request): JsonResponse { $request->validate([ 'manager_id' => 'required|integer', ]); $tenant = Tenant::findOrFail($tenantId); $managerId = $request->input('manager_id'); // 테넌트 영업 관리 정보 조회 또는 생성 $management = SalesTenantManagement::findOrCreateByTenant($tenantId); if ($managerId === 0) { // 본인으로 설정 (현재 로그인 사용자) $manager = auth()->user(); $management->update([ 'manager_user_id' => $manager->id, ]); } else { // 특정 매니저 지정 $manager = User::find($managerId); if (!$manager) { return response()->json([ 'success' => false, 'message' => '매니저를 찾을 수 없습니다.', ], 404); } $management->update([ 'manager_user_id' => $manager->id, ]); } return response()->json([ 'success' => true, 'manager' => [ 'id' => $manager->id, 'name' => $manager->name, ], ]); } /** * 테넌트 리스트 부분 새로고침 (HTMX) */ public function refreshTenantList(Request $request): View { // 테넌트 목록 (나와 연결된 계약만) $currentUserId = auth()->id(); $childrenIds = auth()->user()->children()->pluck('id')->toArray(); $partnerIds = array_merge([$currentUserId], $childrenIds); // 1) 내가 등록한 가망고객에서 전환된 tenant_id (20% 수당) $registeredTenantIds = TenantProspect::whereNotNull('tenant_id') ->where('status', TenantProspect::STATUS_CONVERTED) ->whereIn('registered_by', $partnerIds) ->pluck('tenant_id') ->toArray(); // 2) 내가 매니저로 지정된 tenant_id (5% 수당) $managedTenantIds = SalesTenantManagement::where('manager_user_id', $currentUserId) ->pluck('tenant_id') ->toArray(); // 두 목록 합치기 (중복 제거) $convertedTenantIds = array_unique(array_merge($registeredTenantIds, $managedTenantIds)); // 전환된 테넌트만 조회 (최신순, 페이지네이션) $tenants = Tenant::whereIn('id', $convertedTenantIds) ->orderBy('created_at', 'desc') ->paginate(10) ->withQueryString(); // 각 테넌트의 영업 관리 정보 로드 $tenantIds = $tenants->pluck('id')->toArray(); $managements = SalesTenantManagement::whereIn('tenant_id', $tenantIds) ->with('manager') ->get() ->keyBy('tenant_id'); // 내가 유치한 영업파트너 목록 (드롭다운용) $allManagers = auth()->user()->children() ->where('is_active', true) ->get(['id', 'name', 'email']); return view('sales.dashboard.partials.tenant-list', compact( 'tenants', 'managements', 'allManagers' )); } /** * 매니저 목록 조회 (드롭다운용) */ public function getManagers(Request $request): JsonResponse { // HQ 테넌트의 사용자 중 매니저 역할이 있는 사용자 조회 $managers = User::whereHas('tenants', function ($query) { $query->where('tenant_type', 'HQ'); })->get(['id', 'name', 'email']); return response()->json([ 'success' => true, 'managers' => $managers, ]); } /** * 영업파트너 수당 정보 조회 */ private function getCommissionData(): array { $user = auth()->user(); $commissionSummary = []; $recentCommissions = collect(); // 현재 사용자가 영업파트너인지 확인 $partner = SalesPartner::where('user_id', $user->id) ->where('status', 'active') ->first(); if ($partner) { $commissionSummary = $this->commissionService->getPartnerCommissionSummary($partner->id); $recentCommissions = $this->commissionService->getRecentCommissions($partner->id, 5); } return compact('commissionSummary', 'recentCommissions', 'partner'); } }