feat:영업파트너 고객관리 진행완료 필터 및 날짜입력 비활성화
- 진행완료(두 시나리오 모두 100%) 필터 버튼 추가 (보라색) - 진행률 미달 시 수당 날짜 input 5개 disabled 처리 - 통계에 progress_complete 건수 추가 Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -108,8 +108,9 @@ private function getIndexData(Request $request): array
|
||||
});
|
||||
}
|
||||
|
||||
// 상태 필터
|
||||
if (!empty($filters['status'])) {
|
||||
// 상태 필터 (progress_complete는 계산값 기반이므로 별도 처리)
|
||||
$isProgressCompleteFilter = ($filters['status'] === 'progress_complete');
|
||||
if (!empty($filters['status']) && !$isProgressCompleteFilter) {
|
||||
$query->where('status', $filters['status']);
|
||||
}
|
||||
|
||||
@@ -118,32 +119,87 @@ private function getIndexData(Request $request): array
|
||||
$query->where('registered_by', $filters['registered_by']);
|
||||
}
|
||||
|
||||
$prospects = $query->orderByDesc('created_at')->paginate(20);
|
||||
// progress_complete 필터: 전체 조회 후 PHP에서 필터링
|
||||
if ($isProgressCompleteFilter) {
|
||||
$allProspects = $query->orderByDesc('created_at')->get();
|
||||
|
||||
// 각 가망고객의 진행률 계산 및 상태 자동 전환
|
||||
foreach ($prospects as $prospect) {
|
||||
$progress = SalesScenarioChecklist::getProspectProgress($prospect->id);
|
||||
$prospect->sales_progress = $progress['sales']['percentage'];
|
||||
$prospect->manager_progress = $progress['manager']['percentage'];
|
||||
// 진행률 계산 및 부가정보 세팅
|
||||
foreach ($allProspects as $prospect) {
|
||||
$progress = SalesScenarioChecklist::getProspectProgress($prospect->id);
|
||||
$prospect->sales_progress = $progress['sales']['percentage'];
|
||||
$prospect->manager_progress = $progress['manager']['percentage'];
|
||||
|
||||
// 진행률 100% 시 상태 자동 전환 체크
|
||||
if ($progress['sales']['percentage'] === 100 && $progress['manager']['percentage'] === 100) {
|
||||
SalesScenarioChecklist::checkAndConvertProspectStatus($prospect->id);
|
||||
$prospect->refresh();
|
||||
if ($progress['sales']['percentage'] === 100 && $progress['manager']['percentage'] === 100) {
|
||||
SalesScenarioChecklist::checkAndConvertProspectStatus($prospect->id);
|
||||
$prospect->refresh();
|
||||
}
|
||||
|
||||
$management = SalesTenantManagement::where('tenant_prospect_id', $prospect->id)->first();
|
||||
$prospect->hq_status = $management?->hq_status ?? 'pending';
|
||||
$prospect->hq_status_label = $management?->hq_status_label ?? '대기';
|
||||
$prospect->manager_user = $management?->manager;
|
||||
|
||||
if ($management) {
|
||||
$commission = SalesCommission::where('management_id', $management->id)->first();
|
||||
$prospect->commission = $commission;
|
||||
} else {
|
||||
$prospect->commission = null;
|
||||
}
|
||||
}
|
||||
|
||||
// management 정보
|
||||
$management = SalesTenantManagement::where('tenant_prospect_id', $prospect->id)->first();
|
||||
$prospect->hq_status = $management?->hq_status ?? 'pending';
|
||||
$prospect->hq_status_label = $management?->hq_status_label ?? '대기';
|
||||
$prospect->manager_user = $management?->manager;
|
||||
// 두 시나리오 모두 100%인 것만 필터링
|
||||
$filtered = $allProspects->filter(function ($prospect) {
|
||||
return $prospect->sales_progress === 100 && $prospect->manager_progress === 100;
|
||||
});
|
||||
|
||||
// 수당 정보 (management가 있는 경우)
|
||||
if ($management) {
|
||||
$commission = SalesCommission::where('management_id', $management->id)->first();
|
||||
$prospect->commission = $commission;
|
||||
} else {
|
||||
$prospect->commission = null;
|
||||
// 수동 페이지네이션
|
||||
$page = request()->get('page', 1);
|
||||
$perPage = 20;
|
||||
$prospects = new \Illuminate\Pagination\LengthAwarePaginator(
|
||||
$filtered->forPage($page, $perPage)->values(),
|
||||
$filtered->count(),
|
||||
$perPage,
|
||||
$page,
|
||||
['path' => request()->url(), 'query' => request()->query()]
|
||||
);
|
||||
} else {
|
||||
$prospects = $query->orderByDesc('created_at')->paginate(20);
|
||||
|
||||
// 각 가망고객의 진행률 계산 및 상태 자동 전환
|
||||
foreach ($prospects as $prospect) {
|
||||
$progress = SalesScenarioChecklist::getProspectProgress($prospect->id);
|
||||
$prospect->sales_progress = $progress['sales']['percentage'];
|
||||
$prospect->manager_progress = $progress['manager']['percentage'];
|
||||
|
||||
// 진행률 100% 시 상태 자동 전환 체크
|
||||
if ($progress['sales']['percentage'] === 100 && $progress['manager']['percentage'] === 100) {
|
||||
SalesScenarioChecklist::checkAndConvertProspectStatus($prospect->id);
|
||||
$prospect->refresh();
|
||||
}
|
||||
|
||||
// management 정보
|
||||
$management = SalesTenantManagement::where('tenant_prospect_id', $prospect->id)->first();
|
||||
$prospect->hq_status = $management?->hq_status ?? 'pending';
|
||||
$prospect->hq_status_label = $management?->hq_status_label ?? '대기';
|
||||
$prospect->manager_user = $management?->manager;
|
||||
|
||||
// 수당 정보 (management가 있는 경우)
|
||||
if ($management) {
|
||||
$commission = SalesCommission::where('management_id', $management->id)->first();
|
||||
$prospect->commission = $commission;
|
||||
} else {
|
||||
$prospect->commission = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 진행완료 건수 계산 (전체 prospect 중 두 시나리오 모두 100%인 건수)
|
||||
$progressCompleteCount = 0;
|
||||
$allForStats = TenantProspect::all();
|
||||
foreach ($allForStats as $p) {
|
||||
$prog = SalesScenarioChecklist::getProspectProgress($p->id);
|
||||
if ($prog['sales']['percentage'] === 100 && $prog['manager']['percentage'] === 100) {
|
||||
$progressCompleteCount++;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -153,6 +209,7 @@ private function getIndexData(Request $request): array
|
||||
'active' => TenantProspect::where('status', TenantProspect::STATUS_ACTIVE)->count(),
|
||||
'expired' => TenantProspect::where('status', TenantProspect::STATUS_EXPIRED)->count(),
|
||||
'converted' => TenantProspect::where('status', TenantProspect::STATUS_CONVERTED)->count(),
|
||||
'progress_complete' => $progressCompleteCount,
|
||||
];
|
||||
|
||||
// 영업파트너별 통계
|
||||
|
||||
Reference in New Issue
Block a user