Paillasse/portail/app/Http/Controllers/MesNotesController.php

72 lines
2.4 KiB
PHP
Raw Normal View History

<?php
namespace App\Http\Controllers;
use App\Models\Correction;
use App\Models\RenduDevoir;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Auth;
use Illuminate\View\View;
/**
* « Mes notes » (séparation vitrine/application, 2026-10-13) : notes des
* devoirs maison et des labs, groupées par compétence quand le lab en a
* (lab.yaml, jamais lu jusqu'ici). « Sans compétence associée » sinon —
* jamais de taux inventé.
*/
class MesNotesController extends Controller
{
public function show(): View
{
$eleve = Auth::guard('eleve')->user();
$notesDevoirs = RenduDevoir::where('eleve_id', $eleve->id)
->whereNotNull('note')
->with('devoir')
->get()
->map(fn (RenduDevoir $r) => [
'titre' => $r->devoir->titre,
'note' => (int) $r->note,
'note_max' => 20,
'competences' => [],
]);
$notesLabs = Correction::whereHas('labSession', fn ($q) => $q->where('eleve_id', $eleve->id))
->with('labSession.lab')
->get()
->map(fn (Correction $c) => [
'titre' => $c->labSession->lab->titre,
'note' => $c->note,
'note_max' => $c->note_max,
'competences' => $c->labSession->lab->competences ?? [],
]);
$notes = $notesDevoirs->concat($notesLabs);
return view('mes-notes', ['notes' => $notes, 'parCompetence' => $this->grouperParCompetence($notes)]);
}
/**
* @param Collection<int, array{titre: string, note: int, note_max: int, competences: array<int, string>}> $notes
* @return Collection<string, array{moyenne: int, nombre: int}>
*/
private function grouperParCompetence(Collection $notes): Collection
{
$parCompetence = [];
foreach ($notes as $note) {
$competences = $note['competences'] ?: ['Sans compétence associée'];
$taux = $note['note_max'] > 0 ? $note['note'] / $note['note_max'] * 100 : 0;
foreach ($competences as $competence) {
$parCompetence[$competence][] = $taux;
}
}
return collect($parCompetence)->map(fn (array $taux) => [
'moyenne' => (int) round(array_sum($taux) / count($taux)),
'nombre' => count($taux),
]);
}
}