feat: Permettre à l'enseignant de saisir les notes dans une grille inline
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

L'enseignant avait besoin d'un moyen rapide de saisir les notes après
une évaluation. La grille inline permet de compléter 30 élèves en moins
de 3 minutes grâce à la navigation clavier (Tab/Enter/Shift+Tab),
la validation temps réel, l'auto-save debounced (500ms) et les
raccourcis /abs et /disp pour marquer absents/dispensés.

Les notes restent en brouillon jusqu'à publication explicite (avec
confirmation modale). Une fois publiées, les élèves les voient
immédiatement ; les parents après un délai de 24h (VisibiliteNotesPolicy).
Le mode offline stocke les notes en IndexedDB et synchronise
automatiquement au retour de la connexion.

Chaque modification est auditée dans grade_events via un event
subscriber qui écoute NoteSaisie/NoteModifiee sur le bus d'événements.
This commit is contained in:
2026-03-29 09:55:45 +02:00
parent 98be1951bf
commit b70d5ec2ad
45 changed files with 3902 additions and 11 deletions

View File

@@ -0,0 +1,52 @@
<?php
declare(strict_types=1);
namespace App\Tests\Unit\Scolarite\Domain\Model\Grade;
use App\Scolarite\Domain\Exception\ValeurNoteInvalideException;
use App\Scolarite\Domain\Model\Grade\GradeValue;
use PHPUnit\Framework\Attributes\Test;
use PHPUnit\Framework\TestCase;
final class GradeValueTest extends TestCase
{
#[Test]
public function acceptsZero(): void
{
self::assertSame(0.0, (new GradeValue(0))->value);
}
#[Test]
public function acceptsPositiveValue(): void
{
self::assertSame(15.5, (new GradeValue(15.5))->value);
}
#[Test]
public function rejectsNegativeValue(): void
{
$this->expectException(ValeurNoteInvalideException::class);
new GradeValue(-1);
}
#[Test]
public function rejectsNegativeDecimal(): void
{
$this->expectException(ValeurNoteInvalideException::class);
new GradeValue(-0.5);
}
#[Test]
public function equalsComparesValues(): void
{
$a = new GradeValue(15.0);
$b = new GradeValue(15.0);
$c = new GradeValue(12.0);
self::assertTrue($a->equals($b));
self::assertFalse($a->equals($c));
}
}