Files
Classeo/backend/src/Scolarite/Application/Query/GetChildrenGrades/GetChildrenGradesSummaryHandler.php
Mathias STRASSER bec211ebf0
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
feat: Permettre à l'élève de consulter ses notes et moyennes
L'élève avait accès à ses compétences mais pas à ses notes numériques.
Cette fonctionnalité lui donne une vue complète de sa progression scolaire
avec moyennes par matière, détail par évaluation, statistiques de classe,
et un mode "découverte" pour révéler ses notes à son rythme (FR14, FR15).

Les notes ne sont visibles qu'après publication par l'enseignant, ce qui
garantit que l'élève les découvre avant ses parents (délai 24h story 6.7).
2026-04-07 14:43:38 +02:00

95 lines
3.0 KiB
PHP

<?php
declare(strict_types=1);
namespace App\Scolarite\Application\Query\GetChildrenGrades;
use function array_sum;
use function count;
use function round;
/**
* Calcule les moyennes par matière et la moyenne générale
* à partir des notes visibles (respectant le délai parent).
*
* Ne lit PAS les agrégats pré-calculés (student_averages) car ceux-ci
* incluent des notes encore dans la période de délai.
*/
final readonly class GetChildrenGradesSummaryHandler
{
public function __construct(
private GetChildrenGradesHandler $gradesHandler,
) {
}
/** @return array<ChildGradesSummaryDto> */
public function __invoke(GetChildrenGradesSummaryQuery $query): array
{
// Réutilise le handler notes qui applique le délai de visibilité
$childrenGrades = ($this->gradesHandler)(new GetChildrenGradesQuery(
parentId: $query->parentId,
tenantId: $query->tenantId,
));
$result = [];
foreach ($childrenGrades as $child) {
// Grouper par matière et calculer les moyennes pondérées
$subjectData = [];
foreach ($child->grades as $grade) {
if ($grade->value === null) {
continue;
}
$key = $grade->subjectId;
if (!isset($subjectData[$key])) {
$subjectData[$key] = [
'subjectId' => $grade->subjectId,
'subjectName' => $grade->subjectName,
'weightedSum' => 0.0,
'coefficientSum' => 0.0,
'gradeCount' => 0,
];
}
$subjectData[$key]['weightedSum'] += $grade->value * $grade->coefficient;
$subjectData[$key]['coefficientSum'] += $grade->coefficient;
++$subjectData[$key]['gradeCount'];
}
$subjectAverages = [];
foreach ($subjectData as $data) {
if ($data['coefficientSum'] > 0) {
$subjectAverages[] = [
'subjectId' => $data['subjectId'],
'subjectName' => $data['subjectName'],
'average' => round($data['weightedSum'] / $data['coefficientSum'], 2),
'gradeCount' => $data['gradeCount'],
];
}
}
$generalAverage = null;
if ($subjectAverages !== []) {
$averages = array_map(static fn (array $a): float => $a['average'], $subjectAverages);
$generalAverage = round(array_sum($averages) / count($averages), 2);
}
$result[] = new ChildGradesSummaryDto(
childId: $child->childId,
firstName: $child->firstName,
lastName: $child->lastName,
periodId: null,
subjectAverages: $subjectAverages,
generalAverage: $generalAverage,
);
}
return $result;
}
}