feat: Calculer automatiquement les moyennes après chaque saisie de notes
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

Les enseignants ont besoin de moyennes à jour immédiatement après la
publication ou modification des notes, sans attendre un batch nocturne.

Le système recalcule via Domain Events synchrones : statistiques
d'évaluation (min/max/moyenne/médiane), moyennes matières pondérées
(normalisation /20), et moyenne générale par élève. Les résultats sont
stockés dans des tables dénormalisées avec cache Redis (TTL 5 min).

Trois endpoints API exposent les données avec contrôle d'accès par rôle.
Une commande console permet le backfill des données historiques au
déploiement.
This commit is contained in:
2026-03-30 06:22:03 +02:00
parent b70d5ec2ad
commit e745cf326a
733 changed files with 113156 additions and 286 deletions

View File

@@ -0,0 +1,56 @@
<?php
declare(strict_types=1);
namespace DoctrineMigrations;
use Doctrine\DBAL\Schema\Schema;
use Doctrine\Migrations\AbstractMigration;
final class Version20260331154510 extends AbstractMigration
{
public function getDescription(): string
{
return 'Ajout des appréciations sur les notes et table des modèles d\'appréciations enseignant';
}
public function up(Schema $schema): void
{
$this->addSql(<<<'SQL'
ALTER TABLE grades ADD COLUMN appreciation TEXT
SQL);
$this->addSql(<<<'SQL'
ALTER TABLE grades ADD COLUMN appreciation_updated_at TIMESTAMPTZ
SQL);
$this->addSql(<<<'SQL'
CREATE TABLE appreciation_templates (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
tenant_id UUID NOT NULL,
teacher_id UUID NOT NULL REFERENCES users(id),
title VARCHAR(100) NOT NULL,
content TEXT NOT NULL,
category VARCHAR(50),
usage_count INT NOT NULL DEFAULT 0,
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
)
SQL);
$this->addSql(<<<'SQL'
CREATE INDEX idx_templates_teacher ON appreciation_templates(teacher_id)
SQL);
$this->addSql(<<<'SQL'
CREATE INDEX idx_templates_tenant ON appreciation_templates(tenant_id)
SQL);
}
public function down(Schema $schema): void
{
$this->addSql('DROP TABLE IF EXISTS appreciation_templates');
$this->addSql('ALTER TABLE grades DROP COLUMN IF EXISTS appreciation_updated_at');
$this->addSql('ALTER TABLE grades DROP COLUMN IF EXISTS appreciation');
}
}