auditionadmin/app/Models/ScoreSheet.php

63 lines
1.7 KiB
PHP

<?php
namespace App\Models;
use App\Actions\Tabulation\CalculateScoreSheetTotal;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\HasOneThrough;
use Illuminate\Support\Facades\App;
class ScoreSheet extends Model
{
protected $fillable = [
'user_id',
'entry_id',
'subscores',
];
protected $casts = ['subscores' => 'json'];
public function entry(): BelongsTo
{
return $this->belongsTo(Entry::class);
}
public function judge(): BelongsTo
{
return $this->belongsTo(User::class, 'user_id');
}
public function audition(): HasOneThrough
{
return $this->hasOneThrough(
Audition::class, // The final model you want to access
Entry::class, // The intermediate model
'id', // Foreign key on the intermediate model (Entry)
'id', // Foreign key on the final model (Audition)
'entry_id', // Local key on the current model (ScoreSheet)
'audition_id' // Local key on the intermediate model (Entry)
);
}
public function getSubscore($id)
{
return $this->subscores[$id]['score'] ?? false;
}
public function isValid()
{
// TODO move to either TabulationService or a specific service for scoreValidation
$judges = $this->audition->judges;
return $judges->contains('id', $this->judge->id);
}
public function totalScore($mode)
{
$calculator = App::make(CalculateScoreSheetTotal::class);
return $calculator($mode, $this->entry, $this->judge);
}
}