From 4ff5e1dbcb3e1f51e016f69bc59728571b568dec Mon Sep 17 00:00:00 2001 From: Matt Young Date: Tue, 9 Jul 2024 12:32:05 -0500 Subject: [PATCH] Seating Status Screen --- .../Tabulation/SeatingStatusController.php | 32 +++++++++++++++++++ app/Models/Audition.php | 10 ++++-- resources/views/tabulation/status.blade.php | 21 ++++-------- routes/tabulation.php | 20 +++++++++--- 4 files changed, 62 insertions(+), 21 deletions(-) create mode 100644 app/Http/Controllers/Tabulation/SeatingStatusController.php diff --git a/app/Http/Controllers/Tabulation/SeatingStatusController.php b/app/Http/Controllers/Tabulation/SeatingStatusController.php new file mode 100644 index 0000000..48b0757 --- /dev/null +++ b/app/Http/Controllers/Tabulation/SeatingStatusController.php @@ -0,0 +1,32 @@ +withCount(['entries', 'unscoredEntries'])->with('flags')->get(); + $auditionData = []; + foreach ($auditions as $audition) { + $auditionData[] = [ + 'id' => $audition->id, + 'name' => $audition->name, + 'scoredEntriesCount' => $audition->entries_count - $audition->unscored_entries_count, + 'totalEntriesCount' => $audition->entries_count, + 'scoredPercentage' => $audition->entries_count > 0 ? ($audition->entries_count - $audition->unscored_entries_count) / $audition->entries_count * 100 : 100, + 'scoringComplete' => $audition->unscored_entries_count === 0, + 'seatsPublished' => $audition->hasFlag('seats_published'), + ]; + } + $auditionData = collect($auditionData); + return view('tabulation.status', compact('auditionData')); + } +} diff --git a/app/Models/Audition.php b/app/Models/Audition.php index 21d6c78..9553d52 100644 --- a/app/Models/Audition.php +++ b/app/Models/Audition.php @@ -29,6 +29,12 @@ class Audition extends Model return $this->hasMany(Entry::class); } + public function unscoredEntries() + { + return $this->hasMany(Entry::class) + ->whereDoesntHave('scoreSheets'); + } + public function room(): BelongsTo { return $this->belongsTo(Room::class); @@ -114,12 +120,12 @@ class Audition extends Model public function scopeForSeating(Builder $query): void { - $query->where('for_seating', 1); + $query->where('for_seating', 1)->orderBy('score_order'); } public function scopeForAdvancement(Builder $query): void { - $query->where('for_advancement', 1); + $query->where('for_advancement', 1)->orderBy('score_order'); } public function scopeSeatsPublished(Builder $query): Builder diff --git a/resources/views/tabulation/status.blade.php b/resources/views/tabulation/status.blade.php index bf594b1..af469ad 100644 --- a/resources/views/tabulation/status.blade.php +++ b/resources/views/tabulation/status.blade.php @@ -13,33 +13,26 @@ - @foreach($auditions as $audition) - @php - $percent = 100; - if($audition->seating_entries_count > 0) { - $percent = round(($audition->scored_entries_count / $audition->seating_entries_count) * 100); - } - @endphp + @foreach($auditionData as $audition) - - +
- {{ $audition->name }} - {{ $audition->scored_entries_count }} / {{ $audition->seating_entries_count }} Scored + {{ $audition['name'] }} + {{ $audition['scoredEntriesCount'] }} / {{ $audition['totalEntriesCount'] }} Scored
-
+
- @if( $audition->scored_entries_count == $audition->seating_entries_count) + @if( $audition['scoringComplete']) @endif - @if( $audition->hasFlag('seats_published')) + @if( $audition['seatsPublished']) @endif diff --git a/routes/tabulation.php b/routes/tabulation.php index 956ddde..a7118dd 100644 --- a/routes/tabulation.php +++ b/routes/tabulation.php @@ -1,4 +1,5 @@ group(function () Route::get('/choose_entry', 'chooseEntry')->name('scores.chooseEntry'); Route::get('/entry', 'entryScoreSheet')->name('scores.entryScoreSheet'); Route::post('/entry/{entry}', 'saveEntryScoreSheet')->name('scores.saveEntryScoreSheet'); - Route::delete('/{score}', [\App\Http\Controllers\Tabulation\ScoreController::class, 'destroyScore'])->name('scores.destroy'); + Route::delete('/{score}', + [\App\Http\Controllers\Tabulation\ScoreController::class, 'destroyScore'])->name('scores.destroy'); }); // Entry Flagging - Route::prefix('entry-flags/')->controller(\App\Http\Controllers\Tabulation\EntryFlagController::class)->group(function () { + Route::prefix('entry-flags/')->controller(\App\Http\Controllers\Tabulation\EntryFlagController::class)->group(function ( + ) { Route::get('/choose_no_show', 'noShowSelect')->name('entry-flags.noShowSelect'); Route::get('/propose-no-show', 'noShowConfirm')->name('entry-flags.confirmNoShow'); Route::post('/no-show/{entry}', 'enterNoShow')->name('entry-flags.enterNoShow'); Route::delete('/no-show/{entry}', 'undoNoShow')->name('entry-flags.undoNoShow'); }); - // Generic Tabulation Routes - Route::prefix('tabulation/')->controller(\App\Http\Controllers\Tabulation\TabulationController::class)->group(function () { + // Seating Routes + Route::prefix('seating/')->group(function () { + Route::get('/', App\Http\Controllers\Tabulation\SeatingStatusController::class)->name('seating.status'); + }); + + // Generic Tabulation Routes (TO BE REPLACED) + Route::prefix('tabulation/')->controller(\App\Http\Controllers\Tabulation\TabulationController::class)->group(function ( + ) { Route::get('/status', 'status')->name('tabulation.status'); Route::match(['get', 'post'], '/auditions/{audition}', 'auditionSeating')->name('tabulation.audition.seat'); Route::post('/auditions/{audition}/publish-seats', 'publishSeats')->name('tabulation.seat.publish'); @@ -31,7 +40,8 @@ Route::middleware(['auth', 'verified', CheckIfCanTab::class])->group(function () }); // Advancement Routes - Route::prefix('advancement/')->controller(\App\Http\Controllers\Tabulation\AdvancementController::class)->group(function () { + Route::prefix('advancement/')->controller(\App\Http\Controllers\Tabulation\AdvancementController::class)->group(function ( + ) { Route::get('/status', 'status')->name('advancement.status'); Route::get('/{audition}', 'ranking')->name('advancement.ranking'); Route::post('/{audition}', 'setAuditionPassers')->name('advancement.setAuditionPassers');