namespace App\Models;
+use App\Events\ParticipantChanged;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
{
use HasFactory;
+
+ public function getRunners() {
+ $runners = [];
+ foreach ($this->participants as $participant) {
+ if (in_array('runner', $participant->roles)) {
+ $runners[] = $participant;
+ }
+ }
+ return $runners;
+ }
+
+ public function hasScoreboard() {
+ return $this->type == 'signup-async';
+ }
+
+ public function updatePlacement() {
+ $runners = [];
+ foreach ($this->participants as $p) {
+ if ($p->isRunner()) {
+ $p->score = 0;
+ $runners[] = $p;
+ } else {
+ $p->updatePlacement(null, null);
+ }
+ }
+ if (empty($runners)) {
+ return;
+ }
+ foreach ($this->rounds as $round) {
+ foreach ($runners as $p) {
+ $result = $p->findResult($round);
+ if ($result) {
+ $p->score += $result->score;
+ }
+ }
+ }
+
+ usort($runners, [Participant::class, 'compareScore']);
+ $reversed = array_reverse($runners);
+ $placement = count($runners);
+ $skipped = 0;
+ $lastScore = $runners[0]->score;
+ foreach ($runners as $p) {
+ if ($p->score > $lastScore) {
+ $placement -= $skipped;
+ $skipped = 1;
+ $lastScore = $p->score;
+ } else {
+ ++$skipped;
+ }
+ $p->updatePlacement($p->score, $placement);
+ }
+ }
+
+
+ public function applications() {
+ return $this->hasMany(Application::class);
+ }
+
public function participants() {
return $this->hasMany(Participant::class);
}
return $this->hasMany(Round::class)->orderBy('number', 'DESC');
}
+
+ protected $casts = [
+ 'accept_applications' => 'boolean',
+ 'locked' => 'boolean',
+ 'no_record' => 'boolean',
+ ];
+
}