From ec6aa4aa5369e0b406b42181d07d580d92360325 Mon Sep 17 00:00:00 2001 From: Matt Young Date: Sun, 9 Feb 2025 16:47:28 -0600 Subject: [PATCH] Work on seating function for SCOBDA nomination ensembles. --- .../NominationSeatingController.php | 6 +++ .../ScobdaNominationSeatingController.php | 48 +++++++++++++++++++ .../layout/navbar/menus/tabulation.blade.php | 3 ++ .../scobda/admin/seating/index.blade.php | 38 +++++++++++++++ routes/nominationEnsemble.php | 7 +++ 5 files changed, 102 insertions(+) create mode 100644 resources/views/nomination_ensembles/scobda/admin/seating/index.blade.php diff --git a/app/Http/Controllers/NominationEnsembles/NominationSeatingController.php b/app/Http/Controllers/NominationEnsembles/NominationSeatingController.php index e4e31e7..e8d7e8f 100644 --- a/app/Http/Controllers/NominationEnsembles/NominationSeatingController.php +++ b/app/Http/Controllers/NominationEnsembles/NominationSeatingController.php @@ -2,7 +2,13 @@ namespace App\Http\Controllers\NominationEnsembles; +use App\Models\NominationEnsemble; + interface NominationSeatingController { public function index(); + + public function show(NominationEnsemble $ensemble); + + public function seat(NominationEnsemble $ensemble); } diff --git a/app/Http/Controllers/NominationEnsembles/ScobdaNominationSeatingController.php b/app/Http/Controllers/NominationEnsembles/ScobdaNominationSeatingController.php index 1f34564..4cfd8a1 100644 --- a/app/Http/Controllers/NominationEnsembles/ScobdaNominationSeatingController.php +++ b/app/Http/Controllers/NominationEnsembles/ScobdaNominationSeatingController.php @@ -3,11 +3,59 @@ namespace App\Http\Controllers\NominationEnsembles; use App\Http\Controllers\Controller; +use App\Models\NominationEnsemble; +use App\Models\NominationEnsembleEntry; class ScobdaNominationSeatingController extends Controller implements NominationSeatingController { public function index() { + $ensembles = NominationEnsemble::all(); + $ensemble = null; + + return view('nomination_ensembles.scobda.admin.seating.index', compact('ensembles', 'ensemble')); + } + + public function show(NominationEnsemble $ensemble) + { + $ensembles = NominationEnsemble::all(); + + return view('nomination_ensembles.scobda.admin.seating.index', compact('ensembles', 'ensemble')); } + + public function seat(NominationEnsemble $ensemble) + { + $nominations = NominationEnsembleEntry::where('nomination_ensemble_id', + $ensemble->id)->orderByRaw('CAST(data->"$.rank" AS UNSIGNED)')->get(); + $rankGroupedNominations = $nominations->groupBy(function ($entry) { + return $entry->data['rank']; + }); + + $acceptedNominations = collect(); + $rankOn = 1; + // Collect students to add to the ensemble + while ($rankOn <= $ensemble->data['max_nominations'] && $rankGroupedNominations->has($rankOn)) { + // If were at or over the target size of the ensemble, stop adding people + if ($acceptedNominations->count() >= $ensemble->data['target_size']) { + break; + } + // Add people of the current rank to the ensemble + foreach ($rankGroupedNominations[$rankOn] as $nomination) { + $acceptedNominations->push($nomination); + } + $rankOn++; + + // If we want to round down the ensemble size, quit adding people if hte next rank will exceed the target + if ( + $rankGroupedNominations->has($rankOn) && + $acceptedNominations->count() + $rankGroupedNominations[$rankOn]->count() >= $ensemble->data['target_size'] && + $ensemble->data['rounding_direction'] === 'down' + ) { + break; + } + } + + dd($acceptedNominations); + } } diff --git a/resources/views/components/layout/navbar/menus/tabulation.blade.php b/resources/views/components/layout/navbar/menus/tabulation.blade.php index bc0f361..ba33e98 100644 --- a/resources/views/components/layout/navbar/menus/tabulation.blade.php +++ b/resources/views/components/layout/navbar/menus/tabulation.blade.php @@ -33,6 +33,9 @@ @if(auditionSetting('advanceTo')) {{ auditionSetting('advanceTo') }} Status @endif + @if(auditionSetting('nomination_ensemble_rules') !== 'disabled') + Nomination Ensemble Seating + @endif diff --git a/resources/views/nomination_ensembles/scobda/admin/seating/index.blade.php b/resources/views/nomination_ensembles/scobda/admin/seating/index.blade.php new file mode 100644 index 0000000..fb2e0a5 --- /dev/null +++ b/resources/views/nomination_ensembles/scobda/admin/seating/index.blade.php @@ -0,0 +1,38 @@ + + Nomination Ensemble Seating + +
+ +
+ +
+ +
+ @if($ensemble) + + + {{ $ensemble->name }} + + + Seat Ensemble + + + + + + @endif +
+ +
+ +
diff --git a/routes/nominationEnsemble.php b/routes/nominationEnsemble.php index 376669a..c3e4dd6 100644 --- a/routes/nominationEnsemble.php +++ b/routes/nominationEnsemble.php @@ -3,6 +3,7 @@ use App\Http\Controllers\NominationEnsembles\NominationAdminController; use App\Http\Controllers\NominationEnsembles\NominationEnsembleController; use App\Http\Controllers\NominationEnsembles\NominationEnsembleEntryController; +use App\Http\Controllers\NominationEnsembles\NominationSeatingController; use App\Http\Middleware\CheckIfAdmin; use Illuminate\Support\Facades\Route; @@ -17,6 +18,12 @@ Route::middleware(['auth', 'verified', CheckIfAdmin::class])->prefix('nomination Route::prefix('nominations/')->controller(NominationAdminController::class)->group(function () { Route::get('/', 'index')->name('nomination.admin.index'); }); + + Route::prefix('seating/')->controller(NominationSeatingController::class)->group(function () { + Route::get('/', 'index')->name('nomination.admin.seating.index'); + Route::get('/{ensemble}', 'show')->name('nomination.admin.seating.show'); + Route::post('/{ensemble}', 'seat')->name('nomination.admin.seating.seat'); + }); }); Route::middleware(['auth', 'verified'])->prefix('nominations/')->group(function () {