diff --git a/app/Http/Controllers/Admin/AcademicClasses/AttendanceController.php b/app/Http/Controllers/Admin/AcademicClasses/AttendanceController.php index d4fd668..8f6397a 100644 --- a/app/Http/Controllers/Admin/AcademicClasses/AttendanceController.php +++ b/app/Http/Controllers/Admin/AcademicClasses/AttendanceController.php @@ -34,17 +34,6 @@ public function index(Request $request): Response ]); } - public function mine(Request $request): Response - { - $student = $request->user()->student; - - abort_if(! $student, 403); - - return Inertia::render('admin/academic-classes/attendances/mine', [ - 'summaries' => $this->service->forStudent($student), - ]); - } - public function show(CourseClass $courseClass): Response { $this->abortUnlessLecturerOwnsClass($courseClass); diff --git a/app/Services/Admin/AcademicClasses/AttendanceService.php b/app/Services/Admin/AcademicClasses/AttendanceService.php index b3e575e..7448461 100644 --- a/app/Services/Admin/AcademicClasses/AttendanceService.php +++ b/app/Services/Admin/AcademicClasses/AttendanceService.php @@ -5,10 +5,8 @@ use App\Enums\AttendanceStatus; use App\Models\Attendance; use App\Models\CourseClass; -use App\Models\Student; use App\Models\User; use Illuminate\Database\Eloquent\Collection; -use Illuminate\Support\Collection as BaseCollection; class AttendanceService { @@ -113,35 +111,4 @@ public function deleteSession(int $courseClassId, int $meetingNumber): void ->delete(); } - /** - * Per-class attendance summary for a student's own classes: every class - * they're enrolled in, with their recorded meetings and a present/total - * tally, even for classes with no attendance taken yet. - */ - public function forStudent(Student $student): BaseCollection - { - $enrollments = $student->enrollments() - ->with([ - 'courseClass.course:id,code,name', - 'courseClass.academicTerm:id,academic_year,semester,start_date,end_date', - ]) - ->get(); - - $recordsByClass = Attendance::query() - ->where('student_id', $student->id) - ->orderBy('meeting_number') - ->get(['course_class_id', 'meeting_number', 'date', 'status']) - ->groupBy('course_class_id'); - - return $enrollments->map(function ($enrollment) use ($recordsByClass) { - $records = $recordsByClass->get($enrollment->course_class_id, new Collection); - - return [ - 'course_class' => $enrollment->courseClass, - 'records' => $records->values(), - 'present_count' => $records->where('status', AttendanceStatus::Present)->count(), - 'total_count' => $records->count(), - ]; - })->values(); - } } diff --git a/app/Support/PermissionCatalog.php b/app/Support/PermissionCatalog.php index 922f9e3..c8e6e04 100644 --- a/app/Support/PermissionCatalog.php +++ b/app/Support/PermissionCatalog.php @@ -18,7 +18,7 @@ class PermissionCatalog 'view-assignment-submissions', 'update-assignment-submissions', 'submit-assignments', 'view-schedules', 'create-schedules', 'update-schedules', 'delete-schedules', - 'view-attendances', 'create-attendances', 'delete-attendances', 'view-own-attendances', + 'view-attendances', 'create-attendances', 'delete-attendances', ]; public const MANAGE = [ diff --git a/database/seeders/RolePermissionSeeder.php b/database/seeders/RolePermissionSeeder.php index cf869a1..1ddeba9 100644 --- a/database/seeders/RolePermissionSeeder.php +++ b/database/seeders/RolePermissionSeeder.php @@ -51,7 +51,6 @@ public function run(): void 'view-materials', 'view-assignments', 'submit-assignments', - 'view-own-attendances', 'view-announcements', ...$feedbackSelfService, ], diff --git a/resources/js/components/app-sidebar.tsx b/resources/js/components/app-sidebar.tsx index 3a25804..a3fb7c0 100644 --- a/resources/js/components/app-sidebar.tsx +++ b/resources/js/components/app-sidebar.tsx @@ -36,10 +36,7 @@ import { SidebarMenuItem, } from '@/components/ui/sidebar'; import { index as assignmentsRoute } from '@/routes/admin/academic-classes/assignments'; -import { - index as attendancesRoute, - mine as myAttendancesRoute, -} from '@/routes/admin/academic-classes/attendances'; +import { index as attendancesRoute } from '@/routes/admin/academic-classes/attendances'; import { index as materialsRoute } from '@/routes/admin/academic-classes/materials'; import { index as schedulesRoute } from '@/routes/admin/academic-classes/schedules'; import { index as logsRoute } from '@/routes/admin/developer/logs'; @@ -175,15 +172,6 @@ function buildNavMain({ }, ] : []), - ...(can('view-own-attendances') - ? [ - { - name: 'Riwayat Kehadiran', - url: myAttendancesRoute.url(), - icon: ClipboardCheck, - }, - ] - : []), ]; const keuanganItems: NavItem[] = [ diff --git a/resources/js/pages/admin/academic-classes/attendances/mine.tsx b/resources/js/pages/admin/academic-classes/attendances/mine.tsx deleted file mode 100644 index faf3fd8..0000000 --- a/resources/js/pages/admin/academic-classes/attendances/mine.tsx +++ /dev/null @@ -1,150 +0,0 @@ -import { Head } from '@inertiajs/react'; -import { format } from 'date-fns'; -import { PageHeader } from '@/components/page-header'; -import { - Accordion, - AccordionContent, - AccordionItem, - AccordionTrigger, -} from '@/components/ui/accordion'; -import { Badge } from '@/components/ui/badge'; -import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; -import { formatAcademicTermLabel } from '@/types/academic-term'; -import type { AttendanceClassSummary } from '@/types/attendance'; -import { AttendanceStatusLabels } from '@/types/attendance'; - -type Props = { - summaries: AttendanceClassSummary[]; -}; - -function courseClassLabel( - courseClass: AttendanceClassSummary['course_class'], -): string { - return `${courseClass.course?.code ?? ''} ${courseClass.course?.name ?? ''}`; -} - -function percentageOf(part: number, total: number): number { - return total > 0 ? Math.round((part / total) * 100) : 0; -} - -export default function MyAttendance({ summaries }: Props) { - return ( - <> - - -
- - - {summaries.length === 0 ? ( -

- Belum ada kelas yang terdaftar. -

- ) : ( -
- {summaries.map((summary) => ( - - - - {courseClassLabel(summary.course_class)} - - - -
- = 75 - ? 'secondary' - : 'destructive' - } - className="w-fit text-[10px] font-normal" - > - Hadir {summary.present_count} /{' '} - {summary.total_count} ( - {percentageOf( - summary.present_count, - summary.total_count, - )} - %) - - {summary.course_class.academic_term && ( - - {formatAcademicTermLabel( - summary.course_class - .academic_term, - )} - - )} -
- - {summary.records.length > 0 && ( - - - - Detail Pertemuan - - -
- {summary.records.map( - (record) => ( -
- - Pertemuan - ke- - {record.meeting_number ?? - '-'}{' '} - ·{' '} - {format( - new Date( - record.date, - ), - 'd MMM yyyy', - )} - - - { - AttendanceStatusLabels[ - record - .status - ] - } - -
- ), - )} -
-
-
-
- )} -
-
- ))} -
- )} -
- - ); -} diff --git a/resources/js/types/attendance.ts b/resources/js/types/attendance.ts index 51e4df9..2339325 100644 --- a/resources/js/types/attendance.ts +++ b/resources/js/types/attendance.ts @@ -41,16 +41,3 @@ export type AttendanceRosterEntry = { status: AttendanceStatus; }; -export type AttendanceRecord = { - course_class_id: number; - meeting_number: number | null; - date: string; - status: AttendanceStatus; -}; - -export type AttendanceClassSummary = { - course_class: AttendanceCourseClass; - records: AttendanceRecord[]; - present_count: number; - total_count: number; -}; diff --git a/routes/admin.php b/routes/admin.php index 629f708..dd63b43 100644 --- a/routes/admin.php +++ b/routes/admin.php @@ -84,7 +84,6 @@ Route::prefix('attendances')->name('attendances.')->group(function () { Route::get('/', [AttendanceController::class, 'index'])->name('index')->middleware('permission:view-attendances'); - Route::get('mine', [AttendanceController::class, 'mine'])->name('mine')->middleware('permission:view-own-attendances'); Route::get('{course_class}', [AttendanceController::class, 'show'])->name('show')->middleware('permission:view-attendances'); Route::get('{course_class}/{meeting_number}', [AttendanceController::class, 'session']) ->whereNumber('meeting_number')