currentUser(); $scheduleService = new DashboardScheduleService(); $current = $scheduleService->getCurrentSchedule($userContext); if (empty($current['is_active_now']) || empty($current['schedule_id'])) { return $this->successResponse(['active' => false], 'No active schedule'); } $scheduleId = (int) $current['schedule_id']; $classId = (int) ($current['class_id'] ?? 0); $tz = new \DateTimeZone('Asia/Jakarta'); $today = (new \DateTimeImmutable('now', $tz))->format('Y-m-d'); $db = \Config\Database::connect(); $expectedTotal = 0; if ($classId > 0) { $expectedTotal = $db->table('students')->where('class_id', $classId)->countAllResults(); } $presentTotal = $db->table('attendance_sessions') ->where('schedule_id', $scheduleId) ->where('attendance_date', $today) ->where('status', AttendanceSession::STATUS_PRESENT) ->countAllResults(); $lateTotal = $db->table('attendance_sessions') ->where('schedule_id', $scheduleId) ->where('attendance_date', $today) ->where('status', AttendanceSession::STATUS_LATE) ->countAllResults(); $absentTotal = $expectedTotal - ($presentTotal + $lateTotal); if ($absentTotal < 0) { $absentTotal = 0; } $data = [ 'active' => true, 'subject_name' => (string) ($current['subject_name'] ?? '-'), 'class_name' => (string) ($current['class_name'] ?? '-'), 'expected_total' => $expectedTotal, 'present_total' => $presentTotal, 'late_total' => $lateTotal, 'absent_total' => $absentTotal, ]; return $this->successResponse($data, 'Attendance progress'); } }