diff --git a/app/Http/Controllers/EntryController.php b/app/Http/Controllers/EntryController.php index 9243145..6c16d8f 100644 --- a/app/Http/Controllers/EntryController.php +++ b/app/Http/Controllers/EntryController.php @@ -19,7 +19,7 @@ class EntryController extends Controller $entries = $entries->sortBy(function ($entry) { return $entry->student->last_name.$entry->student->first_name.$entry->audition->score_order; }); - $auditions = Audition::deadlineNotPast(); + $auditions = Audition::open()->get(); $students = Auth::user()->students; return view('entries.index', ['entries' => $entries, 'students' => $students, 'auditions' => $auditions]); diff --git a/app/Models/Audition.php b/app/Models/Audition.php index dfa3057..66be60c 100644 --- a/app/Models/Audition.php +++ b/app/Models/Audition.php @@ -2,6 +2,8 @@ namespace App\Models; +use Carbon\Carbon; +use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; @@ -25,11 +27,6 @@ class Audition extends Model protected $scored_entries_count; //Set by TabulationService - public static function deadlineNotPast() - { - return Audition::where('entry_deadline', '>=', now())->get(); - } - public function event(): BelongsTo { return $this->belongsTo(Event::class); @@ -50,7 +47,7 @@ class Audition extends Model return $this->belongsTo(ScoringGuide::class); } - public function dislpay_fee(): string + public function display_fee(): string { return '$'.number_format($this->entry_fee / 100, 2); } @@ -134,7 +131,7 @@ class Audition extends Model } /** - * @return BelongsToMany|\App\Models\User[] + * @return BelongsToMany|User[] */ public function judges(): array|BelongsToMany { @@ -185,4 +182,35 @@ class Audition extends Model // remove related auditionFlag where flag_name = $flag $this->flags()->where('flag_name', $flag)->delete(); } + + public function scopeOpen(Builder $query): void + { + $query->where('entry_deadline', '>=', Carbon::now()); + } + + public function scopeForSeating(Builder $query): void + { + $query->where('for_seating', 1); + } + + public function scopeForAdvancement(Builder $query): void + { + $query->where('for_advancement', 1); + } + + 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'); + }); + + } } diff --git a/app/Models/Entry.php b/app/Models/Entry.php index 680a4f4..d48f760 100644 --- a/app/Models/Entry.php +++ b/app/Models/Entry.php @@ -2,6 +2,7 @@ namespace App\Models; +use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; @@ -69,7 +70,7 @@ class Entry extends Model } - public function addFlag($flag) + public function addFlag($flag): void { if ($this->hasFlag($flag)) { return; @@ -78,7 +79,7 @@ class Entry extends Model $this->flags()->create(['flag_name' => $flag]); } - public function removeFlag($flag) + public function removeFlag($flag): void { // remove related auditionFlag where flag_name = $flag $this->flags()->where('flag_name', $flag)->delete(); @@ -100,4 +101,23 @@ class Entry extends Model { return $this->hasOne(Seat::class); } + + public function scopeForSeating(Builder $query): void + { + $query->where('for_seating', 1); + } + + public function scopeForAdvancement(Builder $query): void + { + $query->where('for_advancement', 1); + } + + public function scopeAvailable(Builder $query): void + { + $query->whereDoesntHave('flags', function (Builder $query) { + $query->where('flag_name', 'declined') + ->orWhere('flag_name', 'no-show') + ->orWhere('flag_name', 'failed-prelim'); + }); + } } diff --git a/app/Providers/InvoiceDataServiceProvider.php b/app/Providers/InvoiceDataServiceProvider.php index 6556ed4..439181f 100644 --- a/app/Providers/InvoiceDataServiceProvider.php +++ b/app/Providers/InvoiceDataServiceProvider.php @@ -27,12 +27,14 @@ class InvoiceDataServiceProvider extends ServiceProvider */ public function boot(): void { - $this->app->singleton(InvoiceDataService::class, function ($app) { - return match (auditionSetting('fee_structure')) { - 'oneFeePerEntry' => new InvoiceOneFeePerEntry($app->make(EntryService::class)), - 'oneFeePerStudent' => new InvoiceOneFeePerStudent($app->make(EntryService::class)), - default => throw new \Exception('Unknown Invoice Method'), - }; - }); + if (auditionSetting('fee_structure')) { + $this->app->singleton(InvoiceDataService::class, function ($app) { + return match (auditionSetting('fee_structure')) { + 'oneFeePerEntry' => new InvoiceOneFeePerEntry($app->make(EntryService::class)), + 'oneFeePerStudent' => new InvoiceOneFeePerStudent($app->make(EntryService::class)), + default => throw new \Exception('Unknown Invoice Method'), + }; + }); + } } } diff --git a/database/factories/AuditionFactory.php b/database/factories/AuditionFactory.php index 3b52d27..4cefeff 100644 --- a/database/factories/AuditionFactory.php +++ b/database/factories/AuditionFactory.php @@ -2,6 +2,8 @@ namespace Database\Factories; +use App\Models\Event; +use Carbon\Carbon; use Illuminate\Database\Eloquent\Factories\Factory; /** @@ -16,8 +18,44 @@ class AuditionFactory extends Factory */ public function definition(): array { + $instruments = [ + 'Flute', + 'Oboe', + 'Clarinet', + 'Bass Clarinet', + 'Contra Clarinet', + 'Bassoon', + 'Alto Sax', + 'Tenor Sax', + 'Bari Sax', + 'Trumpet', + 'Horn', + 'Trombone', + 'Euphonium', + 'Tuba', + 'String Bass', + 'Percussion', + ]; + + $event = Event::factory()->create(); + return [ - // + 'event_id' => $event->id, + 'name' => $this->faker->randomElement($instruments).$this->faker->randomNumber(1), + 'score_order' => 1, + 'entry_deadline' => Carbon::tomorrow(), + 'entry_fee' => 1000, + 'minimum_grade' => 7, + 'maximum_grade' => 12, + 'for_seating' => 1, + 'for_advancement' => 1, ]; } + + public function closed(?Carbon $entryDeadline = null): self + { + return $this->state( + fn (array $attributes) => ['entry_deadline' => $entryDeadline ?? Carbon::yesterday()] + ); + } } diff --git a/database/factories/EntryFactory.php b/database/factories/EntryFactory.php index ad03155..5ee40fa 100644 --- a/database/factories/EntryFactory.php +++ b/database/factories/EntryFactory.php @@ -2,6 +2,8 @@ namespace Database\Factories; +use App\Models\Audition; +use App\Models\Student; use Illuminate\Database\Eloquent\Factories\Factory; /** @@ -16,9 +18,28 @@ class EntryFactory extends Factory */ public function definition(): array { + $student = Student::factory()->create(); + $audition = Audition::factory()->create(); return [ - 'student_id' => 3, - 'audition_id' =>3 + 'student_id' => $student->id, + 'audition_id' => $audition->id, + 'draw_number' => null, + 'for_seating' => 1, + 'for_advancement' => 1, ]; } + + public function seatingOnly(): self + { + return $this->state( + fn (array $attributes) => ['for_advancement' => 0] + ); + } + + public function advanceOnly(): self + { + return $this->state( + fn (array $attributes) => ['for_seating' => 0] + ); + } } diff --git a/database/factories/EventFactory.php b/database/factories/EventFactory.php index 19b0bf9..ae4a7c9 100644 --- a/database/factories/EventFactory.php +++ b/database/factories/EventFactory.php @@ -17,7 +17,7 @@ class EventFactory extends Factory public function definition(): array { return [ - 'name' => 'Concert Band Auditions' + 'name' => $this->faker->name(), ]; } } diff --git a/database/factories/StudentFactory.php b/database/factories/StudentFactory.php index 44ed7c1..99efec3 100644 --- a/database/factories/StudentFactory.php +++ b/database/factories/StudentFactory.php @@ -2,6 +2,7 @@ namespace Database\Factories; +use App\Models\School; use Illuminate\Database\Eloquent\Factories\Factory; /** @@ -16,7 +17,9 @@ class StudentFactory extends Factory */ public function definition(): array { + $school = School::factory()->create(); return [ + 'school_id' => $school->id, 'first_name' => fake()->firstName(), 'last_name' => fake()->lastName(), 'grade' => rand(7,12), diff --git a/database/factories/UserFactory.php b/database/factories/UserFactory.php index 5c234c8..c4971cc 100644 --- a/database/factories/UserFactory.php +++ b/database/factories/UserFactory.php @@ -23,7 +23,11 @@ class UserFactory extends Factory */ public function definition(): array { - $judingPrefPossibilities = ['woodwinds','flute','clarinet','saxophones', 'low clarinets','oboe','bassoon','double reeds','brass','low brass','trumpet','trombone','horn','tuba','euphonium','percussion']; + $judingPrefPossibilities = [ + 'woodwinds', 'flute', 'clarinet', 'saxophones', 'low clarinets', 'oboe', 'bassoon', 'double reeds', 'brass', + 'low brass', 'trumpet', 'trombone', 'horn', 'tuba', 'euphonium', 'percussion', + ]; + return [ 'first_name' => fake()->firstName(), 'last_name' => fake()->lastName(), @@ -46,4 +50,18 @@ class UserFactory extends Factory 'email_verified_at' => null, ]); } + + public function admin(): static + { + return $this->state(fn (array $attributes) => [ + 'is_admin' => 1, + ]); + } + + public function tab(): static + { + return $this->state(fn (array $attributes) => [ + 'is_tab' => 1, + ]); + } } diff --git a/resources/views/admin/auditions/index.blade.php b/resources/views/admin/auditions/index.blade.php index 4f84350..527d197 100644 --- a/resources/views/admin/auditions/index.blade.php +++ b/resources/views/admin/auditions/index.blade.php @@ -25,40 +25,41 @@
- - @foreach($auditions as $audition) - - {{ $audition->event->name }} - {{ $audition->name }} - {{ $audition->entry_deadline }} - {{ $audition->dislpay_fee() }} - {{ $audition->minimum_grade }} - {{ $audition->maximum_grade }} - @if(auditionSetting('advanceTo')) - - @if($audition->for_seating) - - @else - - @endif - - - @if($audition->for_advancement) - - @else - - @endif - - @endif - {{ $audition->entries->count() }} - - @endforeach - + + @foreach($auditions as $audition) + + {{ $audition->event->name }} + {{ $audition->name }} + {{ $audition->entry_deadline }} + {{ $audition->display_fee() }} + {{ $audition->minimum_grade }} - {{ $audition->maximum_grade }} + @if(auditionSetting('advanceTo')) + + @if($audition->for_seating) + + @else + + @endif + + + @if($audition->for_advancement) + + @else + + @endif + + @endif + {{ $audition->entries->count() }} + + @endforeach +
-{{-- {{ $auditions->links('vendor.pagination.simple-audition') }}--}} + {{-- {{ $auditions->links('vendor.pagination.simple-audition') }}--}}