user()->isAdmin(), 403); $users = User::with(['appRoles', 'department'])->get()->map(function ($user) { return [ 'id' => $user->id, 'name' => $user->name, 'login' => $user->login, 'is_active' => $user->is_active, 'created_at' => $user->created_at->format('d.m.Y H:i:s'), 'updated_at' => $user->updated_at->format('d.m.Y H:i:s'), ]; }); return Inertia::render('Admin/Users/Index', ['users' => $users]); } public function create() { abort_unless(auth()->user()->isAdmin(), 403); return Inertia::render('Admin/Users/Create', [ 'departments' => $this->allDepartments(), 'roles' => $this->allRoles(), ]); } public function store(Request $request) { abort_unless(auth()->user()->isAdmin(), 403); $validated = $request->validate([ 'name' => 'required|string|max:255', 'login' => 'required|string|max:255|unique:users,login', 'password' => 'required|string|min:6', 'is_active' => 'required|boolean', 'department_id' => 'required|integer|exists:departments,department_id', 'departments' => 'array', 'departments.*' => 'integer|exists:departments,department_id', 'roles' => 'required|array|min:1', 'roles.*' => 'integer|exists:roles,role_id', ]); $user = User::create([ 'name' => $validated['name'], 'login' => $validated['login'], 'password' => Hash::make($validated['password']), 'is_active' => $validated['is_active'], 'rf_department_id' => $validated['department_id'], ]); // Назначаем роли — первая роль становится дефолтной foreach ($validated['roles'] as $i => $roleId) { UserRole::create([ 'rf_user_id' => $user->id, 'rf_role_id' => $roleId, 'is_active' => true, 'is_default' => $i === 0, ]); } // Привязываем дополнительные отделения foreach ($validated['departments'] ?? [] as $i => $deptId) { UserDepartment::create([ 'rf_user_id' => $user->id, 'rf_department_id' => $deptId, 'is_favorite' => false, 'order' => $i, ]); } return redirect('/admin/users')->with('success', 'Пользователь создан'); } public function show(User $user) { abort_unless(auth()->user()->isAdmin(), 403); $userData = [ 'id' => $user->id, 'name' => $user->name, 'login' => $user->login, 'is_active' => $user->is_active, 'department_id' => $user->rf_department_id, 'created_at' => $user->created_at->format('d.m.Y H:i:s'), 'updated_at' => $user->updated_at->format('d.m.Y H:i:s'), ]; $userRoleIds = $user->userRoles()->pluck('rf_role_id')->toArray(); $userDepartmentIds = UserDepartment::where('rf_user_id', $user->id) ->pluck('rf_department_id') ->toArray(); return Inertia::render('Admin/Users/User', [ 'userData' => $userData, 'userRoleIds' => $userRoleIds, 'userDepartmentIds' => $userDepartmentIds, 'allRoles' => $this->allRoles(), 'allDepartments' => $this->allDepartments(), ]); } public function update(User $user, Request $request) { abort_unless(auth()->user()->isAdmin(), 403); $validated = $request->validate([ 'name' => 'required|string|max:255', 'login' => 'required|string|max:255|unique:users,login,' . $user->id, 'is_active' => 'required|boolean', 'department_id' => 'required|integer|exists:departments,department_id', 'departments' => 'array', 'departments.*' => 'integer|exists:departments,department_id', 'roles' => 'required|array|min:1', 'roles.*' => 'integer|exists:roles,role_id', ]); $user->update([ 'name' => $validated['name'], 'login' => $validated['login'], 'is_active' => $validated['is_active'], 'rf_department_id' => $validated['department_id'], ]); // Синхронизируем роли UserRole::where('rf_user_id', $user->id)->delete(); foreach ($validated['roles'] as $i => $roleId) { UserRole::create([ 'rf_user_id' => $user->id, 'rf_role_id' => $roleId, 'is_active' => true, 'is_default' => $i === 0, ]); } // Синхронизируем доп. отделения через updateOrCreate $newDeptIds = $validated['departments'] ?? []; UserDepartment::where('rf_user_id', $user->id) ->whereNotIn('rf_department_id', $newDeptIds) ->delete(); foreach ($newDeptIds as $i => $deptId) { UserDepartment::updateOrCreate( ['rf_user_id' => $user->id, 'rf_department_id' => $deptId], ['is_favorite' => false, 'order' => $i] ); } return redirect('/admin/users/' . $user->id)->with('success', 'Данные сохранены'); } public function resetPassword(User $user, Request $request) { abort_unless(auth()->user()->isAdmin(), 403); $request->validate([ 'password' => 'required|string|min:6|confirmed', ]); $user->update(['password' => Hash::make($request->password)]); return redirect('/admin/users/' . $user->id)->with('success', 'Пароль изменён'); } private function allRoles(): array { return Role::all()->map(fn($r) => [ 'role_id' => $r->role_id, 'name' => $r->name, ])->toArray(); } private function allDepartments(): array { return Department::orderBy('name_full')->get()->map(fn($d) => [ 'department_id' => $d->department_id, 'name_full' => $d->name_full, ])->toArray(); } }