toDateString(); $users = User::query() ->select(['id', 'name']) ->active() ->whereHas('roles', function ($q) { $q->whereHas('permissions', fn($pq) => $pq->where('name', Permission::ATTENDANCES_CREATE->value)); }) ->whereHas('employee') ->get(); foreach ($users as $user) { $employee = $user->employee; if (! $employee) { continue; } $hasAttendedToday = Attendance::where('employee_id', $employee->id) ->where('attendance_date', $today) ->exists(); if ($hasAttendedToday) { continue; } $isOnLeave = LeaveRequest::approved() ->where('employee_id', $employee->id) ->where('start_date', '<=', $today) ->where('end_date', '>=', $today) ->exists(); if ($isOnLeave) { continue; } try { $user->notify(new WebPushNotification( title: 'Reminder Presensi', body: 'Selamat pagi! Jangan lupa untuk melakukan presensi masuk hari ini.', url: route('admin.hr.attendances.index'), )); } catch (\Exception $e) { Log::error("Gagal mengirim reminder presensi ke user {$user->id}: {$e->getMessage()}"); } } } }