atualizacao
This commit is contained in:
@@ -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.');
|
||||
}
|
||||
}
|
||||
|
||||
10
app/Http/Controllers/ConfigsController.php
Normal file
10
app/Http/Controllers/ConfigsController.php
Normal file
@@ -0,0 +1,10 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
class ConfigsController extends Controller
|
||||
{
|
||||
//
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
157
app/Http/Controllers/UsersController.php
Normal file
157
app/Http/Controllers/UsersController.php
Normal 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!');
|
||||
}
|
||||
}
|
||||
20
app/Http/Middleware/SetTenantMiddleware.php
Normal file
20
app/Http/Middleware/SetTenantMiddleware.php
Normal 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);
|
||||
}
|
||||
}
|
||||
@@ -1,8 +1,9 @@
|
||||
<?php
|
||||
namespace App\Jobs;
|
||||
|
||||
use App\Models\configs;
|
||||
use Illuminate\Support\Facades\Log;
|
||||
use App\Models\turmas;
|
||||
use App\Models\Turma;
|
||||
use App\Models\envios_wpp;
|
||||
use Illuminate\Bus\Queueable;
|
||||
use Illuminate\Contracts\Queue\ShouldQueue;
|
||||
@@ -38,7 +39,8 @@ class Envio_Mensagem_Whatsapp implements ShouldQueue
|
||||
|
||||
public function handle(): void
|
||||
{
|
||||
$turma = turmas::findOrFail($this->idTurma);
|
||||
$turma = Turma::findOrFail($this->idTurma);
|
||||
$token = configs::where('nome', '=', 'wuzapi_token')->first();
|
||||
$detalhes = [];
|
||||
|
||||
|
||||
@@ -99,7 +101,7 @@ class Envio_Mensagem_Whatsapp implements ShouldQueue
|
||||
case 'texto':
|
||||
$response = Http::withHeaders([
|
||||
'accept' => 'application/json',
|
||||
'token' => '3aCSVE4jS9h233mNBr1awz3DF0In8CFk',
|
||||
'token' => $token->valor,
|
||||
])
|
||||
->post('https://waha.cae.app.br/chat/send/text', [
|
||||
'phone' => $turma->id_whatsapp,
|
||||
@@ -177,7 +179,7 @@ class Envio_Mensagem_Whatsapp implements ShouldQueue
|
||||
case 'imagem';
|
||||
$response = Http::withHeaders([
|
||||
'accept' => 'application/json',
|
||||
'token' => '3aCSVE4jS9h233mNBr1awz3DF0In8CFk',
|
||||
'token' => $token->valor,
|
||||
])
|
||||
->post('https://waha.cae.app.br/chat/send/image', [
|
||||
'phone' => $turma->id_whatsapp,
|
||||
|
||||
62
app/Models/Aluno.php
Normal file
62
app/Models/Aluno.php
Normal file
@@ -0,0 +1,62 @@
|
||||
<?php
|
||||
|
||||
namespace App\Models;
|
||||
|
||||
use App\Models\Traits\BelongsToEscola;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
|
||||
class Aluno extends Model
|
||||
{
|
||||
use BelongsToEscola;
|
||||
|
||||
protected $fillable = [
|
||||
'id_escola',
|
||||
'id_turma',
|
||||
'nome',
|
||||
'cpf',
|
||||
'data_nascimento',
|
||||
'data_inscricao',
|
||||
'user_id', // usuário do aluno (portal), opcional
|
||||
// 'responsavel_user_id' // ❌ removido (agora é pivot)
|
||||
];
|
||||
|
||||
public function turma()
|
||||
{
|
||||
return $this->belongsTo(
|
||||
Turma::class,
|
||||
'id_turma'
|
||||
);
|
||||
}
|
||||
|
||||
public function escola()
|
||||
{
|
||||
return $this->belongsTo(
|
||||
Escola::class,
|
||||
'id_escola'
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Usuário do aluno (se o aluno tiver login no portal)
|
||||
*/
|
||||
public function user()
|
||||
{
|
||||
return $this->belongsTo(
|
||||
User::class,
|
||||
'user_id'
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Responsáveis do aluno (N:N via pivot aluno_responsaveis)
|
||||
*/
|
||||
public function responsaveis()
|
||||
{
|
||||
return $this->belongsToMany(
|
||||
User::class,
|
||||
'aluno_responsaveis',
|
||||
'aluno_id',
|
||||
'user_id'
|
||||
)->withTimestamps();
|
||||
}
|
||||
}
|
||||
66
app/Models/Escola.php
Normal file
66
app/Models/Escola.php
Normal file
@@ -0,0 +1,66 @@
|
||||
<?php
|
||||
|
||||
namespace App\Models;
|
||||
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Illuminate\Database\Eloquent\Builder;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
|
||||
class Escola extends Model
|
||||
{
|
||||
protected $casts = [
|
||||
'endereco' => 'array',
|
||||
];
|
||||
|
||||
protected $fillable = [
|
||||
'cnpj',
|
||||
'endereco',
|
||||
'nome',
|
||||
];
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| GLOBAL SCOPE MULTI-TENANT
|
||||
|--------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
protected static function booted()
|
||||
{
|
||||
static::addGlobalScope('user_escolas', function (Builder $builder) {
|
||||
|
||||
if (Auth::check() && !Auth::user()->is_super_admin) {
|
||||
|
||||
$builder->whereIn('id', function ($query) {
|
||||
|
||||
$query->select('escola_id')
|
||||
->from('user_escolas')
|
||||
->where('user_id', Auth::id());
|
||||
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
});
|
||||
}
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| RELACIONAMENTOS
|
||||
|--------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
public function turmas()
|
||||
{
|
||||
return $this->hasMany(Turma::class, 'id_escola');
|
||||
}
|
||||
|
||||
public function users()
|
||||
{
|
||||
return $this->belongsToMany(
|
||||
User::class,
|
||||
'user_escolas',
|
||||
'escola_id',
|
||||
'user_id'
|
||||
);
|
||||
}
|
||||
}
|
||||
50
app/Models/Traits/BelongsToEscola.php
Normal file
50
app/Models/Traits/BelongsToEscola.php
Normal file
@@ -0,0 +1,50 @@
|
||||
<?php
|
||||
|
||||
namespace App\Models\Traits;
|
||||
|
||||
use Illuminate\Database\Eloquent\Builder;
|
||||
|
||||
trait BelongsToEscola
|
||||
{
|
||||
protected static function bootBelongsToEscola()
|
||||
{
|
||||
static::addGlobalScope('escola', function (Builder $builder) {
|
||||
|
||||
$user = auth()->user();
|
||||
|
||||
// Sem usuário logado: não filtra
|
||||
if (!$user) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Super admin: vê tudo (não filtra por escola)
|
||||
if ($user->is_super_admin) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Usuário comum: filtra pela escola atual
|
||||
if ($user->current_escola_id) {
|
||||
$builder->where('id_escola', $user->current_escola_id);
|
||||
}
|
||||
});
|
||||
|
||||
static::creating(function ($model) {
|
||||
|
||||
$user = auth()->user();
|
||||
|
||||
if (!$user) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Super admin: não força id_escola automaticamente
|
||||
if ($user->is_super_admin) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Se não veio id_escola, seta pela escola atual do usuário
|
||||
if (!$model->id_escola) {
|
||||
$model->id_escola = $user->current_escola_id;
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
24
app/Models/Turma.php
Normal file
24
app/Models/Turma.php
Normal file
@@ -0,0 +1,24 @@
|
||||
<?php
|
||||
|
||||
namespace App\Models;
|
||||
use App\Models\Traits\BelongsToEscola;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
|
||||
class Turma extends Model
|
||||
{
|
||||
use BelongsToEscola;
|
||||
|
||||
protected $fillable = [
|
||||
'id_escola',
|
||||
'nome'
|
||||
];
|
||||
|
||||
public function escola()
|
||||
{
|
||||
return $this->belongsTo(
|
||||
Escola::class,
|
||||
'id_escola'
|
||||
);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -2,47 +2,131 @@
|
||||
|
||||
namespace App\Models;
|
||||
|
||||
// use Illuminate\Contracts\Auth\MustVerifyEmail;
|
||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||
use Illuminate\Foundation\Auth\User as Authenticatable;
|
||||
use Illuminate\Notifications\Notifiable;
|
||||
use Spatie\Permission\Traits\HasRoles;
|
||||
|
||||
class User extends Authenticatable
|
||||
{
|
||||
/** @use HasFactory<\Database\Factories\UserFactory> */
|
||||
use HasFactory, Notifiable;
|
||||
use HasRoles;
|
||||
|
||||
/**
|
||||
* The attributes that are mass assignable.
|
||||
*
|
||||
* @var list<string>
|
||||
*/
|
||||
protected $fillable = [
|
||||
'name',
|
||||
'email',
|
||||
'password',
|
||||
'is_super_admin',
|
||||
'current_escola_id',
|
||||
];
|
||||
|
||||
/**
|
||||
* The attributes that should be hidden for serialization.
|
||||
*
|
||||
* @var list<string>
|
||||
*/
|
||||
protected $hidden = [
|
||||
'password',
|
||||
'remember_token',
|
||||
];
|
||||
|
||||
/**
|
||||
* Get the attributes that should be cast.
|
||||
*
|
||||
* @return array<string, string>
|
||||
*/
|
||||
protected function casts(): array
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| RELACIONAMENTOS
|
||||
|--------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
public function escolas()
|
||||
{
|
||||
return [
|
||||
'email_verified_at' => 'datetime',
|
||||
'password' => 'hashed',
|
||||
return $this->belongsToMany(
|
||||
Escola::class,
|
||||
'user_escolas',
|
||||
'user_id',
|
||||
'escola_id'
|
||||
);
|
||||
}
|
||||
|
||||
public function escolaAtual()
|
||||
{
|
||||
return $this->belongsTo(
|
||||
Escola::class,
|
||||
'current_escola_id'
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Alunos pelos quais este usuário é responsável (N:N via pivot)
|
||||
*/
|
||||
public function alunosComoResponsavel()
|
||||
{
|
||||
return $this->belongsToMany(
|
||||
Aluno::class,
|
||||
'aluno_responsaveis',
|
||||
'user_id',
|
||||
'aluno_id'
|
||||
)->withTimestamps();
|
||||
}
|
||||
|
||||
/**
|
||||
* Se você quiser acessar o "aluno" do próprio usuário (portal do aluno),
|
||||
* dá pra ter 1:1 (um usuário pode ser o aluno).
|
||||
*/
|
||||
public function aluno()
|
||||
{
|
||||
return $this->hasOne(Aluno::class, 'user_id');
|
||||
}
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| SUPER ADMIN
|
||||
|--------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
public function isSuperAdmin(): bool
|
||||
{
|
||||
return (bool) $this->is_super_admin;
|
||||
}
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| FUNÇÃO / CARGO DO USUÁRIO (ROLE)
|
||||
|--------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
public function funcao(): ?string
|
||||
{
|
||||
if ($this->isSuperAdmin()) {
|
||||
return 'Super Admin';
|
||||
}
|
||||
|
||||
if (!$this->current_escola_id) {
|
||||
return null;
|
||||
}
|
||||
|
||||
setPermissionsTeamId($this->current_escola_id);
|
||||
|
||||
$role = $this->roles()->value('name');
|
||||
|
||||
if (!$role) {
|
||||
return null;
|
||||
}
|
||||
|
||||
$map = [
|
||||
'coordenacao' => 'Coordenação',
|
||||
'secretaria' => 'Secretaria',
|
||||
'responsavel' => 'Responsável',
|
||||
'aluno' => 'Aluno',
|
||||
'representante_de_turma' => 'Representante de Turma',
|
||||
'super_admin' => 'Super Admin',
|
||||
];
|
||||
|
||||
return $map[$role] ?? ucfirst(str_replace('_', ' ', $role));
|
||||
}
|
||||
|
||||
public function hasFuncao(string $funcao): bool
|
||||
{
|
||||
if ($funcao === 'super_admin') {
|
||||
return $this->isSuperAdmin();
|
||||
}
|
||||
|
||||
if (!$this->current_escola_id) {
|
||||
return false;
|
||||
}
|
||||
|
||||
setPermissionsTeamId($this->current_escola_id);
|
||||
|
||||
return $this->hasRole($funcao);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,17 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace App\Models;
|
||||
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
|
||||
class alunos extends Model
|
||||
{
|
||||
public function turma()
|
||||
{
|
||||
return $this->belongsTo(turmas::class, 'id_turma', 'id');
|
||||
}
|
||||
|
||||
public function responsaveis() {
|
||||
return $this->hasMany(User::class, 'id', 'id_responsavel');
|
||||
}
|
||||
}
|
||||
10
app/Models/configs.php
Normal file
10
app/Models/configs.php
Normal file
@@ -0,0 +1,10 @@
|
||||
<?php
|
||||
|
||||
namespace App\Models;
|
||||
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
|
||||
class configs extends Model
|
||||
{
|
||||
//
|
||||
}
|
||||
@@ -1,23 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace App\Models;
|
||||
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
|
||||
class escolas extends Model
|
||||
{
|
||||
protected $casts = [
|
||||
'endereco' => 'array',
|
||||
];
|
||||
|
||||
protected $fillable = [
|
||||
'cnpj',
|
||||
'endereco',
|
||||
'nome',
|
||||
];
|
||||
|
||||
public function turmas()
|
||||
{
|
||||
return $this->hasMany(turmas::class, 'id_escola', 'id');
|
||||
}
|
||||
}
|
||||
@@ -1,26 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace App\Models;
|
||||
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
|
||||
class turmas extends Model
|
||||
{
|
||||
protected $fillable = [
|
||||
'nome',
|
||||
'descricao',
|
||||
];
|
||||
public function escola()
|
||||
{
|
||||
return $this->hasOne(escolas::class, 'id', 'id_escola');
|
||||
}
|
||||
|
||||
public function alunos()
|
||||
{
|
||||
return $this->hasMany(alunos::class, 'id', 'id_turma');
|
||||
}
|
||||
|
||||
public function enviosWpp() {
|
||||
return $this->hasMany(envios_wpp::class, 'id_turma', 'id');
|
||||
}
|
||||
}
|
||||
@@ -3,22 +3,20 @@
|
||||
namespace App\Providers;
|
||||
|
||||
use Illuminate\Support\ServiceProvider;
|
||||
use Illuminate\Support\Facades\Gate;
|
||||
|
||||
class AppServiceProvider extends ServiceProvider
|
||||
{
|
||||
/**
|
||||
* Register any application services.
|
||||
*/
|
||||
public function register(): void
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
/**
|
||||
* Bootstrap any application services.
|
||||
*/
|
||||
public function boot(): void
|
||||
{
|
||||
//
|
||||
// 🔥 Super Admin ignora todas as permissões
|
||||
Gate::before(function ($user, $ability) {
|
||||
return $user->is_super_admin ? true : null;
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user