2026-10-09 21:07:25 +02:00
|
|
|
<?php
|
|
|
|
|
|
|
|
|
|
namespace App\Console\Commands;
|
|
|
|
|
|
|
|
|
|
use App\Models\Classe;
|
|
|
|
|
use Illuminate\Console\Command;
|
|
|
|
|
use Illuminate\Support\Facades\DB;
|
|
|
|
|
use Illuminate\Support\Facades\Log;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* RGPD (CLAUDE.md, étape 14) : supprime les classes archivées depuis
|
2026-10-13 12:14:30 +02:00
|
|
|
* 90 jours, avec en cascade leurs élèves, séances, sessions de lab, machines,
|
2026-10-13 12:44:00 +02:00
|
|
|
* corrections, quiz et devoirs maison (chantier « vrai cockpit »). Le compte du
|
2026-10-13 12:14:30 +02:00
|
|
|
* prof est conservé. Le journal ne garde que des identifiants et des
|
|
|
|
|
* nombres, jamais de nom d'élève.
|
2026-10-09 21:07:25 +02:00
|
|
|
*
|
|
|
|
|
* Les sauvegardes chiffrées contenant encore ces données expirent d'elles-
|
|
|
|
|
* mêmes au plus 4 semaines plus tard (rotation, docs/runbooks/sauvegardes.md).
|
|
|
|
|
*/
|
|
|
|
|
class PurgerClassesArchivees extends Command
|
|
|
|
|
{
|
|
|
|
|
protected $signature = 'classes:purger-archivees';
|
|
|
|
|
|
|
|
|
|
protected $description = 'Supprime les classes archivées depuis 90 jours et les données de leurs élèves';
|
|
|
|
|
|
|
|
|
|
public function handle(): void
|
|
|
|
|
{
|
|
|
|
|
$classes = Classe::whereNotNull('archivee_a')
|
|
|
|
|
->where('archivee_a', '<=', now()->subDays(Classe::DELAI_PURGE_JOURS))
|
|
|
|
|
->withCount('eleves')
|
|
|
|
|
->get();
|
|
|
|
|
|
|
|
|
|
$purgees = 0;
|
|
|
|
|
|
|
|
|
|
foreach ($classes as $classe) {
|
|
|
|
|
// Ne peut arriver qu'en cas d'anomalie (un lab expire en 45 min) :
|
|
|
|
|
// on ne supprime pas une session dont la stack Heat vivrait encore.
|
|
|
|
|
if ($classe->aDesLabsEnCours()) {
|
|
|
|
|
Log::warning('Purge RGPD reportée : lab en cours', ['classe_id' => $classe->id]);
|
|
|
|
|
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
DB::transaction(fn () => $classe->delete());
|
|
|
|
|
Log::info('Purge RGPD : classe supprimée', [
|
|
|
|
|
'classe_id' => $classe->id,
|
|
|
|
|
'eleves' => $classe->eleves_count,
|
|
|
|
|
'archivee_a' => $classe->archivee_a->toDateString(),
|
|
|
|
|
]);
|
|
|
|
|
$purgees++;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$this->info("{$purgees} classe(s) purgée(s).");
|
|
|
|
|
}
|
|
|
|
|
}
|