feat: implement CourseClass and ClassEnrollment management; add controllers, services, and requests for course enrollment functionality
This commit is contained in:
parent
f6da193473
commit
80435b6cfa
@ -1,11 +1,11 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Admin\Manage;
|
||||
namespace App\Http\Controllers\Admin\Manage\CourseClass;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Models\ClassEnrollment;
|
||||
use App\Models\CourseClass;
|
||||
use App\Services\Admin\Manage\ClassEnrollmentService;
|
||||
use App\Services\Admin\Manage\CourseClass\ClassEnrollmentService;
|
||||
use Illuminate\Http\RedirectResponse;
|
||||
use Inertia\Inertia;
|
||||
use Inertia\Response;
|
||||
@ -1,13 +1,13 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Admin\Manage;
|
||||
namespace App\Http\Controllers\Admin\Manage\CourseClass;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Http\Requests\Admin\Manage\CourseClassRequest;
|
||||
use App\Http\Requests\Admin\Manage\DuplicateCourseClassesRequest;
|
||||
use App\Http\Requests\Admin\Manage\CourseClass\CourseClassRequest;
|
||||
use App\Http\Requests\Admin\Manage\CourseClass\DuplicateCourseClassesRequest;
|
||||
use App\Http\Requests\PaginatedRequest;
|
||||
use App\Models\CourseClass;
|
||||
use App\Services\Admin\Manage\CourseClassService;
|
||||
use App\Services\Admin\Manage\CourseClass\CourseClassService;
|
||||
use App\Services\Admin\Master\AcademicTermService;
|
||||
use App\Services\Admin\Master\CourseService;
|
||||
use App\Services\Admin\Users\LecturerService;
|
||||
@ -1,6 +1,6 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Requests\Admin\Manage;
|
||||
namespace App\Http\Requests\Admin\Manage\CourseClass;
|
||||
|
||||
use App\Enums\ClassMethod;
|
||||
use App\Enums\Semester;
|
||||
@ -1,6 +1,6 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Requests\Admin\Manage;
|
||||
namespace App\Http\Requests\Admin\Manage\CourseClass;
|
||||
|
||||
use App\Models\AcademicTerm;
|
||||
use Illuminate\Foundation\Http\FormRequest;
|
||||
@ -1,6 +1,6 @@
|
||||
<?php
|
||||
|
||||
namespace App\Services\Admin\Manage;
|
||||
namespace App\Services\Admin\Manage\CourseClass;
|
||||
|
||||
use App\Models\ClassEnrollment;
|
||||
use App\Models\CourseClass;
|
||||
@ -1,6 +1,6 @@
|
||||
<?php
|
||||
|
||||
namespace App\Services\Admin\Manage;
|
||||
namespace App\Services\Admin\Manage\CourseClass;
|
||||
|
||||
use App\Models\CourseClass;
|
||||
use App\Models\User;
|
||||
@ -10,28 +10,6 @@
|
||||
|
||||
class CourseClassService
|
||||
{
|
||||
/**
|
||||
* When $user is a dosen, only their own assigned classes are returned.
|
||||
* When $user is a mahasiswa, only classes from their own department are returned.
|
||||
*/
|
||||
public function getAllForSelect(?User $user = null): Collection
|
||||
{
|
||||
return CourseClass::query()
|
||||
->select(['course_classes.id', 'course_classes.course_id', 'course_classes.lecturer_id', 'course_classes.academic_term_id'])
|
||||
->join('courses', 'courses.id', '=', 'course_classes.course_id')
|
||||
->join('departments', 'departments.id', '=', 'courses.department_id')
|
||||
->with([
|
||||
'course:id,code,name,semester_number,department_id',
|
||||
'course.department:id,name',
|
||||
])
|
||||
->when($user?->hasRole('dosen'), fn ($q) => $q->where('course_classes.lecturer_id', $user->lecturer?->id))
|
||||
->when($user?->hasRole('mahasiswa'), fn ($q) => $q->where('courses.department_id', $user->student?->department_id))
|
||||
->orderBy('departments.name')
|
||||
->orderBy('courses.semester_number')
|
||||
->orderBy('courses.name')
|
||||
->get();
|
||||
}
|
||||
|
||||
public function paginated(int $perPage = 25, string $search = '', ?int $academicTermId = null, ?string $method = null): LengthAwarePaginator
|
||||
{
|
||||
return CourseClass::query()
|
||||
@ -65,11 +43,12 @@ public function createMany(array $data): Collection
|
||||
|
||||
public function update(CourseClass $courseClass, array $data): CourseClass
|
||||
{
|
||||
$courseClass->course_id = $data['course_id'];
|
||||
$courseClass->lecturer_id = $data['lecturer_id'];
|
||||
$courseClass->academic_term_id = $data['academic_term_id'];
|
||||
$courseClass->method = $data['method'] ?? null;
|
||||
$courseClass->update();
|
||||
$courseClass->update([
|
||||
'course_id' => $data['course_id'],
|
||||
'lecturer_id' => $data['lecturer_id'],
|
||||
'academic_term_id' => $data['academic_term_id'],
|
||||
'method' => $data['method'] ?? null,
|
||||
]);
|
||||
|
||||
return $courseClass;
|
||||
}
|
||||
@ -121,4 +100,26 @@ public function duplicateFromTerm(int $sourceAcademicTermId, int $targetAcademic
|
||||
return ['created' => $created, 'skipped' => $skipped];
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* When $user is a dosen, only their own assigned classes are returned.
|
||||
* When $user is a mahasiswa, only classes from their own department are returned.
|
||||
*/
|
||||
public function getAllForSelect(?User $user = null): Collection
|
||||
{
|
||||
return CourseClass::query()
|
||||
->select(['course_classes.id', 'course_classes.course_id', 'course_classes.lecturer_id', 'course_classes.academic_term_id'])
|
||||
->join('courses', 'courses.id', '=', 'course_classes.course_id')
|
||||
->join('departments', 'departments.id', '=', 'courses.department_id')
|
||||
->with([
|
||||
'course:id,code,name,semester_number,department_id',
|
||||
'course.department:id,name',
|
||||
])
|
||||
->when($user?->hasRole('dosen'), fn ($q) => $q->where('course_classes.lecturer_id', $user->lecturer?->id))
|
||||
->when($user?->hasRole('mahasiswa'), fn ($q) => $q->where('courses.department_id', $user->student?->department_id))
|
||||
->orderBy('departments.name')
|
||||
->orderBy('courses.semester_number')
|
||||
->orderBy('courses.name')
|
||||
->get();
|
||||
}
|
||||
}
|
||||
@ -42,15 +42,17 @@ export default function ClassEnrollmentIndex({
|
||||
|
||||
const columns: ColumnDef<ClassEnrollment>[] = [
|
||||
{
|
||||
accessorKey: 'student.student_number',
|
||||
id: 'identity',
|
||||
header: () => <span>NIM</span>,
|
||||
cell: ({ row }) => row.original.student?.student_number ?? '-',
|
||||
},
|
||||
{
|
||||
accessorKey: 'student.user.profile.full_name',
|
||||
header: () => <span>Nama Mahasiswa</span>,
|
||||
cell: ({ row }) =>
|
||||
row.original.student?.user?.profile?.full_name ?? '-',
|
||||
cell: ({ row }) => (
|
||||
<div className="flex flex-col">
|
||||
<span>{row.original.student?.student_number ?? '-'}</span>
|
||||
<span className="text-sm text-muted-foreground">
|
||||
{row.original.student?.user?.profile?.full_name ??
|
||||
'-'}
|
||||
</span>
|
||||
</div>
|
||||
),
|
||||
},
|
||||
{
|
||||
accessorKey: 'student.department.name',
|
||||
|
||||
@ -11,8 +11,8 @@
|
||||
use App\Http\Controllers\Admin\Finances\TuitionInvoiceController;
|
||||
use App\Http\Controllers\Admin\Finances\TuitionPaymentController;
|
||||
use App\Http\Controllers\Admin\Manage\AnnouncementController;
|
||||
use App\Http\Controllers\Admin\Manage\ClassEnrollmentController;
|
||||
use App\Http\Controllers\Admin\Manage\CourseClassController;
|
||||
use App\Http\Controllers\Admin\Manage\CourseClass\ClassEnrollmentController;
|
||||
use App\Http\Controllers\Admin\Manage\CourseClass\CourseClassController;
|
||||
use App\Http\Controllers\Admin\Manage\CourseRegistrationController;
|
||||
use App\Http\Controllers\Admin\Master\AcademicTermController;
|
||||
use App\Http\Controllers\Admin\Master\CourseController;
|
||||
|
||||
Loading…
Reference in New Issue
Block a user