From 5d11741f1d89955fdce239862d9990e10f2db909 Mon Sep 17 00:00:00 2001 From: Yoga Pangestu Date: Thu, 16 Jul 2026 15:05:56 +0700 Subject: [PATCH] feat: enhance attendance retrieval by filtering employees based on roles with attendance view permissions --- app/Services/System/AnalysisService.php | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/app/Services/System/AnalysisService.php b/app/Services/System/AnalysisService.php index e0b09aa..b46f66e 100644 --- a/app/Services/System/AnalysisService.php +++ b/app/Services/System/AnalysisService.php @@ -4,6 +4,7 @@ use App\Enums\EmployeeAdvanceStatus; use App\Enums\OrderStatus; +use App\Enums\Permission; use App\Enums\PriceType; use App\Enums\ProductStockQuality; use App\Enums\Role; @@ -32,6 +33,12 @@ public function getAttendance(?Carbon $startDate = null, ?Carbon $endDate = null $user = auth()->user(); $isSuper = $user?->hasAnyRole(['developer', 'owner', 'direktur']) ?? false; + $attendanceRoles = collect(Role::cases()) + ->filter(fn (Role $role) => in_array(Permission::ATTENDANCES_VIEW, $role->permissions())) + ->map(fn (Role $role) => $role->value) + ->values() + ->toArray(); + $employeeQuery = Employee::query(); $attendanceQuery = Attendance::query(); $leaveRequestQuery = LeaveRequest::query()->approved(); @@ -39,6 +46,7 @@ public function getAttendance(?Carbon $startDate = null, ?Carbon $endDate = null if ($startDate && $endDate) { $attendanceQuery->whereBetween('attendance_date', [$startDate, $endDate]); $leaveRequestQuery->where('start_date', '<=', $endDate)->where('end_date', '>=', $startDate); + $employeeQuery->where('join_date', '<=', $endDate); } if (! $isSuper) { @@ -48,6 +56,7 @@ public function getAttendance(?Carbon $startDate = null, ?Carbon $endDate = null $leaveRequestQuery->where('employee_id', $employeeId); } + $employeeQuery->whereHas('user.roles', fn ($q) => $q->whereIn('name', $attendanceRoles)); $totalEmployees = $employeeQuery->count(); $present = $attendanceQuery->distinct('employee_id')->count('employee_id'); $onLeave = $leaveRequestQuery->distinct('employee_id')->count('employee_id');