72 lines
2.4 KiB
PHP
72 lines
2.4 KiB
PHP
|
|
<?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),
|
||
|
|
]);
|
||
|
|
}
|
||
|
|
}
|