feat:영업파트너 고객관리 진행완료 필터 및 날짜입력 비활성화

- 진행완료(두 시나리오 모두 100%) 필터 버튼 추가 (보라색)
- 진행률 미달 시 수당 날짜 input 5개 disabled 처리
- 통계에 progress_complete 건수 추가

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
김보곤
2026-02-04 16:24:00 +09:00
parent 6bac811d96
commit 1519673b34
2 changed files with 98 additions and 28 deletions

View File

@@ -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,
];
// 영업파트너별 통계