belongsTo(Event::class); } public function entries(): HasMany { return $this->hasMany(Entry::class); } public function unscoredEntries(): HasMany { return $this->hasMany(Entry::class) ->whereDoesntHave('totalScore') ->whereDoesntHave('flags', function ($query) { $query->where('flag_name', 'no_show'); }); } public function room(): BelongsTo { return $this->belongsTo(Room::class); } public function scoringGuide(): BelongsTo { return $this->belongsTo(ScoringGuide::class); } public function bonusScore(): BelongsToMany { return $this->belongsToMany(BonusScoreDefinition::class, 'bonus_score_audition_assignment'); } public function display_fee(): string { return '$'.number_format($this->entry_fee / 100, 2); } /** * @return BelongsToMany|User[] */ public function judges(): array|BelongsToMany { return $this->belongsToMany( User::class, // The related model 'room_user', // The intermediate table 'room_id', // The foreign key on the intermediate table 'user_id', // The related key on the intermediate table 'room_id', // The local key 'id' // The local ke ); } /** * Ensures judges_count property is always available */ public function getJudgesCountAttribute() { if (!isset($this->attributes['judges_count'])) { $this->attributes['judges_count'] = $this->judges()->count(); } return $this->attributes['judges_count']; } public function flags(): HasMany { return $this->hasMany(AuditionFlag::class); } public function hasFlag($flag): bool { $flags = []; foreach ($this->flags as $checkFlag) { $flags[] = $checkFlag->flag_name->value; } return in_array($flag, $flags); } public function addFlag($flag): void { if ($this->hasFlag($flag)) { return; } $enum = match ($flag) { 'drawn' => AuditionFlags::DRAWN, 'seats_published' => AuditionFlags::SEATS_PUBLISHED, 'advancement_published' => AuditionFlags::ADVANCEMENT_PUBLISHED, }; $this->flags()->create(['flag_name' => $enum]); $this->load('flags'); } public function removeFlag($flag): void { // remove related auditionFlag where flag_name = $flag $this->flags()->where('flag_name', $flag)->delete(); $this->load('flags'); } public function seats(): HasMany { return $this->hasMany(Seat::class); } public function getDoublerEntries(): Collection { return $this->entries() ->whereIn('student_id', function ($query) { $query->select('student_id') ->from('doubler_entry_counts') ->where('event_id', $this->event_id); }) ->get(); } public function scopeOpen(Builder $query): void { $currentDate = Carbon::now('America/Chicago'); $currentDate = $currentDate->format('Y-m-d'); $query->where('entry_deadline', '>=', $currentDate); } public function scopeForSeating(Builder $query): void { $query->where('for_seating', 1)->orderBy('score_order'); } public function scopeForAdvancement(Builder $query): void { $query->where('for_advancement', 1)->orderBy('score_order'); } public function scopeSeatsPublished(Builder $query): Builder { return $query->whereHas('flags', function (Builder $query) { $query->where('flag_name', 'seats_published'); }); } public function scopeAdvancementPublished(Builder $query): Builder { return $query->whereHas('flags', function (Builder $query) { $query->where('flag_name', 'advancement_published'); }); } }