feat:영업파트너 고객관리 페이지 내부 새로고침 기능 추가

- 헤더에 새로고침 버튼 추가
- HTMX로 콘텐츠 영역만 새로고침 (페이지 전체 리로드 없음)
- 컨트롤러에 refresh 메서드 및 getIndexData 공통 메서드 추가
- content.blade.php partial 분리

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
김보곤
2026-02-02 12:59:58 +09:00
parent e450780bad
commit 3688e76bb8
4 changed files with 255 additions and 195 deletions

View File

@@ -37,6 +37,48 @@ public function index(Request $request): View|Response
return response('', 200)->header('HX-Redirect', route('sales.admin-prospects.index'));
}
$data = $this->getIndexData($request);
return view('sales.admin-prospects.index', $data);
}
/**
* 고객 상세 모달
*/
public function modalShow(int $id): View
{
$this->checkAdminAccess();
$prospect = TenantProspect::with(['registeredBy', 'tenant'])->findOrFail($id);
// 진행률
$progress = SalesScenarioChecklist::getProspectProgress($prospect->id);
$prospect->sales_progress = $progress['sales']['percentage'];
$prospect->manager_progress = $progress['manager']['percentage'];
// management 정보
$management = SalesTenantManagement::findOrCreateByProspect($prospect->id);
return view('sales.admin-prospects.partials.show-modal', compact('prospect', 'management', 'progress'));
}
/**
* 콘텐츠 새로고침 (HTMX)
*/
public function refresh(Request $request): View
{
$this->checkAdminAccess();
$data = $this->getIndexData($request);
return view('sales.admin-prospects.partials.content', $data);
}
/**
* index 데이터 조회 (공통)
*/
private function getIndexData(Request $request): array
{
// 영업 역할을 가진 사용자 목록 (영업파트너)
$salesPartners = User::whereHas('userRoles', function ($q) {
$q->whereHas('role', function ($rq) {
@@ -48,7 +90,7 @@ public function index(Request $request): View|Response
$filters = [
'search' => $request->get('search'),
'status' => $request->get('status'),
'registered_by' => $request->get('registered_by'), // 특정 영업파트너 필터
'registered_by' => $request->get('registered_by'),
];
// 쿼리 빌드
@@ -86,7 +128,6 @@ public function index(Request $request): View|Response
// 진행률 100% 시 상태 자동 전환 체크
if ($progress['sales']['percentage'] === 100 && $progress['manager']['percentage'] === 100) {
SalesScenarioChecklist::checkAndConvertProspectStatus($prospect->id);
// 상태가 변경되었을 수 있으므로 다시 로드
$prospect->refresh();
}
@@ -117,27 +158,7 @@ public function index(Request $request): View|Response
];
});
return view('sales.admin-prospects.index', compact('prospects', 'stats', 'salesPartners', 'partnerStats', 'filters'));
}
/**
* 고객 상세 모달
*/
public function modalShow(int $id): View
{
$this->checkAdminAccess();
$prospect = TenantProspect::with(['registeredBy', 'tenant'])->findOrFail($id);
// 진행률
$progress = SalesScenarioChecklist::getProspectProgress($prospect->id);
$prospect->sales_progress = $progress['sales']['percentage'];
$prospect->manager_progress = $progress['manager']['percentage'];
// management 정보
$management = SalesTenantManagement::findOrCreateByProspect($prospect->id);
return view('sales.admin-prospects.partials.show-modal', compact('prospect', 'management', 'progress'));
return compact('prospects', 'stats', 'salesPartners', 'partnerStats', 'filters');
}
/**