atualizacao

This commit is contained in:
2026-02-22 18:16:47 +00:00
parent 7136d3e061
commit 05b7d0a82b
45 changed files with 3881 additions and 246 deletions

View File

@@ -2,7 +2,7 @@
namespace App\Http\Controllers;
use App\Models\alunos;
use App\Models\Aluno;
use App\Models\turmas;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
@@ -11,20 +11,45 @@ class AlunosController extends Controller
{
public function index()
{
$escolaId = Auth::user()->id_escola;
if ($escolaId == 0) {
$alunos = alunos::all();
} else {
$alunos = [];
$turmas = turmas::where('id_escola', $escolaId)->get();
foreach ($turmas as $turma) {
$alunosget = alunos::where('id_turma', $turma->id)->get();
$user = Auth()->user();
foreach ($alunosget as $alunosg) {
$alunos[] = $alunosg;
}
}
// coordenação/secretaria (ou quem tiver)
if ($user->can('alunos.ver_todos')) {
$alunos = Aluno::query()->get();
return view('escolas.alunos', compact('alunos'));
}
return view('escolas.alunos', compact('alunos'));
// aluno/responsável
if ($user->can('alunos.ver_meus')) {
$alunos = Aluno::query()
->where(function ($q) use ($user) {
$q->where('user_id', $user->id)
->orWhereHas('responsaveis', fn($r) => $r->where('users.id', $user->id));
})
->get();
return view('alunos.index', compact('alunos'));
}
abort(403);
}
public function updateOrCreate(Request $request)
{
$aluno = Aluno::updateOrCreate(
['cpf' => $request->cpf],
[
'nome' => $request->nome,
'id_turma' => $request->id_turma,
'id_escola' => $request->id_escola,
'data_nascimento' => $request->data_nascimento,
'data_inscricao' => $request->data_inscricao,
'cpf' => $request->cpf,
'user_id' => $request->user_id,
'responsavel_user_id' => $request->responsavel_user_id,
]
);
return redirect()->route('alunos')->with('success', 'Aluno Criado|Atualizado com sucesso.');
}
}

View File

@@ -0,0 +1,10 @@
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class ConfigsController extends Controller
{
//
}

View File

@@ -2,36 +2,186 @@
namespace App\Http\Controllers;
use App\Models\escolas;
use App\Models\Escola;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;
use Spatie\Permission\Models\Role;
use Spatie\Permission\Models\Permission;
use Spatie\Permission\PermissionRegistrar;
class EscolasController extends Controller
{
public function index()
{
if (Auth::user()->id_escola == 0) {
$escolas = escolas::all();
} else {
$escolas = escolas::where('id', Auth::user()->id_escola)->get();
}
$escolas = Escola::all();
return view('escolas.index', compact('escolas'));
}
public function createOrUpdate(Request $request)
{
try {
escolas::updateOrCreate([
'cnpj' => $request->cnpj,
],[
{
DB::beginTransaction();
try {
$escola = Escola::updateOrCreate(
['cnpj' => $request->cnpj],
[
'nome' => $request->razaosocial,
'endereco' => json_decode($request->address, true),
]);
return redirect()->route('escolas')->with('success', 'Escola Criada|Atualizada com sucesso');
} catch (\Throwable $th) {
dd($th);
]
);
if ($escola->wasRecentlyCreated) {
// 🔥 Limpa cache ANTES
app(PermissionRegistrar::class)->forgetCachedPermissions();
// Define tenant (team)
setPermissionsTeamId($escola->id);
/*
|--------------------------------------------------------------------------
| ROLES (POR ESCOLA)
|--------------------------------------------------------------------------
*/
$roles = [
'coordenacao',
'secretaria',
'responsavel',
'aluno',
'representante_de_turma',
];
foreach ($roles as $r) {
Role::firstOrCreate([
'name' => $r,
'guard_name' => 'web',
'id_escola' => $escola->id,
]);
}
/*
|--------------------------------------------------------------------------
| PERMISSIONS
|--------------------------------------------------------------------------
*/
$permissions = [
// escolas
'escolas.ver',
'escolas.criar',
'escolas.editar',
'escolas.deletar',
// turmas
'turmas.ver',
'turmas.detalhes',
'turmas.criar',
'turmas.editar',
'turmas.deletar',
// alunos
'alunos.ver_todos',
'alunos.ver_meus',
'alunos.criar',
'alunos.editar',
'alunos.deletar',
// whatsapp
'wpp.enviar',
];
foreach ($permissions as $p) {
Permission::firstOrCreate([
'name' => $p,
'guard_name' => 'web',
]);
}
/*
|--------------------------------------------------------------------------
| MAPEAR ROLE -> PERMISSIONS (CORRIGIDO)
|--------------------------------------------------------------------------
*/
$rolePermissions = [
// Coordenação: vê todos os alunos
'coordenacao' => [
'turmas.ver',
'turmas.detalhes',
'turmas.criar',
'turmas.editar',
'turmas.deletar',
'alunos.ver_todos',
'alunos.criar',
'alunos.editar',
'alunos.deletar',
'wpp.enviar',
],
// Secretaria: vê todos os alunos
'secretaria' => [
'turmas.ver',
'turmas.detalhes',
'alunos.ver_todos',
'alunos.criar',
'alunos.editar',
'wpp.enviar',
],
// Responsável: vê somente os "meus"
'responsavel' => [
'alunos.ver_meus',
],
// Aluno: vê somente os "meus"
'aluno' => [
'alunos.ver_meus',
],
// Representante: vê os "meus" + detalhes da turma (e wpp se você quiser)
'representante_de_turma' => [
'alunos.ver_meus',
'turmas.detalhes',
'wpp.enviar',
],
];
foreach ($rolePermissions as $roleName => $perms) {
$role = Role::query()
->where('name', $roleName)
->where('guard_name', 'web')
->where('id_escola', $escola->id)
->firstOrFail();
$role->syncPermissions($perms);
}
// 🔥 Limpa cache DEPOIS
app(PermissionRegistrar::class)->forgetCachedPermissions();
// opcional: volta contexto global
setPermissionsTeamId(null);
}
DB::commit();
return redirect()
->route('escolas')
->with('success', 'Escola Criada|Atualizada com sucesso');
} catch (\Throwable $th) {
DB::rollBack();
throw $th;
}
}
}

View File

@@ -2,7 +2,7 @@
namespace App\Http\Controllers;
use App\Models\turmas;
use App\Models\Turma;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
@@ -11,21 +11,17 @@ class TurmasController extends Controller
public function index()
{
if (Auth::user()->id_escola == 0) {
$turmas = turmas::all();
} else {
$turmas = turmas::where('id_escola', Auth::user()->id_escola)->get();
}
$turmas = Turma::all();
return view('escolas.turmas', compact('turmas'));
}
public function createOrUpdate(Request $request)
{
$turma = turmas::where('nome', '=', $request->turma_nome)->count();
$turma = Turma::where('nome', '=', $request->turma_nome)->count();
if ($turma == 0) {
try {
$turma = new turmas();
$turma = new Turma();
$turma->id_escola = $request->id_escola;
$turma->nome = $request->turma_nome;
$turma->descricao = $request->turma_descricao;
@@ -37,7 +33,7 @@ class TurmasController extends Controller
}
} else {
try {
turmas::where('nome', $request->turma_nome)->update([
Turma::where('nome', $request->turma_nome)->update([
'nome' => $request->turma_nome,
'descricao' => $request->turma_descricao,
'id_escola' => $request->id_escola,
@@ -50,8 +46,31 @@ class TurmasController extends Controller
}
}
public function detalhes ($id) {
$turma = turmas::findOrFail($id);
return view('escolas.turmas_detalhes', compact('turma'));
public function detalhes($id)
{
$turma = Turma::findOrFail($id);
return view('escolas.Turma_detalhes', compact('turma'));
}
public function byEscola(Request $request, $escolaId)
{
// Se você tem multi-tenant e o usuário NÃO é super admin,
// é boa prática garantir que ele só consulte escola permitida.
$user = auth()->user();
if (!$user->is_super_admin) {
// se você usa pivot user_escolas:
$allowed = $user->escolas()->where('escolas.id', $escolaId)->exists();
if (!$allowed) {
abort(403);
}
}
$turmas = Turma::query()
->where('id_escola', $escolaId)
->orderBy('nome')
->get(['id', 'nome']);
return response()->json($turmas);
}
}

View File

@@ -0,0 +1,157 @@
<?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!');
}
}

View File

@@ -0,0 +1,20 @@
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
class SetTenantMiddleware
{
public function handle(Request $request, Closure $next)
{
if (auth()->check()) {
setPermissionsTeamId(auth()->user()->current_escola_id);
} else {
setPermissionsTeamId(null);
}
return $next($request);
}
}