diff --git a/app/Http/Controllers/Sales/SalesDashboardController.php b/app/Http/Controllers/Sales/SalesDashboardController.php index 0db5e311..36432edf 100644 --- a/app/Http/Controllers/Sales/SalesDashboardController.php +++ b/app/Http/Controllers/Sales/SalesDashboardController.php @@ -311,6 +311,149 @@ public function getManagers(Request $request): JsonResponse ]); } + /** + * 유치 파트너 활동 현황 (HTMX 탭 로드) + */ + public function partnerActivity(Request $request): View + { + $data = $this->getPartnerActivityData(); + + return view('sales.dashboard.partials.partner-activity', $data); + } + + /** + * 유치 파트너 활동 데이터 조회 + */ + private function getPartnerActivityData(): array + { + $currentUser = auth()->user(); + $currentUserId = $currentUser->id; + + // 직접 유치한 하위 파트너 목록 (parent_id가 현재 사용자인 사용자들) + $recruitedPartners = User::where('parent_id', $currentUserId) + ->where('is_active', true) + ->with(['userRoles.role']) + ->get(); + + $partnerIds = $recruitedPartners->pluck('id')->toArray(); + + // 요약 통계 계산 + $summaryStats = $this->calculatePartnerSummaryStats($partnerIds, $currentUserId); + + // 파트너별 상세 활동 데이터 + $partnerActivities = $this->getPartnerActivitiesDetail($recruitedPartners, $currentUserId); + + return [ + 'summaryStats' => $summaryStats, + 'partnerActivities' => $partnerActivities, + 'recruitedPartners' => $recruitedPartners, + ]; + } + + /** + * 유치 파트너 요약 통계 계산 + */ + private function calculatePartnerSummaryStats(array $partnerIds, int $currentUserId): array + { + // 유치 파트너 수 + $partnerCount = count($partnerIds); + + // 하위 파트너들이 등록한 총 영업권(명함) 수 + $totalProspects = TenantProspect::whereIn('registered_by', $partnerIds)->count(); + + // 하위 파트너들의 계약 성사 건수 + $totalConversions = TenantProspect::whereIn('registered_by', $partnerIds) + ->where('status', TenantProspect::STATUS_CONVERTED) + ->count(); + + // 매니저로서 받을 수당 (내가 매니저로 지정된 수당 중 하위 파트너 관련) + $expectedCommission = SalesCommission::where('manager_user_id', $currentUserId) + ->whereHas('partner', function ($query) use ($partnerIds) { + $query->whereIn('user_id', $partnerIds); + }) + ->sum('manager_commission'); + + return [ + 'partner_count' => $partnerCount, + 'total_prospects' => $totalProspects, + 'total_conversions' => $totalConversions, + 'expected_commission' => $expectedCommission, + ]; + } + + /** + * 파트너별 상세 활동 데이터 + */ + private function getPartnerActivitiesDetail($recruitedPartners, int $currentUserId): array + { + $activities = []; + + foreach ($recruitedPartners as $partner) { + // 파트너의 영업파트너 정보 + $salesPartner = SalesPartner::where('user_id', $partner->id)->first(); + + // 파트너가 등록한 영업권 수 + $prospectCount = TenantProspect::where('registered_by', $partner->id)->count(); + + // 진행 중인 영업권 (active 상태) + $activeProspects = TenantProspect::where('registered_by', $partner->id) + ->where('status', TenantProspect::STATUS_ACTIVE) + ->count(); + + // 계약 성사 건수 + $conversions = TenantProspect::where('registered_by', $partner->id) + ->where('status', TenantProspect::STATUS_CONVERTED) + ->count(); + + // 이 파트너로 인한 나의 매니저 수당 + $managerCommission = 0; + if ($salesPartner) { + $managerCommission = SalesCommission::where('manager_user_id', $currentUserId) + ->where('partner_id', $salesPartner->id) + ->sum('manager_commission'); + } + + // 최근 활동 내역 (최근 전환된 테넌트 5개) + $recentTenants = TenantProspect::where('registered_by', $partner->id) + ->where('status', TenantProspect::STATUS_CONVERTED) + ->with(['tenant']) + ->orderBy('converted_at', 'desc') + ->limit(5) + ->get(); + + // 활동 상태 판단 + $lastActivity = TenantProspect::where('registered_by', $partner->id) + ->orderBy('updated_at', 'desc') + ->first(); + $status = 'inactive'; + if ($lastActivity) { + $daysSinceActivity = now()->diffInDays($lastActivity->updated_at); + if ($daysSinceActivity <= 7) { + $status = 'active'; + } elseif ($daysSinceActivity <= 30) { + $status = 'moderate'; + } + } + + // 역할 정보 + $roles = $partner->userRoles->pluck('role.name')->filter()->toArray(); + $roleLabel = !empty($roles) ? implode(', ', $roles) : '영업'; + + $activities[] = [ + 'partner' => $partner, + 'role_label' => $roleLabel, + 'prospect_count' => $prospectCount, + 'active_prospects' => $activeProspects, + 'conversions' => $conversions, + 'manager_commission' => $managerCommission, + 'status' => $status, + 'recent_tenants' => $recentTenants, + ]; + } + + return $activities; + } + /** * 영업파트너 수당 정보 조회 */ diff --git a/resources/views/sales/dashboard/index.blade.php b/resources/views/sales/dashboard/index.blade.php index 266f22d1..bc8a8792 100644 --- a/resources/views/sales/dashboard/index.blade.php +++ b/resources/views/sales/dashboard/index.blade.php @@ -17,7 +17,7 @@ @endpush @section('content') -
{{ $summaryStats['partner_count'] }}명
+직접 유치한 파트너
+{{ $summaryStats['total_prospects'] }}건
+파트너들이 등록한 명함
+{{ $summaryStats['total_conversions'] }}건
+계약 성사 건수
+{{ number_format($summaryStats['expected_commission']) }}원
+매니저 수당 합계
+직접 유치한 파트너들의 영업 활동을 확인하세요
+유치한 파트너가 없습니다
+파트너를 유치하면 이곳에서 활동 현황을 확인할 수 있습니다
+| 파트너 | +역할 | +영업권 | +진행중 | +성공 | +예상수당 | +상태 | +
|---|---|---|---|---|---|---|
|
+
+
+
+
+
+ {{ $activity['partner']->name }} +{{ $activity['partner']->email }} + |
+ + + {{ $activity['role_label'] }} + + | ++ {{ $activity['prospect_count'] }} + | ++ {{ $activity['active_prospects'] }} + | ++ {{ $activity['conversions'] }} + | ++ {{ number_format($activity['manager_commission']) }}원 + | ++ + {{ $statusLabels[$activity['status']] ?? '비활동' }} + + | +
|
+ @if($activity['recent_tenants']->isEmpty())
+
+ 아직 계약 성사 내역이 없습니다
+
+ @else
+
+
+ @endif
+ 최근 계약 성사 내역 + @foreach($activity['recent_tenants'] as $prospect) +
+
+ @endforeach
+
+
+
+
+
+ {{ $prospect->company_name }} +{{ $prospect->tenant?->company_name ?? '-' }} +
+ {{-- 진행 단계 표시 --}}
+
+
+
+
+
+
+
+
+ {{ $prospect->converted_at?->format('Y-m-d') ?? '-' }}
+
+
+ 계약완료
+
+ |
+ ||||||