*/ use HasFactory; protected $fillable = ['etablissement_id', 'user_id', 'nom', 'formation', 'code_classe', 'chat_actif']; protected $casts = [ 'archivee_a' => 'datetime', 'chat_actif' => 'boolean', ]; 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 */ public function etablissement(): BelongsTo { return $this->belongsTo(Etablissement::class); } /** @return BelongsTo */ public function prof(): BelongsTo { return $this->belongsTo(User::class, 'user_id'); } /** @return HasMany */ public function eleves(): HasMany { return $this->hasMany(Eleve::class); } /** @return HasMany */ public function demandesInscription(): HasMany { return $this->hasMany(DemandeInscription::class); } /** @return HasMany */ public function seances(): HasMany { return $this->hasMany(Seance::class); } /** @return HasMany */ public function quizzes(): HasMany { return $this->hasMany(Quiz::class)->latest(); } /** @return HasMany */ public function devoirs(): HasMany { return $this->hasMany(Devoir::class)->latest('echeance'); } /** @return HasMany */ public function annonces(): HasMany { return $this->hasMany(Annonce::class)->latest(); } /** @return HasMany */ public function observations(): HasMany { return $this->hasMany(Observation::class)->latest(); } /** @return HasMany */ public function filsConversation(): HasMany { return $this->hasMany(FilConversation::class); } 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(); } }