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);
|
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
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
|
|
|
||||||
|
|
@ -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');
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue