get(); // Set auditions equal to the collection of auditions that do not have a related bonus score $unassignedAuditions = Audition::orderBy('score_order')->doesntHave('bonusScore')->get(); return view('admin.bonus-scores.index', compact('bonusScores', 'unassignedAuditions')); } public function store() { $validData = request()->validate([ 'name' => 'required|unique:bonus_score_definitions,name', 'max_score' => 'required|numeric', 'weight' => 'required|numeric', ]); BonusScoreDefinition::create($validData); return to_route('admin.bonus-scores.index')->with('success', 'Bonus Score Created'); } public function update(BonusScoreDefinition $bonusScore) { $validData = request()->validate([ 'name' => 'required|unique:bonus_score_definitions,name,'.$bonusScore->id, 'max_score' => 'required|numeric', 'weight' => 'required|numeric', ]); $bonusScore->update($validData); return to_route('admin.bonus-scores.index')->with('success', 'Bonus Score Updated'); } public function destroy(BonusScoreDefinition $bonusScore) { if ($bonusScore->auditions()->count() > 0) { return to_route('admin.bonus-scores.index')->with('error', 'Bonus Score has auditions attached'); } $bonusScore->delete(); return to_route('admin.bonus-scores.index')->with('success', 'Bonus Score Deleted'); } public function assignAuditions(Request $request) { // TODO: add pivot model to log changes to assignments $validData = $request->validate([ 'bonus_score_id' => 'required|exists:bonus_score_definitions,id', 'audition' => 'required|array', 'audition.*' => ['required', new ValidateAuditionKey()], ]); $bonusScore = BonusScoreDefinition::find($validData['bonus_score_id']); foreach ($validData['audition'] as $auditionId => $value) { try { $bonusScore->auditions()->attach($auditionId); } catch (Exception) { return redirect()->route('admin.bonus-scores.index')->with('error', 'Error assigning auditions to bonus score'); } } return redirect()->route('admin.bonus-scores.index')->with('success', 'Auditions assigned to bonus score'); } public function unassignAudition(Audition $audition) { // TODO: add pivot model to log changes to assignments $audition->bonusScore()->detach(); return redirect()->route('admin.bonus-scores.index')->with('success', 'Audition unassigned from bonus score'); } public function judges() { //TODO Need to show if judge is assigned, and show bonus assignments or normal judging page $bonusScores = BonusScoreDefinition::all(); $users = User::orderBy('last_name')->orderBy('first_name')->get(); return view('admin.bonus-scores.judge-assignments', compact('bonusScores', 'users')); } public function assignJudge(BonusScoreDefinition $bonusScore) { $validData = request()->validate([ 'judge' => 'required|exists:users,id', ]); $bonusScore->judges()->attach($validData['judge']); return redirect()->route('admin.bonus-scores.judges')->with('success', 'Judge assigned to bonus score'); } public function removeJudge(BonusScoreDefinition $bonusScore) { $validData = request()->validate([ 'judge' => 'required|exists:users,id', ]); $bonusScore->judges()->detach($validData['judge']); return redirect()->route('admin.bonus-scores.judges')->with('success', 'Judge removed from bonus score'); } }