feat: Tracer automatiquement les événements notes et évaluations dans l'audit trail
Some checks failed
CI / Backend Tests (push) Has been cancelled
CI / Frontend Tests (push) Has been cancelled
CI / E2E Tests (push) Has been cancelled
CI / Naming Conventions (push) Has been cancelled
CI / Build Check (push) Has been cancelled

Story 1-7 avait posé les fondations d'audit trail mais laissé en dehors du
périmètre initial les événements notes/évaluations, qui étaient alors non
couverts par les domaines. Avec la clôture des epics notation, ces actions
sensibles (création/modification/suppression d'évaluation, saisie/modification
de note, publication) doivent maintenant être tracées pour répondre aux
exigences RGPD et faciliter la résolution des litiges parent/enseignant.

Les événements de domaine existants ne transportaient pas tous les champs
nécessaires à l'audit (ancien/nouveau titre, description, barème, coefficient,
date, studentId). L'enrichissement de leur payload permet aux handlers d'audit
de journaliser les diffs complets via AuditLogger, sans que les autres
consommateurs (recalcul de moyennes) n'aient besoin de changer leur logique.

Au passage, le test E2E student-grades AC5 ("Nouveau" badge) visait
séquentiellement '.grade-card' puis '.badge-new' : la fenêtre de 3 s avant
markGradesSeen pouvait se refermer entre les deux attentes sur Firefox CI.
Un seul expect combiné '.grade-card .badge-new' élimine cette course.
This commit is contained in:
2026-04-22 21:10:53 +02:00
parent 86d00ce733
commit 80ce289b86
17 changed files with 949 additions and 21 deletions

View File

@@ -18,7 +18,10 @@ final readonly class EvaluationCreee implements DomainEvent
public string $subjectId,
public string $teacherId,
public string $title,
public ?string $description,
public DateTimeImmutable $evaluationDate,
public int $gradeScale,
public float $coefficient,
private DateTimeImmutable $occurredOn,
) {
}

View File

@@ -14,8 +14,16 @@ final readonly class EvaluationModifiee implements DomainEvent
{
public function __construct(
public EvaluationId $evaluationId,
public string $title,
public DateTimeImmutable $evaluationDate,
public string $oldTitle,
public string $newTitle,
public ?string $oldDescription,
public ?string $newDescription,
public float $oldCoefficient,
public float $newCoefficient,
public DateTimeImmutable $oldEvaluationDate,
public DateTimeImmutable $newEvaluationDate,
public int $oldGradeScale,
public int $newGradeScale,
private DateTimeImmutable $occurredOn,
) {
}

View File

@@ -15,6 +15,7 @@ final readonly class NoteModifiee implements DomainEvent
public function __construct(
public GradeId $gradeId,
public string $evaluationId,
public string $studentId,
public ?float $oldValue,
public ?float $newValue,
public string $oldStatus,

View File

@@ -73,7 +73,10 @@ final class Evaluation extends AggregateRoot
subjectId: (string) $subjectId,
teacherId: (string) $teacherId,
title: $title,
description: $description,
evaluationDate: $evaluationDate,
gradeScale: $gradeScale->maxValue,
coefficient: $coefficient->value,
occurredOn: $now,
));
@@ -97,6 +100,12 @@ final class Evaluation extends AggregateRoot
throw BaremeNonModifiableException::carNotesExistantes($this->id);
}
$oldTitle = $this->title;
$oldDescription = $this->description;
$oldCoefficient = $this->coefficient;
$oldEvaluationDate = $this->evaluationDate;
$oldGradeScale = $this->gradeScale;
$this->title = $title;
$this->description = $description;
$this->coefficient = $coefficient;
@@ -110,8 +119,16 @@ final class Evaluation extends AggregateRoot
$this->recordEvent(new EvaluationModifiee(
evaluationId: $this->id,
title: $title,
evaluationDate: $evaluationDate,
oldTitle: $oldTitle,
newTitle: $this->title,
oldDescription: $oldDescription,
newDescription: $this->description,
oldCoefficient: $oldCoefficient->value,
newCoefficient: $this->coefficient->value,
oldEvaluationDate: $oldEvaluationDate,
newEvaluationDate: $this->evaluationDate,
oldGradeScale: $oldGradeScale->maxValue,
newGradeScale: $this->gradeScale->maxValue,
occurredOn: $now,
));
}

View File

@@ -96,6 +96,7 @@ final class Grade extends AggregateRoot
$this->recordEvent(new NoteModifiee(
gradeId: $this->id,
evaluationId: (string) $this->evaluationId,
studentId: (string) $this->studentId,
oldValue: $oldValue,
newValue: $value?->value,
oldStatus: $oldStatus,