Initial work on recaps

This commit is contained in:
Matt Young 2024-11-04 07:13:52 -06:00
parent ce4e3e6984
commit c660e3b4f4
4 changed files with 126 additions and 0 deletions

View File

@ -0,0 +1,60 @@
<?php
namespace App\Http\Controllers\Admin;
use App\Actions\Tabulation\RankAuditionEntries;
use App\Http\Controllers\Controller;
use App\Models\Audition;
use Illuminate\Support\Facades\App;
class RecapController extends Controller
{
public function selectAudition()
{
$auditions = Audition::orderBy('score_order')->get();
return view('admin.recap.selectAudition', compact('auditions'));
}
public function showRecap(Audition $audition)
{
$ranker = App::make(RankAuditionEntries::class);
$subscores = $audition->scoringGuide->subscores()->orderBy('tiebreak_order')->get();
$judges = $audition->judges;
$entries = $ranker->rank('seating', $audition);
$recapRows = [];
$rowOn = 1;
foreach ($entries as $entry) {
$recapRows[$rowOn]['rank'] = $entry->raw_rank;
$recapRows[$rowOn]['name'] = $entry->student->full_name(true);
$recapRows[$rowOn]['school'] = $entry->student->school->name;
$recapRows[$rowOn]['entryId'] = $entry->id;
foreach ($entry->scoreSheets as $sheet) {
foreach ($sheet->subscores as $subscore) {
$recapRows[$rowOn]['subscores']['judge'.$sheet->user_id][$subscore['subscore_name']] = $subscore['score'];
}
}
$recapRows[$rowOn]['total_score'] = $entry['score_totals'][0];
$rowOn++;
}
//dd($recapRows);
// Calculate ordinals for each score
$subscoreOrdinals = [];
$ssOn = 1;
foreach ($subscores as $subscore) {
$sortedEntries = $entries->sortByDesc(function ($entry) use ($ssOn) {
return $entry['score_totals'][$ssOn];
});
$thisOrdinal = 1;
foreach ($sortedEntries as $entry) {
$subscoreOrdinals['entry'.$entry->id][$ssOn] = $thisOrdinal;
$thisOrdinal++;
}
$ssOn++;
}
return view('admin.recap.recap', compact('audition', 'subscores', 'judges', 'entries', 'recapRows', 'subscoreOrdinals'));
}
}

View File

@ -0,0 +1,50 @@
<x-layout.app>
<x-layout.page-header>{{$audition->name}} Recap</x-layout.page-header>
<x-card.card class="mt-3">
<x-table.table>
<thead>
<tr>
<x-table.th rowspan="2">#</x-table.th>
<x-table.th rowspan="2">Name</x-table.th>
@foreach($subscores as $subscore)
<x-table.th colspan="{{ $judges->count() + 1 }}">{{ $subscore->name }}</x-table.th>
@endforeach
<x-table.th rowspan="2">Total</x-table.th>
</tr>
<tr>
@foreach($subscores as $subscore)
@foreach($judges as $judge)
<x-table.th>{{ $judge->last_name }}</x-table.th>
@endforeach
<x-table.th>Tot</x-table.th>
@endforeach
</tr>
</thead>
<x-table.body>
@foreach($recapRows as $row)
<tr>
<x-table.td>{{$row['rank']}}</x-table.td>
<x-table.td>{{$row['name']}}<br>{{$row['school']}}</x-table.td>
@php ($ssTotal = 0)
@php ($ssOn = 1)
@foreach($subscores as $subscore)
@foreach($judges as $judge)
<x-table.td>
{{ $row['subscores']['judge'.$judge->id][$subscore->name] }}
</x-table.td>
@php ($ssTotal += $row['subscores']['judge'.$judge->id][$subscore->name])
@endforeach
<x-table.td>
{{ $ssTotal }}<br>
( {{ $subscoreOrdinals['entry'.$row['entryId']][$ssOn] }} )
</x-table.td>
@php($ssOn++)
@endforeach
<x-table.td>{{$row['total_score']}}</x-table.td>
</tr>
@endforeach
</x-table.body>
</x-table.table>
</x-card.card>
</x-layout.app>

View File

@ -0,0 +1,13 @@
<x-layout.app>
<x-slot:page_title>Recap - Select Audition</x-slot:page_title>
<x-card.card class="max-w-lg mx-auto">
<x-card.heading>Select Audition</x-card.heading>
<x-card.list.body>
@foreach($auditions as $audition)
<x-card.list.row>
<a href="{{route('admin.recap.recap',$audition->id)}}">{{$audition->name}}</a>
</x-card.list.row>
@endforeach
</x-card.list.body>
</x-card.card>
</x-layout.app>

View File

@ -14,6 +14,7 @@ use App\Http\Controllers\Admin\PrintCards;
use App\Http\Controllers\Admin\PrintRoomAssignmentsController; use App\Http\Controllers\Admin\PrintRoomAssignmentsController;
use App\Http\Controllers\Admin\PrintSignInSheetsController; use App\Http\Controllers\Admin\PrintSignInSheetsController;
use App\Http\Controllers\Admin\PrintStandNameTagsController; use App\Http\Controllers\Admin\PrintStandNameTagsController;
use App\Http\Controllers\Admin\RecapController;
use App\Http\Controllers\Admin\RoomController; use App\Http\Controllers\Admin\RoomController;
use App\Http\Controllers\Admin\SchoolController; use App\Http\Controllers\Admin\SchoolController;
use App\Http\Controllers\Admin\ScoringGuideController; use App\Http\Controllers\Admin\ScoringGuideController;
@ -27,6 +28,8 @@ Route::middleware(['auth', 'verified', CheckIfAdmin::class])->prefix('admin/')->
Route::get('/logs', App\Http\Controllers\Admin\LogViewer::class)->name('admin.view_logs'); Route::get('/logs', App\Http\Controllers\Admin\LogViewer::class)->name('admin.view_logs');
Route::get('/export_results', ExportResultsController::class)->name('admin.export_results'); Route::get('/export_results', ExportResultsController::class)->name('admin.export_results');
Route::get('/print_stand_name_tags', PrintStandNameTagsController::class)->name('admin.print_stand_name_tags'); Route::get('/print_stand_name_tags', PrintStandNameTagsController::class)->name('admin.print_stand_name_tags');
Route::get('/recap', [RecapController::class, 'selectAudition'])->name('admin.recap.selectAudition');
Route::get('/recap/{audition}', [RecapController::class, 'showRecap'])->name('admin.recap.recap');
Route::post('/auditions/roomUpdate', [ Route::post('/auditions/roomUpdate', [
AuditionController::class, 'roomUpdate', AuditionController::class, 'roomUpdate',