user(); if ($user->hasRole('mahasiswa')) { return to_route('admin.manage.course-registrations.show', $user->student->id); } $isKaprodi = $user->hasRole('kaprodi'); return Inertia::render('admin/manage/course-registrations/index', [ 'departments' => $this->service->departmentSummary(), 'registrations' => $this->service->paginated( ...$request->validatedWithDefaults(), departmentId: $request->validated('department_id'), advisorLecturerId: ! $isKaprodi && $user->hasRole('dosen') ? $user->lecturer?->id : null, ledDepartmentIds: $isKaprodi ? $user->ledDepartmentIds() : null, ), 'filters' => $request->only(['department_id']), ]); } public function show(Student $student): Response { $user = auth()->user(); $isStudent = $user->hasRole('mahasiswa'); abort_if($isStudent && $user->student->id !== $student->id, 403); abort_if(! $isStudent && ! $user->canAccessCourseRegistrationOf($student), 403); $backHref = $isStudent ? null : route('admin.manage.course-registrations.index'); $canReview = ! $isStudent && $user->can('approve-course-registrations') && $user->canReviewCourseRegistrationOf($student); $canSignAsKaprodi = $user->isKaprodiOf($student); $canSignAsAdvisor = $user->isAdvisorOf($student); $activeTerm = $this->academicTermService->getActive(); $allCourseClasses = $activeTerm ? $this->service->availableCourseClasses($student->department_id, $activeTerm->id) : collect(); $semesters = $allCourseClasses ->map(fn (CourseClass $courseClass) => $courseClass->course?->semester_number) ->unique() ->sort() ->values(); $submissions = $semesters->mapWithKeys(fn (?int $semesterNumber) => [ CourseRegistrationSubmission::semesterKey($semesterNumber) => $this->service->buildSubmissionPayload( $student, $activeTerm, $semesterNumber, $allCourseClasses, ), ]); return Inertia::render('admin/manage/course-registrations/show', [ 'submissions' => $submissions, 'semesters' => $semesters->values(), 'openSemesters' => $activeTerm?->open_semesters ?? [], 'backHref' => $backHref, 'canReview' => $canReview, 'canSignAsKaprodi' => $canSignAsKaprodi, 'canSignAsAdvisor' => $canSignAsAdvisor, ]); } public function save(Student $student, string $semester, SaveCourseRegistrationRequest $request): RedirectResponse { $semesterNumber = CourseRegistrationSubmission::parseSemesterKey($semester); $activeTerm = $this->academicTermService->getActive(); abort_if($activeTerm === null, 422); $selectableIds = $this->service->selectableCourseClassIds( $student->department_id, $activeTerm->id, $semesterNumber, $activeTerm->open_semesters ?? [], ); $selectedIds = array_values(array_intersect( $request->validated('course_class_ids') ?? [], $selectableIds, )); $submission = $this->service->findOrCreateForStudent($student, $activeTerm, $semesterNumber); $this->service->saveRegistrations( $submission, $selectedIds, $activeTerm->id, $student->id, $request->file('signature'), ); Inertia::flash('toast', ['type' => 'success', 'message' => 'KRS berhasil disimpan.']); return to_route('admin.manage.course-registrations.show', $student->id); } public function signAsKaprodi(Student $student, string $semester, SignCourseRegistrationRequest $request): RedirectResponse { abort_unless(auth()->user()->isKaprodiOf($student), 403); $submission = $this->service->findOrCreateForSemester($student, $semester); $this->service->signAsKaprodi($submission, $request->file('signature')); Inertia::flash('toast', ['type' => 'success', 'message' => 'Tanda tangan berhasil disimpan.']); return to_route('admin.manage.course-registrations.show', $student->id); } public function signAsAdvisor(Student $student, string $semester, SignCourseRegistrationRequest $request): RedirectResponse { abort_unless(auth()->user()->isAdvisorOf($student), 403); $submission = $this->service->findOrCreateForSemester($student, $semester); $this->service->signAsAdvisor($submission, $request->file('signature')); Inertia::flash('toast', ['type' => 'success', 'message' => 'Tanda tangan berhasil disimpan.']); return to_route('admin.manage.course-registrations.show', $student->id); } public function approve(CourseRegistrationSubmission $submission): RedirectResponse { abort_unless(auth()->user()->canReviewCourseRegistrationOf($submission->student), 403); $this->service->approve($submission); return Inertia::flash('toast', ['type' => 'success', 'message' => 'KRS berhasil disetujui.'])->back(); } public function reject(RejectCourseRegistrationRequest $request, CourseRegistrationSubmission $submission): RedirectResponse { abort_unless(auth()->user()->canReviewCourseRegistrationOf($submission->student), 403); $this->service->reject($submission, $request->validated('reason')); return Inertia::flash('toast', ['type' => 'success', 'message' => 'KRS berhasil ditolak.'])->back(); } }