From 3688e76bb86c6b504cb71c0d51ac109633b7859b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EB=B3=B4=EA=B3=A4?= Date: Mon, 2 Feb 2026 12:59:58 +0900 Subject: [PATCH] =?UTF-8?q?feat:=EC=98=81=EC=97=85=ED=8C=8C=ED=8A=B8?= =?UTF-8?q?=EB=84=88=20=EA=B3=A0=EA=B0=9D=EA=B4=80=EB=A6=AC=20=ED=8E=98?= =?UTF-8?q?=EC=9D=B4=EC=A7=80=20=EB=82=B4=EB=B6=80=20=EC=83=88=EB=A1=9C?= =?UTF-8?q?=EA=B3=A0=EC=B9=A8=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 헤더에 새로고침 버튼 추가 - HTMX로 콘텐츠 영역만 새로고침 (페이지 전체 리로드 없음) - 컨트롤러에 refresh 메서드 및 getIndexData 공통 메서드 추가 - content.blade.php partial 분리 Co-Authored-By: Claude Opus 4.5 --- .../Sales/AdminProspectController.php | 67 ++++-- .../sales/admin-prospects/index.blade.php | 209 ++++-------------- .../partials/content.blade.php | 173 +++++++++++++++ routes/web.php | 1 + 4 files changed, 255 insertions(+), 195 deletions(-) create mode 100644 resources/views/sales/admin-prospects/partials/content.blade.php diff --git a/app/Http/Controllers/Sales/AdminProspectController.php b/app/Http/Controllers/Sales/AdminProspectController.php index cd7fadf2..4360dd7d 100644 --- a/app/Http/Controllers/Sales/AdminProspectController.php +++ b/app/Http/Controllers/Sales/AdminProspectController.php @@ -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'); } /** diff --git a/resources/views/sales/admin-prospects/index.blade.php b/resources/views/sales/admin-prospects/index.blade.php index f27c1e61..ad9eda1d 100644 --- a/resources/views/sales/admin-prospects/index.blade.php +++ b/resources/views/sales/admin-prospects/index.blade.php @@ -2,6 +2,25 @@ @section('title', '영업파트너 고객관리') +@push('styles') + +@endpush + @section('content')
@@ -10,180 +29,26 @@

영업파트너 고객관리

전체 영업파트너의 고객 현황을 관리합니다 (관리자 전용)

+ + - -
-
-
전체 고객
-
{{ number_format($stats['total']) }}건
-
-
-
영업 진행중
-
{{ number_format($stats['active']) }}건
-
-
-
영업권 만료
-
{{ number_format($stats['expired']) }}건
-
-
-
계약 완료
-
{{ number_format($stats['converted']) }}건
-
-
- - -
-
- - - - - - - - @if(request('status')) - - @endif - - -
- -
- - -
- -
- - - -
-
- - -
-
- - - - - - - - - - - - - - - - @forelse($prospects as $prospect) - - - - - - - - - - - - @empty - - - - @endforelse - -
업체명담당 파트너담당 매니저영업 진행률매니저 진행률개발 상태상태등록일관리
-
{{ $prospect->company_name }}
-
{{ $prospect->business_number }}
-
- @if($prospect->registeredBy) - {{ $prospect->registeredBy->name }} - @else - - - @endif - - @if($prospect->manager_user) - {{ $prospect->manager_user->name }} - @else - 미지정 - @endif - -
-
-
-
- {{ $prospect->sales_progress }}% -
-
-
-
-
-
- {{ $prospect->manager_progress }}% -
-
- - - - {{ $prospect->status_label }} - - - {{ $prospect->created_at->format('Y-m-d') }} - - -
- 등록된 고객이 없습니다. -
-
- - - @if($prospects->hasPages()) -
- {{ $prospects->withQueryString()->links() }} -
- @endif + +
+ @include('sales.admin-prospects.partials.content')
diff --git a/resources/views/sales/admin-prospects/partials/content.blade.php b/resources/views/sales/admin-prospects/partials/content.blade.php new file mode 100644 index 00000000..92c1530e --- /dev/null +++ b/resources/views/sales/admin-prospects/partials/content.blade.php @@ -0,0 +1,173 @@ +{{-- 통계 카드 --}} +
+
+
전체 고객
+
{{ number_format($stats['total']) }}건
+
+
+
영업 진행중
+
{{ number_format($stats['active']) }}건
+
+
+
영업권 만료
+
{{ number_format($stats['expired']) }}건
+
+
+
계약 완료
+
{{ number_format($stats['converted']) }}건
+
+
+ +{{-- 필터 영역 --}} +
+
+ {{-- 상태 필터 버튼 --}} + + + {{-- 구분선 --}} + + + {{-- 현재 status 유지 --}} + @if(request('status')) + + @endif + + {{-- 영업파트너 선택 --}} +
+ +
+ + {{-- 검색 입력 --}} +
+ +
+ + {{-- 검색 버튼 --}} + +
+
+ +{{-- 테이블 --}} +
+
+ + + + + + + + + + + + + + + + @forelse($prospects as $prospect) + + + + + + + + + + + + @empty + + + + @endforelse + +
업체명담당 파트너담당 매니저영업 진행률매니저 진행률개발 상태상태등록일관리
+
{{ $prospect->company_name }}
+
{{ $prospect->business_number }}
+
+ @if($prospect->registeredBy) + {{ $prospect->registeredBy->name }} + @else + - + @endif + + @if($prospect->manager_user) + {{ $prospect->manager_user->name }} + @else + 미지정 + @endif + +
+
+
+
+ {{ $prospect->sales_progress }}% +
+
+
+
+
+
+ {{ $prospect->manager_progress }}% +
+
+ + + + {{ $prospect->status_label }} + + + {{ $prospect->created_at->format('Y-m-d') }} + + +
+ 등록된 고객이 없습니다. +
+
+ + {{-- 페이지네이션 --}} + @if($prospects->hasPages()) +
+ {{ $prospects->withQueryString()->links() }} +
+ @endif +
diff --git a/routes/web.php b/routes/web.php index 3104d19e..7434b830 100644 --- a/routes/web.php +++ b/routes/web.php @@ -930,6 +930,7 @@ // 관리자용 전체 고객 관리 (관리자/슈퍼관리자 전용) Route::get('admin-prospects', [\App\Http\Controllers\Sales\AdminProspectController::class, 'index'])->name('admin-prospects.index'); + Route::get('admin-prospects/refresh', [\App\Http\Controllers\Sales\AdminProspectController::class, 'refresh'])->name('admin-prospects.refresh'); Route::get('admin-prospects/{id}/modal-show', [\App\Http\Controllers\Sales\AdminProspectController::class, 'modalShow'])->name('admin-prospects.modal-show'); Route::post('admin-prospects/{id}/hq-status', [\App\Http\Controllers\Sales\AdminProspectController::class, 'updateHqStatus'])->name('admin-prospects.update-hq-status');