120 lines
4.5 KiB
PHP
120 lines
4.5 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers\Tabulation;
|
|
|
|
use App\Actions\Tabulation\EnterScore;
|
|
use App\Exceptions\ScoreEntryException;
|
|
use App\Http\Controllers\Controller;
|
|
use App\Models\Entry;
|
|
use App\Models\EntryTotalScore;
|
|
use App\Models\ScoreSheet;
|
|
use App\Models\User;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Support\Facades\Session;
|
|
|
|
class ScoreController extends Controller
|
|
{
|
|
public function chooseEntry()
|
|
{
|
|
$method = 'GET';
|
|
$formRoute = 'scores.entryScoreSheet';
|
|
$title = 'Enter Scores';
|
|
|
|
return view('tabulation.choose_entry', compact('method', 'formRoute', 'title'));
|
|
}
|
|
|
|
public function destroyScore(ScoreSheet $score)
|
|
{
|
|
EntryTotalScore::where('entry_id', $score->entry_id)->delete();
|
|
if ($score->entry->audition->hasFlag('seats_published')) {
|
|
return redirect()->back()->with('error', 'Cannot delete scores for an entry where seats are published');
|
|
}
|
|
if ($score->entry->audition->hasFlag('advancement_published')) {
|
|
return redirect()->back()->with('error',
|
|
'Cannot delete scores for an entry where advancement is published');
|
|
}
|
|
$score->delete();
|
|
|
|
return redirect()->back()->with('success', 'Score Deleted');
|
|
}
|
|
|
|
public function entryScoreSheet(Request $request)
|
|
{
|
|
$existing_sheets = [];
|
|
$entry = Entry::with(['student', 'audition.room.judges'])->find($request->input('entry_id'));
|
|
|
|
$publishedCheck = $this->checkIfPublished($entry);
|
|
if ($publishedCheck) {
|
|
return $publishedCheck;
|
|
}
|
|
|
|
$judges = $entry->audition->room->judges;
|
|
foreach ($judges as $judge) {
|
|
$scoreSheet = ScoreSheet::where('entry_id', $entry->id)->where('user_id', $judge->id)->first();
|
|
if ($scoreSheet) {
|
|
Session::flash('caution', 'Scores exist for this entry. Now editing existing scores');
|
|
$existing_sheets[$judge->id] = $scoreSheet;
|
|
}
|
|
}
|
|
$scoring_guide = $entry->audition->scoringGuide;
|
|
$subscores = $entry->audition->scoringGuide->subscores->sortBy('display_order');
|
|
if (! $entry) {
|
|
return redirect()->route('tabulation.chooseEntry')->with('error', 'Entry not found');
|
|
}
|
|
if ($entry->hasFlag('no_show')) {
|
|
session()->flash('error',
|
|
'This entry is marked as a no-show. Entering a score will remove the no-show flag');
|
|
}
|
|
|
|
return view('tabulation.entry_score_sheet',
|
|
compact('entry', 'judges', 'scoring_guide', 'subscores', 'existing_sheets'));
|
|
}
|
|
|
|
public function saveEntryScoreSheet(Request $request, Entry $entry, EnterScore $scoreRecorder)
|
|
{
|
|
$publishedCheck = $this->checkIfPublished($entry);
|
|
if ($publishedCheck) {
|
|
return $publishedCheck;
|
|
}
|
|
foreach ($request->all() as $key => $value) {
|
|
if (! str_contains($key, 'judge')) {
|
|
continue;
|
|
}
|
|
$judge_id = str_replace('judge', '', $key);
|
|
$judge = User::find($judge_id);
|
|
$existingScore = ScoreSheet::where('entry_id', $entry->id)
|
|
->where('user_id', $judge->id)->first();
|
|
if ($existingScore === null) {
|
|
$existingScore = false;
|
|
}
|
|
try {
|
|
$scoreRecorder($judge, $entry, $value, $existingScore);
|
|
} catch (ScoreEntryException $e) {
|
|
return redirect()->route('scores.entryScoreSheet', ['entry_id' => $entry->id])
|
|
->with('error', $e->getMessage());
|
|
}
|
|
}
|
|
|
|
// Since we're entering a score, this apparently isn't a no show.
|
|
$entry->removeFlag('no_show');
|
|
|
|
return redirect()->route('scores.chooseEntry')->with('success', 'Scores saved');
|
|
}
|
|
|
|
protected function checkIfPublished($entry)
|
|
{
|
|
// We're not going to enter scores if seats are published
|
|
if ($entry->audition->hasFlag('seats_published')) {
|
|
return to_route('scores.chooseEntry')->with('error',
|
|
'Cannot enter scores for entry '.$entry->id.'. '.$entry->audition->name.' seats are published');
|
|
}
|
|
// Nope, not if advancement is published either
|
|
if ($entry->audition->hasFlag('advancement_published')) {
|
|
return to_route('scores.chooseEntry')->with('error',
|
|
'Cannot enter scores for entry '.$entry->id.'. '.$entry->audition->name.' advancement is published');
|
|
}
|
|
|
|
return false;
|
|
}
|
|
}
|