Add action to total an entries scores.
This commit is contained in:
parent
3c545f0dce
commit
e79e7e222d
|
|
@ -0,0 +1,72 @@
|
|||
<?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);
|
||||
}
|
||||
}
|
||||
|
|
@ -8,4 +8,9 @@ use Illuminate\Database\Eloquent\Model;
|
|||
class EntryTotalScore extends Model
|
||||
{
|
||||
use HasFactory;
|
||||
|
||||
protected $casts = [
|
||||
'seating_subscore_totals' => 'json',
|
||||
'advancement_subscore_totals' => 'json',
|
||||
];
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue