feat:대시보드 통계를 실제 데이터로 구현

- 총 가입비, 총 수당, 지급 완료 비율 등 실제 계산
- 판매자(20%) / 매니저(5%) 역할별 수당 상세
- 영업파트너로서의 수당 + 매니저로서의 수당 모두 집계
- 테넌트 통계 (관리 테넌트 수, 누적 수당, 확정 수당)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
pro
2026-01-30 17:02:41 +09:00
parent bd371f25d5
commit 7b24f3b883

View File

@@ -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')