redo-ensemble-table #1

Merged
matt merged 4 commits from redo-ensemble-table into main 2026-01-02 02:40:10 +00:00
9 changed files with 87 additions and 26 deletions
Showing only changes of commit ee7cb96d03 - Show all commits

View File

@ -4,8 +4,8 @@ namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller; use App\Http\Controllers\Controller;
use App\Http\Requests\EtudeUploadRequest; use App\Http\Requests\EtudeUploadRequest;
use App\Models\AuditionedEnsemble;
use App\Models\AuditionEtude; use App\Models\AuditionEtude;
use App\Models\Ensemble;
use App\Models\Instrument; use App\Models\Instrument;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Support\Facades\Storage; use Illuminate\Support\Facades\Storage;
@ -28,7 +28,7 @@ class AuditionEtudeController extends Controller
public function create() public function create()
{ {
$instruments = Instrument::orderBy('score_order')->get(); $instruments = Instrument::orderBy('score_order')->get();
$ensembles = AuditionedEnsemble::all(); $ensembles = Ensemble::all();
return view('admin.audition_etude.create', [ return view('admin.audition_etude.create', [
'instruments' => $instruments, 'instruments' => $instruments,
@ -42,7 +42,7 @@ class AuditionEtudeController extends Controller
public function store(EtudeUploadRequest $request) public function store(EtudeUploadRequest $request)
{ {
$instrument = Instrument::find($request->instrument_id); $instrument = Instrument::find($request->instrument_id);
$ensemble = AuditionedEnsemble::find($request->auditioned_ensemble_id); $ensemble = Ensemble::find($request->ensemble_id);
$filename = $ensemble->name.' '.$instrument->instrument.' Set '.$request->set.'.pdf'; $filename = $ensemble->name.' '.$instrument->instrument.' Set '.$request->set.'.pdf';
$filename = str_replace(' ', '_', $filename); $filename = str_replace(' ', '_', $filename);
@ -52,7 +52,7 @@ class AuditionEtudeController extends Controller
AuditionEtude::create([ AuditionEtude::create([
'instrument_id' => $request->instrument_id, 'instrument_id' => $request->instrument_id,
'auditioned_ensemble_id' => $request->auditioned_ensemble_id, 'ensemble_id' => $request->ensemble_id,
'set' => $request->set, 'set' => $request->set,
'file_path' => $path, 'file_path' => $path,
'original_filename' => $originalFilename, 'original_filename' => $originalFilename,
@ -61,7 +61,7 @@ class AuditionEtudeController extends Controller
session([ session([
'previous_instrument_id' => $request->instrument_id, 'previous_instrument_id' => $request->instrument_id,
'previous_auditioned_ensemble_id' => $request->auditioned_ensemble_id, 'previous_ensemble_id' => $request->ensemble_id,
'previous_set' => $request->set, 'previous_set' => $request->set,
]); ]);

View File

@ -3,15 +3,16 @@
namespace App\Http\Controllers\Admin; namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller; use App\Http\Controllers\Controller;
use App\Models\AuditionedEnsemble; use App\Models\Ensemble;
use App\Models\Instrument; use App\Models\Instrument;
class AuditionEtudeGridController extends Controller class AuditionEtudeGridController extends Controller
{ {
public function index() public function index()
{ {
$ensembles = AuditionedEnsemble::all(); $ensembles = Ensemble::all();
$instruments = Instrument::orderBy('score_order')->get(); $instruments = Instrument::orderBy('score_order')->get();
return view('admin.audition_etude.grid', compact('ensembles', 'instruments')); return view('admin.audition_etude.grid', compact('ensembles', 'instruments'));
} }
} }

View File

@ -2,7 +2,7 @@
namespace App\Http\Controllers; namespace App\Http\Controllers;
use App\Models\AuditionedEnsemble; use App\Models\Ensemble;
use App\Models\Instrument; use App\Models\Instrument;
use App\Services\AuditionEtudeService; use App\Services\AuditionEtudeService;
@ -10,7 +10,7 @@ class EtudesController extends Controller
{ {
public function __invoke(AuditionEtudeService $service) public function __invoke(AuditionEtudeService $service)
{ {
$ensembles = AuditionedEnsemble::all(); $ensembles = Ensemble::all();
$instruments = Instrument::has('etudes')->withCount('etudes')->get(); $instruments = Instrument::has('etudes')->withCount('etudes')->get();
$schoolYear = $service->getActiveSchoolYear(); $schoolYear = $service->getActiveSchoolYear();
$currentSet = []; $currentSet = [];

View File

@ -2,7 +2,7 @@
namespace App\Http\Requests; namespace App\Http\Requests;
use App\Models\AuditionedEnsemble; use App\Models\Ensemble;
use Illuminate\Foundation\Http\FormRequest; use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Validation\Rule; use Illuminate\Validation\Rule;
@ -25,18 +25,18 @@ class EtudeUploadRequest extends FormRequest
{ {
return [ return [
'auditioned_ensemble_id' => ['required', 'exists:auditioned_ensembles,id'], 'ensemble_id' => ['required', 'exists:ensembles,id'],
'instrument_id' => ['required', 'exists:instruments,id'], 'instrument_id' => ['required', 'exists:instruments,id'],
'set' => [ 'set' => [
'required', 'required',
'numeric', 'numeric',
'min:1', 'min:1',
Rule::unique('audition_etudes') Rule::unique('audition_etudes')
->where('auditioned_ensemble_id', $this->auditioned_ensemble_id) ->where('ensemble_id', $this->ensemble_id)
->where('instrument_id', $this->instrument_id), ->where('instrument_id', $this->instrument_id),
function ($attribute, $value, $fail) { function ($attribute, $value, $fail) {
/** @noinspection PhpUndefinedFieldInspection */ /** @noinspection PhpUndefinedFieldInspection */
$ensemble = AuditionedEnsemble::find($this->auditioned_ensemble_id); $ensemble = Ensemble::find($this->ensemble_id);
if ($ensemble && $value > $ensemble->set_count) { if ($ensemble && $value > $ensemble->set_count) {
$fail("The set number cannot exceed {$ensemble->set_count} for this ensemble."); $fail("The set number cannot exceed {$ensemble->set_count} for this ensemble.");
} }

View File

@ -9,7 +9,7 @@ use Illuminate\Database\Eloquent\Relations\BelongsTo;
class AuditionEtude extends Model class AuditionEtude extends Model
{ {
protected $fillable = [ protected $fillable = [
'instrument_id', 'auditioned_ensemble_id', 'set', 'original_filename', 'file_path', 'file_size', 'instrument_id', 'ensemble_id', 'set', 'original_filename', 'file_path', 'file_size',
]; ];
public function instrument(): BelongsTo public function instrument(): BelongsTo
@ -17,9 +17,9 @@ class AuditionEtude extends Model
return $this->belongsTo(Instrument::class); return $this->belongsTo(Instrument::class);
} }
public function auditionedEnsemble(): BelongsTo public function ensemble(): BelongsTo
{ {
return $this->belongsTo(AuditionedEnsemble::class); return $this->belongsTo(Ensemble::class);
} }
protected function humanReadableFileSize(): Attribute protected function humanReadableFileSize(): Attribute

View File

@ -5,7 +5,7 @@ namespace App\Models;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\HasMany; use Illuminate\Database\Eloquent\Relations\HasMany;
class AuditionedEnsemble extends Model class Ensemble extends Model
{ {
protected $fillable = [ protected $fillable = [
'name', 'set_count', 'name', 'set_count',
@ -13,6 +13,6 @@ class AuditionedEnsemble extends Model
public function etudes(): HasMany public function etudes(): HasMany
{ {
return $this->hasMany(AuditionEtude::class); return $this->hasMany(AuditionEtude::class, 'ensemble_id');
} }
} }

View File

@ -2,7 +2,7 @@
namespace App\Services; namespace App\Services;
use App\Models\AuditionedEnsemble; use App\Models\Ensemble;
use Carbon\Carbon; use Carbon\Carbon;
readonly class AuditionEtudeService readonly class AuditionEtudeService
@ -62,14 +62,14 @@ readonly class AuditionEtudeService
* Sets rotate annually based on the ensemble's set count. * Sets rotate annually based on the ensemble's set count.
* The rotation is calculated from the configured start year. * The rotation is calculated from the configured start year.
* *
* @param AuditionedEnsemble $ensemble The ensemble to get the set for * @param Ensemble $ensemble The ensemble to get the set for
* @param int|null $year Optional year. Defaults to current audition year. * @param int|null $year Optional year. Defaults to current audition year.
* @return int The set number (1 to ensemble's set_count) * @return int The set number (1 to ensemble's set_count)
* *
* @example * @example
* getSetForEnsemble($ensemble, 2024) // Returns the set number for 2024 * getSetForEnsemble($ensemble, 2024) // Returns the set number for 2024
*/ */
public function getSetForEnsemble(AuditionedEnsemble $ensemble, ?int $year = null): int public function getSetForEnsemble(Ensemble $ensemble, ?int $year = null): int
{ {
$year = $year ?? $this->getCurrentAuditionYear(); $year = $year ?? $this->getCurrentAuditionYear();
$setCount = $ensemble->set_count; $setCount = $ensemble->set_count;

View File

@ -0,0 +1,61 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
// Rename the auditioned_ensembles table to ensembles
Schema::rename('auditioned_ensembles', 'ensembles');
// Update the foreign key on audition_etudes table
Schema::table('audition_etudes', function (Blueprint $table) {
// Drop the existing foreign key constraint
$table->dropForeign(['auditioned_ensemble_id']);
// Rename the column
$table->renameColumn('auditioned_ensemble_id', 'ensemble_id');
});
// Re-add the foreign key constraint with the new name
Schema::table('audition_etudes', function (Blueprint $table) {
$table->foreign('ensemble_id')
->references('id')
->on('ensembles')
->cascadeOnDelete();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
// Drop the foreign key before renaming
Schema::table('audition_etudes', function (Blueprint $table) {
$table->dropForeign(['ensemble_id']);
});
// Rename the column back
Schema::table('audition_etudes', function (Blueprint $table) {
$table->renameColumn('ensemble_id', 'auditioned_ensemble_id');
});
// Rename the table back to auditioned_ensembles
Schema::rename('ensembles', 'auditioned_ensembles');
// Re-add the original foreign key
Schema::table('audition_etudes', function (Blueprint $table) {
$table->foreign('auditioned_ensemble_id')
->references('id')
->on('auditioned_ensembles')
->cascadeOnDelete();
});
}
};

View File

@ -2,11 +2,10 @@
namespace Database\Seeders; namespace Database\Seeders;
use App\Models\AuditionedEnsemble; use App\Models\Ensemble;
use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder; use Illuminate\Database\Seeder;
class AuditionedEnsembleSeeder extends Seeder class EnsembleSeeder extends Seeder
{ {
/** /**
* Run the database seeds. * Run the database seeds.
@ -19,6 +18,6 @@ class AuditionedEnsembleSeeder extends Seeder
['name' => 'Seventh Grade', 'set_count' => 1], ['name' => 'Seventh Grade', 'set_count' => 1],
['name' => 'Jazz', 'set_count' => 3], ['name' => 'Jazz', 'set_count' => 3],
]; ];
AuditionedEnsemble::insert($defaults); Ensemble::insert($defaults);
} }
} }