/home/techb158/workloadmatch.com/workloadmatch.com/BackUp/Manager
NameSizeModeActions
core/-0755rm
css/-0755rm
data/-0755rm
fonts/-0755rm
Inc/-0755rm
js/-0755rm
php/-0755rm
accesscontrol.php160390644editdlrm
AddClient.php39300644editdlrm
addcourse.php177360644editdlrm
addcoursesession.php205280644editdlrm
addcoursetime.php173050644editdlrm
addgroup - Copy.php212120644editdlrm
addgroup.php229990644editdlrm
addgroup1.php206670644editdlrm
addholiday.php180190644editdlrm
addmanager.php187650644editdlrm
addremediation.php178770644editdlrm
addretake.php219140644editdlrm
adduser.php300790644editdlrm
adduser1.php235270644editdlrm
Add_Course_Session.php65290644editdlrm
add_event.php19600644editdlrm
Add_Teacher_Unavailability.php17460644editdlrm
adminreports.php162190644editdlrm
AI_Generate_Schedule - Copy.php122170644editdlrm
AI_Generate_Schedule.php107310644editdlrm
ajax_course_group_Backup.php172700644editdlrm
ajax_course_group_Backup_1.php187420644editdlrm
ajax_fetch_schedule.php37600644editdlrm
ajax_get_group_slots.php8720644editdlrm
ajax_replace_saturday -Completed.php187390644editdlrm
ajax_replace_saturday - Copy (2).php187390644editdlrm
ajax_replace_saturday - Copy (3).php265540644editdlrm
ajax_replace_saturday - Copy (4).php266150644editdlrm
ajax_replace_saturday - Copy (5).php283740644editdlrm
ajax_replace_saturday - Copy.php134520644editdlrm
ajax_replace_saturday - Good.php172700644editdlrm
ajax_replace_saturday.php307790644editdlrm
ajax_swap_courses.php42790644editdlrm
assign_course_group-BackUp.php213310644editdlrm
assign_course_group - Copy (BackUp).php183150644editdlrm
assign_course_group - Copy.php213180644editdlrm
assign_course_group.php183150644editdlrm
assign_course_group1.php209620644editdlrm
Assign_Course_Report.php13750644editdlrm
assign_teacher_manual-1.php210950644editdlrm
assign_teacher_manual - Copy (2).php223280644editdlrm
assign_teacher_manual - Copy.php223880644editdlrm
assign_teacher_manual-Not work.php205850644editdlrm
assign_teacher_manual.php223280644editdlrm
assign_teacher_manual_force_conflicts.php223590644editdlrm
availableteacherreport.php137180644editdlrm
Available_Teacher_Report - Copy.php22360644editdlrm
Available_Teacher_Report.php76910644editdlrm
brokerreports.php163180644editdlrm
calendar - Copy (2).php168910644editdlrm
calendar - Copy.php231930644editdlrm
calendar.php306530644editdlrm
changestatus.php8650644editdlrm
Check_if_Teacher_Report.php15870644editdlrm
complete_schedule_report_by_teacher.php193120644editdlrm
courseflagtime.php34110644editdlrm
Create_Group_Schedule_Algorithm.php38280644editdlrm
Create_Schedule_Algorithm - Copy (2).php414120644editdlrm
Create_Schedule_Algorithm - Copy (3).php463520644editdlrm
Create_Schedule_Algorithm - Copy (4).php535690644editdlrm
Create_Schedule_Algorithm - Copy (5).php679560644editdlrm
Create_Schedule_Algorithm - Copy (6).php711340644editdlrm
Create_Schedule_Algorithm - Copy (7).php725290644editdlrm
Create_Schedule_Algorithm - Copy (8).php730840644editdlrm
Create_Schedule_Algorithm - Copy (9).php735770644editdlrm
Create_Schedule_Algorithm - Copy (10).php765050644editdlrm
Create_Schedule_Algorithm - Copy (11).php767640644editdlrm
Create_Schedule_Algorithm - Copy (12).php863240644editdlrm
Create_Schedule_Algorithm - Copy (13).php831330644editdlrm
Create_Schedule_Algorithm - Copy (14).php872740644editdlrm
Create_Schedule_Algorithm - Copy (get info only).php697470644editdlrm
Create_Schedule_Algorithm - Copy (with 2 course 2nd SPECIAL ).php823140644editdlrm
Create_Schedule_Algorithm - Copy.php405810644editdlrm
Create_Schedule_Algorithm.php882760644editdlrm
Create_Schedule_Algorithm_1.php414120644editdlrm
Create_Schedule_Algorithm_2.php765050644editdlrm
Create_Schedule_Algorithm_2_combined.php897640644editdlrm
Create_Schedule_Algorithm_2_combined_both_slots.php919320644editdlrm
Create_Schedule_Algorithm_2_fixed.php768290644editdlrm
Create_Schedule_Algorithm_3.php872740644editdlrm
Create_Schedule_Algorithm_4.php872740644editdlrm
dashboard-BackUp.php188060644editdlrm
dashboard.php225070644editdlrm
deleteschedulefromgroup.php168190644editdlrm
delete_course.php5800644editdlrm
delete_course_from_teacher.php49900644editdlrm
delete_course_from_teacher_backup.php30940644editdlrm
delete_event.php12120644editdlrm
delete_group.php18580644editdlrm
delete_holiday.php7150644editdlrm
delete_retake.php12760644editdlrm
delete_schedule_from_group-1.php18700644editdlrm
delete_schedule_from_group.php18500644editdlrm
delete_teacher_level.php7980644editdlrm
delete_teacher_unavailability.php13470644editdlrm
delete_timeslot.php5970644editdlrm
display_schedule-1.php188460644editdlrm
display_schedule.php188460644editdlrm
do_remove_saturday.php61700644editdlrm
edit_event.php16120644editdlrm
error_log740700644editdlrm
examschedulereport.php162670644editdlrm
Exam_Schedule_Report.php26770644editdlrm
export_absences.php12210644editdlrm
fetch_all_scheduled_courses.php63180644editdlrm
fetch_courses - BackUp.php97110644editdlrm
fetch_courses - Copy.php77190644editdlrm
fetch_courses.php91670644editdlrm
fetch_courses_for_program.php7880644editdlrm
fetch_courses_for_program_by_schedule - Copy.php22970644editdlrm
fetch_courses_for_program_by_schedule.php39350644editdlrm
fetch_courses_teacher_preference.php38520644editdlrm
fetch_course_for_added_group.php8970644editdlrm
fetch_course_hours.php6910644editdlrm
fetch_disabled_dates.php5180644editdlrm
fetch_events.php9750644editdlrm
fetch_exist_dates.php10990644editdlrm
fetch_groups_exist_in_schedule.php9560644editdlrm
fetch_groups_for_program.php8430644editdlrm
fetch_group_timeslot.php8470644editdlrm
fetch_reserve_courses.php74290644editdlrm
fetch_retake_courses.php9230644editdlrm
fetch_scheduled_courses.php21780644editdlrm
fetch_schedule_report_by_group.php54400644editdlrm
fetch_teachers_by_group.php44210644editdlrm
fetch_teachers_by_program.php18210644editdlrm
fetch_teachers_for_group.php31700644editdlrm
fetch_teacher_assignment.php247760644editdlrm
fetch_teacher_by_course.php38800644editdlrm
fetch_teacher_conflicts.php56820644editdlrm
fetch_teacher_conflicts_only.php76650644editdlrm
fetch_teacher_conflicts_only_force_conflicts.php71140644editdlrm
fetch_teacher_conflicts_showonly.php104470644editdlrm
fetch_teacher_load.php14820644editdlrm
fetch_teacher_prefrence_courses_accounting.php16060644editdlrm
find_replacement-1.php160750644editdlrm
find_replacement.php181610644editdlrm
followup.php161600644editdlrm
Generate Group Schedule.php169870644editdlrm
Generate Group Schedule 1.php181210644editdlrm
generateschedule.php157060644editdlrm
Generate_Schedule.php336200644editdlrm
generate_schedule_handler.php70950644editdlrm
Generate_Schedule_Script.php297310644editdlrm
getlang.php3260644editdlrm
getrefer.php43490644editdlrm
getstatus.php12600644editdlrm
get_groups_by_program.php6080644editdlrm
get_schedule_ai-1.php377550644editdlrm
get_schedule_ai - Copy.php364590644editdlrm
get_schedule_ai.php368550644editdlrm
get_schedule_report.php23930644editdlrm
group_schedule_form - Copy.php169940644editdlrm
group_schedule_form.php169940644editdlrm
main-header-inc.php11960644editdlrm
main-header.php166710644editdlrm
managecategory.php92330644editdlrm
managerreports.php250560644editdlrm
Preference_Accounting.php225030644editdlrm
profile.php206800644editdlrm
reference_list.php82070644editdlrm
remove_saturday_course.php195030644editdlrm
report_absence.php192870644editdlrm
report_absence_1.php61600644editdlrm
reserve_course.php189570644editdlrm
rewrite_ajax_replace_saturday.php128000644editdlrm
rewrite_Create_Schedule_Algorithm.php883180644editdlrm
rewrite_Create_Schedule_Algorithm_2.php889000644editdlrm
save_schedule.php29700644editdlrm
save_schedule_group_course.php253670644editdlrm
schedulereportbygroup.php177310644editdlrm
schedulereportbyteacher.php191110644editdlrm
scheduleteacherbygroupreport - Copy.php319860644editdlrm
scheduleteacherbygroupreport.php365560644editdlrm
scheduleteacherreport.php281500644editdlrm
schedule_report.php176640644editdlrm
Schedule_Report_by_Group.php36470644editdlrm
Schedule_Report_by_Teacher.php924330644editdlrm
selectuser.php11720644editdlrm
swapcourses.php194690644editdlrm
teacher_preference.php181820644editdlrm
teacher_preference_by_course.php192440644editdlrm
teacher_unavailability.php178350644editdlrm
test.php138950644editdlrm
test1.php218370644editdlrm
transfer_reference.php272880644editdlrm
unassigncoursereport.php160290644editdlrm
unassign_course.php190110644editdlrm
Unassign_Course_Report.php16970644editdlrm
unscheduledgroupreport.php156750644editdlrm
Unscheduled_Group_Report.php20070644editdlrm
updateclient.php147650644editdlrm
updatecourse.php216260644editdlrm
updatecoursesessionhours.php181970644editdlrm
updatecoursetime.php218310644editdlrm
updategroup - Copy.php245340644editdlrm
updategroup.php180010644editdlrm
updateholiday.php224930644editdlrm
updateteacherlevel.php245320644editdlrm
updateteacherunavailability.php141840644editdlrm
UpdateUser.php182140644editdlrm
Update_Course_Hours.php21350644editdlrm
Update_Follow_Up.php46180644editdlrm
update_reserve_course.php19340644editdlrm
update_teacher_level25080644editdlrm
update_teacher_level.php24300644editdlrm
useraccesslist.php128750644editdlrm
users.php90490644editdlrm
view_swap_log.php8940644editdlrm
Edit: /home/techb158/workloadmatch.com/workloadmatch.com/BackUp/Manager/Generate_Schedule.php (33620B)
prepare("SELECT Weekend_Class, Time_Slot, Time_From, Time_To, class_days FROM Manager_Group_Name WHERE Group_ID = ?"); $groupQuery->bind_param("i", $Group_ID); $groupQuery->execute(); $groupResult = $groupQuery->get_result()->fetch_assoc(); $timeSlots = intval($groupResult['Time_Slot']); $timeFrom = explode(',', $groupResult['Time_From']); $timeTo = explode(',', $groupResult['Time_To']); $classDays = explode(',', $groupResult['class_days']); // e.g., Mon,Tue,Wed $weekend = $groupResult['Weekend_Class']; // Get holidays $holidays = []; $events = $mysqli->query("SELECT Event_Start FROM Events"); while ($row = $events->fetch_assoc()) { $holidays[] = $row['Event_Start']; } // Get retake days $retakeDays = []; $retakes = $mysqli->prepare("SELECT Retake_Date FROM Retake_Records WHERE Program_ID = ? AND Group_ID = ?"); $retakes->bind_param("ii", $Program_ID, $Group_ID); $retakes->execute(); $retakeRes = $retakes->get_result(); while ($row = $retakeRes->fetch_assoc()) { $retakeDays[] = $row['Retake_Date']; } // Generate valid dates between start and end $current = new DateTime($Start_Date); $end = new DateTime($End_Date); $calendar = []; while ($current <= $end) { $dayName = $current->format('D'); $dateStr = $current->format('Y-m-d'); if (in_array($dayName, $classDays) && !in_array($dateStr, $holidays) && !in_array($dateStr, $retakeDays)) { $calendar[] = $dateStr; } $current->modify('+1 day'); } // Sort courses by priority usort($selectedCourses, function($a, $b) use ($priorityCourses) { return (in_array($a, $priorityCourses) ? 0 : 1) - (in_array($b, $priorityCourses) ? 0 : 1); }); // Prepare schedule slots $schedule = []; $dateIndex = 0; foreach ($selectedCourses as $Course_ID) { $sessions = intval($courseSessions[$Course_ID] ?? 1); for ($i = 0; $i < $sessions; $i++) { if (!isset($calendar[$dateIndex])) break; $date = $calendar[$dateIndex]; for ($slot = 0; $slot < $timeSlots && $i < $sessions; $slot++, $i++) { if (!isset($timeFrom[$slot]) || !isset($timeTo[$slot])) continue; $schedule[] = [ 'Course_ID' => $Course_ID, 'Date' => $date, 'Time_Slot' => $slot + 1, 'Time_From' => $timeFrom[$slot], 'Time_To' => $timeTo[$slot] ]; } $dateIndex++; $i--; // Compensate for loop increment if only one slot per day } } // Display the results echo "

Generated Schedule

"; echo ""; foreach ($schedule as $row) { echo ""; } echo "
DateSlotTimeCourse ID
{$row['Date']} Slot {$row['Time_Slot']} {$row['Time_From']} - {$row['Time_To']} {$row['Course_ID']}
"; } */ if ($_SERVER['REQUEST_METHOD'] === 'POST') { $Program_ID = intval($_POST['Program_ID']); $Group_ID = intval($_POST['Group_ID']); $Start_Date = $_POST['Start_Date']; $End_Date = $_POST['End_Date']; $Divide_Evenly = isset($_POST['Divide_Evenly']); $selectedCourses = $_POST['Selected_Courses'] ?? []; $courseSessions = $_POST['Course_Sessions'] ?? []; $priorityCourses = $_POST['Priority_Course'] ?? []; echo "

🔍 Selected Courses

"; print_r($selectedCourses); echo "
"; echo "

🔢 Course Sessions

"; print_r($courseSessions); echo "
"; echo "

⭐ Priority Courses

"; print_r($priorityCourses); echo "
"; if (empty($selectedCourses)) { echo "No courses selected."; exit; } // Fetch group time slot config $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(); $group = $stmt->get_result()->fetch_assoc(); if (!$group) { echo "Group info not found."; exit; } $classDays = explode(',', $group['class_days']); $weekend = $group['Weekend_Class']; $groupName = $group['Group_Name']; // Remove Saturday if not allowed if (!$weekend && in_array('Saturday', $classDays)) { $classDays = array_filter($classDays, fn($day) => $day !== 'Saturday'); } // Extract working window and slot labels $slotLabels = explode(',', $group['Time_Slot']); $managerStart = new DateTime(trim($group['Time_From'])); $managerEnd = new DateTime(trim($group['Time_To'])); $managerDuration = $managerEnd->diff($managerStart); $dayHours = $managerDuration->h + ($managerDuration->i / 60); $slotCount = count($slotLabels); $sessionLength = $slotCount > 0 ? $dayHours / $slotCount : 3; $courseSessions = []; $courseQuery = $mysqli->query("SELECT Course_ID, Course_Time FROM Courses WHERE Program_ID = $Program_ID"); while ($row = $courseQuery->fetch_assoc()) { $courseID = $row['Course_ID']; $courseHours = $row['Course_Time']; $courseSessions[$courseID] = ceil($courseHours / $sessionLength); } $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) { if (count($slotLabels) === 1) { echo "

⚠️ No matching slot found for '$label', using full manager time range.

"; $timeFrom[] = $managerStart->format("H:i:s"); $timeTo[] = $managerEnd->format("H:i:s"); } else { echo "

❌ No valid Time_Slot_Programs found for label '$label' within the manager range {$managerStart->format('H:i')}–{$managerEnd->format('H:i')}

"; } } } $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); $sessionLength = $slotCount > 0 ? $sessionLength / $slotCount : 3; $courseSessions = []; if (empty($courseSessions)) { $courseQuery = $mysqli->query("SELECT Course_ID, Course_Time FROM Courses WHERE Program_ID = $Program_ID"); while ($row = $courseQuery->fetch_assoc()) { $courseID = $row['Course_ID']; $courseHours = $row['Course_Time']; $courseSessions[$courseID] = ceil($courseHours / $sessionLength); } } // Get holidays $holidayDates = []; $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) { $holidayDates[] = $start->format('Y-m-d'); $start->modify('+1 day'); } } // Get retake dates $retakeDates = []; $retakeStmt = $mysqli->prepare("SELECT Retake_Date FROM Retake_Records WHERE Program_ID = ? AND Group_ID = ?"); $retakeStmt->bind_param("ii", $Program_ID, $Group_ID); $retakeStmt->execute(); $retakes = $retakeStmt->get_result(); while ($row = $retakes->fetch_assoc()) { $retakeDates[] = $row['Retake_Date']; } // Build valid schedule days (excluding July) $cur = new DateTime($Start_Date); $validDates = []; $totalSessionsNeeded = array_sum($courseSessions); $sessionsPerDay = count($slotLabels); $daysRequired = ceil($totalSessionsNeeded / $sessionsPerDay); $added = 0; while ($added < $daysRequired) { $day = $cur->format('l'); $dateStr = $cur->format('Y-m-d'); $month = (int) $cur->format('m'); if ($month === 7) { $cur->modify('+1 day'); continue; } if (in_array($day, $classDays) && !in_array($dateStr, $holidayDates) && !in_array($dateStr, $retakeDates)) { $validDates[] = $dateStr; $added++; } $cur->modify('+1 day'); } // Output valid dates echo "

📅 Valid Dates for Scheduling (Excluding July)

"; print_r($validDates); echo "
"; // 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); 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; //if ($isSaturday && $weekend) { // $slotName = 'Morning'; // // // 💡 NEW: Get Morning time from Time_Slot_Programs table directly // $stmt = $mysqli->prepare("SELECT Time_From, Time_To FROM Time_Slot_Programs WHERE Time_Slot = 'Morning' LIMIT 1"); // $stmt->execute(); // $res = $stmt->get_result(); // if ($rowTime = $res->fetch_assoc()) { // $from = $rowTime['Time_From']; // $to = $rowTime['Time_To']; // } else { // $from = '08:30:00'; // fallback // $to = '12:30:00'; // } // $row['Time'] = "$from - $to"; //} else { // $slotName = $slotLabels[$slotIndex] ?? 'Unknown'; //} // // //$isSaturday = (new DateTime($row['Date']))->format('l') === 'Saturday'; //if ($isSaturday) { // $slotName .= " (Sat)"; //} echo ""; } } echo "
DateSlotTimeCourse
$date$label
(" . (new DateTime($row['Date']))->format('l') . ") {$row['Date']} {$slotName} {$row['Time']} {$courseName}" . ($isExam ? " (Exam Day)" : "") . "
"; } else { echo "

🚫 No schedule generated — check if valid time slots, sessions, or dates are missing.

"; } } /* if ($_SERVER['REQUEST_METHOD'] === 'POST') { $Program_ID = intval($_POST['Program_ID']); $Group_ID = intval($_POST['Group_ID']); $Start_Date = $_POST['Start_Date']; //$End_Date = $_POST['End_Date']; $Divide_Evenly = isset($_POST['Divide_Evenly']); $selectedCourses = $_POST['Selected_Courses'] ?? []; $courseSessions = $_POST['Course_Sessions'] ?? []; $priorityCourses = $_POST['Priority_Course'] ?? []; echo "

🔍 Selected Courses

"; print_r($selectedCourses); echo "
"; echo "

🔢 Course Sessions

"; print_r($courseSessions); echo "
"; echo "

⭐ Priority Courses

"; print_r($priorityCourses); echo "
"; if (empty($selectedCourses)) { echo "No courses selected."; exit; } // Fetch group time slot config $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(); $group = $stmt->get_result()->fetch_assoc(); if (!$group) { echo "Group info not found."; exit; } $classDays = explode(',', $group['class_days']); $weekend = $group['Weekend_Class']; $groupName = $group['Group_Name']; // Remove Saturday if not allowed if (!$weekend && in_array('Saturday', $classDays)) { $classDays = array_filter($classDays, fn($day) => $day !== 'Saturday'); } // Extract working window and slot labels $slotLabels = explode(',', $group['Time_Slot']); $managerStart = new DateTime(trim($group['Time_From'])); $managerEnd = new DateTime(trim($group['Time_To'])); // Calculate session length in hours from group's full day $managerStart = new DateTime(trim($group['Time_From'])); $managerEnd = new DateTime(trim($group['Time_To'])); $managerDuration = $managerEnd->diff($managerStart); $dayHours = $managerDuration->h + ($managerDuration->i / 60); // Count number of time slots (based on Time_Slot labels) $slotCount = count($slotLabels); $sessionLength = $slotCount > 0 ? $dayHours / $slotCount : 3; // fallback 3 if division fails // Fetch course hours and calculate suggested session count $courseSessions = []; // overwrite or generate if not already provided $courseQuery = $mysqli->query("SELECT Course_ID, Course_Time FROM Courses WHERE Program_ID = $Program_ID"); while ($row = $courseQuery->fetch_assoc()) { $courseID = $row['Course_ID']; $courseHours = $row['Course_Time']; $courseSessions[$courseID] = ceil($courseHours / $sessionLength); } $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']); // ✅ Check if the slot fits within the group's available range if ($slotStart >= $managerStart && $slotEnd <= $managerEnd) { $timeFrom[] = $slotStart->format("H:i:s"); $timeTo[] = $slotEnd->format("H:i:s"); $validSlotFound = true; break; // pick the first valid one } } if (!$validSlotFound) { // ✅ Fallback only if the group has ONE slot if (count($slotLabels) === 1) { echo "

⚠️ No matching slot found for '$label', using full manager time range.

"; $timeFrom[] = $managerStart->format("H:i:s"); $timeTo[] = $managerEnd->format("H:i:s"); } else { echo "

❌ No valid Time_Slot_Programs found for label '$label' within the manager range {$managerStart->format('H:i')}–{$managerEnd->format('H:i')}

"; } } } // 🔄 Calculate accurate session length based on selected slot durations $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); $sessionLength = $slotCount > 0 ? $sessionLength / $slotCount : 3; // Fetch course hours and calculate suggested session count $courseSessions = []; if (empty($courseSessions)) { $courseQuery = $mysqli->query("SELECT Course_ID, Course_Time FROM Courses WHERE Program_ID = $Program_ID"); while ($row = $courseQuery->fetch_assoc()) { $courseID = $row['Course_ID']; $courseHours = $row['Course_Time']; $courseSessions[$courseID] = ceil($courseHours / $sessionLength); } } echo "

📅 Group Time Slots

"; echo "
Time From: "; print_r($timeFrom); echo "
"; echo "
Time To: "; print_r($timeTo); echo "
"; echo "

📅 Class Days Allowed

"; print_r($classDays); echo "
"; // Get holidays $holidayDates = []; $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) { $holidayDates[] = $start->format('Y-m-d'); $start->modify('+1 day'); } } echo "

💼 Holidays

"; print_r($holidayDates); echo "
"; // Get retake dates $retakeDates = []; $retakeStmt = $mysqli->prepare("SELECT Retake_Date FROM Retake_Records WHERE Program_ID = ? AND Group_ID = ?"); $retakeStmt->bind_param("ii", $Program_ID, $Group_ID); $retakeStmt->execute(); $retakes = $retakeStmt->get_result(); while ($row = $retakes->fetch_assoc()) { $retakeDates[] = $row['Retake_Date']; } echo "

💼 Retake Dates

"; print_r($retakeDates); echo "
"; // Build valid schedule days //$validDates = []; $cur = new DateTime($Start_Date); $validDates = []; $totalSessionsNeeded = array_sum($courseSessions); $sessionsPerDay = count($slotLabels); $daysRequired = ceil($totalSessionsNeeded / $sessionsPerDay); $added = 0; while ($added < $daysRequired) { $day = $cur->format('l'); $dateStr = $cur->format('Y-m-d'); if (in_array($day, $classDays) && !in_array($dateStr, $holidayDates) && !in_array($dateStr, $retakeDates)) { $validDates[] = $dateStr; $added++; } $cur->modify('+1 day'); } // Suggest the end date $expectedEndDate = end($validDates); echo "

📅 Suggested End Date (Based on Andragogical Days)

"; echo "

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

"; $end = new DateTime($End_Date); while ($cur <= $end) { $day = $cur->format('l'); $dateStr = $cur->format('Y-m-d'); if (in_array($day, $classDays) && !in_array($dateStr, $holidayDates) && !in_array($dateStr, $retakeDates)) { $validDates[] = $dateStr; } $cur->modify('+1 day'); } echo "

📅 Valid Dates for Scheduling

"; 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); 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; //if ($isSaturday && $weekend) { // $slotName = 'Morning'; // // // 💡 NEW: Get Morning time from Time_Slot_Programs table directly // $stmt = $mysqli->prepare("SELECT Time_From, Time_To FROM Time_Slot_Programs WHERE Time_Slot = 'Morning' LIMIT 1"); // $stmt->execute(); // $res = $stmt->get_result(); // if ($rowTime = $res->fetch_assoc()) { // $from = $rowTime['Time_From']; // $to = $rowTime['Time_To']; // } else { // $from = '08:30:00'; // fallback // $to = '12:30:00'; // } // $row['Time'] = "$from - $to"; //} else { // $slotName = $slotLabels[$slotIndex] ?? 'Unknown'; //} // // //$isSaturday = (new DateTime($row['Date']))->format('l') === 'Saturday'; //if ($isSaturday) { // $slotName .= " (Sat)"; //} echo ""; } } echo "
DateSlotTimeCourse
$date$label
(" . (new DateTime($row['Date']))->format('l') . ") {$row['Date']} {$slotName} {$row['Time']} {$courseName}" . ($isExam ? " (Exam Day)" : "") . "
"; } else { echo "

🚫 No schedule generated — check if valid time slots, sessions, or dates are missing.

"; } } */ ?>