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

62
app/Models/Aluno.php Normal file
View 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
View 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'
);
}
}

View 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
View 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'
);
}
}

View File

@@ -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);
}
}

View File

@@ -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
View File

@@ -0,0 +1,10 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class configs extends Model
{
//
}

View File

@@ -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');
}
}

View File

@@ -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');
}
}