98 lines
2.5 KiB
PHP
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();
|
|
}
|
|
}
|