From 820171df6187933429340bec69f3d4ccbbc1e842 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EB=B3=B4=EA=B3=A4?= Date: Sat, 31 Jan 2026 21:28:28 +0900 Subject: [PATCH] =?UTF-8?q?feat:=EC=9D=B8=EA=B3=84=20=EC=99=84=EB=A3=8C=20?= =?UTF-8?q?=EC=8B=9C=20=EC=88=98=EB=8B=B9=20=EB=B0=8F=20=ED=86=B5=EA=B3=84?= =?UTF-8?q?=20=EC=9E=90=EB=8F=99=20=EA=B3=84=EC=82=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - hq_status가 handover인 경우 계약 금액 기반 수당 계산 - 판매자 수당: 가입비 × 10% (기준금액 50% × 20%) - 관리자 수당: 가입비 × 2.5% (기준금액 50% × 5%) - 관리 테넌트 수에 인계 완료 가망고객 포함 - 총 가입비, 확정 수당 통계에 반영 Co-Authored-By: Claude Opus 4.5 --- .../Sales/SalesDashboardController.php | 68 +++++++++++++++++-- .../sales/dashboard/partials/stats.blade.php | 4 +- 2 files changed, 64 insertions(+), 8 deletions(-) diff --git a/app/Http/Controllers/Sales/SalesDashboardController.php b/app/Http/Controllers/Sales/SalesDashboardController.php index 5c659c9d..6e45df69 100644 --- a/app/Http/Controllers/Sales/SalesDashboardController.php +++ b/app/Http/Controllers/Sales/SalesDashboardController.php @@ -4,6 +4,7 @@ use App\Http\Controllers\Controller; use App\Models\Sales\SalesCommission; +use App\Models\Sales\SalesContractProduct; use App\Models\Sales\SalesPartner; use App\Models\Sales\SalesTenantManagement; use App\Models\Sales\TenantProspect; @@ -141,6 +142,46 @@ private function getDashboardData(Request $request): array ], ]; + // === 인계(handover) 완료된 가망고객의 수당 계산 === + // 내가 등록한 가망고객 중 인계 완료된 것들의 계약 금액 조회 + $handoverProspectIds = TenantProspect::whereIn('registered_by', $partnerIds) + ->pluck('id') + ->toArray(); + + // 인계 완료된 가망고객의 management_id 조회 + $handoverManagements = SalesTenantManagement::whereIn('prospect_id', $handoverProspectIds) + ->where('hq_status', SalesTenantManagement::HQ_STATUS_HANDOVER) + ->get(); + + // 인계 완료된 계약의 가입비 합계 + $handoverManagementIds = $handoverManagements->pluck('id')->toArray(); + $handoverTotalRegFee = SalesContractProduct::whereIn('management_id', $handoverManagementIds) + ->sum('registration_fee'); + + // 수당 계산: 가입비 × 50% × 20% = 가입비 × 10% + $handoverPartnerCommission = (int)($handoverTotalRegFee * 0.10); + + // 내가 매니저로 지정된 인계 완료 건의 수당 계산 + $managedHandoverManagements = SalesTenantManagement::where('manager_user_id', $currentUserId) + ->where('hq_status', SalesTenantManagement::HQ_STATUS_HANDOVER) + ->get(); + $managedHandoverManagementIds = $managedHandoverManagements->pluck('id')->toArray(); + $managedHandoverTotalRegFee = SalesContractProduct::whereIn('management_id', $managedHandoverManagementIds) + ->sum('registration_fee'); + + // 매니저 수당: 가입비 × 50% × 5% = 가입비 × 2.5% + $handoverManagerCommission = (int)($managedHandoverTotalRegFee * 0.025); + + // 기존 수당에 인계 완료 수당 추가 + $partnerCommissionTotal += $handoverPartnerCommission; + $managerCommissionTotal += $handoverManagerCommission; + $totalMembershipFee += $handoverTotalRegFee; + $totalCommission = $partnerCommissionTotal + $managerCommissionTotal; + + // 역할별 수당 업데이트 + $commissionByRole[0]['amount'] = $partnerCommissionTotal; + $commissionByRole[1]['amount'] = $managerCommissionTotal; + // 총 가입비 대비 수당 비율 $totalCommissionRatio = $totalMembershipFee > 0 ? round(($totalCommission / $totalMembershipFee) * 100, 1) : 0; @@ -153,27 +194,42 @@ private function getDashboardData(Request $request): array // 2) 내가 매니저로 지정된 tenant_id (5% 수당) $managedTenantIds = SalesTenantManagement::where('manager_user_id', $currentUserId) + ->whereNotNull('tenant_id') ->pluck('tenant_id') ->toArray(); // 두 목록 합치기 (중복 제거) $convertedTenantIds = array_unique(array_merge($registeredTenantIds, $managedTenantIds)); - // 3) 내가 등록한 가망고객 (아직 전환되지 않은 것 - active 상태) + // 3) 인계 완료된 가망고객 ID 조회 + $handoverCompletedProspectIds = SalesTenantManagement::whereNotNull('prospect_id') + ->where('hq_status', SalesTenantManagement::HQ_STATUS_HANDOVER) + ->pluck('prospect_id') + ->toArray(); + + // 4) 내가 등록한 가망고객 (아직 인계 완료되지 않은 것) $prospects = TenantProspect::whereIn('registered_by', $partnerIds) ->whereIn('status', [TenantProspect::STATUS_ACTIVE, TenantProspect::STATUS_EXPIRED]) + ->whereNotIn('id', $handoverCompletedProspectIds) ->orderBy('created_at', 'desc') ->get(); + // 인계 완료된 가망고객 수 + $handoverProspectCount = count($handoverManagementIds); + // 수익 및 테넌트 관리 통계 (실제 데이터) $tenantStats = [ - 'total_tenants' => count($convertedTenantIds), // 관리 테넌트 - 'total_prospects' => $prospects->count(), // 진행중 가망고객 - 'total_membership_revenue' => $totalMembershipFee, // 총 가입비 실적 - 'total_commission_accumulated' => $totalCommission, // 누적 수당 - 'confirmed_commission' => $paidCommission, // 확정(지급완료) 수당 + 'total_tenants' => count($convertedTenantIds) + $handoverProspectCount, // 관리 테넌트 + 인계완료 + 'total_prospects' => $prospects->count(), // 진행중 가망고객 + 'total_membership_revenue' => $totalMembershipFee, // 총 가입비 실적 + 'total_commission_accumulated' => $totalCommission, // 누적 수당 + 'confirmed_commission' => $paidCommission, // 확정(지급완료) 수당 ]; + // 통계 업데이트 + $stats['total_membership_fee'] = $totalMembershipFee; + $stats['total_commission'] = $totalCommission; + // 전환된 테넌트만 조회 (최신순, 페이지네이션) $tenants = Tenant::whereIn('id', $convertedTenantIds) ->orderBy('created_at', 'desc') diff --git a/resources/views/sales/dashboard/partials/stats.blade.php b/resources/views/sales/dashboard/partials/stats.blade.php index 74ed886b..1e030c9a 100644 --- a/resources/views/sales/dashboard/partials/stats.blade.php +++ b/resources/views/sales/dashboard/partials/stats.blade.php @@ -20,8 +20,8 @@ -

{{ $tenants->total() }}개

-

등록된 업체 수

+

{{ $tenantStats['total_tenants'] ?? 0 }}개

+

인계 완료 업체 수