156 lines
4.5 KiB
PHP
156 lines
4.5 KiB
PHP
|
|
<?php
|
||
|
|
|
||
|
|
namespace App\Http\Controllers\Sales;
|
||
|
|
|
||
|
|
use App\Http\Controllers\Controller;
|
||
|
|
use App\Models\Sales\SalesManager;
|
||
|
|
use Illuminate\Http\Request;
|
||
|
|
use Illuminate\Http\Response;
|
||
|
|
use Illuminate\View\View;
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 영업 담당자/매니저 관리 컨트롤러
|
||
|
|
*/
|
||
|
|
class SalesManagerController extends Controller
|
||
|
|
{
|
||
|
|
/**
|
||
|
|
* 목록 페이지
|
||
|
|
*/
|
||
|
|
public function index(Request $request): View|Response
|
||
|
|
{
|
||
|
|
if ($request->header('HX-Request')) {
|
||
|
|
return response('', 200)->header('HX-Redirect', route('sales.managers.index'));
|
||
|
|
}
|
||
|
|
|
||
|
|
$query = SalesManager::query()->active();
|
||
|
|
|
||
|
|
// 검색
|
||
|
|
if ($search = $request->get('search')) {
|
||
|
|
$query->where(function ($q) use ($search) {
|
||
|
|
$q->where('name', 'like', "%{$search}%")
|
||
|
|
->orWhere('member_id', 'like', "%{$search}%")
|
||
|
|
->orWhere('email', 'like', "%{$search}%")
|
||
|
|
->orWhere('phone', 'like', "%{$search}%");
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
// 역할 필터
|
||
|
|
if ($role = $request->get('role')) {
|
||
|
|
$query->where('role', $role);
|
||
|
|
}
|
||
|
|
|
||
|
|
$managers = $query->orderBy('name')->paginate(20);
|
||
|
|
|
||
|
|
// 통계
|
||
|
|
$stats = [
|
||
|
|
'total' => SalesManager::active()->count(),
|
||
|
|
'operators' => SalesManager::active()->where('role', 'operator')->count(),
|
||
|
|
'sales_admins' => SalesManager::active()->where('role', 'sales_admin')->count(),
|
||
|
|
'managers' => SalesManager::active()->where('role', 'manager')->count(),
|
||
|
|
];
|
||
|
|
|
||
|
|
return view('sales.managers.index', compact('managers', 'stats'));
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 등록 폼
|
||
|
|
*/
|
||
|
|
public function create(): View
|
||
|
|
{
|
||
|
|
$parents = SalesManager::active()
|
||
|
|
->whereIn('role', ['operator', 'sales_admin'])
|
||
|
|
->orderBy('name')
|
||
|
|
->get();
|
||
|
|
|
||
|
|
return view('sales.managers.create', compact('parents'));
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 등록 처리
|
||
|
|
*/
|
||
|
|
public function store(Request $request)
|
||
|
|
{
|
||
|
|
$validated = $request->validate([
|
||
|
|
'member_id' => 'required|string|max:50|unique:sales_managers,member_id',
|
||
|
|
'password' => 'required|string|min:4',
|
||
|
|
'name' => 'required|string|max:100',
|
||
|
|
'phone' => 'nullable|string|max:20',
|
||
|
|
'email' => 'nullable|email|max:100',
|
||
|
|
'parent_id' => 'nullable|exists:sales_managers,id',
|
||
|
|
'role' => 'required|in:operator,sales_admin,manager',
|
||
|
|
'remarks' => 'nullable|string',
|
||
|
|
]);
|
||
|
|
|
||
|
|
SalesManager::create($validated);
|
||
|
|
|
||
|
|
return redirect()->route('sales.managers.index')
|
||
|
|
->with('success', '담당자가 등록되었습니다.');
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 상세 페이지
|
||
|
|
*/
|
||
|
|
public function show(int $id): View
|
||
|
|
{
|
||
|
|
$manager = SalesManager::with(['parent', 'children', 'registeredProspects', 'records'])
|
||
|
|
->findOrFail($id);
|
||
|
|
|
||
|
|
return view('sales.managers.show', compact('manager'));
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 수정 폼
|
||
|
|
*/
|
||
|
|
public function edit(int $id): View
|
||
|
|
{
|
||
|
|
$manager = SalesManager::findOrFail($id);
|
||
|
|
$parents = SalesManager::active()
|
||
|
|
->whereIn('role', ['operator', 'sales_admin'])
|
||
|
|
->where('id', '!=', $id)
|
||
|
|
->orderBy('name')
|
||
|
|
->get();
|
||
|
|
|
||
|
|
return view('sales.managers.edit', compact('manager', 'parents'));
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 수정 처리
|
||
|
|
*/
|
||
|
|
public function update(Request $request, int $id)
|
||
|
|
{
|
||
|
|
$manager = SalesManager::findOrFail($id);
|
||
|
|
|
||
|
|
$validated = $request->validate([
|
||
|
|
'name' => 'required|string|max:100',
|
||
|
|
'phone' => 'nullable|string|max:20',
|
||
|
|
'email' => 'nullable|email|max:100',
|
||
|
|
'parent_id' => 'nullable|exists:sales_managers,id',
|
||
|
|
'role' => 'required|in:operator,sales_admin,manager',
|
||
|
|
'remarks' => 'nullable|string',
|
||
|
|
'password' => 'nullable|string|min:4',
|
||
|
|
]);
|
||
|
|
|
||
|
|
// 비밀번호가 비어있으면 제외
|
||
|
|
if (empty($validated['password'])) {
|
||
|
|
unset($validated['password']);
|
||
|
|
}
|
||
|
|
|
||
|
|
$manager->update($validated);
|
||
|
|
|
||
|
|
return redirect()->route('sales.managers.index')
|
||
|
|
->with('success', '담당자 정보가 수정되었습니다.');
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 삭제 처리 (비활성화)
|
||
|
|
*/
|
||
|
|
public function destroy(int $id)
|
||
|
|
{
|
||
|
|
$manager = SalesManager::findOrFail($id);
|
||
|
|
$manager->update(['is_active' => false]);
|
||
|
|
|
||
|
|
return redirect()->route('sales.managers.index')
|
||
|
|
->with('success', '담당자가 비활성화되었습니다.');
|
||
|
|
}
|
||
|
|
}
|