Pages /legal et /confidentialite réécrites d'après le système réel, purge des classes archivées depuis 90 jours (prouvée par Pest), archivage côté prof. Polices, xterm.js et CodeMirror ne sont plus chargés depuis Google ni jsDelivr. Pages d'aperçu signalées, sans vrais établissements ni faux chiffres. Journaux Laravel gardés 14 jours. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
80 lines
2 KiB
PHP
80 lines
2 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 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();
|
|
}
|
|
}
|