*/ 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; } }