auditionadmin/app/Http/Controllers/Tabulation/SeatingStatusController.php

71 lines
2.5 KiB
PHP

<?php
namespace App\Http\Controllers\Tabulation;
use App\Actions\Tabulation\CalculateAuditionScores;
use App\Http\Controllers\Controller;
use App\Models\Audition;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Cache;
class SeatingStatusController extends Controller
{
/**
* Handle the incoming request.
*/
public function __invoke(Request $request)
{
if (! Cache::has('seating_status_audition_totaler_throttle')) {
$lock = Cache::lock('seating_status_audition_totaler_lock');
if ($lock->get()) {
try {
$totaler = app(CalculateAuditionScores::class);
foreach (Audition::forSeating()->with('judges')->get() as $audition) {
$totaler($audition);
}
// set throttle
Cache::put('seating_status_audition_totaler_throttle', true, 15);
} finally {
$lock->release();
}
}
}
$auditions = Audition::forSeating()
->withCount([
'entries' => function ($query) {
$query->where('for_seating', 1);
},
])
->withCount([
'unscoredEntries' => function ($query) {
$query->where('for_seating', 1);
},
])
->with('flags')
->with('entries')
->get();
$auditionData = [];
foreach ($auditions as $audition) {
$noShowCount = $audition->entries->filter(function ($entry) {
return $entry->hasFlag('no_show');
})->count();
$auditionData[$audition->id] = [
'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'),
'audition' => $audition,
];
}
$auditionData = collect($auditionData);
return view('tabulation.status', compact('auditionData'));
}
}