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 { $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' => $request->username, 'password' => Hash::make($request->password), 'type' => 'staff', ]); // Generate EMPLOYEE ID using admin ID (safe) $employeeId = 'EMP' . str_pad($admin->id, 4, '0', STR_PAD_LEFT); $admin->update(['employee_id' => $employeeId]); // 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.'); } }