73 lines
2.9 KiB
PHP
73 lines
2.9 KiB
PHP
<?php
|
|
|
|
namespace App\Actions\Tabulation;
|
|
|
|
use App\Models\Entry;
|
|
use App\Models\EntryTotalScore;
|
|
use App\Models\ScoreSheet;
|
|
|
|
class TotalEntryScores
|
|
{
|
|
public function __construct()
|
|
{
|
|
}
|
|
|
|
public function __invoke(Entry $entry, bool $force_recalculation = false): void
|
|
{
|
|
if ($force_recalculation) {
|
|
EntryTotalScore::where('entry_id', $entry->id)->delete();
|
|
}
|
|
// bail out if a total score is already calculated
|
|
if (EntryTotalScore::where('entry_id', $entry->id)->count() > 0) {
|
|
return;
|
|
}
|
|
$requiredSubscores = $entry->audition->scoringGuide->subscores;
|
|
$newTotaledScore = EntryTotalScore::make();
|
|
$newTotaledScore->entry_id = $entry->id;
|
|
|
|
// deal with seating scores
|
|
$scoreSheets = ScoreSheet::where('entry_id', $entry->id)->orderBy('seating_total', 'desc')->get();
|
|
if (auditionSetting('olympic_scoring' && $scoreSheets->count() > 2)) {
|
|
// under olympic scoring, drop the first and last element
|
|
$scoreSheets->shift();
|
|
$scoreSheets->pop();
|
|
}
|
|
$newTotaledScore->seating_total = $scoreSheets->avg('seating_total');
|
|
$seatingSubscores = $requiredSubscores
|
|
->filter(fn ($subscore) => $subscore->for_seating == true)
|
|
->sortBy('tiebreak_order');
|
|
$total_seating_subscores = [];
|
|
foreach ($seatingSubscores as $subscore) {
|
|
$runningTotal = 0;
|
|
foreach ($scoreSheets as $scoreSheet) {
|
|
$runningTotal += $scoreSheet->subscores[$subscore->id]['score'];
|
|
}
|
|
$total_seating_subscores[] = $runningTotal / $scoreSheets->count();
|
|
}
|
|
$newTotaledScore->seating_subscore_totals = $total_seating_subscores;
|
|
|
|
// deal with advancement scores
|
|
$scoreSheets = ScoreSheet::where('entry_id', $entry->id)->orderBy('advancement_total', 'desc')->get();
|
|
if (auditionSetting('olympic_scoring' && $scoreSheets->count() > 2)) {
|
|
// under olympic scoring, drop the first and last element
|
|
$scoreSheets->shift();
|
|
$scoreSheets->pop();
|
|
}
|
|
$newTotaledScore->advancement_total = $scoreSheets->avg('advancement_total');
|
|
$advancement_subscores = $requiredSubscores
|
|
->filter(fn ($subscore) => $subscore->for_advance == true)
|
|
->sortBy('tiebreak_order');
|
|
$total_advancement_subscores = [];
|
|
foreach ($advancement_subscores as $subscore) {
|
|
$runningTotal = 0;
|
|
foreach ($scoreSheets as $scoreSheet) {
|
|
$runningTotal += $scoreSheet->subscores[$subscore->id]['score'];
|
|
}
|
|
$total_advancement_subscores[] = $runningTotal / $scoreSheets->count();
|
|
}
|
|
$newTotaledScore->advancement_subscore_totals = $total_advancement_subscores;
|
|
$newTotaledScore->save();
|
|
dd($newTotaledScore);
|
|
}
|
|
}
|