76 lines
2.5 KiB
PHP
76 lines
2.5 KiB
PHP
|
|
<?php
|
||
|
|
|
||
|
|
namespace App\Http\Controllers;
|
||
|
|
|
||
|
|
use App\Models\Devoir;
|
||
|
|
use App\Models\Seance;
|
||
|
|
use Carbon\Carbon;
|
||
|
|
use Illuminate\Support\Collection;
|
||
|
|
use Illuminate\Support\Facades\Auth;
|
||
|
|
use Illuminate\View\View;
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Emploi du temps (séparation vitrine/application, 2026-10-13) : séances
|
||
|
|
* et échéances de devoirs, réunies et triées par date. Pas d'examens ici
|
||
|
|
* tant qu'aucun modèle d'examen n'existe (CLAUDE.md : pas de ligne vide ni
|
||
|
|
* de donnée inventée).
|
||
|
|
*/
|
||
|
|
class EmploiDuTempsController extends Controller
|
||
|
|
{
|
||
|
|
public function show(): View
|
||
|
|
{
|
||
|
|
if ($prof = Auth::guard('web')->user()) {
|
||
|
|
$classeIds = $prof->classes()->whereNull('archivee_a')->pluck('id');
|
||
|
|
|
||
|
|
$seances = Seance::whereIn('classe_id', $classeIds)
|
||
|
|
->whereIn('statut', [Seance::PLANIFIEE, Seance::SALLE_ATTENTE, Seance::EN_COURS])
|
||
|
|
->whereNotNull('prevue_a')
|
||
|
|
->with(['classe', 'lab'])
|
||
|
|
->get();
|
||
|
|
|
||
|
|
$devoirs = Devoir::whereIn('classe_id', $classeIds)
|
||
|
|
->where('echeance', '>=', now())
|
||
|
|
->with('classe')
|
||
|
|
->get();
|
||
|
|
} else {
|
||
|
|
$eleve = Auth::guard('eleve')->user();
|
||
|
|
|
||
|
|
$seances = $eleve->classe->seances()
|
||
|
|
->whereIn('statut', [Seance::PLANIFIEE, Seance::SALLE_ATTENTE, Seance::EN_COURS])
|
||
|
|
->whereNotNull('prevue_a')
|
||
|
|
->with(['lab', 'classe'])
|
||
|
|
->get();
|
||
|
|
|
||
|
|
$devoirs = $eleve->classe->devoirs()->where('echeance', '>=', now())->get();
|
||
|
|
}
|
||
|
|
|
||
|
|
$evenements = $this->fusionner($seances, $devoirs);
|
||
|
|
|
||
|
|
return view('emploi-du-temps', ['evenements' => $evenements]);
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* @param Collection<int, Seance> $seances
|
||
|
|
* @param Collection<int, Devoir> $devoirs
|
||
|
|
* @return Collection<int, array{date: ?Carbon, type: string, titre: string, classe: string}>
|
||
|
|
*/
|
||
|
|
private function fusionner(Collection $seances, Collection $devoirs): Collection
|
||
|
|
{
|
||
|
|
$depuisSeances = $seances->map(fn (Seance $s) => [
|
||
|
|
'date' => $s->prevue_a,
|
||
|
|
'type' => 'seance',
|
||
|
|
'titre' => $s->lab->titre,
|
||
|
|
'classe' => $s->classe->nom,
|
||
|
|
]);
|
||
|
|
|
||
|
|
$depuisDevoirs = $devoirs->map(fn (Devoir $d) => [
|
||
|
|
'date' => $d->echeance,
|
||
|
|
'type' => 'devoir',
|
||
|
|
'titre' => $d->titre,
|
||
|
|
'classe' => $d->classe->nom,
|
||
|
|
]);
|
||
|
|
|
||
|
|
return $depuisSeances->concat($depuisDevoirs)->sortBy('date')->values();
|
||
|
|
}
|
||
|
|
}
|