Rewrite tabulation #14
|
|
@ -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'));
|
||||
}
|
||||
}
|
||||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -13,33 +13,26 @@
|
|||
</tr>
|
||||
</thead>
|
||||
<x-table.body>
|
||||
@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)
|
||||
<tr class="hover:bg-gray-50">
|
||||
|
||||
<x-table.td class="">
|
||||
<a href="/tabulation/auditions/{{ $audition->id }}">
|
||||
<a href="/tabulation/auditions/{{ $audition['id'] }}">
|
||||
<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-sm font-medium text-indigo-700 dark:text-white">{{ $audition->scored_entries_count }} / {{ $audition->seating_entries_count }} Scored</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['scoredEntriesCount'] }} / {{ $audition['totalEntriesCount'] }} Scored</span>
|
||||
</div>
|
||||
<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>
|
||||
</a>
|
||||
</x-table.td>
|
||||
<td class="px-8">
|
||||
@if( $audition->scored_entries_count == $audition->seating_entries_count)
|
||||
@if( $audition['scoringComplete'])
|
||||
<x-icons.checkmark color="green"/>
|
||||
@endif
|
||||
</td>
|
||||
<td class="px-8">
|
||||
@if( $audition->hasFlag('seats_published'))
|
||||
@if( $audition['seatsPublished'])
|
||||
<x-icons.checkmark color="green"/>
|
||||
@endif
|
||||
</td>
|
||||
|
|
|
|||
|
|
@ -1,4 +1,5 @@
|
|||
<?php
|
||||
|
||||
// Tabulation Routes
|
||||
use App\Http\Controllers\Tabulation\DoublerDecisionController;
|
||||
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('/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');
|
||||
|
|
|
|||
Loading…
Reference in New Issue