156 lines
5.0 KiB
PHP
156 lines
5.0 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers\Admin;
|
|
|
|
use App\Actions\Students\CreateStudent;
|
|
use App\Http\Controllers\Controller;
|
|
use App\Http\Requests\StudentStoreRequest;
|
|
use App\Models\Audition;
|
|
use App\Models\AuditLogEntry;
|
|
use App\Models\Event;
|
|
use App\Models\NominationEnsemble;
|
|
use App\Models\School;
|
|
use App\Models\Student;
|
|
|
|
use function auth;
|
|
use function compact;
|
|
use function max;
|
|
use function min;
|
|
use function request;
|
|
use function to_route;
|
|
use function view;
|
|
|
|
class StudentController extends Controller
|
|
{
|
|
public function index()
|
|
{
|
|
$filters = session('adminStudentFilters') ?? null;
|
|
$schools = School::orderBy('name')->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();
|
|
|
|
$logEntries = AuditLogEntry::whereJsonContains('affected->students', $student->id)->orderBy('created_at',
|
|
'desc')->get();
|
|
|
|
return view('admin.students.edit',
|
|
compact('student', 'schools', 'minGrade', 'maxGrade', 'events', 'event_entries', 'logEntries'));
|
|
}
|
|
|
|
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.'<br>Name: '.$student->full_name().'<br>Grade: '.$student->grade.'<br>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;
|
|
|
|
}
|
|
}
|