feat:인계 완료 시 수당 및 통계 자동 계산
- hq_status가 handover인 경우 계약 금액 기반 수당 계산 - 판매자 수당: 가입비 × 10% (기준금액 50% × 20%) - 관리자 수당: 가입비 × 2.5% (기준금액 50% × 5%) - 관리 테넌트 수에 인계 완료 가망고객 포함 - 총 가입비, 확정 수당 통계에 반영 Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -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')
|
||||
|
||||
Reference in New Issue
Block a user