feat:영업파트너 역할 위임 기능 및 용어 정리
- 역할 위임/부여/제거 기능 추가 (delegateRole, assignRole, removeRole) - '상위 관리자' → '추천인(유치자)' 용어 변경 - 역할 코드 변경: sales_operator/sales_admin/sales_manager → sales/manager/recruiter - 뷰 파일 전면 수정 (영업파트너 구조 반영) - 역할 관리 UI 추가 (show.blade.php) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -3,7 +3,6 @@
|
||||
namespace App\Http\Controllers\Sales;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Models\Role;
|
||||
use App\Models\Sales\SalesManagerDocument;
|
||||
use App\Models\User;
|
||||
use App\Services\Sales\SalesManagerService;
|
||||
@@ -12,7 +11,7 @@
|
||||
use Illuminate\View\View;
|
||||
|
||||
/**
|
||||
* 영업 담당자/매니저 관리 컨트롤러
|
||||
* 영업파트너 관리 컨트롤러
|
||||
*/
|
||||
class SalesManagerController extends Controller
|
||||
{
|
||||
@@ -35,10 +34,10 @@ public function index(Request $request): View|Response
|
||||
'approval_status' => $request->get('approval_status'),
|
||||
];
|
||||
|
||||
$managers = $this->service->getSalesManagers($filters)->paginate(20);
|
||||
$partners = $this->service->getSalesPartners($filters)->paginate(20);
|
||||
$stats = $this->service->getStats();
|
||||
|
||||
return view('sales.managers.index', compact('managers', 'stats'));
|
||||
return view('sales.managers.index', compact('partners', 'stats'));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -46,20 +45,16 @@ public function index(Request $request): View|Response
|
||||
*/
|
||||
public function create(): View
|
||||
{
|
||||
$tenantId = session('selected_tenant_id', 1);
|
||||
// 영업 역할 목록
|
||||
$roles = $this->service->getSalesRoles();
|
||||
|
||||
// 영업 관련 역할 목록
|
||||
$roles = Role::where('tenant_id', $tenantId)
|
||||
->whereIn('name', ['sales_operator', 'sales_admin', 'sales_manager'])
|
||||
->get();
|
||||
|
||||
// 상위 관리자 후보
|
||||
$parents = $this->service->getParentCandidates();
|
||||
// 추천인(유치자) 후보
|
||||
$recommenders = $this->service->getRecommenderCandidates();
|
||||
|
||||
// 문서 타입 목록
|
||||
$documentTypes = SalesManagerDocument::DOCUMENT_TYPES;
|
||||
|
||||
return view('sales.managers.create', compact('roles', 'parents', 'documentTypes'));
|
||||
return view('sales.managers.create', compact('roles', 'recommenders', 'documentTypes'));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -77,7 +72,7 @@ public function store(Request $request)
|
||||
'role_ids' => 'required|array|min:1',
|
||||
'role_ids.*' => 'exists:roles,id',
|
||||
'documents' => 'nullable|array',
|
||||
'documents.*.file' => 'nullable|file|max:10240', // 10MB
|
||||
'documents.*.file' => 'nullable|file|max:10240',
|
||||
'documents.*.document_type' => 'nullable|string',
|
||||
'documents.*.description' => 'nullable|string|max:500',
|
||||
]);
|
||||
@@ -94,10 +89,10 @@ public function store(Request $request)
|
||||
}
|
||||
}
|
||||
|
||||
$this->service->createSalesManager($validated, $documents);
|
||||
$this->service->createSalesPartner($validated, $documents);
|
||||
|
||||
return redirect()->route('sales.managers.index')
|
||||
->with('success', '영업담당자 등록 신청이 완료되었습니다. 본사 승인 후 활성화됩니다.');
|
||||
->with('success', '영업파트너 등록 신청이 완료되었습니다. 본사 승인 후 활성화됩니다.');
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -105,10 +100,21 @@ public function store(Request $request)
|
||||
*/
|
||||
public function show(int $id): View
|
||||
{
|
||||
$manager = User::with(['parent', 'children', 'userRoles.role', 'salesDocuments', 'approver'])
|
||||
$partner = User::with(['parent', 'children', 'userRoles.role', 'salesDocuments', 'approver'])
|
||||
->findOrFail($id);
|
||||
|
||||
return view('sales.managers.show', compact('manager'));
|
||||
// 계층 레벨
|
||||
$level = $this->service->getPartnerLevel($partner);
|
||||
|
||||
// 하위 파트너
|
||||
$children = User::where('parent_id', $partner->id)
|
||||
->with('userRoles.role')
|
||||
->get();
|
||||
|
||||
// 역할 위임 가능한 하위 파트너
|
||||
$delegationCandidates = $this->service->getDelegationCandidates($partner);
|
||||
|
||||
return view('sales.managers.show', compact('partner', 'level', 'children', 'delegationCandidates'));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -116,25 +122,22 @@ public function show(int $id): View
|
||||
*/
|
||||
public function edit(int $id): View
|
||||
{
|
||||
$manager = User::with(['userRoles.role', 'salesDocuments'])->findOrFail($id);
|
||||
$tenantId = session('selected_tenant_id', 1);
|
||||
$partner = User::with(['userRoles.role', 'salesDocuments'])->findOrFail($id);
|
||||
|
||||
// 영업 관련 역할 목록
|
||||
$roles = Role::where('tenant_id', $tenantId)
|
||||
->whereIn('name', ['sales_operator', 'sales_admin', 'sales_manager'])
|
||||
->get();
|
||||
// 영업 역할 목록
|
||||
$roles = $this->service->getSalesRoles();
|
||||
|
||||
// 상위 관리자 후보
|
||||
$parents = $this->service->getParentCandidates($id);
|
||||
// 추천인(유치자) 후보
|
||||
$recommenders = $this->service->getRecommenderCandidates($id);
|
||||
|
||||
// 현재 역할 ID 목록
|
||||
$currentRoleIds = $manager->userRoles->pluck('role_id')->toArray();
|
||||
$currentRoleIds = $partner->userRoles->pluck('role_id')->toArray();
|
||||
|
||||
// 문서 타입 목록
|
||||
$documentTypes = SalesManagerDocument::DOCUMENT_TYPES;
|
||||
|
||||
return view('sales.managers.edit', compact(
|
||||
'manager', 'roles', 'parents', 'currentRoleIds', 'documentTypes'
|
||||
'partner', 'roles', 'recommenders', 'currentRoleIds', 'documentTypes'
|
||||
));
|
||||
}
|
||||
|
||||
@@ -143,7 +146,7 @@ public function edit(int $id): View
|
||||
*/
|
||||
public function update(Request $request, int $id)
|
||||
{
|
||||
$manager = User::findOrFail($id);
|
||||
$partner = User::findOrFail($id);
|
||||
|
||||
$validated = $request->validate([
|
||||
'name' => 'required|string|max:100',
|
||||
@@ -171,10 +174,10 @@ public function update(Request $request, int $id)
|
||||
}
|
||||
}
|
||||
|
||||
$this->service->updateSalesManager($manager, $validated, $documents);
|
||||
$this->service->updateSalesPartner($partner, $validated, $documents);
|
||||
|
||||
return redirect()->route('sales.managers.index')
|
||||
->with('success', '담당자 정보가 수정되었습니다.');
|
||||
->with('success', '영업파트너 정보가 수정되었습니다.');
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -182,11 +185,11 @@ public function update(Request $request, int $id)
|
||||
*/
|
||||
public function destroy(int $id)
|
||||
{
|
||||
$manager = User::findOrFail($id);
|
||||
$manager->update(['is_active' => false]);
|
||||
$partner = User::findOrFail($id);
|
||||
$partner->update(['is_active' => false]);
|
||||
|
||||
return redirect()->route('sales.managers.index')
|
||||
->with('success', '담당자가 비활성화되었습니다.');
|
||||
->with('success', '영업파트너가 비활성화되었습니다.');
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -194,11 +197,11 @@ public function destroy(int $id)
|
||||
*/
|
||||
public function approve(int $id)
|
||||
{
|
||||
$manager = User::findOrFail($id);
|
||||
$this->service->approve($manager, auth()->id());
|
||||
$partner = User::findOrFail($id);
|
||||
$this->service->approve($partner, auth()->id());
|
||||
|
||||
return redirect()->back()
|
||||
->with('success', '영업담당자가 승인되었습니다.');
|
||||
->with('success', '영업파트너가 승인되었습니다.');
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -210,11 +213,70 @@ public function reject(Request $request, int $id)
|
||||
'rejection_reason' => 'required|string|max:1000',
|
||||
]);
|
||||
|
||||
$manager = User::findOrFail($id);
|
||||
$this->service->reject($manager, auth()->id(), $validated['rejection_reason']);
|
||||
$partner = User::findOrFail($id);
|
||||
$this->service->reject($partner, auth()->id(), $validated['rejection_reason']);
|
||||
|
||||
return redirect()->back()
|
||||
->with('success', '영업담당자가 반려되었습니다.');
|
||||
->with('success', '영업파트너가 반려되었습니다.');
|
||||
}
|
||||
|
||||
/**
|
||||
* 역할 위임 처리
|
||||
*/
|
||||
public function delegateRole(Request $request, int $id)
|
||||
{
|
||||
$validated = $request->validate([
|
||||
'to_user_id' => 'required|exists:users,id',
|
||||
'role_name' => 'required|string|in:manager,recruiter',
|
||||
]);
|
||||
|
||||
$fromUser = User::findOrFail($id);
|
||||
$toUser = User::findOrFail($validated['to_user_id']);
|
||||
|
||||
try {
|
||||
$this->service->delegateRole($fromUser, $toUser, $validated['role_name']);
|
||||
|
||||
$roleLabel = $validated['role_name'] === 'manager' ? '매니저' : '유치담당';
|
||||
return redirect()->back()
|
||||
->with('success', "{$roleLabel} 역할이 {$toUser->name}님에게 위임되었습니다.");
|
||||
} catch (\InvalidArgumentException $e) {
|
||||
return redirect()->back()
|
||||
->with('error', $e->getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 역할 부여
|
||||
*/
|
||||
public function assignRole(Request $request, int $id)
|
||||
{
|
||||
$validated = $request->validate([
|
||||
'role_name' => 'required|string|in:sales,manager,recruiter',
|
||||
]);
|
||||
|
||||
$partner = User::findOrFail($id);
|
||||
$this->service->assignRole($partner, $validated['role_name']);
|
||||
|
||||
$roleLabels = ['sales' => '영업', 'manager' => '매니저', 'recruiter' => '유치담당'];
|
||||
return redirect()->back()
|
||||
->with('success', "{$roleLabels[$validated['role_name']]} 역할이 부여되었습니다.");
|
||||
}
|
||||
|
||||
/**
|
||||
* 역할 제거
|
||||
*/
|
||||
public function removeRole(Request $request, int $id)
|
||||
{
|
||||
$validated = $request->validate([
|
||||
'role_name' => 'required|string|in:sales,manager,recruiter',
|
||||
]);
|
||||
|
||||
$partner = User::findOrFail($id);
|
||||
$this->service->removeRole($partner, $validated['role_name']);
|
||||
|
||||
$roleLabels = ['sales' => '영업', 'manager' => '매니저', 'recruiter' => '유치담당'];
|
||||
return redirect()->back()
|
||||
->with('success', "{$roleLabels[$validated['role_name']]} 역할이 제거되었습니다.");
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user