redo-ensemble-table #1
|
|
@ -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,
|
||||||
]);
|
]);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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'));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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 = [];
|
||||||
|
|
@ -23,6 +23,6 @@ class EtudesController extends Controller
|
||||||
->get()->keyBy('instrument_id');
|
->get()->keyBy('instrument_id');
|
||||||
}
|
}
|
||||||
|
|
||||||
return view('etudes', compact('ensembles', 'schoolYear', 'currentSet', 'instruments','etudes'));
|
return view('etudes', compact('ensembles', 'schoolYear', 'currentSet', 'instruments', 'etudes'));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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.");
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Loading…
Reference in New Issue