From 7eff16289f640cef5847b953768df5bcc10312e5 Mon Sep 17 00:00:00 2001 From: Matt Young Date: Thu, 13 Feb 2025 02:20:41 -0600 Subject: [PATCH] Nominations by users under MEOBDA rules working. --- ...eobdaNominationEnsembleEntryController.php | 172 ++++++++++++++++++ .../NominationEnsembleServiceProvider.php | 2 + .../meobda/entries/index.blade.php | 64 +++++++ 3 files changed, 238 insertions(+) create mode 100644 app/Http/Controllers/NominationEnsembles/MeobdaNominationEnsembleEntryController.php create mode 100644 resources/views/nomination_ensembles/meobda/entries/index.blade.php diff --git a/app/Http/Controllers/NominationEnsembles/MeobdaNominationEnsembleEntryController.php b/app/Http/Controllers/NominationEnsembles/MeobdaNominationEnsembleEntryController.php new file mode 100644 index 0000000..5261c4d --- /dev/null +++ b/app/Http/Controllers/NominationEnsembles/MeobdaNominationEnsembleEntryController.php @@ -0,0 +1,172 @@ +format('Y-m-d'); + + $ensembles = NominationEnsemble::all(); + $availableInstruments = []; + $availableStudents = []; + $existingNominations = []; + $nominationsAvailable = []; + + foreach ($ensembles as $ensemble) { + // Get existing nominations + $existingNominations[$ensemble->id] = auth()->user()->school->nominations() + ->where('nomination_ensemble_id', $ensemble->id) + ->get() + ->keyBy('student_id'); + // Count how many nominations exist on each instrument + $nominatedInstrumentCount = []; + foreach ($existingNominations[$ensemble->id] as $nom) { + $nominatedInstrumentCount[$nom->data['instrument']] = + ($nominatedInstrumentCount[$nom->data['instrument']] ?? 0) + 1; + } + + // Set available instruments + foreach ($ensemble->data['instruments'] as $instrument) { + // Skip it if we're at the limit on this instrument + if (! is_null($instrument['max']) && $instrument['max'] <= ($nominatedInstrumentCount[$instrument['name']] ?? 0)) { + continue; + } + $availableInstruments[$ensemble->id][] = $instrument['name']; + } + + // Set available students + $students = Student::where('school_id', auth()->user()->school_id) + ->where('grade', '>=', $ensemble->minimum_grade) + ->where('grade', '<=', $ensemble->maximum_grade) + ->orderBy('last_name', 'asc') + ->orderBy('first_name', 'asc') + ->get(); + foreach ($existingNominations[$ensemble->id] as $checknom) { + $students = $students->reject(function ($student) use ($checknom) { + return $checknom->student_id == $student->id; + }); + } + $availableStudents[$ensemble->id] = $students; + $nominationsAvailable[$ensemble->id] = $existingNominations[$ensemble->id]->count() < $ensemble->data['max_nominations']; + } + + return view('nomination_ensembles.meobda.entries.index', + compact('ensembles', 'currentDate', 'availableInstruments', 'availableStudents', 'existingNominations', + 'nominationsAvailable')); + } + + public function show(NominationEnsembleEntry $entry) + { + // TODO: Implement show() method. + } + + public function create() + { + // TODO: Implement create() method. + } + + public function store() + { + $validData = request()->validate([ + 'ensemble' => [ + 'required', + 'exists:App\Models\NominationEnsemble,id', + ], + 'new_student' => [ + 'required', + 'exists:App\Models\Student,id', + ], + 'new_instrument' => 'required', + ]); + $ensemble = NominationEnsemble::find($validData['ensemble']); + + // Check that the deadline is not past + $currentDate = Carbon::now('America/Chicago'); + $currentDate = $currentDate->format('Y-m-d'); + if ($ensemble->entry_deadline < $currentDate) { + return redirect()->route('nomination.entry.index')->with('error', + 'The nomination deadline for that ensemble has passed'); + } + + // Check if new_instrument is valid + foreach ($ensemble->data['instruments'] as $instrument) { + $availableInstruments[] = $instrument['name']; + } + if (! in_array($validData['new_instrument'], $availableInstruments)) { + return redirect()->route('nomination.entry.index')->with('error', + 'Invalid Instrument Specified'); + } + + // Check if the student belongs to the current user + $student = Student::find($validData['new_student']); + if (auth()->user()->school_id !== $student->school_id) { + return redirect()->route('nomination.entry.index')->with('error', + 'You may only nominate students from your school'); + } + + // Check that the user's school has nominations available + $existing_nominations = auth()->user()->school->nominations; + if ($existing_nominations->count() >= $ensemble->data['max_nominations']) { + return redirect()->route('nomination.entry.index')->with('error', + 'You have already used all of your nominations for this ensemble'); + } + + // Check that the user's school isn't over limit for the requested instrument + $instrumentLimit = collect($ensemble->data['instruments'])->firstWhere('name', + $validData['new_instrument'])['max']; + if ($instrumentLimit) { + $used = 0; + foreach ($existing_nominations as $nom) { + if ($nom->data['instrument'] == $validData['new_instrument']) { + $used++; + } + if ($used >= $instrumentLimit) { + return redirect()->route('nomination.entry.index')->with('error', + 'You may not nominate any more students on that instrument'); + } + } + } + + // Check that the student isn't already nominated for this ensemble + if (NominationEnsembleEntry::where('student_id', $validData['new_student']) + ->where('nomination_ensemble_id', $validData['ensemble']) + ->count() > 0) { + return redirect()->route('nomination.entry.index')->with('error', + 'Student already nominated for that ensemble'); + } + + $newEntry = new NominationEnsembleEntry(); + $newEntry->student_id = $validData['new_student']; + $newEntry->nomination_ensemble_id = $validData['ensemble']; + $newEntry->data = ['instrument' => $validData['new_instrument']]; + $newEntry->save(); + + return redirect()->route('nomination.entry.index')->with('success', + 'Nomination entered'); + } + + public function edit(NominationEnsembleEntry $entry) + { + // TODO: Implement edit() method. + } + + public function update(NominationEnsembleEntry $entry) + { + // TODO: Implement update() method. + } + + public function destroy(NominationEnsembleEntry $entry) + { + // TODO: Implement destroy() method. + } +} diff --git a/app/Providers/NominationEnsembleServiceProvider.php b/app/Providers/NominationEnsembleServiceProvider.php index 606494a..1c1dea3 100644 --- a/app/Providers/NominationEnsembleServiceProvider.php +++ b/app/Providers/NominationEnsembleServiceProvider.php @@ -3,6 +3,7 @@ namespace App\Providers; use App\Http\Controllers\NominationEnsembles\MeobdaNominationEnsembleController; +use App\Http\Controllers\NominationEnsembles\MeobdaNominationEnsembleEntryController; use App\Http\Controllers\NominationEnsembles\NominationAdminController; use App\Http\Controllers\NominationEnsembles\NominationEnsembleController; use App\Http\Controllers\NominationEnsembles\NominationEnsembleEntryController; @@ -38,6 +39,7 @@ class NominationEnsembleServiceProvider extends ServiceProvider // meobda implementation $this->app->bind(NominationEnsembleController::class, MeobdaNominationEnsembleController::class); + $this->app->bind(NominationEnsembleEntryController::class, MeobdaNominationEnsembleEntryController::class); } } } diff --git a/resources/views/nomination_ensembles/meobda/entries/index.blade.php b/resources/views/nomination_ensembles/meobda/entries/index.blade.php new file mode 100644 index 0000000..98ecccb --- /dev/null +++ b/resources/views/nomination_ensembles/meobda/entries/index.blade.php @@ -0,0 +1,64 @@ + + Nominations + + + @foreach($ensembles as $ensemble) + + {{ $ensemble->name }} + + {{ $ensemble->data['max_nominations'] }} nominations accepted
+ Entry Deadline {{ \Carbon\Carbon::parse($ensemble->entry_deadline)->format('M j, Y') }} +
+ + Existing Nominations + + + + Student + Grade + Instrument + + + + @foreach($existingNominations[$ensemble->id] as $nom) + + {{ $nom->student->full_name() }} + {{ $nom->student->grade }} + {{ $nom->data['instrument'] }} + + @endforeach + + + + + @if($nominationsAvailable[$ensemble->id]) + + New Entry + + + + + @foreach($availableStudents[$ensemble->id] as $student) + + @endforeach + + + + @foreach($availableInstruments[$ensemble->id] as $instrument) + + @endforeach + + + Add Nomination + + + + + @endif + +
+ @endforeach +
+