91 lines
3.4 KiB
PHP
91 lines
3.4 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers\Tabulation\Seating;
|
|
|
|
use App\Actions\Tabulation\RankAuditionEntries;
|
|
use App\Exceptions\AuditionAdminException;
|
|
use App\Http\Controllers\Controller;
|
|
use App\Models\Audition;
|
|
use App\Models\Ensemble;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Support\Arr;
|
|
|
|
use function redirect;
|
|
|
|
/**
|
|
* Selects entries for seating in an audition and saves them to the session
|
|
* for later formal seating.
|
|
*/
|
|
class MakeSeatingDecisionsController extends Controller
|
|
{
|
|
public function draftSeats(
|
|
Audition $audition,
|
|
Request $request
|
|
) {
|
|
$ranker = app(RankAuditionEntries::class);
|
|
$validated = $request->validate([
|
|
'ensemble' => ['required', 'array'],
|
|
'ensemble.*' => ['required', 'integer', 'min:0'],
|
|
]);
|
|
$proposedSeatingArray = [];
|
|
try {
|
|
$rankedEntries = $ranker($audition, 'seating');
|
|
} catch (AuditionAdminException $e) {
|
|
return redirect()->route('seating.audition', ['audition' => $audition->id])
|
|
->with('error', $e->getMessage());
|
|
}
|
|
|
|
// Pull out entries that have declined a seat in this audition
|
|
$rankedEntries = $rankedEntries->reject(function ($entry) {
|
|
return $entry->hasFlag('declined');
|
|
});
|
|
|
|
$rankedEntries->load(['student.school']);
|
|
$rankedEnsembles = Ensemble::orderBy('rank')->where('event_id', $audition->event_id)->get();
|
|
$ensembleRankOn = 1;
|
|
|
|
// Iterate over all ensembles that exist for the event
|
|
foreach ($rankedEnsembles as $ensemble) {
|
|
// If the user didn't ask for any seats in this ensemble, skip it
|
|
if (! Arr::has($validated['ensemble'], $ensemble->id)) {
|
|
continue;
|
|
}
|
|
|
|
// Set up an entry in the session for each ensemble we're going to seat
|
|
$proposedSeatingArray[$ensembleRankOn]['ensemble_id'] = $ensemble->id;
|
|
$proposedSeatingArray[$ensembleRankOn]['ensemble_name'] = $ensemble->name;
|
|
$proposedSeatingArray[$ensembleRankOn]['accept_count'] = $validated['ensemble'][$ensemble->id];
|
|
|
|
// Pull the top rated entry for each seat in order
|
|
for ($n = 1; $n <= $validated['ensemble'][$ensemble->id]; $n++) {
|
|
// Escape the loop if we're out of entries
|
|
if ($rankedEntries->isEmpty()) {
|
|
break;
|
|
}
|
|
|
|
$thisEntry = $rankedEntries->shift();
|
|
$proposedSeatingArray[$ensembleRankOn]['seats'][$n]['seat'] = $n;
|
|
$proposedSeatingArray[$ensembleRankOn]['seats'][$n]['entry_id'] = $thisEntry->id;
|
|
$proposedSeatingArray[$ensembleRankOn]['seats'][$n]['entry_name'] = $thisEntry->student->full_name();
|
|
$proposedSeatingArray[$ensembleRankOn]['seats'][$n]['entry_school'] = $thisEntry->student->school->name;
|
|
}
|
|
|
|
$ensembleRankOn++;
|
|
}
|
|
|
|
// Save the data to the session
|
|
$sessionKeyName = 'proposedSeatingArray-'.$audition->id;
|
|
$request->session()->put($sessionKeyName, $proposedSeatingArray);
|
|
|
|
return redirect()->route('seating.audition', ['audition' => $audition->id]);
|
|
}
|
|
|
|
public function clearDraft(
|
|
Audition $audition
|
|
) {
|
|
session()->forget('proposedSeatingArray-'.$audition->id);
|
|
|
|
return redirect()->route('seating.audition', ['audition' => $audition->id]);
|
|
}
|
|
}
|