158 lines
5.2 KiB
PHP
158 lines
5.2 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
use App\Models\User;
|
|
use App\Models\Escola;
|
|
use App\Models\Aluno;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Support\Facades\Hash;
|
|
use Illuminate\Validation\Rule;
|
|
use Spatie\Permission\Models\Role;
|
|
use Spatie\Permission\PermissionRegistrar;
|
|
|
|
|
|
class UsersController extends Controller
|
|
{
|
|
public function index()
|
|
{
|
|
$usuarios = User::all();
|
|
return view('usuarios.index', compact('usuarios'));
|
|
}
|
|
|
|
|
|
|
|
|
|
public function rolesByEscola(Request $request, $escolaId)
|
|
{
|
|
$user = auth()->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!');
|
|
}
|
|
}
|