withCount('entries')->orderBy('score_order')->orderBy('created_at', 'desc')->get(); return view('admin.auditions.index', ['auditions' => $auditions]); } public function create() { if (! Auth::user()->is_admin) { abort(403); } $events = Event::orderBy('name')->get(); return view('admin.auditions.create', ['events' => $events]); } public function store(Request $request) { if (! Auth::user()->is_admin) { abort(403); } $validData = request()->validate([ 'event_id' => ['required', 'exists:events,id'], 'name' => ['required'], 'entry_deadline' => ['required', 'date'], 'entry_fee' => ['required', 'numeric'], 'minimum_grade' => ['required', 'integer'], 'maximum_grade' => 'required|numeric|gte:minimum_grade', 'scoring_guide_id' => 'nullable|exists:scoring_guides,id', ], [ 'maximum_grade.gte' => 'The maximum grade must be greater than the minimum grade.', ]); $validData['for_seating'] = $request->get('for_seating') ? 1 : 0; $validData['for_advancement'] = $request->get('for_advancement') ? 1 : 0; if (empty($alidData['scoring_guide_id'])) { $validData['scoring_guide_id'] = 0; } Audition::create([ 'event_id' => $validData['event_id'], 'name' => $validData['name'], 'entry_deadline' => $validData['entry_deadline'], 'entry_fee' => $validData['entry_fee'] * 100, 'minimum_grade' => $validData['minimum_grade'], 'maximum_grade' => $validData['maximum_grade'], 'for_seating' => $validData['for_seating'], 'for_advancement' => $validData['for_advancement'], 'scoring_guide_id' => $validData['scoring_guide_id'], ]); return to_route('admin.auditions.index')->with('success', 'Audition created successfully'); } public function edit(Audition $audition) { if (! Auth::user()->is_admin) { abort(403); } $events = Event::orderBy('name')->get(); return view('admin.auditions.edit', ['audition' => $audition, 'events' => $events]); } public function update(Request $request, Audition $audition) { if (! Auth::user()->is_admin) { abort(403); } $validData = request()->validate([ 'event_id' => ['required', 'exists:events,id'], 'name' => ['required'], 'entry_deadline' => ['required', 'date'], 'entry_fee' => ['required', 'numeric'], 'minimum_grade' => ['required', 'integer'], 'maximum_grade' => 'required | numeric | gt:minimum_grade', ], [ 'maximum_grade.gt' => 'The maximum grade must be greater than the minimum grade.', ]); $validData['for_seating'] = $request->get('for_seating') ? 1 : 0; $validData['for_advancement'] = $request->get('for_advancement') ? 1 : 0; $audition->update([ 'event_id' => $validData['event_id'], 'name' => $validData['name'], 'entry_deadline' => $validData['entry_deadline'], 'entry_fee' => $validData['entry_fee'] * 100, 'minimum_grade' => $validData['minimum_grade'], 'maximum_grade' => $validData['maximum_grade'], 'for_seating' => $validData['for_seating'], 'for_advancement' => $validData['for_advancement'], ]); return to_route('admin.auditions.index')->with('success', 'Audition updated successfully'); } public function reorder(Request $request) { if (! Auth::user()->is_admin) { abort(403); } $order = $request->order; foreach ($order as $index => $id) { $audition = Audition::find($id); $audition->update(['score_order' => $index]); } return response()->json(['status' => 'success']); } public function roomUpdate(Request $request) { $auditions = $request->all(); foreach ($auditions as $audition) { Audition::where('id', $audition['id']) ->update([ 'room_id' => $audition['room_id'], 'order_in_room' => $audition['room_order'], ]); } return response()->json(['status' => 'success']); } /** * Update the scoring guide for an audition * Used by AJAX call on the scoring guide index page * request should include scoring_guide_id and audition_id * * @return JsonResponse */ public function scoringGuideUpdate(Request $request) { $audition = Audition::find($request->audition_id); if ($audition) { $audition->update([ 'scoring_guide_id' => $request->new_guide_id, ]); return response()->json(['success' => true]); } return response()->json(['success' => false], 404); } public function destroy(Audition $audition) { if ($audition->entries->count() > 0) { return redirect()->route('admin.auditions.index')->with('error', 'Cannot delete an audition with entries.'); } $audition->delete(); return to_route('admin.auditions.index')->with('success', 'Audition deleted successfully'); } public function prepareDraw() { if (! Auth::user()->is_admin) { abort(403); } $allAuditions = Audition::with('entries')->orderBy('score_order')->get(); $nodraw_auditions = $allAuditions->filter(function ($audition) { return $audition->has_no_draw(); }); $drawn_auditions = $allAuditions->filter(function ($audition) { return $audition->has_complete_draw(); }); $partial_draw_auditions = $allAuditions->filter(function ($audition) { return $audition->has_partial_draw(); }); return view('admin.entries.prepare_draw', compact('nodraw_auditions', 'drawn_auditions', 'partial_draw_auditions')); } public function runDraw(Request $request) { if (! Auth::user()->is_admin) { abort(403); } $draw_auditions = Audition::with('entries')->find(array_keys($request->input('auditions'))); foreach ($draw_auditions as $audition) { $audition->runDraw(); } return redirect(' / admin / auditions / run_draw'); } }