/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/save_schedule_group_course.php (25367B)
'Invalid data format.']); exit; } // 3. PREPARE STATEMENTS // 3A. Fetch course name and duration $nameStmt = $mysqli->prepare(" SELECT Course_Name, Course_Time FROM Courses WHERE Course_ID = ? "); if (!$nameStmt) { error_log("nameStmt error: " . $mysqli->error); http_response_code(500); exit(json_encode(['error' => 'Server error.'])); } // 3B. Check for existing master row // (10 placeholders: Program_ID, Course_ID, Group_ID, Time_Slot_ID, Course_Hours, // Time_Slot, Start_Date, End_Date, Start_Time, End_Time) $getMainStmt = $mysqli->prepare(" SELECT Schedule_ID FROM Course_Group_Schedule_Main WHERE Program_ID = ? AND Course_ID = ? AND Group_ID = ? AND Time_Slot_ID = ? AND Course_Hours = ? AND Time_Slot = ? AND Start_Date = ? AND End_Date = ? AND Start_Time = ? AND End_Time = ? "); if (!$getMainStmt) { error_log("getMainStmt error: " . $mysqli->error); http_response_code(500); exit(json_encode(['error' => 'Server error.'])); } // 3C. Insert new master row when needed (11 placeholders) // (Program_ID, Course_ID, Group_ID, Time_Slot_ID, Course_Hours, // Reserve_Course, Time_Slot, Start_Date, End_Date, Start_Time, End_Time) $insertMainStmt = $mysqli->prepare(" INSERT INTO Course_Group_Schedule_Main (Program_ID, Course_ID, Group_ID, Time_Slot_ID, Course_Hours, Reserve_Course, Time_Slot, Start_Date, End_Date, Start_Time, End_Time, Assigned, Last_Updated) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 0, NOW()) "); if (!$insertMainStmt) { error_log("insertMainStmt error: " . $mysqli->error); http_response_code(500); exit(json_encode(['error' => 'Server error.'])); } // 3D. Insert individual session rows (13 placeholders) // (Schedule_ID, Program_ID, Course_ID, Group_ID, Group_Slot_ID, // Course_Hours, Course_Name, Reserve_Course, Time_Slot, // Start_Date, End_Date, Start_Time, End_Time) $sessionStmt = $mysqli->prepare(" INSERT INTO Schedule_Course_for_Group (Schedule_ID, Program_ID, Course_ID, Group_ID, Group_Slot_ID, Course_Hours, Course_Name, Reserve_Course, Time_Slot, Start_Date, End_Date, Start_Time, End_Time, Assigned, Last_Updated) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 0, NOW()) "); if (!$sessionStmt) { error_log("sessionStmt error: " . $mysqli->error); http_response_code(500); exit(json_encode(['error' => 'Server error.'])); } // 4. GROUP ROWS BY UNIQUE ASSIGNMENT $assignments = []; foreach ($data as $row) { // Create a unique key for each assignment $key = implode('-', [ $row['program_id'], $row['course_id'], $row['group_id'], $row['group_slot_id'], $row['reserve_course'], $row['time_slot'], $row['start_time'], $row['end_time'] ]); if (!isset($assignments[$key])) { $assignments[$key] = [ 'info' => $row, 'sessions' => [] ]; } $assignments[$key]['sessions'][] = $row; if ($row['time_slot'] === 0 || $row['time_slot'] === '0') { error_log("Zero time_slot detected: " . json_encode($row)); } } // 5. PROCESS EACH ASSIGNMENT $insertedCount = 0; foreach ($assignments as $assignment) { $info = $assignment['info']; // 5A. Fetch course name + duration $nameStmt->bind_param('i', $info['course_id']); $nameStmt->execute(); $nameStmt->bind_result($courseName, $courseHours); $nameStmt->fetch(); $nameStmt->free_result(); // 5B. Look for existing master row // Type string: 5×i (Program_ID, Course_ID, Group_ID, Time_Slot_ID, Course_Hours) // 5×s (Time_Slot, Start_Date, End_Date, Start_Time, End_Time) $getMainStmt->bind_param( 'iiiii' . 'sssss', $info['program_id'], // i $info['course_id'], // i $info['group_id'], // i $info['group_slot_id'], // i $courseHours, // i $info['time_slot'], // s $info['start_date'], // s $info['end_date'], // s $info['start_time'], // s $info['end_time'] // s ); $getMainStmt->execute(); $getMainStmt->bind_result($mainScheduleID); $foundMain = $getMainStmt->fetch(); $getMainStmt->free_result(); // 5C. If no master row, insert it if (!$foundMain || !$mainScheduleID) { $reserveCourse = $info['reserve_course']; // integer column // Type string: 6×i (Program_ID, Course_ID, Group_ID, Time_Slot_ID, Course_Hours, Reserve_Course) // 5×s (Time_Slot, Start_Date, End_Date, Start_Time, End_Time) $insertMainStmt->bind_param( 'iiiiiisssss', $info['program_id'], // i $info['course_id'], // i $info['group_id'], // i $info['group_slot_id'], // i $courseHours, // i $reserveCourse, // i $info['time_slot'], // s $info['start_date'], // s $info['end_date'], // s $info['start_time'], // s $info['end_time'] // s ); if ($insertMainStmt->execute()) { $mainScheduleID = $insertMainStmt->insert_id; } else { error_log("Failed to insert master: " . $insertMainStmt->error); continue; // skip sessions for this assignment } } // 5D. Insert each session row tied to $mainScheduleID foreach ($assignment['sessions'] as $session) { $reserveCourse = $session['reserve_course']; // Correct column order: // 1. Schedule_ID (i) // 2. Program_ID (i) // 3. Course_ID (i) // 4. Group_ID (i) // 5. Group_Slot_ID (i) // 6. Course_Hours (i) // 7. Course_Name (s) // 8. Reserve_Course (i) // 9. Time_Slot (s) // 10. Start_Date (s) // 11. End_Date (s) // 12. Start_Time (s) // 13. End_Time (s) $sessionStmt->bind_param( 'iiiiiiissssss', $mainScheduleID, // i $session['program_id'], // i $session['course_id'], // i $session['group_id'], // i $session['group_slot_id'], // i $courseHours, // i $courseName, // s $reserveCourse, // i $session['time_slot'], // s $session['start_date'], // s $session['end_date'], // s $session['start_time'], // s $session['end_time'] // s ); if ($sessionStmt->execute()) { $insertedCount++; } else { error_log("Session insert error: " . $sessionStmt->error . " — " . json_encode($session)); } } } // 6. CLEAN UP & RETURN RESPONSE $sessionStmt->close(); $insertMainStmt->close(); $getMainStmt->close(); $nameStmt->close(); echo "✅ Inserted $insertedCount session rows into Schedule_Course_for_Group, all linked to their correct Schedule_ID from Course_Group_Schedule_Main."; // Return a success message with the number of inserted sessions //echo json_encode([ // 'message' => "Inserted $insertedCount session rows successfully." //]); */ // 1. INITIAL SETUP include_once '../includes/db_connect.php'; include_once '../includes/functions.php'; sec_session_start(); header('Content-Type: application/json'); ini_set('error_log', __DIR__ . '/schedule_error_log.txt'); // 2. READ & VALIDATE INPUT $payload = file_get_contents('php://input'); $data = json_decode($payload, true); if (!is_array($data)) { error_log("Invalid payload: $payload"); http_response_code(400); echo "Invalid data format."; exit; } // 3. PREPARE STATEMENTS // 3A. Fetch course name + duration $nameStmt = $mysqli->prepare(" SELECT Course_Name, Course_Time FROM Courses WHERE Course_ID = ? "); if (!$nameStmt) { error_log("nameStmt prepare failed: " . $mysqli->error); http_response_code(500); exit("Server error."); } // 3B. Check for existing master row // Now includes Start_Date AND End_Date (10 placeholders total) $getMainStmt = $mysqli->prepare(" SELECT Schedule_ID FROM Course_Group_Schedule_Main WHERE Program_ID = ? AND Course_ID = ? AND Group_ID = ? AND Time_Slot_ID = ? AND Course_Hours = ? AND Time_Slot = ? AND Start_Date = ? AND End_Date = ? AND Start_Time = ? AND End_Time = ? "); if (!$getMainStmt) { error_log("getMainStmt prepare failed: " . $mysqli->error); http_response_code(500); exit("Server error."); } // 3C. Insert a new master row when needed // 11 placeholders (reserve_course plus the 10 other columns) $insertMainStmt = $mysqli->prepare(" INSERT INTO Course_Group_Schedule_Main (Program_ID, Course_ID, Group_ID, Time_Slot_ID, Course_Hours, Reserve_Course, Time_Slot, Start_Date, End_Date, Start_Time, End_Time, Assigned, Last_Updated) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 0, NOW()) "); if (!$insertMainStmt) { error_log("insertMainStmt prepare failed: " . $mysqli->error); http_response_code(500); exit("Server error."); } // 3D. Insert individual session rows (13 placeholders total) $sessionStmt = $mysqli->prepare(" INSERT INTO Schedule_Course_for_Group (Schedule_ID, Program_ID, Course_ID, Group_ID, Group_Slot_ID, Course_Hours, Course_Name, Reserve_Course, Time_Slot, Start_Date, End_Date, Start_Time, End_Time, Assigned, Last_Updated) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 0, NOW()) "); if (!$sessionStmt) { error_log("sessionStmt prepare failed: " . $mysqli->error); http_response_code(500); exit("Server error."); } // 4. GROUP ROWS BY UNIQUE ASSIGNMENT $assignments = []; foreach ($data as $row) { $key = implode('-', [ $row['program_id'], $row['course_id'], $row['group_id'], $row['group_slot_id'], $row['reserve_course'], $row['time_slot'], $row['start_time'], $row['end_time'] ]); if (!isset($assignments[$key])) { $assignments[$key] = [ 'info' => $row, 'sessions' => [] ]; } $assignments[$key]['sessions'][] = $row; if ($row['time_slot'] === 0 || $row['time_slot'] === '0') { error_log("Zero time_slot detected: " . json_encode($row)); } } // 5. PROCESS EACH ASSIGNMENT $insertedCount = 0; foreach ($assignments as $assignment) { $info = $assignment['info']; // 5A. Fetch course name and course hours $nameStmt->bind_param('i', $info['course_id']); $nameStmt->execute(); $nameStmt->bind_result($course_name, $course_hours); $fetched = $nameStmt->fetch(); $nameStmt->free_result(); if (! $fetched) { error_log("No course found for Course_ID=" . $info['course_id']); continue; // skip this assignment entirely } // 5B. Look for an existing master row // type string = 5×i + 5×s = 'iiiii' . 'sssss' $getMainStmt->bind_param( 'iiiii' . 'sssss', $info['program_id'], // i $info['course_id'], // i $info['group_id'], // i $info['group_slot_id'], // i $course_hours, // i $info['time_slot'], // s $info['start_date'], // s $info['end_date'], // s $info['start_time'], // s $info['end_time'] // s ); $getMainStmt->execute(); $getMainStmt->bind_result($mainScheduleID); $foundMain = $getMainStmt->fetch(); $getMainStmt->free_result(); // 5C. If no master row, insert it if (! $foundMain || ! $mainScheduleID) { $reserve_course = (int) $info['reserve_course']; // type string = 6×i + 5×s = 'iiiiiisssss' $insertMainStmt->bind_param( 'iiiiiisssss', $info['program_id'], // i $info['course_id'], // i $info['group_id'], // i $info['group_slot_id'], // i $course_hours, // i $reserve_course, // i $info['time_slot'], // s $info['start_date'], // s $info['end_date'], // s $info['start_time'], // s $info['end_time'] // s ); if ($insertMainStmt->execute()) { $mainScheduleID = $insertMainStmt->insert_id; } else { error_log("Failed to insert master row: " . $insertMainStmt->error); continue; // skip sessions for this assignment } } // 5D. Insert each session row tied to $mainScheduleID foreach ($assignment['sessions'] as $row) { $reserve_course = (int) $row['reserve_course']; // type string = 7×i + 6×s = 'iiiiiiissssss' $sessionStmt->bind_param( 'iiiiiisisssss', $mainScheduleID, // i $row['program_id'], // i $row['course_id'], // i $row['group_id'], // i $row['group_slot_id'], // i $course_hours, // i $course_name, // s $reserve_course, // i $row['time_slot'], // s $row['start_date'], // s $row['end_date'], // s $row['start_time'], // s $row['end_time'] // s ); if ($sessionStmt->execute()) { $insertedCount++; } else { error_log( "Session insert failed: " . $sessionStmt->error . " — row: " . json_encode($row) ); } } } // 6. CLEAN UP & OUTPUT $sessionStmt->close(); $insertMainStmt->close(); $getMainStmt->close(); $nameStmt->close(); // Assuming you already have $mysqli as your mysqli connection $sql = " UPDATE Course_Group_Schedule_Main AS main JOIN ( SELECT Schedule_ID, Program_ID, Course_ID, Group_ID, MAX(End_Date) AS MaxEndDate FROM Schedule_Course_for_Group GROUP BY Schedule_ID, Program_ID, Course_ID, Group_ID ) AS scfg ON main.Schedule_ID = scfg.Schedule_ID AND main.Program_ID = scfg.Program_ID AND main.Course_ID = scfg.Course_ID AND main.Group_ID = scfg.Group_ID SET main.End_Date = scfg.MaxEndDate "; // Run the query if ($mysqli->query($sql)) { // echo "Course_Group_Schedule_Main updated successfully."; } else { echo "Error updating records: " . $mysqli->error; } echo "✅ Inserted $insertedCount session rows into Schedule_Course_for_Group."; /* include_once '../includes/db_connect.php'; include_once '../includes/functions.php'; sec_session_start(); ini_set('error_log', __DIR__ . '/schedule_error_log.txt'); $payload = file_get_contents('php://input'); $data = json_decode($payload, true); if (!is_array($data)) { error_log("❌ Invalid input payload: $payload"); http_response_code(400); echo "Invalid data format."; exit; } //error_log("✅ Decoded data structure: " . print_r($data, true)); // //exit(); //exit("Server error."); $nameStmt = $mysqli->prepare("SELECT Course_Name FROM Courses WHERE Course_ID = ?"); if (! $nameStmt) { error_log("❌ Course name lookup failed: " . $mysqli->error); http_response_code(500); exit("Server error."); } $stmt = $mysqli->prepare("INSERT INTO Schedule_Course_for_Group (Schedule_ID, Program_ID, Course_ID, Group_ID, Group_Slot_ID, Course_Name, Reserve_Course, Time_Slot, Start_Date, End_Date, Start_Time, End_Time, Assigned, Last_Updated) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 0, NOW())"); if (! $stmt) { error_log("❌ Insert prepare failed: " . $mysqli->error); http_response_code(500); exit("Server error."); } $inserted = 0; $grouped = []; // Fetch the last Schedule_ID $result = $mysqli->query("SELECT MAX(Schedule_ID) AS LastID FROM Schedule_Course_for_Group"); $row = $result->fetch_assoc(); $currentScheduleID = (int) $row['LastID']; $checkDuplicateStmt = $mysqli->prepare(" SELECT COUNT(*) FROM Schedule_Course_for_Group WHERE Program_ID = ? AND Course_ID = ? AND Group_ID = ? AND Time_Slot = ? AND Start_Date = ? AND End_Date = ? AND Start_Time = ? AND End_Time = ? "); if (! $checkDuplicateStmt) { error_log("❌ Failed to prepare checkDuplicateStmt: " . $mysqli->error); exit("Server error."); } foreach ($data as $row) { $program_id = (int) $row['program_id']; $course_id = (int) $row['course_id']; $group_id = (int) $row['group_id']; $group_slot_id = (int) $row['group_slot_id']; $reserve_course = (int) $row['reserve_course']; $time_slot = trim($row['time_slot'] ?? ''); $start_date = trim($row['start_date'] ?? ''); $end_date = trim($row['end_date'] ?? '') ?: $start_date; $start_time = trim($row['start_time'] ?? ''); $end_time = trim($row['end_time'] ?? ''); if (!$program_id || !$course_id || !$group_id || !$group_slot_id || $time_slot === '' || $start_date === '') { error_log("⚠️ Skipping invalid row: " . json_encode($row)); continue; } // Lookup course name $nameStmt->bind_param('i', $course_id); $nameStmt->execute(); $nameStmt->bind_result($course_name); $nameStmt->fetch(); $nameStmt->free_result(); // Always add to grouped list (even if duplicate in session table) $key = "$program_id-$course_id-$group_id-$time_slot-$start_time-$end_time"; if (!isset($grouped[$key])) { $grouped[$key] = [ 'program_id' => $program_id, 'course_id' => $course_id, 'group_id' => $group_id, 'group_slot_id' => $group_slot_id, 'reserve_course' => $reserve_course, 'time_slot' => $time_slot, 'start_time' => $start_time, 'end_time' => $end_time, 'start_date' => $start_date, 'end_date' => $end_date, ]; } else { $grouped[$key]['start_date'] = min($grouped[$key]['start_date'], $start_date); $grouped[$key]['end_date'] = max($grouped[$key]['end_date'], $end_date); } // Check for duplicate $checkDuplicateStmt->bind_param( 'iiisssss', $program_id, $course_id, $group_id, $time_slot, $start_date, $end_date, $start_time, $end_time ); $checkDuplicateStmt->execute(); $checkDuplicateStmt->bind_result($exists); $checkDuplicateStmt->fetch(); $checkDuplicateStmt->free_result(); if ($exists > 0) { error_log("⚠️ Duplicate row skipped (already exists): " . json_encode($row)); continue; // Skip inserting into session table } // Insert new session $currentScheduleID++; $stmt->bind_param( 'iiiiisisssss', $currentScheduleID, $program_id, $course_id, $group_id, $group_slot_id, $course_name, $reserve_course, $time_slot, $start_date, $end_date, $start_time, $end_time ); if ($stmt->execute()) { $inserted++; } else { error_log("❌ Insert failed: " . $stmt->error . " — row: " . json_encode($row)); } } // Final: Insert into Course_Group_Schedule_Main $checkStmt = $mysqli->prepare(" SELECT COUNT(*) FROM Course_Group_Schedule_Main WHERE Program_ID = ? AND Course_ID = ? AND Group_ID = ? AND Time_Slot = ? AND Start_Time = ? AND End_Time = ? "); $insertStmt2 = $mysqli->prepare(" INSERT INTO Course_Group_Schedule_Main (Program_ID, Course_ID, Group_ID, Time_Slot_ID, Reserve_Course, Time_Slot, Start_Date, End_Date, Start_Time, End_Time, Assigned, Last_Updated) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 0, NOW())"); $mainInserted = 0; foreach ($grouped as $g) { $checkStmt->bind_param( 'iiisss', $g['program_id'], $g['course_id'], $g['group_id'], $g['time_slot'], $g['start_time'], $g['end_time'] ); $checkStmt->execute(); $checkStmt->bind_result($count); $checkStmt->fetch(); $checkStmt->free_result(); if ($count == 0) { $insertStmt2->bind_param( 'iiiissssss', $g['program_id'], $g['course_id'], $g['group_id'], $g['group_slot_id'], $g['reserve_course'], $g['time_slot'], $g['start_date'], $g['end_date'], $g['start_time'], $g['end_time'] ); if ($insertStmt2->execute()) { $mainInserted++; } else { error_log("❌ Failed to insert into Main: " . $insertStmt2->error); } } } $stmt->close(); $insertStmt2->close(); $checkStmt->close(); $nameStmt->close(); $checkDuplicateStmt->close(); echo "✅ Inserted $inserted rows into Schedule_Course_for_Group. Inserted $mainInserted grouped rows into Course_Group_Schedule_Main."; */ //echo "✅ Saved all session rows. Inserted $mainInserted new grouped rows into Course_Group_Schedule_Main."; //echo "✅ Inserted $inserted session rows into Schedule_Course_for_Group. Inserted $mainInserted grouped rows into Course_Group_Schedule_Main."; /***** // Enable error logging //ini_set('log_errors', 1); ini_set('error_log', __DIR__ . '/schedule_error_log.txt'); // Read & decode incoming JSON $payload = file_get_contents('php://input'); $data = json_decode($payload, true); if (!is_array($data)) { error_log("❌ Invalid input payload: $payload"); http_response_code(400); echo "Invalid data format."; exit; } // Prepare a statement to look up Course_Name $nameStmt = $mysqli->prepare( "SELECT Course_Name FROM Courses WHERE Course_ID = ?" ); if (! $nameStmt) { error_log("❌ Name-lookup prepare failed: " . $mysqli->error); http_response_code(500); echo "Server error."; exit; } // Prepare the insert (now including Course_Name) $sql = "INSERT INTO Schedule_Course_for_Group (Program_ID, Course_ID, Group_ID, Group_Slot_ID, Course_Name, Reserve_Course, Time_Slot, Start_Date, End_Date, Start_Time, End_Time, Assigned, Last_Updated) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 0, NOW())"; $stmt = $mysqli->prepare($sql); if (! $stmt) { error_log("❌ Insert-prepare failed: " . $mysqli->error); http_response_code(500); echo "Server error."; exit; } $inserted = 0; foreach ($data as $row) { // pull out & sanitize $program_id = (int) $row['program_id']; $course_id = (int) $row['course_id']; $group_id = (int) $row['group_id']; $group_slot_id = (int) $row['group_slot_id']; $reserve_course = (int) $row['reserve_course']; $time_slot = trim($row['time_slot'] ?? ''); $start_date = trim($row['start_date'] ?? ''); $end_date = trim($row['end_date'] ?? ''); $start_time = trim($row['start_time'] ?? ''); $end_time = trim($row['end_time'] ?? ''); // default end_date to start_date if empty if ($end_date === '') { $end_date = $start_date; } // basic sanity check if (! $program_id || ! $course_id || ! $group_id || ! $group_slot_id || $time_slot === '' || $start_date === '' || $end_date === '' ) { error_log("⚠️ Skipping invalid row: " . json_encode($row)); continue; } // 1) look up Course_Name $nameStmt->bind_param('i', $course_id); $nameStmt->execute(); $nameStmt->bind_result($course_name); if (! $nameStmt->fetch()) { $course_name = ''; // or some default } $nameStmt->free_result(); // 2) insert $stmt->bind_param( 'iiiisisssss', $program_id, // i $course_id, // i $group_id, // i $group_slot_id, // i $course_name, // s $reserve_course,// i $time_slot, // s $start_date, // s $end_date, // s $start_time, // s $end_time // s ); if ($stmt->execute()) { $inserted++; } else { error_log("❌ Insert failed: " . $stmt->error . " — row: " . json_encode($row)); } } $stmt->close(); $nameStmt->close(); echo "✅ Inserted $inserted row(s) into Schedule_Course_for_Group."; **/