diff --git a/app/Http/Controllers/Sales/SalesDashboardController.php b/app/Http/Controllers/Sales/SalesDashboardController.php index 745fa704..f3526b05 100644 --- a/app/Http/Controllers/Sales/SalesDashboardController.php +++ b/app/Http/Controllers/Sales/SalesDashboardController.php @@ -3,6 +3,7 @@ namespace App\Http\Controllers\Sales; use App\Http\Controllers\Controller; +use App\Models\Sales\SalesCommission; use App\Models\Sales\SalesPartner; use App\Models\Sales\SalesTenantManagement; use App\Models\Sales\TenantProspect; @@ -64,28 +65,71 @@ private function getDashboardData(Request $request): array $endDate = now()->endOfMonth()->format('Y-m-d'); } - // 통계 데이터 (임시 데이터 - 추후 실제 데이터로 교체) + $currentUserId = auth()->id(); + $childrenIds = auth()->user()->children()->pluck('id')->toArray(); + $partnerIds = array_merge([$currentUserId], $childrenIds); + + // 현재 사용자의 영업파트너 정보 조회 + $partner = SalesPartner::where('user_id', $currentUserId)->first(); + $partnerId = $partner?->id; + + // 나와 관련된 모든 수당 조회 (영업파트너로서 + 매니저로서) + $myCommissionsAsPartner = $partnerId + ? SalesCommission::forPartner($partnerId)->get() + : collect(); + $myCommissionsAsManager = SalesCommission::forManager($currentUserId)->get(); + + // 판매자(영업파트너) 수당 계산 + $partnerCommissionTotal = $myCommissionsAsPartner->sum('partner_commission'); + $partnerCommissionPaid = $myCommissionsAsPartner->where('status', SalesCommission::STATUS_PAID)->sum('partner_commission'); + $partnerCommissionPending = $myCommissionsAsPartner->where('status', SalesCommission::STATUS_PENDING)->sum('partner_commission'); + $partnerCommissionApproved = $myCommissionsAsPartner->where('status', SalesCommission::STATUS_APPROVED)->sum('partner_commission'); + + // 매니저 수당 계산 + $managerCommissionTotal = $myCommissionsAsManager->sum('manager_commission'); + $managerCommissionPaid = $myCommissionsAsManager->where('status', SalesCommission::STATUS_PAID)->sum('manager_commission'); + $managerCommissionPending = $myCommissionsAsManager->where('status', SalesCommission::STATUS_PENDING)->sum('manager_commission'); + $managerCommissionApproved = $myCommissionsAsManager->where('status', SalesCommission::STATUS_APPROVED)->sum('manager_commission'); + + // 총 수당 계산 (중복 제거: 동일 commission에서 partner + manager인 경우) + $allCommissionIds = $myCommissionsAsPartner->pluck('id')->merge($myCommissionsAsManager->pluck('id'))->unique(); + $totalContracts = $allCommissionIds->count(); + + // 통계 데이터 (실제 데이터) + $totalMembershipFee = $myCommissionsAsPartner->sum('payment_amount') + $myCommissionsAsManager->sum('payment_amount'); + $totalCommission = $partnerCommissionTotal + $managerCommissionTotal; + $paidCommission = $partnerCommissionPaid + $managerCommissionPaid; + $commissionRate = $totalCommission > 0 ? round(($paidCommission / $totalCommission) * 100, 1) : 0; + $stats = [ - 'total_membership_fee' => 0, // 총 가입비 - 'total_commission' => 0, // 총 수당 - 'commission_rate' => 0, // 지급 승인 완료 비율 - 'total_contracts' => 0, // 전체 건수 - 'pending_membership_approval' => 0, // 가입 승인 대기 - 'pending_payment_approval' => 0, // 지급 승인 대기 + 'total_membership_fee' => $totalMembershipFee, // 총 가입비 + 'total_commission' => $totalCommission, // 총 수당 + 'commission_rate' => $commissionRate, // 지급 완료 비율 + 'total_contracts' => $totalContracts, // 전체 건수 + 'pending_membership_approval' => $myCommissionsAsPartner->where('status', SalesCommission::STATUS_PENDING)->count() + + $myCommissionsAsManager->where('status', SalesCommission::STATUS_PENDING)->count(), + 'pending_payment_approval' => $myCommissionsAsPartner->where('status', SalesCommission::STATUS_APPROVED)->count() + + $myCommissionsAsManager->where('status', SalesCommission::STATUS_APPROVED)->count(), ]; - // 역할별 수당 상세 + // 역할별 수당 상세 (실제 데이터) $commissionByRole = [ [ 'name' => '판매자', 'rate' => 20, - 'amount' => 0, + 'amount' => $partnerCommissionTotal, + 'paid' => $partnerCommissionPaid, + 'pending' => $partnerCommissionPending, + 'approved' => $partnerCommissionApproved, 'color' => 'green', ], [ 'name' => '관리자', 'rate' => 5, - 'amount' => 0, + 'amount' => $managerCommissionTotal, + 'paid' => $managerCommissionPaid, + 'pending' => $managerCommissionPending, + 'approved' => $managerCommissionApproved, 'color' => 'blue', ], [ @@ -96,23 +140,8 @@ private function getDashboardData(Request $request): array ], ]; - // 총 가입비 대비 수당 - $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); + // 총 가입비 대비 수당 비율 + $totalCommissionRatio = $totalMembershipFee > 0 ? round(($totalCommission / $totalMembershipFee) * 100, 1) : 0; // 1) 내가 등록한 가망고객에서 전환된 tenant_id (20% 수당) $registeredTenantIds = TenantProspect::whereNotNull('tenant_id') @@ -129,6 +158,14 @@ private function getDashboardData(Request $request): array // 두 목록 합치기 (중복 제거) $convertedTenantIds = array_unique(array_merge($registeredTenantIds, $managedTenantIds)); + // 수익 및 테넌트 관리 통계 (실제 데이터) + $tenantStats = [ + 'total_tenants' => count($convertedTenantIds), // 관리 테넌트 + 'total_membership_revenue' => $totalMembershipFee, // 총 가입비 실적 + 'total_commission_accumulated' => $totalCommission, // 누적 수당 + 'confirmed_commission' => $paidCommission, // 확정(지급완료) 수당 + ]; + // 전환된 테넌트만 조회 (최신순, 페이지네이션) $tenants = Tenant::whereIn('id', $convertedTenantIds) ->orderBy('created_at', 'desc')