*/ use Authenticatable, GerePreferences, GereSessionUnique, HasFactory; protected $fillable = ['classe_id', 'prenom', 'nom', 'identifiant', 'code_secret', 'jeton_qr']; protected $hidden = ['code_secret', 'jeton_session_actif', 'jeton_qr']; protected $casts = [ 'derniere_connexion_a' => 'datetime', 'derniere_activite_a' => 'datetime', 'preferences' => 'array', ]; /** * En ligne : une requête authentifiée dans les 3 dernières minutes * (middleware MetAJourActivite) — pas une vraie présence temps réel. */ public function estEnLigne(): bool { return $this->derniere_activite_a !== null && $this->derniere_activite_a->gt(now()->subMinutes(3)); } public function getAuthPasswordName(): string { return 'code_secret'; } /** @return BelongsTo */ public function classe(): BelongsTo { return $this->belongsTo(Classe::class); } /** @return HasMany */ public function labSessions(): HasMany { return $this->hasMany(LabSession::class); } /** @return HasMany */ public function raccourcis(): HasMany { return $this->hasMany(Raccourci::class)->orderBy('ordre'); } /** @return HasOne */ public function filConversation(): HasOne { return $this->hasOne(FilConversation::class); } public function nomAffiche(): string { return $this->nom ? $this->prenom.' '.mb_substr($this->nom, 0, 1).'.' : $this->prenom; } }