/home/techb158/workloadmatch.com/Manager
NameSizeModeActions
core/-0755rm
css/-0755rm
data/-0755rm
fonts/-0755rm
Inc/-0755rm
js/-0755rm
php/-0755rm
addcourse.php180030644editdlrm
addcoursesession.php144240644editdlrm
addcoursesession_bak.php.disabled208600644editdlrm
addcoursetime.php175640644editdlrm
addgroup.php234650644editdlrm
addgroup1.php204630644editdlrm
addholiday.php182830644editdlrm
addmanager.php190600644editdlrm
addremediation.php181400644editdlrm
addretake.php222840644editdlrm
adduser.php304850644editdlrm
adduser1.php231660644editdlrm
Add_Course_Session.php69310644editdlrm
Add_Course_Session_bak.php.disabled69310644editdlrm
add_event.php20040644editdlrm
Add_Teacher_Unavailability.php17240644editdlrm
AI_Generate_Schedule.php110310644editdlrm
ai_schedule.php199750644editdlrm
ajax_fetch_schedule.php38560644editdlrm
ajax_get_group_slots.php8970644editdlrm
ajax_replace_saturday.php316740644editdlrm
ajax_replace_saturday_backup_latest.php314740644editdlrm
ajax_replace_saturday_bak.php.disabled318120644editdlrm
ajax_swap_courses.php43940644editdlrm
approve_teacher_absence.php22300644editdlrm
approve_teacher_unavailability.php22740644editdlrm
assign_course_group.php181150644editdlrm
assign_course_group1.php207520644editdlrm
Assign_Course_Report.php23180644editdlrm
assign_teacher_legacy.php164900644editdlrm
assign_teacher_manual.php175510644editdlrm
assign_teacher_manual_bak.php.disabled227180644editdlrm
assign_teacher_manual_force_conflicts.php227490644editdlrm
availableteacherreport.php125950644editdlrm
Available_Teacher_Report.php35540644editdlrm
batch_schedule.php95820644editdlrm
calendar.php315020644editdlrm
calendar_schedule.php80860644editdlrm
chat.php164370644editdlrm
chat_bak.php.disabled102650644editdlrm
Check_if_Teacher_Report.php16390644editdlrm
complete_schedule_report_by_teacher.php197990644editdlrm
courseflagtime.php35180644editdlrm
Create_Group_Schedule_Algorithm.php39390644editdlrm
Create_Schedule_Algorithm.php906290644editdlrm
Create_Schedule_Algorithm_1.php424300644editdlrm
Create_Schedule_Algorithm_2.php785320644editdlrm
Create_Schedule_Algorithm_2_combined.php921570644editdlrm
Create_Schedule_Algorithm_2_combined_both_slots.php945460644editdlrm
Create_Schedule_Algorithm_2_combined_both_slots_bak.php.disabled946110644editdlrm
Create_Schedule_Algorithm_2_fixed.php788690644editdlrm
Create_Schedule_Algorithm_3.php895940644editdlrm
Create_Schedule_Algorithm_4.php895940644editdlrm
dashboard.php211030644editdlrm
deletecoursesession.php85910644editdlrm
deleteschedulefromgroup.php174240644editdlrm
delete_course.php6070644editdlrm
delete_course_from_teacher.php51260644editdlrm
delete_course_session_handler.php7910644editdlrm
delete_duplicate_assignments.php25370644editdlrm
delete_event.php12550644editdlrm
delete_group.php19130644editdlrm
delete_holiday.php7430644editdlrm
delete_retake.php13240644editdlrm
delete_schedule_from_group.php19400644editdlrm
delete_teacher_absence.php10150644editdlrm
delete_teacher_level.php8280644editdlrm
delete_teacher_unavailability.php13500644editdlrm
delete_timeslot.php6260644editdlrm
display_schedule.php186620644editdlrm
do_remove_saturday.php64020644editdlrm
duplicate_assignment_report.php94230644editdlrm
edit_event.php16630644editdlrm
examschedulereport.php165100644editdlrm
Exam_Schedule_Report.php27620644editdlrm
export_absences.php12580644editdlrm
fetch_all_scheduled_courses.php63250644editdlrm
fetch_courses.php93730644editdlrm
fetch_courses_for_program.php8150644editdlrm
fetch_courses_for_program_by_schedule.php40470644editdlrm
fetch_courses_teacher_preference.php39540644editdlrm
fetch_course_for_added_group.php10460644editdlrm
fetch_course_hours.php7140644editdlrm
fetch_course_sessions.php14050644editdlrm
fetch_dashboard_charts.php42820644editdlrm
fetch_disabled_dates.php5430644editdlrm
fetch_duplicate_assignments.php49020644editdlrm
fetch_events.php10140644editdlrm
fetch_exist_dates.php11410644editdlrm
fetch_groups_exist_in_schedule.php9590644editdlrm
fetch_groups_for_program.php8710644editdlrm
fetch_groups_for_program_legacy.php7750644editdlrm
fetch_group_timeslot.php8780644editdlrm
fetch_lockup_courses-1-1.php140860644editdlrm
fetch_lockup_courses.php145870644editdlrm
fetch_lockup_courses_1.php136380644editdlrm
fetch_lockup_courses_2.php138500644editdlrm
fetch_lockup_courses_bak.php88990644editdlrm
fetch_reserve_courses.php75670644editdlrm
fetch_retake_courses.php9570644editdlrm
fetch_scheduled_courses.php22540644editdlrm
fetch_schedule_report_by_group.php55540644editdlrm
fetch_teachers_by_group.php48880644editdlrm
fetch_teachers_by_group_legacy.php24210644editdlrm
fetch_teachers_by_program.php18710644editdlrm
fetch_teachers_for_group.php32650644editdlrm
fetch_teacher_assignment.php254050644editdlrm
fetch_teacher_by_course.php39820644editdlrm
fetch_teacher_conflicts-1-1.php57930644editdlrm
fetch_teacher_conflicts.php57660644editdlrm
fetch_teacher_conflicts_only-1-1.php82750644editdlrm
fetch_teacher_conflicts_only-1.php87370644editdlrm
fetch_teacher_conflicts_only.php77250644editdlrm
fetch_teacher_conflicts_only_force_conflicts.php72870644editdlrm
fetch_teacher_conflicts_only_legacy.php67020644editdlrm
fetch_teacher_conflicts_showonly-1-1.php106560644editdlrm
fetch_teacher_conflicts_showonly.php105310644editdlrm
fetch_teacher_load.php16330644editdlrm
fetch_teacher_load_legacy.php11440644editdlrm
fetch_teacher_prefrence_courses.php18480644editdlrm
fetch_teacher_prefrence_courses_accounting.php16470644editdlrm
fetch_workload_data.php45200644editdlrm
fetch_workload_hours-1.php22910644editdlrm
fetch_workload_hours-2.php21470644editdlrm
fetch_workload_hours.php23410644editdlrm
find_replacement-1-1.php186030644editdlrm
find_replacement.php183130644editdlrm
Generate Group Schedule.php173300644editdlrm
Generate Group Schedule 1.php184900644editdlrm
generateschedule.php159460644editdlrm
Generate_Schedule.php347430644editdlrm
generate_schedule_handler.php73750644editdlrm
Generate_Schedule_Script.php307290644editdlrm
getlang.php3510644editdlrm
get_groups_by_program.php6290644editdlrm
get_schedule_ai.php377120644editdlrm
get_schedule_report.php24710644editdlrm
group_schedule_form.php173370644editdlrm
Lockup_to_Assign.php120520644editdlrm
Lockup_to_Assign_bak.php113010644editdlrm
main-header-inc.php77940644editdlrm
main-header.php196560644editdlrm
Preference_Accounting.php98100644editdlrm
preference_accounting.php96030644editdlrm
preference_secretarial.php98100644editdlrm
profile.php209760644editdlrm
remove_saturday_course.php193130644editdlrm
report_absence.php210560644editdlrm
report_absence_1.php63850644editdlrm
reserve_course.php192850644editdlrm
rewrite_ajax_replace_saturday.php131890644editdlrm
rewrite_Create_Schedule_Algorithm.php906720644editdlrm
rewrite_Create_Schedule_Algorithm_2.php912680644editdlrm
save_schedule.php31020644editdlrm
save_schedule_group_course.php263010644editdlrm
save_teacher_preference.php22160644editdlrm
schedulereportbygroup.php180130644editdlrm
schedulereportbyteacher.php194240644editdlrm
scheduleteacherbygroupreport.php374180644editdlrm
scheduleteacherreport.php287880644editdlrm
schedule_report.php179440644editdlrm
Schedule_Report_by_Group.php37410644editdlrm
Schedule_Report_by_Teacher.php946340644editdlrm
swapcourses.php198130644editdlrm
teacher_notes.php189360644editdlrm
teacher_preference.php184960644editdlrm
teacher_preference_by_course.php195870644editdlrm
teacher_report_visibility.php157610644editdlrm
teacher_unavailability.php205770644editdlrm
test.php142780644editdlrm
test1.php224250644editdlrm
unassigncoursereport.php150750644editdlrm
unassign_course.php193240644editdlrm
Unassign_Course_Report.php20580644editdlrm
unscheduledgroupreport.php163960644editdlrm
Unscheduled_Group_Report.php24110644editdlrm
updatecourse.php224540644editdlrm
updatecoursesessionhours.php189050644editdlrm
updatecoursetime.php226700644editdlrm
updategroup.php186190644editdlrm
updateholiday.php233320644editdlrm
updateteacherlevel.php254330644editdlrm
updateteacherunavailability.php118330644editdlrm
UpdateUser.php192610644editdlrm
Update_Course_Hours.php20270644editdlrm
update_reserve_course.php20040644editdlrm
update_teacher_absence.php121350644editdlrm
update_teacher_level25080644editdlrm
update_teacher_level.php24990644editdlrm
useraccesslist.php131450644editdlrm
users.php91710644editdlrm
view_swap_log.php9290644editdlrm
workloadhoursreport.php81820644editdlrm
Edit: /home/techb158/workloadmatch.com/Manager/get_schedule_ai.php (37712B)
prepare("SELECT Program_ID, Program_Name FROM Programs"); $stmtGroup->execute(); $programData = $stmtGroup->get_result()->fetch_all(MYSQLI_ASSOC); $stmtGroup->close(); // ========================================= // 3. Define Utility Functions (Important Modularization) // ========================================= // Build calendar excluding holidays, retakes, and July function build_schedule_calendar($Start_Date, $End_Date, $classDays, $timeSlots, $mysqli, $Program_ID, $Group_ID) { $start = new DateTime($Start_Date); $end = $End_Date ? new DateTime($End_Date) : new DateTime('+1 year'); $calendar = []; $holidayDates = get_holidays($mysqli, $Start_Date); $retakeDates = get_retake_dates($mysqli, $Program_ID, $Group_ID); $cur = clone $start; while ($cur <= $end) { $day = $cur->format('l'); $dateStr = $cur->format('Y-m-d'); $month = (int) $cur->format('m'); if ($month !== 7 && in_array($day, $classDays) && !in_array($dateStr, $holidayDates) && !in_array($dateStr, $retakeDates)) { foreach ($timeSlots as $slot) { $calendar[$dateStr][trim($slot)] = 'free'; } } $cur->modify('+1 day'); } return $calendar; } // ========================================= // 4. Handle POST Request to Generate Schedule // ========================================= // Format the label of the time slot, especially for Saturday sessions function format_time_slot_label($slot, $day) { if ($day === 'Saturday') { if (stripos($slot, 'evening') !== false) return 'Morning (Sat)'; if (stripos($slot, 'morning') !== false) return 'Morning'; } return $slot; } // Format the time range of the session based on the slot and the day function format_time_slot_range($slot, $start, $end, $day) { if ($day === 'Saturday') { if (stripos($slot, 'morning') !== false) return "08:30 AM - 12:30 PM"; if (stripos($slot, 'evening') !== false) return "09:00 AM - 01:00 PM"; } return date('h:i A', strtotime($start)) . ' - ' . date('h:i A', strtotime($end)); } // Get group configuration from database function get_group_info($mysqli, $Group_ID) { $stmt = $mysqli->prepare("SELECT Time_Slot, Time_From, Time_To, class_days, Weekend_Class, Group_Name FROM manager_group_name WHERE Group_ID = ?"); $stmt->bind_param("i", $Group_ID); $stmt->execute(); return $stmt->get_result()->fetch_assoc(); } // Retrieve time slots for the group function fetch_slot_times($mysqli, $slotLabels, $managerStart, $managerEnd) { $timeFrom = []; $timeTo = []; foreach ($slotLabels as $label) { $label = trim($label); $stmt = $mysqli->prepare("SELECT Time_From, Time_To FROM time_slot_programs WHERE Time_Slot = ?"); $stmt->bind_param("s", $label); $stmt->execute(); $result = $stmt->get_result(); $validSlotFound = false; while ($row = $result->fetch_assoc()) { $slotStart = new DateTime($row['Time_From']); $slotEnd = new DateTime($row['Time_To']); if ($slotStart >= $managerStart && $slotEnd <= $managerEnd) { $timeFrom[] = $slotStart->format("H:i:s"); $timeTo[] = $slotEnd->format("H:i:s"); $validSlotFound = true; break; } } if (!$validSlotFound && count($slotLabels) === 1) { $timeFrom[] = $managerStart->format("H:i:s"); $timeTo[] = $managerEnd->format("H:i:s"); } } return [$timeFrom, $timeTo]; } // Collect all holiday dates in the current year function get_holidays($mysqli, $Start_Date) { $holidays = []; $res = $mysqli->query("SELECT Event_Start, Event_End FROM Events WHERE Calendar_Year = YEAR('$Start_Date')"); while ($row = $res->fetch_assoc()) { $start = new DateTime($row['Event_Start']); $end = new DateTime($row['Event_End']); while ($start <= $end) { $holidays[] = $start->format('Y-m-d'); $start->modify('+1 day'); } } return $holidays; } // Collect all retake dates for the group and program function get_retake_dates($mysqli, $Program_ID, $Group_ID) { $retakeDates = []; $stmt = $mysqli->prepare("SELECT Retake_Date FROM retake_records WHERE Program_ID = ? AND Group_ID = ?"); $stmt->bind_param("ii", $Program_ID, $Group_ID); $stmt->execute(); $res = $stmt->get_result(); while ($row = $res->fetch_assoc()) { $retakeDates[] = $row['Retake_Date']; } return $retakeDates; } // Generate all valid class dates, excluding holidays, retakes, and July function generate_valid_dates($Start_Date, $End_Date, $classDays, $holidayDates, $retakeDates) { $validDates = []; $cur = new DateTime($Start_Date); $end = $End_Date ? new DateTime($End_Date) : null; while (!$end || $cur <= $end) { $day = $cur->format('l'); $dateStr = $cur->format('Y-m-d'); $month = (int) $cur->format('m'); if ($month === 7 || !in_array($day, $classDays) || in_array($dateStr, $holidayDates) || in_array($dateStr, $retakeDates)) { $cur->modify('+1 day'); continue; } $validDates[] = $dateStr; $cur->modify('+1 day'); if ($end === null && count($validDates) > 365) break; // Prevent infinite loop in fallback } return $validDates; } // Calculate the average duration of one session function calculate_session_length($timeFrom, $timeTo) { $sessionLength = 0; foreach ($timeFrom as $i => $from) { $fromTime = new DateTime($from); $toTime = new DateTime($timeTo[$i]); $sessionLength += ($toTime->getTimestamp() - $fromTime->getTimestamp()) / 3600; } $slotCount = count($timeFrom); return $slotCount > 0 ? $sessionLength / $slotCount : 3; } // Calculate the number of sessions required for each course function calculate_course_sessions($mysqli, $Program_ID, $sessionLength) { $courseSessions = []; $res = $mysqli->query("SELECT Course_ID, Course_Time FROM Courses WHERE Program_ID = $Program_ID"); while ($row = $res->fetch_assoc()) { $courseID = $row['Course_ID']; $courseHours = $row['Course_Time']; $courseSessions[$courseID] = ceil($courseHours / $sessionLength); } return $courseSessions; } // โœ… You can now call these functions in your main POST logic to keep code readable and modular. $scheduleOutput = []; // Default if ($_SERVER['REQUEST_METHOD'] === 'POST') { //if (isset($_POST['reset']) || isset($_POST['Start_Date'])) { // unset($_SESSION['deletedSaturdays']); //} // Step 1: Retrieve Form Data $Program_ID = intval($_POST['Program_ID']); $Group_ID = intval($_POST['Group_ID']); $Start_Date = $_POST['Start_Date']; $End_Date = $_POST['End_Date'] ?? date('Y-m-d', strtotime('+1 year', strtotime($Start_Date))); $selectedCourses = $_POST['Selected_Courses'] ?? []; $courseSessions = $_POST['Course_Sessions'] ?? []; $priorityCourses = $_POST['Priority_Course'] ?? []; $group = get_group_info($mysqli, $Group_ID); if (!$group) { echo "Group info not found."; exit; } $classDays = explode(',', $group['class_days']); if (!$group['Weekend_Class'] && in_array('Saturday', $classDays)) { $classDays = array_filter($classDays, fn($day) => $day !== 'Saturday'); } $slotLabels = explode(',', $group['Time_Slot']); $managerStart = new DateTime(trim($group['Time_From'])); $managerEnd = new DateTime(trim($group['Time_To'])); list($timeFrom, $timeTo) = fetch_slot_times($mysqli, $slotLabels, $managerStart, $managerEnd); $sessionLength = calculate_session_length($timeFrom, $timeTo); $courseSessions = calculate_course_sessions($mysqli, $Program_ID, $sessionLength); $holidayDates = get_holidays($mysqli, $Start_Date); $retakeDates = get_retake_dates($mysqli, $Program_ID, $Group_ID); $validDates = generate_valid_dates($Start_Date, $End_Date, $classDays, $holidayDates, $retakeDates); //echo "

๐Ÿ“… Valid Dates for Scheduling (Excluding July)

"; print_r($validDates); echo "
"; // ๐Ÿ”„ Additional scheduling logic .... // Output valid dates //echo "

๐Ÿ“… Valid Dates for Scheduling (Excluding July)

"; print_r($validDates); echo "
"; $totalSessionsNeeded = array_sum($courseSessions); $availableDays = count($validDates); // Estimate sessions per day (based on number of slots) $sessionsPerDay = count($slotLabels); // Calculate how many days are needed to finish all sessions $daysRequired = ceil($totalSessionsNeeded / $sessionsPerDay); // Get expected end date $expectedEndDate = $validDates[$daysRequired - 1] ?? end($validDates); // fallback to last available if out of bounds //echo "

๐Ÿ“… Expected End Date Based on Andragogical Days

"; //echo "

$expectedEndDate (" . (new DateTime($expectedEndDate))->format('l') . ")

"; // Sort by course priority usort($selectedCourses, function ($a, $b) use ($priorityCourses) { $priorityA = $priorityCourses[$a] ?? PHP_INT_MAX; $priorityB = $priorityCourses[$b] ?? PHP_INT_MAX; return $priorityA <=> $priorityB; }); // echo "

๐Ÿ”„ Sorted Courses (Priority First)

"; print_r($selectedCourses); echo "
"; // Prepare for fair scheduling (one course per slot) // Initialize $schedule = []; $remainingSessions = []; foreach ($selectedCourses as $courseID) { $remainingSessions[$courseID] = $courseSessions[$courseID] ?? 0; } // Queue of all courses $courseQueue = $selectedCourses; $currentCourses = [ 0 => null, // Slot 1 (e.g. Morning) 1 => null // Slot 2 (e.g. Afternoon) ]; // Assign initial two courses // Assign initial courses to slots without repeating $courseQueueCopy = $selectedCourses; $assignedCourses = []; foreach ([0, 1] as $slotIndex) { foreach ($courseQueueCopy as $courseID) { if (!in_array($courseID, $assignedCourses) && $remainingSessions[$courseID] > 0) { $currentCourses[$slotIndex] = $courseID; $assignedCourses[] = $courseID; break; } } } // Fetch all course names into array $courseNames = []; $courseRes = $mysqli->query("SELECT Course_ID, Course_Name FROM Courses"); while ($row = $courseRes->fetch_assoc()) { $courseNames[$row['Course_ID']] = $row['Course_Name']; } foreach ($validDates as $date) { $totalSessions = $courseSessions; // Copy of original sessions foreach ([0, 1] as $slotIndex) { $from = $timeFrom[$slotIndex] ?? null; $to = $timeTo[$slotIndex] ?? null; if (!$from || !$to || !$currentCourses[$slotIndex]) continue; $courseID = $currentCourses[$slotIndex]; $courseName = $courseNames[$courseID] ?? "Course #$courseID"; // Schedule the session $schedule[] = [ 'Date' => $date, 'Slot' => "Slot " . ($slotIndex + 1), 'Time' => format_time_slot_range($slotLabels[$slotIndex], $from, $to, (new DateTime($date))->format('l')), 'Course_ID' => $courseID ]; // Session info $scheduledSoFar = $totalSessions[$courseID] - $remainingSessions[$courseID] + 1; $total = $totalSessions[$courseID]; //echo "

โœ… Scheduled $courseName (Course ID: $courseID) on $date (Slot " . ($slotIndex + 1) . ") โ€” Session $scheduledSoFar of $total

"; // Decrease remaining $remainingSessions[$courseID]--; // If finished, pull a new course if ($remainingSessions[$courseID] <= 0) { $currentCourses[$slotIndex] = null; while (!empty($courseQueue)) { $nextCourse = array_shift($courseQueue); if ($remainingSessions[$nextCourse] > 0) { $currentCourses[$slotIndex] = $nextCourse; break; } } } } // Stop if both slots are out of courses if (!$currentCourses[0] && !$currentCourses[1]) break; } // ๐Ÿ” Identify last scheduled session for each course $lastSessions = []; foreach ($schedule as $index => $entry) { $courseID = $entry['Course_ID']; $lastSessions[$courseID] = $index; // keeps overwriting until the last index } //echo "

๐Ÿ“˜ Final Generated Schedule

"; print_r($schedule); echo "
"; //echo "

๐Ÿ“‹ Generated Schedule Table

"; //echo "

Group: " . htmlspecialchars($groupName) . "

"; if (!empty($schedule)) { // Collect all displayed dates: scheduled, holidays, and retakes $displayDates = []; // 1. From scheduled sessions foreach ($schedule as $row) { $displayDates[$row['Date']][] = $row; // grouped by date } // 2. Add holidays (if no course scheduled on them) foreach ($holidayDates as $hDate) { if (!isset($displayDates[$hDate])) { $displayDates[$hDate] = []; // will be handled below } } // 3. Add retakes foreach ($retakeDates as $rDate) { if (!isset($displayDates[$rDate])) { $displayDates[$rDate] = []; // will be handled below } } // Sort the dates chronologically ksort($displayDates); } else { echo "

๐Ÿšซ No schedule generated โ€” check if valid time slots, sessions, or dates are missing.

"; } } ?> Generate Group Schedule

Generate Group Schedule

prepare("SELECT Course_ID, Course_Name, Course_Time FROM Courses WHERE Program_ID = ?"); $stmtCourses->bind_param("i", $Program_ID); $stmtCourses->execute(); $resultCourses = $stmtCourses->get_result(); while ($course = $resultCourses->fetch_assoc()) { $suggestedSessions = ceil($course['Course_Time'] / 3); // Example: assume each session is 3 hours echo ""; } $stmtCourses->close(); } ?>
Select Course Suggested Sessions Custom Sessions Prioritize?
" . htmlspecialchars($course['Course_Name']) . "
"; // โœ… Start container echo ""; echo ""; foreach ($displayDates as $date => $rows) { // Check for holiday or retake styling $isHoliday = in_array($date, $holidayDates); $isRetake = in_array($date, $retakeDates); // If nothing is scheduled, just display the holiday or retake row if (empty($rows)) { $label = $isHoliday ? "Holiday" : "Retake Day"; $bg = $isHoliday ? "#FFD700" : "#CCE5FF"; echo ""; continue; } // Otherwise, loop through actual scheduled courses foreach ($rows as $row) { $courseName = $courseNames[$row['Course_ID']] ?? "Course ID {$row['Course_ID']}"; $index = array_search($row, $schedule); $isExam = isset($lastSessions[$row['Course_ID']]) && $index === $lastSessions[$row['Course_ID']]; $style = ""; if ($isHoliday) { $style = "style='background-color: #FFD700;'"; } elseif ($isRetake) { $style = "style='background-color: #CCE5FF;'"; } elseif ($isExam) { $style = "style='background-color: #FFCCCC; font-weight: bold;'"; } //$slotName = $slotLabels[(int) filter_var($row['Slot'], FILTER_SANITIZE_NUMBER_INT) - 1]; $dayName = (new DateTime($row['Date']))->format('l'); $slotName = format_time_slot_label($slotLabels[(int) filter_var($row['Slot'], FILTER_SANITIZE_NUMBER_INT) - 1], $dayName); $dateObj = new DateTime($row['Date']); //$isSaturday = $dateObj->format('l') === 'Saturday'; $slotIndex = (int) filter_var($row['Slot'], FILTER_SANITIZE_NUMBER_INT) - 1; //$dayName = (new DateTime($row['Date']))->format('l'); $isSaturday = ($dayName === 'Saturday'); echo ""; } } echo "
DateSlotTimeCourseAction
$date$label
($dayName) {$row['Date']} {$slotName} {$row['Time']} {$courseName}" . ($isExam ? " (Exam Day)" : "") . " "; if ($isSaturday) { echo " "; } else { echo "-"; } echo "
"; echo "
"; // โœ… End container } ?>