auditionadmin/app/Http/Controllers/NominationEnsembles/MeobdaNominationAdminContro...

169 lines
5.9 KiB
PHP

<?php
namespace App\Http\Controllers\NominationEnsembles;
use App\Http\Controllers\Controller;
use App\Models\NominationEnsemble;
use App\Models\NominationEnsembleEntry;
use App\Models\School;
use App\Models\Student;
use Illuminate\Validation\Rule;
use function redirect;
class MeobdaNominationAdminController extends Controller implements NominationAdminController
{
public function index()
{
if (request('newFilterParameters')) {
$newFilterData = request()->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()
{
// TODO: Implement create() method.
}
public function store()
{
// TODO: Implement store() method.
}
public function edit(NominationEnsembleEntry $nominationEnsembleEntry)
{
$students = Student::with('school')->get()
->sortBy('school.name');
$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' => Rule::in($validInstruments),
'split' => Rule::in($validSplits),
'seat' => 'integer',
]);
$data = $nominationEnsembleEntry->data;
$data['instrument'] = $validData['instrument'];
$data['split'] = $validData['split'];
$data['seat'] = $validData['seat'];
$nominationEnsembleEntry->update([
'data' => $data,
]);
return redirect()->back();
}
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;
}
}