Paillasse/portail/app/Models/Classe.php
Adam Belkacemi dd4f9c3c55 permet aux élèves de rejoindre leur classe avec son code, et les fiches en lot
L'élève saisit le code de classe et son prénom, le prof accepte, l'élève
voit une seule fois son identifiant et son code. Aucun e-mail. Le prof
peut aussi régénérer les fiches de plusieurs élèves d'un coup. Procédure
pour prouver la copie de la clé des sauvegardes.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 22:18:53 +02:00

85 lines
2.1 KiB
PHP

<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Support\Carbon;
use Illuminate\Support\Str;
class Classe extends Model
{
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 = Str::upper(Str::random(6));
} while (static::where('code_classe', $code)->exists());
return $code;
}
public function etablissement(): BelongsTo
{
return $this->belongsTo(Etablissement::class);
}
public function prof(): BelongsTo
{
return $this->belongsTo(User::class, 'user_id');
}
public function eleves(): HasMany
{
return $this->hasMany(Eleve::class);
}
public function demandesInscription(): HasMany
{
return $this->hasMany(DemandeInscription::class);
}
public function seances(): HasMany
{
return $this->hasMany(Seance::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();
}
}