atualizacao de responsavel
This commit is contained in:
@@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -60,8 +60,9 @@ 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
|
||||||
$data = $request->validate([
|
$data = $request->validate([
|
||||||
'name' => ['required', 'string', 'max:255'],
|
'name' => ['required', 'string', 'max:255'],
|
||||||
@@ -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,25 +161,25 @@ 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();
|
||||||
setPermissionsTeamId(null);
|
setPermissionsTeamId(null);
|
||||||
|
|
||||||
return back()->with('success', 'Usuário criado com sucesso!');
|
return back()->with('success', 'Usuário criado com sucesso!');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user