user(); if (!$user->is_super_admin) { $allowed = $user->escolas()->where('escolas.id', $escolaId)->exists(); abort_if(!$allowed, 403); } // roles por escola $roles = Role::query() ->where('id_escola', $escolaId) ->orderBy('name') ->get(['id', 'name']); return response()->json($roles); } public function alunosByEscola(Request $request, $escolaId) { $user = auth()->user(); if (!$user->is_super_admin) { $allowed = $user->escolas()->where('escolas.id', $escolaId)->exists(); abort_if(!$allowed, 403); } // alunos por escola (sem global scope, se necessário) $alunos = Aluno::query() ->withoutGlobalScope('escola') // se seu Aluno usa BelongsToEscola, isso evita filtrar errado ->where('id_escola', $escolaId) ->orderBy('nome') ->get(['id', 'nome']); return response()->json($alunos); } public function store(Request $request) { // validação base $data = $request->validate([ 'name' => ['required', 'string', 'max:255'], 'email' => ['required', 'email', 'max:255', 'unique:users,email'], 'password' => ['required', 'string', 'min:6', 'confirmed'], 'escola_id' => ['nullable', 'integer', 'exists:escolas,id'], 'role_name' => ['nullable', 'string'], // coordenacao/secretaria/responsavel/aluno/representante_de_turma 'is_super_admin' => ['nullable', 'boolean'], // usado quando role for aluno/responsavel 'aluno_id' => ['nullable', 'integer', 'exists:alunos,id'], ]); // super admin não precisa escola/role $isSuper = (bool)($data['is_super_admin'] ?? false); if ($isSuper) { $data['escola_id'] = null; $data['role_name'] = null; $data['aluno_id'] = null; } else { // usuário comum precisa escola + role if (empty($data['escola_id']) || empty($data['role_name'])) { return back()->withErrors(['escola_id' => 'Selecione escola e cargo.'])->withInput(); } } // Se for responsável/aluno, aluno_id é obrigatório if (!$isSuper && in_array($data['role_name'], ['responsavel', 'aluno'], true)) { if (empty($data['aluno_id'])) { return back()->withErrors(['aluno_id' => 'Selecione o aluno para vincular.'])->withInput(); } // valida se o aluno pertence à escola selecionada $ok = Aluno::query() ->withoutGlobalScope('escola') ->where('id', $data['aluno_id']) ->where('id_escola', $data['escola_id']) ->exists(); if (!$ok) { return back()->withErrors(['aluno_id' => 'Aluno não pertence à escola selecionada.'])->withInput(); } } app(PermissionRegistrar::class)->forgetCachedPermissions(); // cria usuário $user = User::create([ 'name' => $data['name'], 'email' => $data['email'], 'password' => Hash::make($data['password']), 'is_super_admin' => $isSuper, 'current_escola_id' => $data['escola_id'] ?? null, ]); // vincula à escola (pivot) if (!$isSuper && $user->current_escola_id) { $user->escolas()->syncWithoutDetaching([$user->current_escola_id]); // seta team e atribui role da escola setPermissionsTeamId($user->current_escola_id); $role = Role::query() ->where('name', $data['role_name']) ->where('guard_name', 'web') ->where('id_escola', $user->current_escola_id) ->firstOrFail(); $user->syncRoles([$role]); // associações automáticas com aluno if ($data['role_name'] === 'responsavel') { Aluno::query() ->withoutGlobalScope('escola') ->where('id', $data['aluno_id']) ->update(['responsavel_user_id' => $user->id]); } if ($data['role_name'] === 'aluno') { Aluno::query() ->withoutGlobalScope('escola') ->where('id', $data['aluno_id']) ->update(['user_id' => $user->id]); } } app(PermissionRegistrar::class)->forgetCachedPermissions(); setPermissionsTeamId(null); return back()->with('success', 'Usuário criado com sucesso!'); } }