Paillasse/portail/app/Models/Classe.php
2026-10-13 12:14:30 +02:00

98 lines
2.5 KiB
PHP

<?php
namespace App\Models;
use App\Support\CodeLisible;
use Carbon\Carbon;
use Database\Factories\ClasseFactory;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\HasMany;
class Classe extends Model
{
/** @use HasFactory<ClasseFactory> */
use HasFactory;
protected $fillable = ['etablissement_id', 'user_id', 'nom', 'formation', 'code_classe'];
protected $casts = [
'archivee_a' => 'datetime',
];
protected static function booted(): void
{
static::creating(function (Classe $classe) {
$classe->code_classe ??= static::genererCodeUnique();
});
}
public static function genererCodeUnique(): string
{
do {
$code = CodeLisible::genere(6);
} while (static::where('code_classe', $code)->exists());
return $code;
}
/** @return BelongsTo<Etablissement, $this> */
public function etablissement(): BelongsTo
{
return $this->belongsTo(Etablissement::class);
}
/** @return BelongsTo<User, $this> */
public function prof(): BelongsTo
{
return $this->belongsTo(User::class, 'user_id');
}
/** @return HasMany<Eleve, $this> */
public function eleves(): HasMany
{
return $this->hasMany(Eleve::class);
}
/** @return HasMany<DemandeInscription, $this> */
public function demandesInscription(): HasMany
{
return $this->hasMany(DemandeInscription::class);
}
/** @return HasMany<Seance, $this> */
public function seances(): HasMany
{
return $this->hasMany(Seance::class);
}
/** @return HasMany<Quiz, $this> */
public function quizzes(): HasMany
{
return $this->hasMany(Quiz::class)->latest();
}
public function estArchivee(): bool
{
return $this->archivee_a !== null;
}
/**
* RGPD (CLAUDE.md) : une classe archivée et toutes les données de ses
* élèves sont supprimées 90 jours après l'archivage (classes:purger-archivees).
*/
public const DELAI_PURGE_JOURS = 90;
public function supprimeeLe(): ?Carbon
{
return $this->archivee_a?->copy()->addDays(self::DELAI_PURGE_JOURS);
}
public function aDesLabsEnCours(): bool
{
return LabSession::whereIn('seance_id', $this->seances()->select('id'))
->whereIn('etat', [LabSession::ADMIS, LabSession::ACTIF])
->exists();
}
}