feat: enhance attendance retrieval by filtering employees based on roles with attendance view permissions
Some checks are pending
linter / quality (push) Waiting to run
tests / ci (8.3) (push) Waiting to run
tests / ci (8.4) (push) Waiting to run
tests / ci (8.5) (push) Waiting to run

This commit is contained in:
Yoga Pangestu 2026-07-16 15:05:56 +07:00
parent 735b7fa9ed
commit 5d11741f1d

View File

@ -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');