From 89005035560a82f9ec26be92e910598c1aeaadb3 Mon Sep 17 00:00:00 2001 From: Matt Young Date: Fri, 21 Jun 2024 13:31:43 -0500 Subject: [PATCH] Progress --- .../Tabulation/TabulationController.php | 18 ++--- app/Services/TabulationService.php | 49 ++++++----- .../tabulation/auditionSeating.blade.php | 81 ++++++++++--------- 3 files changed, 78 insertions(+), 70 deletions(-) diff --git a/app/Http/Controllers/Tabulation/TabulationController.php b/app/Http/Controllers/Tabulation/TabulationController.php index 0c6fbf7..3d8b369 100644 --- a/app/Http/Controllers/Tabulation/TabulationController.php +++ b/app/Http/Controllers/Tabulation/TabulationController.php @@ -4,20 +4,15 @@ namespace App\Http\Controllers\Tabulation; use App\Http\Controllers\Controller; use App\Models\Audition; -use App\Models\Entry; -use App\Models\ScoreSheet; use App\Services\DoublerService; use App\Services\TabulationService; -use Illuminate\Http\Request; -use Illuminate\Support\Facades\Session; + use function compact; -use function dd; -use function dump; -use function redirect; class TabulationController extends Controller { protected $tabulationService; + protected $doublerService; public function __construct(TabulationService $tabulationService, DoublerService $doublerService) @@ -26,18 +21,17 @@ class TabulationController extends Controller $this->doublerService = $doublerService; } - public function status() { $auditions = $this->tabulationService->getAuditionsWithStatus(); - return view('tabulation.status',compact('auditions')); + + return view('tabulation.status', compact('auditions')); } public function auditionSeating(Audition $audition) { - $entries = $this->tabulationService->auditionEntries($audition->id); + $entries = $this->tabulationService->auditionEntries($audition->id); - return view('tabulation.auditionSeating',compact('audition','entries')); + return view('tabulation.auditionSeating', compact('audition', 'entries')); } - } diff --git a/app/Services/TabulationService.php b/app/Services/TabulationService.php index e622290..3c07fb7 100644 --- a/app/Services/TabulationService.php +++ b/app/Services/TabulationService.php @@ -3,18 +3,18 @@ namespace App\Services; use App\Models\Entry; -use App\Models\ScoreSheet; use App\Models\User; use Illuminate\Support\Facades\Cache; -use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Session; - class TabulationService { protected AuditionCacheService $auditionCacheService; + protected EntryCacheService $entryCacheService; + protected ScoreService $scoreService; + /** * Create a new class instance. */ @@ -30,23 +30,24 @@ class TabulationService /** * Returns the rank of the entry in its audition - * @param Entry $entry + * * @return mixed */ - public function entryRank(Entry $entry) { + public function entryRank(Entry $entry) + { return $this->auditionEntries($entry->audition_id)[$entry->id]->rank; } /** * Returns a collection of entries including their calculated final_score_array and ranked * based upon their scores. - * @param Int $auditionId + * * @return \Illuminate\Support\Collection|mixed */ - public function auditionEntries(Int $auditionId) + public function auditionEntries(int $auditionId) { static $cache = []; - if(isset($cache[$auditionId])) { + if (isset($cache[$auditionId])) { return $cache[$auditionId]; } @@ -56,7 +57,7 @@ class TabulationService foreach ($entries as $entry) { $entry->final_score_array = $this->scoreService->entryTotalScores($entry); - $entry->scoring_complete = $this->scoreService->entryScoreSheetCounts()[$entry->id] ?? 0 == $audition->judges_count; + $entry->scoring_complete = $this->scoreService->entryScoreSheetCounts()[$entry->id] ?? $audition->judges_count == 0; } // Sort the array $entries by the first element in the final_score_array on each entry, then by the second element in that array continuing through each element in the final_score_array for each entry $entries = $entries->sort(function ($a, $b) { @@ -65,41 +66,51 @@ class TabulationService return $b->final_score_array[$i] > $a->final_score_array[$i] ? 1 : -1; } } + return 0; }); //TODO verify this actually sorts by subscores correctly $n = 1; + /** @var Entry $entry */ foreach ($entries as $entry) { - $entry->rank = $n; - $n++; + if (! $entry->hasFlag('declined')) { + $entry->rank = $n; + $n++; + } else { + $entry->rank = 'declined'; + } } $cache[$auditionId] = $entries->keyBy('id'); + return $entries->keyBy('id'); } - - public function entryScoreSheetsAreValid(Entry $entry): bool { + public function entryScoreSheetsAreValid(Entry $entry): bool + { //TODO consider making this move the invalid score to another database for further investigation $validJudges = $this->auditionCacheService->getAudition($entry->audition_id)->judges; foreach ($entry->scoreSheets as $sheet) { if (! $validJudges->contains($sheet->user_id)) { $invalidJudge = User::find($sheet->user_id); - Session::flash('error','Invalid scores for entry ' . $entry->id . ' exist from ' . $invalidJudge->full_name()); + Session::flash('error', 'Invalid scores for entry '.$entry->id.' exist from '.$invalidJudge->full_name()); + return false; } } + return true; } /** * Returns the number of un-scored entries for the audition with the given ID. - * @param $auditionId + * * @return mixed */ public function remainingEntriesForAudition($auditionId) { $audition = $this->getAuditionsWithStatus()[$auditionId]; + return $audition->entries_count - $audition->scored_entries_count; } @@ -107,26 +118,28 @@ class TabulationService * Get the array of all auditions from the cache. For each one, set a property * scored_entries_count that indicates the number of entries for that audition that * have a number of score sheets equal to the number of judges for that audition. + * * @return mixed */ public function getAuditionsWithStatus() { - return Cache::remember('auditionsWithStatus',30,function() { + return Cache::remember('auditionsWithStatus', 30, function () { // Retrieve auditions from the cache and load entry IDs $auditions = $this->auditionCacheService->getAuditions(); // Iterate over the auditions and calculate the scored_entries_count - foreach($auditions as $audition) { + foreach ($auditions as $audition) { $scored_entries_count = 0; foreach ($this->entryCacheService->getEntriesForAudition($audition->id) as $entry) { - if ($this->scoreService->entryScoreSheetCounts()[$entry->id] ?? 0 == $audition->judges_count) { + if ($this->scoreService->entryScoreSheetCounts()[$entry->id] ?? $audition->judges_count == 0) { $scored_entries_count++; } } $audition->scored_entries_count = $scored_entries_count; } + return $auditions; }); } diff --git a/resources/views/tabulation/auditionSeating.blade.php b/resources/views/tabulation/auditionSeating.blade.php index 004ee89..05da5f5 100644 --- a/resources/views/tabulation/auditionSeating.blade.php +++ b/resources/views/tabulation/auditionSeating.blade.php @@ -2,48 +2,49 @@ Audition Seating - {{ $audition->name }} - - - - Rank - ID - Draw # - Student Name - Doubler -{{-- @foreach($judges as $judge)--}} -{{-- {{ $judge->short_name() }}--}} -{{-- @endforeach--}} - Total Score - All Scores? - - + + + + + Rank + ID + Draw # + Student Name + Doubler + {{-- @foreach($judges as $judge)--}} + {{-- {{ $judge->short_name() }}--}} + {{-- @endforeach--}} + Total Score + All Scores? + + - - @foreach($entries as $entry) - - {{ $entry->rank }} - {{ $entry->id }} - {{ $entry->draw_number }} - - {{ $entry->student->full_name() }}, - {{ $entry->student->school->name }} - - - @if($doublerService->studentIsDoubler($entry->student_id)) - - @endif - -{{-- @if($entry->is_doubler)--}} -{{-- --}} -{{-- @endif--}} - - {{ number_format($entry->final_score_array[0] ?? 0,4) }} - @if($entry->scoring_complete) @endif - - @endforeach - - + + @foreach($entries as $entry) + + {{ $entry->rank }} + {{ $entry->id }} + {{ $entry->draw_number }} + + {{ $entry->student->full_name() }}, + {{ $entry->student->school->name }} + + + @if($doublerService->studentIsDoubler($entry->student_id)) + + @endif + {{-- @if($entry->is_doubler)--}} + {{-- --}} + {{-- @endif--}} + + {{ number_format($entry->final_score_array[0] ?? 0,4) }} + @if($entry->scoring_complete) @endif + + @endforeach + + +