Rewrite tabulation #14

Merged
okorpheus merged 43 commits from rewrite-tabulation into master 2024-07-14 05:36:29 +00:00
4 changed files with 62 additions and 21 deletions
Showing only changes of commit 4ff5e1dbcb - Show all commits

View File

@ -0,0 +1,32 @@
<?php
namespace App\Http\Controllers\Tabulation;
use App\Http\Controllers\Controller;
use App\Models\Audition;
use Illuminate\Http\Request;
class SeatingStatusController extends Controller
{
/**
* Handle the incoming request.
*/
public function __invoke(Request $request)
{
$auditions = Audition::forSeating()->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'));
}
}

View File

@ -29,6 +29,12 @@ class Audition extends Model
return $this->hasMany(Entry::class); return $this->hasMany(Entry::class);
} }
public function unscoredEntries()
{
return $this->hasMany(Entry::class)
->whereDoesntHave('scoreSheets');
}
public function room(): BelongsTo public function room(): BelongsTo
{ {
return $this->belongsTo(Room::class); return $this->belongsTo(Room::class);
@ -114,12 +120,12 @@ class Audition extends Model
public function scopeForSeating(Builder $query): void 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 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 public function scopeSeatsPublished(Builder $query): Builder

View File

@ -13,33 +13,26 @@
</tr> </tr>
</thead> </thead>
<x-table.body> <x-table.body>
@foreach($auditions as $audition) @foreach($auditionData as $audition)
@php
$percent = 100;
if($audition->seating_entries_count > 0) {
$percent = round(($audition->scored_entries_count / $audition->seating_entries_count) * 100);
}
@endphp
<tr class="hover:bg-gray-50"> <tr class="hover:bg-gray-50">
<x-table.td class=""> <x-table.td class="">
<a href="/tabulation/auditions/{{ $audition->id }}"> <a href="/tabulation/auditions/{{ $audition['id'] }}">
<div class="flex justify-between mb-1"> <div class="flex justify-between mb-1">
<span class="text-base font-medium text-indigo-700 dark:text-white">{{ $audition->name }}</span> <span class="text-base font-medium text-indigo-700 dark:text-white">{{ $audition['name'] }}</span>
<span class="text-sm font-medium text-indigo-700 dark:text-white">{{ $audition->scored_entries_count }} / {{ $audition->seating_entries_count }} Scored</span> <span class="text-sm font-medium text-indigo-700 dark:text-white">{{ $audition['scoredEntriesCount'] }} / {{ $audition['totalEntriesCount'] }} Scored</span>
</div> </div>
<div class="w-full bg-gray-200 rounded-full h-2.5 dark:bg-gray-700"> <div class="w-full bg-gray-200 rounded-full h-2.5 dark:bg-gray-700">
<div class="bg-indigo-600 h-2.5 rounded-full" style="width: {{ $percent }}%"></div> <div class="bg-indigo-600 h-2.5 rounded-full" style="width: {{ $audition['scoredPercentage'] }}%"></div>
</div> </div>
</a> </a>
</x-table.td> </x-table.td>
<td class="px-8"> <td class="px-8">
@if( $audition->scored_entries_count == $audition->seating_entries_count) @if( $audition['scoringComplete'])
<x-icons.checkmark color="green"/> <x-icons.checkmark color="green"/>
@endif @endif
</td> </td>
<td class="px-8"> <td class="px-8">
@if( $audition->hasFlag('seats_published')) @if( $audition['seatsPublished'])
<x-icons.checkmark color="green"/> <x-icons.checkmark color="green"/>
@endif @endif
</td> </td>

View File

@ -1,4 +1,5 @@
<?php <?php
// Tabulation Routes // Tabulation Routes
use App\Http\Controllers\Tabulation\DoublerDecisionController; use App\Http\Controllers\Tabulation\DoublerDecisionController;
use App\Http\Middleware\CheckIfCanTab; use App\Http\Middleware\CheckIfCanTab;
@ -11,19 +12,27 @@ Route::middleware(['auth', 'verified', CheckIfCanTab::class])->group(function ()
Route::get('/choose_entry', 'chooseEntry')->name('scores.chooseEntry'); Route::get('/choose_entry', 'chooseEntry')->name('scores.chooseEntry');
Route::get('/entry', 'entryScoreSheet')->name('scores.entryScoreSheet'); Route::get('/entry', 'entryScoreSheet')->name('scores.entryScoreSheet');
Route::post('/entry/{entry}', 'saveEntryScoreSheet')->name('scores.saveEntryScoreSheet'); 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 // 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('/choose_no_show', 'noShowSelect')->name('entry-flags.noShowSelect');
Route::get('/propose-no-show', 'noShowConfirm')->name('entry-flags.confirmNoShow'); Route::get('/propose-no-show', 'noShowConfirm')->name('entry-flags.confirmNoShow');
Route::post('/no-show/{entry}', 'enterNoShow')->name('entry-flags.enterNoShow'); Route::post('/no-show/{entry}', 'enterNoShow')->name('entry-flags.enterNoShow');
Route::delete('/no-show/{entry}', 'undoNoShow')->name('entry-flags.undoNoShow'); Route::delete('/no-show/{entry}', 'undoNoShow')->name('entry-flags.undoNoShow');
}); });
// Generic Tabulation Routes // Seating Routes
Route::prefix('tabulation/')->controller(\App\Http\Controllers\Tabulation\TabulationController::class)->group(function () { 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::get('/status', 'status')->name('tabulation.status');
Route::match(['get', 'post'], '/auditions/{audition}', 'auditionSeating')->name('tabulation.audition.seat'); Route::match(['get', 'post'], '/auditions/{audition}', 'auditionSeating')->name('tabulation.audition.seat');
Route::post('/auditions/{audition}/publish-seats', 'publishSeats')->name('tabulation.seat.publish'); 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 // 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('/status', 'status')->name('advancement.status');
Route::get('/{audition}', 'ranking')->name('advancement.ranking'); Route::get('/{audition}', 'ranking')->name('advancement.ranking');
Route::post('/{audition}', 'setAuditionPassers')->name('advancement.setAuditionPassers'); Route::post('/{audition}', 'setAuditionPassers')->name('advancement.setAuditionPassers');