auditionadmin/app/Http/Controllers/Tabulation/ScoreController.php

133 lines
5.2 KiB
PHP

<?php
namespace App\Http\Controllers\Tabulation;
use App\Http\Controllers\Controller;
use App\Models\CalculatedScore;
use App\Models\Entry;
use App\Models\ScoreSheet;
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)
{
CalculatedScore::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();
// TODO clear scoring cache when a score is deleted
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)
{
CalculatedScore::where('entry_id', $entry->id)->delete();
$publishedCheck = $this->checkIfPublished($entry);
if ($publishedCheck) {
return $publishedCheck;
}
$entry->removeFlag('no_show');
$judges = $entry->audition->room->judges;
$subscores = $entry->audition->scoringGuide->subscores->sortBy('tiebreak_order');
$scoringGuide = $entry->audition->scoringGuide;
$preparedScoreSheets = [];
foreach ($judges as $judge) {
$preparedScoreSheets[$judge->id]['user_id'] = $judge->id;
$preparedScoreSheets[$judge->id]['entry_id'] = $entry->id;
$scoreValidation = $scoringGuide->validateScores($request->input('judge'.$judge->id));
if ($scoreValidation != 'success') {
return redirect(url()->previous())->with('error',
$judge->full_name().': '.$scoreValidation)->with('oldScores', $request->all());
}
$scoreSubmission = $request->input('judge'.$judge->id);
$scoresToSave = [];
foreach ($subscores as $subscore) {
$scoresToSave[$subscore->id] = [
'subscore_id' => $subscore->id,
'subscore_name' => $subscore->name,
'score' => intval($scoreSubmission[$subscore->id]),
];
}
$preparedScoreSheets[$judge->id]['scores'] = $scoresToSave;
}
foreach ($preparedScoreSheets as $sheet) {
ScoreSheet::updateOrCreate(
['entry_id' => $sheet['entry_id'], 'user_id' => $sheet['user_id']],
['subscores' => $sheet['scores']]
);
}
// TODO rewrite to use EnterScore action or clear score cache
return redirect()->route('scores.chooseEntry')->with('success', count($preparedScoreSheets).' 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;
}
}