AdvancementStatus page working

This commit is contained in:
Matt Young 2024-07-13 23:29:29 -05:00
parent 026f2002e5
commit cdb7f9b04f
3 changed files with 84 additions and 23 deletions

View File

@ -5,23 +5,48 @@ namespace App\Http\Controllers\Tabulation;
use App\Http\Controllers\Controller;
use App\Models\Audition;
use App\Models\Entry;
use App\Services\TabulationService;
use Illuminate\Http\Request;
class AdvancementController extends Controller
{
protected TabulationService $tabulationService;
public function __construct(TabulationService $tabulationService)
public function __construct()
{
$this->tabulationService = $tabulationService;
}
public function status()
{
$auditions = $this->tabulationService->getAuditionsWithStatus('advancement');
$auditions = Audition::forAdvancement()
->with('flags')
->withCount([
'entries' => function ($query) {
$query->where('for_advancement', 1);
},
])
->withCount([
'unscoredEntries' => function ($query) {
$query->where('for_advancement', 1);
},
])
->get();
$auditionData = [];
$auditions->each(function ($audition) use (&$auditionData) {
$scoredPercent = ($audition->entries_count > 0) ?
round((($audition->entries_count - $audition->unscored_entries_count) / $audition->entries_count) * 100)
: 100;
$auditionData[] = [
'id' => $audition->id,
'name' => $audition->name,
'entries_count' => $audition->entries_count,
'unscored_entries_count' => $audition->unscored_entries_count,
'scored_entries_count' => $audition->entries_count - $audition->unscored_entries_count,
'scored_percentage' => $scoredPercent,
'scoring_complete' => $audition->unscored_entries_count == 0,
'published' => $audition->hasFlag('advancement_published'),
];
});
return view('tabulation.advancement.status', compact('auditions'));
return view('tabulation.advancement.status', compact('auditionData'));
}
public function ranking(Request $request, Audition $audition)
@ -29,7 +54,6 @@ class AdvancementController extends Controller
$entries = $this->tabulationService->auditionEntries($audition->id, 'advancement');
$entries->load('advancementVotes');
$scoringComplete = $entries->every(function ($entry) {
return $entry->scoring_complete;
});
@ -47,7 +71,8 @@ class AdvancementController extends Controller
$entry->addFlag('will_advance');
}
return redirect()->route('advancement.ranking', ['audition' => $audition->id])->with('success', 'Passers have been set successfully');
return redirect()->route('advancement.ranking', ['audition' => $audition->id])->with('success',
'Passers have been set successfully');
}
public function clearAuditionPassers(Request $request, Audition $audition)
@ -57,6 +82,7 @@ class AdvancementController extends Controller
$entry->removeFlag('will_advance');
}
return redirect()->route('advancement.ranking', ['audition' => $audition->id])->with('success', 'Passers have been cleared successfully');
return redirect()->route('advancement.ranking', ['audition' => $audition->id])->with('success',
'Passers have been cleared successfully');
}
}

View File

@ -13,33 +13,27 @@
</tr>
</thead>
<x-table.body>
@foreach($auditions as $audition)
@php
$percent = 100;
if($audition->advancement_entries_count > 0) {
$percent = round(($audition->scored_entries_count / $audition->advancement_entries_count) * 100);
}
@endphp
@foreach($auditionData as $audition)
<tr class="hover:bg-gray-50">
<x-table.td class="">
<a href="{{ route('advancement.ranking', ['audition' => $audition->id]) }}">
<a href="{{ route('advancement.ranking', ['audition' => $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->advancement_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['scored_entries_count'] }} / {{ $audition['entries_count'] }} 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['scored_percentage'] }}%"></div>
</div>
</a>
</x-table.td>
<td class="px-8">
@if( $audition->scored_entries_count == $audition->advancement_entries_count)
@if( $audition['scoring_complete'])
<x-icons.checkmark color="green"/>
@endif
</td>
<td class="px-8">
@if( $audition->hasFlag('advancement_published'))
@if( $audition['published'])
<x-icons.checkmark color="green"/>
@endif
</td>

View File

@ -0,0 +1,41 @@
<?php
use App\Models\Audition;
use App\Models\User;
use Illuminate\Foundation\Testing\RefreshDatabase;
use function Pest\Laravel\actingAs;
use function Pest\Laravel\get;
uses(RefreshDatabase::class);
it('does not answer a regular user or guest', function () {
get(route('advancement.status'))
->assertRedirect(route('home'));
actingAs(User::factory()->create());
get(route('advancement.status'))
->assertRedirect(route('dashboard'))
->assertSessionHas('error', 'You are not authorized to perform this action');
});
it('responds to an admin or tab user', function () {
actAsAdmin();
get(route('advancement.status'))
->assertOk();
actAsTab();
get(route('advancement.status'))
->assertOk();
});
it('includes advancement auditions', function () {
$audition = Audition::factory()->create();
actAsAdmin();
get(route('advancement.status'))
->assertOk()
->assertSee($audition->name);
});
it('does not include auditions not for advancement', function () {
$audition = Audition::factory()->seatingOnly()->create();
actAsAdmin();
get(route('advancement.status'))
->assertOk()
->assertDontSee($audition->name);
});