112 lines
4.6 KiB
PHP
112 lines
4.6 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers\Judging;
|
|
|
|
use App\Actions\Tabulation\EnterPrelimScore;
|
|
use App\Exceptions\AuditionAdminException;
|
|
use App\Http\Controllers\Controller;
|
|
use App\Models\Entry;
|
|
use App\Models\PrelimDefinition;
|
|
use App\Models\PrelimScoreSheet;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Support\Facades\Auth;
|
|
|
|
class PrelimJudgingController extends Controller
|
|
{
|
|
public function prelimEntryList(PrelimDefinition $prelimDefinition)
|
|
{
|
|
if (auth()->user()->cannot('judge', $prelimDefinition)) {
|
|
return redirect()->route('dashboard')->with('error', 'You are not assigned to judge that prelim audition.');
|
|
}
|
|
$entries = $prelimDefinition->audition->entries;
|
|
$subscores = $prelimDefinition->scoringGuide->subscores()->orderBy('display_order')->get();
|
|
$published = $prelimDefinition->audition->hasFlag('seats_published');
|
|
|
|
$prelimScoresheets = PrelimScoreSheet::where('user_id', Auth::id())->get()->keyBy('entry_id');
|
|
|
|
return view('judging.prelim_entry_list',
|
|
compact('prelimDefinition', 'entries', 'subscores', 'published', 'prelimScoresheets'));
|
|
}
|
|
|
|
public function prelimScoreEntryForm(Entry $entry)
|
|
{
|
|
if (auth()->user()->cannot('judge', $entry->audition->prelimDefinition)) {
|
|
return redirect()->route('dashboard')->with('error', 'You are not assigned to judge that prelim audition.');
|
|
}
|
|
if ($entry->audition->hasFlag('seats_published')) {
|
|
return redirect()->route('dashboard')->with('error',
|
|
'Scores for entries in published auditions cannot be modified.');
|
|
}
|
|
if ($entry->hasFlag('no_show')) {
|
|
return redirect()->route('judging.prelimEntryList', $entry->audition->prelimDefinition)->with('error',
|
|
'The requested entry is marked as a no-show. Scores cannot be entered.');
|
|
}
|
|
|
|
$oldSheet = PrelimScoreSheet::where('user_id', Auth::id())->where('entry_id',
|
|
$entry->id)->value('subscores') ?? null;
|
|
|
|
if ($oldSheet) {
|
|
$formRoute = 'update.savePrelimScoreSheet';
|
|
$formMethod = 'PATCH';
|
|
} else {
|
|
$formRoute = 'judging.savePrelimScoreSheet';
|
|
$formMethod = 'POST';
|
|
}
|
|
|
|
return view('judging.prelim_entry_form', compact('entry', 'oldSheet', 'formRoute', 'formMethod'));
|
|
}
|
|
|
|
/**
|
|
* @throws AuditionAdminException
|
|
*/
|
|
public function savePrelimScoreSheet(Entry $entry, Request $request, EnterPrelimScore $scribe)
|
|
{
|
|
if (auth()->user()->cannot('judge', $entry->audition->prelimDefinition)) {
|
|
return redirect()->route('dashboard')->with('error', 'You are not assigned to judge that prelim audition.');
|
|
}
|
|
|
|
// Validate form data
|
|
$subscores = $entry->audition->prelimDefinition->scoringGuide->subscores;
|
|
$validationChecks = [];
|
|
foreach ($subscores as $subscore) {
|
|
$validationChecks['score'.'.'.$subscore->id] = 'required|integer|max:'.$subscore->max_score;
|
|
}
|
|
$validatedData = $request->validate($validationChecks);
|
|
|
|
// Enter the score
|
|
$scribe(auth()->user(), $entry, $validatedData['score']);
|
|
|
|
return redirect()->route('judging.prelimEntryList', $entry->audition->prelimDefinition)->with('success',
|
|
'Entered prelim scores for '.$entry->audition->name.' '.$entry->draw_number);
|
|
}
|
|
|
|
public function updatePrelimScoreSheet(Entry $entry, Request $request, EnterPrelimScore $scribe)
|
|
{
|
|
if (auth()->user()->cannot('judge', $entry->audition->prelimDefinition)) {
|
|
return redirect()->route('dashboard')->with('error', 'You are not assigned to judge that prelim audition.');
|
|
}
|
|
|
|
// Validate form data
|
|
$subscores = $entry->audition->prelimDefinition->scoringGuide->subscores;
|
|
$validationChecks = [];
|
|
foreach ($subscores as $subscore) {
|
|
$validationChecks['score'.'.'.$subscore->id] = 'required|integer|max:'.$subscore->max_score;
|
|
}
|
|
$validatedData = $request->validate($validationChecks);
|
|
|
|
// Get the existing score
|
|
$scoreSheet = PrelimScoreSheet::where('user_id', auth()->user()->id)->where('entry_id', $entry->id)->first();
|
|
|
|
if (! $scoreSheet) {
|
|
return redirect()->back()->with('error', 'No score sheet exists.');
|
|
}
|
|
|
|
// Update the score
|
|
$scribe(auth()->user(), $entry, $validatedData['score'], $scoreSheet);
|
|
|
|
return redirect()->route('judging.prelimEntryList', $entry->audition->prelimDefinition)->with('success',
|
|
'Updated prelim scores for '.$entry->audition->name.' '.$entry->draw_number);
|
|
|
|
}
|
|
}
|