get();
$students = Student::with(['school'])->withCount('entries')->orderBy('last_name')->orderBy('first_name');
// Apply filters
if ($filters) {
if ($filters['first_name']) {
$students = $students->where('first_name', 'like', '%'.$filters['first_name'].'%');
}
if ($filters['last_name']) {
$students = $students->where('last_name', 'like', '%'.$filters['last_name'].'%');
}
if ($filters['school'] && $filters['school'] != 'all') {
$students = $students->where('school_id', $filters['school']);
}
if ($filters['grade'] && $filters['grade'] != 'all') {
$students = $students->where('grade', $filters['grade']);
}
}
$students = $students->paginate(15);
$grades = Student::distinct()->pluck('grade');
return view('admin.students.index', compact('students', 'schools', 'grades'));
}
public function create()
{
$minGrade = $this->minimumGrade();
$maxGrade = $this->maximumGrade();
$schools = School::orderBy('name')->get();
return view('admin.students.create', ['schools' => $schools, 'minGrade' => $minGrade, 'maxGrade' => $maxGrade]);
}
public function store(StudentStoreRequest $request, CreateStudent $creator)
{
/** @noinspection PhpUnhandledExceptionInspection */
$creator([
'first_name' => $request['first_name'],
'last_name' => $request['last_name'],
'grade' => $request['grade'],
'school_id' => $request['school_id'],
'optional_data' => $request->optional_data,
]);
return redirect(route('admin.students.index'))->with('success', 'Student created successfully');
}
public function edit(Student $student)
{
$minGrade = $this->minimumGrade();
$maxGrade = $this->maximumGrade();
$schools = School::orderBy('name')->get();
$student->loadCount('entries');
$event_entries = $student->entries()->with('audition.flags')->get()->groupBy('audition.event_id');
$events = Event::all();
return view('admin.students.edit',
compact('student', 'schools', 'minGrade', 'maxGrade', 'events', 'event_entries'));
}
public function update(StudentStoreRequest $request, Student $student)
{
$student->update([
'first_name' => $request['first_name'],
'last_name' => $request['last_name'],
'grade' => $request['grade'],
'school_id' => $request['school_id'],
'optional_data' => $request->optional_data,
]);
return redirect('/admin/students')->with('success', 'Student updated');
}
public function destroy(Student $student)
{
if ($student->entries()->count() > 0) {
return to_route('admin.students.index')->with('error', 'Student has entries and cannot be deleted');
}
$name = $student->full_name();
$message = 'Deleted student #'.$student->id.'
Name: '.$student->full_name().'
Grade: '.$student->grade.'
School: '.$student->school->name;
AuditLogEntry::create([
'user' => auth()->user()->email,
'ip_address' => request()->ip(),
'message' => $message,
'affected' => [
'students' => [$student->id],
'schools' => [$student->school_id],
],
]);
$student->delete();
return to_route('admin.students.index')->with('success', 'Student '.$name.' deleted successfully.');
}
private function minimumGrade(): int
{
$nomMin = NominationEnsemble::min('minimum_grade');
$normMin = Audition::min('minimum_grade');
if (is_null($nomMin)) {
$minGrade = $normMin;
} else {
$minGrade = min($nomMin, $normMin);
}
return $minGrade;
}
private function maximumGrade(): int
{
$nomMax = NominationEnsemble::max('maximum_grade');
$normMax = Audition::max('maximum_grade');
if (is_null($nomMax)) {
$maxGrade = $normMax;
} else {
$maxGrade = max($nomMax, $normMax);
}
return $maxGrade;
}
}