validate([ 'school' => 'nullable|exists:schools,id', 'section' => 'nullable|string', 'newFilterParameters' => 'string', 'split' => 'nullable|string', 'clear' => 'nullable|string', ]); if ($newFilterData['clear'] ?? false == 'clear') { $filterData = []; session()->forget('nominationAdminFilters'); } else { session()->put('nominationAdminFilters', $newFilterData); $filterData = $newFilterData; } } elseif (session()->has('nominationAdminFilters')) { $filterData = session()->get('nominationAdminFilters'); } else { $filterData = []; } // Populate variables to complete the filter form $schools = School::orderBy('name')->get(); $ensembles = NominationEnsemble::all(); $sections = []; $splits = []; foreach ($ensembles as $ensemble) { // Populate sections for each ensemble $sections[$ensemble->id.'---'.'all'] = $ensemble->name.' - ALL'; foreach ($ensemble->data['instruments'] as $instrument) { $sections[$ensemble->id.'---'.$instrument['name']] = $ensemble->name.' - '.$instrument['name']; } // Populate splits for each ensemble $splits[$ensemble->id.'---'.'all'] = $ensemble->name.' - ALL'; foreach ($ensemble->data['split_names'] as $splitName) { $splits[$ensemble->id.'---'.$splitName] = $ensemble->name.' - '.$splitName; } } // Get and filter nominations $nominations = NominationEnsembleEntry::with('student.school'); if ($filterData['school'] ?? false) { $nominations = $nominations->whereHas('student', function ($query) use ($filterData) { $query->where('school_id', $filterData['school']); }); } if ($filterData['section'] ?? false) { $sectionFilter = explode('---', $filterData['section']); $nominations = $nominations->where('nomination_ensemble_id', $sectionFilter[0]); if ($sectionFilter[1] != 'all') { $nominations = $nominations->where('data->instrument', $sectionFilter[1]); } } if ($filterData['split'] ?? false) { $splitFilter = explode('---', $filterData['split']); $nominations = $nominations->where('nomination_ensemble_id', $splitFilter[0]); if ($splitFilter[1] != 'all') { $nominations = $nominations->where('data->split', $splitFilter[1]); } } $nominations = $nominations->paginate(50); return view('nomination_ensembles.meobda.admin.nominations', compact('nominations', 'schools', 'filterData', 'ensembles', 'sections', 'splits')); } public function show(NominationEnsembleEntry $nominationEnsembleEntry) { // TODO: Implement show() method. } public function create() { $target_ensemble = null; $instrumentation = null; $students = null; if (request()->get('ensemble')) { $validData = request()->validate([ 'ensemble' => 'nullable|exists:nomination_ensembles,id', ]); $target_ensemble = NominationEnsemble::find($validData['ensemble']); // Get viable students for entering $students = Student::where('grade', '<=', $target_ensemble->maximum_grade) ->where('grade', '>=', $target_ensemble->minimum_grade) ->with('school') ->join('schools', 'schools.id', '=', 'students.school_id') ->orderBy('schools.name', 'asc') ->orderBy('students.last_name', 'asc') ->orderBy('students.first_name', 'asc') ->get(['students.*']); // Remove students already nominated $nominated_student_ids = NominationEnsembleEntry::where('nomination_ensemble_id', $target_ensemble->id)->pluck('student_id')->all(); $students = $students->reject(function ($student) use ($nominated_student_ids) { return in_array($student->id, $nominated_student_ids); }); // Get current instrumentation of target ensemble $instrumentation = $this->get_ensemble_instrumentation($target_ensemble); } $ensembles = NominationEnsemble::all(); return view('nomination_ensembles.meobda.admin.nomination-create', compact('ensembles', 'target_ensemble', 'students', 'instrumentation')); } public function store() { // Initial Validation $validData = request()->validate([ 'ensemble' => 'required|exists:nomination_ensembles,id', 'student' => 'required|exists:students,id', 'instrument' => 'required|string', 'split' => 'nullable|string', 'seat' => 'nullable|integer', ]); $proposed_ensemble = NominationEnsemble::find($validData['ensemble']); // Check if $validData['instrument'] is a valid instrument for the proposed ensemble $validInstruments = array_column($proposed_ensemble->data['instruments'], 'name'); if (! in_array($validData['instrument'], $validInstruments)) { return redirect()->back()->with('error', 'Invalid Instrument Specified'); } $data['instrument'] = $validData['instrument']; if ($validData['seat'] > 0) { $data['seat'] = $validData['seat']; } if ($validData['split'] != '---') { $data['split'] = $validData['split']; // Check if $validData['split'] is a valid split for the proposed ensemble $validSplits = $proposed_ensemble->data['splits']; if (! in_array($validData['split'], $validSplits)) { return redirect()->back()->with('error', 'Invalid Split Specified'); } } $newNomination = NominationEnsembleEntry::make([ 'student_id' => $validData['student'], 'nomination_ensemble_id' => $validData['ensemble'], 'data' => $data, ]); $newNomination->save(); return redirect()->route('nomination.admin.index')->with('success', 'New Nomination created'); } public function edit(NominationEnsembleEntry $nominationEnsembleEntry) { $students = Student::with('school')->get() ->sortBy('school.name'); if (! isset($nominationEnsembleEntry->data['seat'])) { $data = $nominationEnsembleEntry->data; $data['seat'] = null; $nominationEnsembleEntry->data = $data; } $instrumentation = $this->get_ensemble_instrumentation($nominationEnsembleEntry->ensemble); return view('nomination_ensembles.meobda.admin.nomination-edit', compact('nominationEnsembleEntry', 'students', 'instrumentation')); } public function update(NominationEnsembleEntry $nominationEnsembleEntry) { $ensemble = $nominationEnsembleEntry->ensemble; $validSplits = $ensemble->data['split_names']; $validInstruments = []; foreach ($ensemble->data['instruments'] as $instrument) { $validInstruments[] = $instrument['name']; } $validData = request()->validate([ 'instrument' => ['nullable', Rule::in($validInstruments)], 'split' => ['nullable', Rule::in($validSplits)], 'seat' => ['nullable', 'integer'], ]); $data = $nominationEnsembleEntry->data; $data['instrument'] = $validData['instrument']; $data['split'] = $validData['split']; $data['seat'] = $validData['seat']; $nominationEnsembleEntry->update([ 'data' => $data, ]); return redirect()->route('nomination.admin.index')->with('success', 'Nomination updated'); } public function destroy(NominationEnsembleEntry $nominationEnsembleEntry) { // TODO: Implement destroy() method. } private function get_ensemble_instrumentation(NominationEnsemble $ensemble) { $entries = NominationEnsembleEntry::where('nomination_ensemble_id', $ensemble->id)->get(); $splits = $ensemble->data['split_names']; $instruments = []; foreach ($ensemble->data['instruments'] as $instrument) { $instruments[] = $instrument['name']; } $counts = []; foreach ($splits as $split) { $counts[$split] = []; foreach ($instruments as $instrument) { $counts[$split][$instrument] = 0; } } foreach ($entries as $entry) { if (! isset($entry->data['split'])) { continue; } $counts[$entry->data['split']][$entry->data['instrument']] += 1; } return $counts; } }