From 7ea4fb067d206dce0d0b1e0eb1523650daefe013 Mon Sep 17 00:00:00 2001
From: Yoga Pangestu
Date: Fri, 4 Sep 2026 09:56:04 +0700
Subject: [PATCH] feat: refactor attendance management; remove 'mine' method
and related components, update permissions and types
---
.../AcademicClasses/AttendanceController.php | 11 --
.../AcademicClasses/AttendanceService.php | 33 ----
app/Support/PermissionCatalog.php | 2 +-
database/seeders/RolePermissionSeeder.php | 1 -
resources/js/components/app-sidebar.tsx | 14 +-
.../academic-classes/attendances/mine.tsx | 150 ------------------
resources/js/types/attendance.ts | 13 --
routes/admin.php | 1 -
8 files changed, 2 insertions(+), 223 deletions(-)
delete mode 100644 resources/js/pages/admin/academic-classes/attendances/mine.tsx
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')