192 lines
6.6 KiB
PHP
192 lines
6.6 KiB
PHP
<?php
|
||
|
||
namespace App\Http\Controllers\Admin;
|
||
|
||
use App\Http\Controllers\Controller;
|
||
use Illuminate\Http\Request;
|
||
use Illuminate\Support\Facades\Hash;
|
||
use App\Models\Admin;
|
||
use Spatie\Permission\Models\Permission;
|
||
use Illuminate\Support\Facades\DB;
|
||
|
||
class AdminStaffController extends Controller
|
||
{
|
||
public function index()
|
||
{
|
||
$staff = Admin::where('type', 'staff')->orderBy('id', 'DESC')->get();
|
||
return view('admin.staff.index', compact('staff'));
|
||
}
|
||
|
||
public function create()
|
||
{
|
||
$permissions = Permission::where('guard_name', 'admin')->get()->groupBy(function ($p) {
|
||
return explode('.', $p->name)[0];
|
||
});
|
||
|
||
return view('admin.staff.create', compact('permissions'));
|
||
}
|
||
|
||
public function store(Request $request)
|
||
{
|
||
$request->validate([
|
||
// Personal Info
|
||
'name' => 'required|string|max:255',
|
||
'email' => 'required|email|unique:admins,email',
|
||
'phone' => 'required|string|max:20',
|
||
'emergency_phone' => 'nullable|string|max:20',
|
||
'address' => 'nullable|string|max:255',
|
||
|
||
// Professional info
|
||
'role' => 'nullable|string|max:100',
|
||
'department' => 'nullable|string|max:100',
|
||
'designation' => 'nullable|string|max:100',
|
||
'joining_date' => 'nullable|date',
|
||
'status' => 'required|string|in:active,inactive',
|
||
'additional_info' => 'nullable|string',
|
||
|
||
// System access
|
||
'username' => 'nullable|string|unique:admins,username',
|
||
'password' => 'required|string|min:6',
|
||
|
||
// Permissions
|
||
'permissions' => 'nullable|array',
|
||
]);
|
||
|
||
DB::beginTransaction();
|
||
|
||
try {
|
||
// 1️⃣ Create staff WITHOUT employee_id (ID not available yet)
|
||
$admin = Admin::create([
|
||
'name' => $request->name,
|
||
'email' => $request->email,
|
||
'phone' => $request->phone,
|
||
'emergency_phone' => $request->emergency_phone,
|
||
'address' => $request->address,
|
||
|
||
'role' => $request->role,
|
||
'department' => $request->department,
|
||
'designation' => $request->designation,
|
||
'joining_date' => $request->joining_date,
|
||
'status' => $request->status,
|
||
'additional_info' => $request->additional_info,
|
||
|
||
// username may be NULL here
|
||
'username' => $request->username ?: null,
|
||
'password' => Hash::make($request->password),
|
||
'type' => 'staff',
|
||
]);
|
||
|
||
// 2️⃣ Generate EMPLOYEE ID
|
||
$employeeId = 'EMP' . str_pad($admin->id, 4, '0', STR_PAD_LEFT);
|
||
|
||
// 3️⃣ Auto-generate username if left blank
|
||
$username = $request->username ?: strtolower($employeeId);
|
||
|
||
// 4️⃣ Update employee_id + username together
|
||
$admin->update([
|
||
'employee_id' => $employeeId,
|
||
'username' => $username,
|
||
]);
|
||
|
||
// 5️⃣ Assign permissions (if any)
|
||
if ($request->permissions) {
|
||
$admin->givePermissionTo($request->permissions);
|
||
}
|
||
|
||
DB::commit();
|
||
|
||
return redirect()
|
||
->route('admin.staff.index')
|
||
->with('success', 'Staff created successfully.');
|
||
|
||
} catch (\Exception $e) {
|
||
DB::rollBack();
|
||
return back()->withErrors(['error' => $e->getMessage()]);
|
||
}
|
||
}
|
||
|
||
|
||
public function edit($id)
|
||
{
|
||
$staff = Admin::where('type', 'staff')->findOrFail($id);
|
||
|
||
$permissions = Permission::where('guard_name', 'admin')->get()->groupBy(function ($p) {
|
||
return explode('.', $p->name)[0];
|
||
});
|
||
|
||
$staffPermissions = $staff->permissions->pluck('name')->toArray();
|
||
|
||
return view('admin.staff.edit', compact('staff', 'permissions', 'staffPermissions'));
|
||
}
|
||
|
||
public function update(Request $request, $id)
|
||
{
|
||
$staff = Admin::where('type', 'staff')->findOrFail($id);
|
||
|
||
$request->validate([
|
||
'name' => 'required|string|max:255',
|
||
'email' => 'required|email|unique:admins,email,' . $staff->id,
|
||
'phone' => 'required|string|max:20',
|
||
'emergency_phone' => 'nullable|string|max:20',
|
||
'address' => 'nullable|string|max:255',
|
||
|
||
'role' => 'nullable|string|max:100',
|
||
'department' => 'nullable|string|max:100',
|
||
'designation' => 'nullable|string|max:100',
|
||
'joining_date' => 'nullable|date',
|
||
'status' => 'required|string|in:active,inactive',
|
||
'additional_info' => 'nullable|string',
|
||
|
||
'username' => 'nullable|string|unique:admins,username,' . $staff->id,
|
||
'password' => 'nullable|string|min:6',
|
||
|
||
'permissions' => 'nullable|array',
|
||
]);
|
||
|
||
DB::beginTransaction();
|
||
|
||
try {
|
||
$staff->update([
|
||
'name' => $request->name,
|
||
'email' => $request->email,
|
||
'phone' => $request->phone,
|
||
'emergency_phone' => $request->emergency_phone,
|
||
'address' => $request->address,
|
||
|
||
'role' => $request->role,
|
||
'department' => $request->department,
|
||
'designation' => $request->designation,
|
||
'joining_date' => $request->joining_date,
|
||
'status' => $request->status,
|
||
'additional_info' => $request->additional_info,
|
||
|
||
'username' => $request->username,
|
||
]);
|
||
|
||
if ($request->password) {
|
||
$staff->update(['password' => Hash::make($request->password)]);
|
||
}
|
||
|
||
$staff->syncPermissions($request->permissions ?? []);
|
||
|
||
DB::commit();
|
||
|
||
return redirect()->route('admin.staff.index')
|
||
->with('success', 'Staff updated successfully.');
|
||
|
||
} catch (\Exception $e) {
|
||
DB::rollBack();
|
||
return back()->withErrors(['error' => $e->getMessage()]);
|
||
}
|
||
}
|
||
|
||
public function destroy($id)
|
||
{
|
||
$staff = Admin::where('type', 'staff')->findOrFail($id);
|
||
$staff->delete();
|
||
|
||
return redirect()->route('admin.staff.index')
|
||
->with('success', 'Staff removed successfully.');
|
||
}
|
||
}
|