atualizacao de responsavel

This commit is contained in:
2026-02-22 19:26:28 +00:00
parent 05b7d0a82b
commit e1e1f444ea
3 changed files with 172 additions and 101 deletions

View File

@@ -3,32 +3,42 @@
namespace App\Http\Controllers; namespace App\Http\Controllers;
use App\Models\Aluno; use App\Models\Aluno;
use App\Models\turmas;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;
class AlunosController extends Controller class AlunosController extends Controller
{ {
public function index() public function index()
{ {
$user = Auth()->user(); $user = Auth::user();
// coordenação/secretaria (ou quem tiver) // coordenação/secretaria (ou quem tiver)
if ($user->can('alunos.ver_todos')) { if ($user->can('alunos.ver_todos')) {
$alunos = Aluno::query()->get(); $alunos = Aluno::query()
->with(['turma', 'escola', 'user', 'responsaveis'])
->orderBy('nome')
->get();
// ✅ mantenha UMA view só (ajuste o nome conforme sua tela real)
return view('escolas.alunos', compact('alunos')); return view('escolas.alunos', compact('alunos'));
} }
// aluno/responsável // aluno/responsável
if ($user->can('alunos.ver_meus')) { if ($user->can('alunos.ver_meus')) {
$alunos = Aluno::query() $alunos = Aluno::query()
->with(['turma', 'escola', 'user', 'responsaveis'])
->where(function ($q) use ($user) { ->where(function ($q) use ($user) {
$q->where('user_id', $user->id) $q->where('user_id', $user->id)
->orWhereHas('responsaveis', fn($r) => $r->where('users.id', $user->id)); ->orWhereHas('responsaveis', function ($r) use ($user) {
$r->where('users.id', $user->id);
});
}) })
->orderBy('nome')
->get(); ->get();
return view('alunos.index', compact('alunos')); // ✅ a mesma view (evita duplicar telas)
return view('escolas.alunos', compact('alunos'));
} }
abort(403); abort(403);
@@ -36,20 +46,53 @@ class AlunosController extends Controller
public function updateOrCreate(Request $request) public function updateOrCreate(Request $request)
{ {
// ✅ Validação mínima (ajuste se quiser campos extras)
$data = $request->validate([
'cpf' => ['required', 'string', 'max:20'],
'nome' => ['required', 'string', 'max:255'],
'id_turma' => ['required', 'integer', 'exists:turmas,id'],
'id_escola' => ['required', 'integer', 'exists:escolas,id'],
'data_nascimento' => ['required', 'date'],
'data_inscricao' => ['required', 'date'],
'user_id' => ['nullable', 'integer', 'exists:users,id'],
// ✅ múltiplos responsáveis (users ids)
'responsavel_ids' => ['nullable', 'array'],
'responsavel_ids.*' => ['integer', 'exists:users,id'],
]);
DB::beginTransaction();
try {
$aluno = Aluno::updateOrCreate( $aluno = Aluno::updateOrCreate(
['cpf' => $request->cpf], ['cpf' => $data['cpf']],
[ [
'nome' => $request->nome, 'nome' => $data['nome'],
'id_turma' => $request->id_turma, 'id_turma' => $data['id_turma'],
'id_escola' => $request->id_escola, 'id_escola' => $data['id_escola'],
'data_nascimento' => $request->data_nascimento, 'data_nascimento' => $data['data_nascimento'],
'data_inscricao' => $request->data_inscricao, 'data_inscricao' => $data['data_inscricao'],
'cpf' => $request->cpf, 'cpf' => $data['cpf'],
'user_id' => $request->user_id, 'user_id' => $data['user_id'] ?? null,
'responsavel_user_id' => $request->responsavel_user_id,
] ]
); );
return redirect()->route('alunos')->with('success', 'Aluno Criado|Atualizado com sucesso.');
// ✅ Pivot N:N responsáveis (se vier no request)
// - syncWithoutDetaching: adiciona sem apagar os existentes
// - sync: substitui os existentes
if (!empty($data['responsavel_ids'])) {
$aluno->responsaveis()->sync($data['responsavel_ids']);
}
DB::commit();
return redirect()
->route('alunos')
->with('success', 'Aluno Criado|Atualizado com sucesso.');
} catch (\Throwable $e) {
DB::rollBack();
throw $e;
}
} }
} }

View File

@@ -60,6 +60,7 @@ class UsersController extends Controller
return response()->json($alunos); return response()->json($alunos);
} }
public function store(Request $request) public function store(Request $request)
{ {
// validação base // validação base
@@ -72,30 +73,35 @@ class UsersController extends Controller
'role_name' => ['nullable', 'string'], // coordenacao/secretaria/responsavel/aluno/representante_de_turma 'role_name' => ['nullable', 'string'], // coordenacao/secretaria/responsavel/aluno/representante_de_turma
'is_super_admin' => ['nullable', 'boolean'], 'is_super_admin' => ['nullable', 'boolean'],
// usado quando role for aluno/responsavel // aluno (1)
'aluno_id' => ['nullable', 'integer', 'exists:alunos,id'], 'aluno_id' => ['nullable', 'integer', 'exists:alunos,id'],
// responsável (N)
'aluno_ids' => ['nullable', 'array'],
'aluno_ids.*' => ['integer', 'exists:alunos,id'],
]); ]);
// super admin não precisa escola/role
$isSuper = (bool)($data['is_super_admin'] ?? false); $isSuper = (bool)($data['is_super_admin'] ?? false);
// super admin não precisa escola/role
if ($isSuper) { if ($isSuper) {
$data['escola_id'] = null; $data['escola_id'] = null;
$data['role_name'] = null; $data['role_name'] = null;
$data['aluno_id'] = null; $data['aluno_id'] = null;
$data['aluno_ids'] = [];
} else { } else {
// usuário comum precisa escola + role
if (empty($data['escola_id']) || empty($data['role_name'])) { if (empty($data['escola_id']) || empty($data['role_name'])) {
return back()->withErrors(['escola_id' => 'Selecione escola e cargo.'])->withInput(); return back()->withErrors(['escola_id' => 'Selecione escola e cargo.'])->withInput();
} }
} }
// Se for responsável/aluno, aluno_id é obrigatório // valida vínculo de aluno conforme cargo
if (!$isSuper && in_array($data['role_name'], ['responsavel', 'aluno'], true)) { if (!$isSuper && $data['role_name'] === 'aluno') {
if (empty($data['aluno_id'])) { if (empty($data['aluno_id'])) {
return back()->withErrors(['aluno_id' => 'Selecione o aluno para vincular.'])->withInput(); return back()->withErrors(['aluno_id' => 'Selecione o aluno para vincular.'])->withInput();
} }
// valida se o aluno pertence à escola selecionada
$ok = Aluno::query() $ok = Aluno::query()
->withoutGlobalScope('escola') ->withoutGlobalScope('escola')
->where('id', $data['aluno_id']) ->where('id', $data['aluno_id'])
@@ -107,6 +113,27 @@ class UsersController extends Controller
} }
} }
if (!$isSuper && $data['role_name'] === 'responsavel') {
$alunoIds = $request->input('aluno_ids', []);
if (count($alunoIds) === 0) {
return back()->withErrors(['aluno_ids' => 'Selecione pelo menos 1 aluno.'])->withInput();
}
// valida se TODOS os alunos pertencem à escola selecionada
$count = Aluno::query()
->withoutGlobalScope('escola')
->whereIn('id', $alunoIds)
->where('id_escola', $data['escola_id'])
->count();
if ($count !== count($alunoIds)) {
return back()->withErrors(['aluno_ids' => 'Um ou mais alunos não pertencem à escola selecionada.'])->withInput();
}
$data['aluno_ids'] = $alunoIds;
}
app(PermissionRegistrar::class)->forgetCachedPermissions(); app(PermissionRegistrar::class)->forgetCachedPermissions();
// cria usuário // cria usuário
@@ -118,8 +145,9 @@ class UsersController extends Controller
'current_escola_id' => $data['escola_id'] ?? null, 'current_escola_id' => $data['escola_id'] ?? null,
]); ]);
// vincula à escola (pivot) // vincula à escola (pivot user_escolas) + role por escola
if (!$isSuper && $user->current_escola_id) { if (!$isSuper && $user->current_escola_id) {
$user->escolas()->syncWithoutDetaching([$user->current_escola_id]); $user->escolas()->syncWithoutDetaching([$user->current_escola_id]);
// seta team e atribui role da escola // seta team e atribui role da escola
@@ -133,20 +161,18 @@ class UsersController extends Controller
$user->syncRoles([$role]); $user->syncRoles([$role]);
// associações automáticas com aluno // associações automáticas
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') { if ($data['role_name'] === 'aluno') {
Aluno::query() Aluno::query()
->withoutGlobalScope('escola') ->withoutGlobalScope('escola')
->where('id', $data['aluno_id']) ->where('id', $data['aluno_id'])
->update(['user_id' => $user->id]); ->update(['user_id' => $user->id]);
} }
if ($data['role_name'] === 'responsavel') {
// pivot aluno_responsaveis (N:N)
$user->alunosComoResponsavel()->syncWithoutDetaching($data['aluno_ids'] ?? []);
}
} }
app(PermissionRegistrar::class)->forgetCachedPermissions(); app(PermissionRegistrar::class)->forgetCachedPermissions();
@@ -154,4 +180,6 @@ class UsersController extends Controller
return back()->with('success', 'Usuário criado com sucesso!'); return back()->with('success', 'Usuário criado com sucesso!');
} }
} }

BIN
dump.rdb

Binary file not shown.