diff --git a/app/Http/Controllers/Sales/SalesDashboardController.php b/app/Http/Controllers/Sales/SalesDashboardController.php index 427047fc..c8db9207 100644 --- a/app/Http/Controllers/Sales/SalesDashboardController.php +++ b/app/Http/Controllers/Sales/SalesDashboardController.php @@ -127,7 +127,8 @@ private function getDashboardData(Request $request): array ], [ 'name' => '관리자', - 'rate' => 5, + 'rate' => null, // 1개월 구독료 (퍼센트가 아닌 고정 금액) + 'rate_label' => '1개월 구독료', 'amount' => $managerCommissionTotal, 'paid' => $managerCommissionPaid, 'pending' => $managerCommissionPending, @@ -166,11 +167,10 @@ private function getDashboardData(Request $request): array ->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); + // 매니저 수당: 1개월 구독료 (퍼센트가 아닌 고정 금액) + $handoverManagerCommission = (int)SalesContractProduct::whereIn('management_id', $managedHandoverManagementIds) + ->sum('subscription_fee'); // 기존 수당에 인계 완료 수당 추가 $partnerCommissionTotal += $handoverPartnerCommission; @@ -318,6 +318,51 @@ public function assignManager(int $tenantId, Request $request): JsonResponse ]); } + /** + * 가망고객에 매니저 지정 + */ + public function assignProspectManager(int $prospectId, Request $request): JsonResponse + { + $request->validate([ + 'manager_id' => 'required|integer', + ]); + + $prospect = TenantProspect::findOrFail($prospectId); + $managerId = $request->input('manager_id'); + + // 가망고객 영업 관리 정보 조회 또는 생성 + $management = SalesTenantManagement::findOrCreateByProspect($prospectId); + + if ($managerId === 0) { + // 본인으로 설정 (현재 로그인 사용자) + $manager = auth()->user(); + $management->update([ + 'manager_user_id' => $manager->id, + ]); + } else { + // 특정 매니저 지정 + $manager = User::find($managerId); + if (!$manager) { + return response()->json([ + 'success' => false, + 'message' => '매니저를 찾을 수 없습니다.', + ], 404); + } + + $management->update([ + 'manager_user_id' => $manager->id, + ]); + } + + return response()->json([ + 'success' => true, + 'manager' => [ + 'id' => $manager->id, + 'name' => $manager->name, + ], + ]); + } + /** * 테넌트 리스트 부분 새로고침 (HTMX) */ @@ -441,10 +486,9 @@ private function calculatePartnerSummaryStats(array $partnerIds, int $currentUse // 하위 파트너들이 등록한 총 영업권(명함) 수 $totalProspects = TenantProspect::whereIn('registered_by', $partnerIds)->count(); - // 예상 수당 계산을 위해 먼저 가입비 정보 조회 + // 예상 수당 계산을 위해 먼저 가입비/구독료 정보 조회 $prospectIds = TenantProspect::whereIn('registered_by', $partnerIds)->pluck('id')->toArray(); $managementIds = SalesTenantManagement::whereIn('tenant_prospect_id', $prospectIds)->pluck('id')->toArray(); - $totalRegistrationFee = SalesContractProduct::whereIn('management_id', $managementIds)->sum('registration_fee'); // 하위 파트너들의 계약 건수 (가입비가 설정된 건수) $contractedManagementCount = SalesContractProduct::whereIn('management_id', $managementIds) @@ -453,13 +497,16 @@ private function calculatePartnerSummaryStats(array $partnerIds, int $currentUse ->count('management_id'); $totalConversions = $contractedManagementCount; + // 매니저 예상 수당: 1개월 구독료 (퍼센트가 아닌 고정 금액) + $totalSubscriptionFee = SalesContractProduct::whereIn('management_id', $managementIds)->sum('subscription_fee'); + // 확정 수당 (SalesCommission에서) $confirmedCommission = SalesCommission::where('manager_user_id', $currentUserId) ->whereHas('partner', function ($query) use ($partnerIds) { $query->whereIn('user_id', $partnerIds); }) ->sum('manager_commission'); - $expectedFromFee = (int)($totalRegistrationFee * 0.05); + $expectedFromFee = (int)$totalSubscriptionFee; // 1개월 구독료 // 최종 예상 수당 (확정 + 예상 중 큰 값) $expectedCommission = max($confirmedCommission, $expectedFromFee); @@ -504,11 +551,12 @@ private function getPartnerActivitiesDetail($recruitedPartners, int $currentUser ->sum('manager_commission'); } - // 예상 수당 계산: 파트너가 등록한 가망고객의 가입비 × 5% + // 예상 수당 계산: 파트너가 등록한 가망고객의 1개월 구독료 $prospectIds = TenantProspect::where('registered_by', $partner->id)->pluck('id')->toArray(); $managementIds = SalesTenantManagement::whereIn('tenant_prospect_id', $prospectIds)->pluck('id')->toArray(); $totalRegistrationFee = SalesContractProduct::whereIn('management_id', $managementIds)->sum('registration_fee'); - $expectedCommission = (int)($totalRegistrationFee * 0.05); // 5% 매니저 수당 + $totalSubscriptionFee = SalesContractProduct::whereIn('management_id', $managementIds)->sum('subscription_fee'); + $expectedCommission = (int)$totalSubscriptionFee; // 1개월 구독료 // 최종 매니저 수당 (확정 + 예상 중 큰 값, 또는 합산) $managerCommission = max($confirmedCommission, $expectedCommission); diff --git a/resources/views/sales/dashboard/partials/commission-by-role.blade.php b/resources/views/sales/dashboard/partials/commission-by-role.blade.php index 654efec4..53e907f0 100644 --- a/resources/views/sales/dashboard/partials/commission-by-role.blade.php +++ b/resources/views/sales/dashboard/partials/commission-by-role.blade.php @@ -38,6 +38,8 @@ @elseif($role['color'] === 'blue') text-blue-600 @else text-gray-600 @endif">{{ $role['rate'] }}% + @elseif(!empty($role['rate_label'])) + {{ $role['rate_label'] }} @else 별도 @endif diff --git a/resources/views/sales/dashboard/partials/manager-dropdown.blade.php b/resources/views/sales/dashboard/partials/manager-dropdown.blade.php index 743f9283..6f4ba732 100644 --- a/resources/views/sales/dashboard/partials/manager-dropdown.blade.php +++ b/resources/views/sales/dashboard/partials/manager-dropdown.blade.php @@ -1,18 +1,31 @@ -{{-- 매니저 드롭다운 컴포넌트 --}} +{{-- 매니저 드롭다운 컴포넌트 (테넌트 또는 가망고객용) --}} @once @endonce @php - $management = $managements[$tenant->id] ?? null; + // 테넌트 또는 가망고객에 따라 다르게 처리 + $isProspect = isset($prospect); + $entityId = $isProspect ? $prospect->id : $tenant->id; + + if ($isProspect) { + $management = $prospectManagement ?? \App\Models\Sales\SalesTenantManagement::findOrCreateByProspect($prospect->id); + } else { + $management = $managements[$tenant->id] ?? null; + } + $assignedManager = $management?->manager; $isSelf = !$assignedManager || $assignedManager->id === auth()->id(); $managerName = $assignedManager?->name ?? '본인'; $managersJson = $allManagers->map(fn($m) => ['id' => $m->id, 'name' => $m->name, 'email' => $m->email])->values()->toJson(); $currentManagerJson = json_encode($assignedManager ? ['id' => $assignedManager->id, 'name' => $assignedManager->name, 'is_self' => $isSelf] : null); + + // API 엔드포인트 결정 + $apiEndpoint = $isProspect ? '/sales/prospects/' : '/sales/tenants/'; @endphp
- +
@@ -111,6 +111,10 @@ {{ $prospect->business_number ?? '-' }}
+ {{-- 매니저 드롭다운 --}} +
+ @include('sales.dashboard.partials.manager-dropdown', ['prospect' => $prospect, 'prospectManagement' => $prospectManagement]) +
{{-- 영업/매니저 진행 버튼 --}}