prepare("SELECT * FROM Manager_Group_Name WHERE Group_ID = ? AND Program_ID = ?");
$stmtGroup->bind_param("ii", $Group_ID, $Program_ID);
$stmtGroup->execute();
$groupData = $stmtGroup->get_result()->fetch_assoc();
$stmtGroup->close();
if (!$groupData) die("Group not found.");
$groupName = htmlspecialchars($groupData['Group_Name']);
$classDays = array_map('trim', explode(',', $groupData['class_days']));
// 2. Assignments
//$stmt = $mysqli->prepare("SELECT tca.*, tp.First_Name, tp.Last_Name, c.Course_Name, cg.Time_Slot, cg.Start_Time, cg.End_Time
// FROM Teacher_Course_Assignments tca
// JOIN Teacher_Profile tp ON tca.Teacher_ID = tp.Teacher_ID
// JOIN Courses c ON tca.Course_ID = c.Course_ID
// JOIN Schedule_Course_for_Group cg ON tca.Schedule_ID = cg.Schedule_ID
// WHERE tca.Program_ID = ? AND tca.Group_ID = ?");
//$stmt->bind_param("ii", $Program_ID, $Group_ID);
//$stmt->execute();
//$assignments = $stmt->get_result()->fetch_all(MYSQLI_ASSOC);
//$stmt->close();
//echo "
";
//print_r($assignments);
//echo "
";
$stmt = $mysqli->prepare("
SELECT
tca.Assignment_ID,
tca.Teacher_ID,
tca.Course_ID,
tca.Group_ID,
tca.Program_ID,
tca.Schedule_ID,
cg.Time_Slot,
tca.Assigned_At,
tp.First_Name,
tp.Last_Name,
cg.Course_Name,
cg.Start_Time,
cg.End_Time,
(
SELECT MIN(Start_Date)
FROM Schedule_Course_for_Group
WHERE Course_ID = tca.Course_ID
AND Group_ID = tca.Group_ID
AND Program_ID = tca.Program_ID
AND Assigned = 1
) AS Start_Date,
(
SELECT MAX(End_Date)
FROM Schedule_Course_for_Group
WHERE Course_ID = tca.Course_ID
AND Group_ID = tca.Group_ID
AND Program_ID = tca.Program_ID
AND Assigned = 1
) AS End_Date
FROM Teacher_Course_Assignments tca
JOIN Teacher_Profile tp
ON tca.Teacher_ID = tp.Teacher_ID
JOIN Schedule_Course_for_Group cg
ON tca.Schedule_ID = cg.Schedule_ID
AND tca.Course_ID = cg.Course_ID
AND tca.Group_ID = cg.Group_ID
AND tca.Program_ID = cg.Program_ID
WHERE tca.Program_ID = ? AND tca.Group_ID = ?
");
if (!$stmt) {
die("❌ Prepare failed: " . $mysqli->error);
}
$stmt->bind_param("ii", $Program_ID, $Group_ID);
$stmt->execute();
$assignments = $stmt->get_result()->fetch_all(MYSQLI_ASSOC);
$stmt->close();
//echo "
";
//print_r($assignments);
//echo "
";
//echo "
";
//print_r($assignments);
//echo "
";
// 3. Retakes
//$stmt = $mysqli->prepare("SELECT rr.Retake_Date, tsp.Time_Slot
// FROM Retake_Records rr
// JOIN Time_Slot_Programs tsp ON rr.Time_Slot_Programs_ID = tsp.Time_Slot_Programs_ID
// WHERE rr.Program_ID = ? AND rr.Group_ID = ?");
//$stmt->bind_param("ii", $Program_ID, $Group_ID);
//$stmt->execute();
//$retakes = $stmt->get_result()->fetch_all(MYSQLI_ASSOC);
//$stmt->close();
$stmt = $mysqli->prepare("
SELECT rr.Retake_Date, gsm.Time_Slot
FROM Retake_Records rr
JOIN Group_Slot_Mapping gsm
ON rr.Group_ID = gsm.Group_ID
WHERE rr.Program_ID = ? AND rr.Group_ID = ?");
$stmt->bind_param("ii", $Program_ID, $Group_ID);
$stmt->execute();
$retakes = $stmt->get_result()->fetch_all(MYSQLI_ASSOC);
$stmt->close();
// 4. Holidays
$holidayMap = [];
$res = $mysqli->query("SELECT Event_Title, Event_Start, Event_End, Event_Color FROM Events");
while ($event = $res->fetch_assoc()) {
$start = new DateTime($event['Event_Start']);
$end = (new DateTime($event['Event_End']))->modify('+1 day');
foreach (new DatePeriod($start, new DateInterval('P1D'), $end) as $dt) {
$holidayMap[$dt->format('Y-m-d')] = [
'title' => $event['Event_Title'],
'color' => $event['Event_Color']
];
}
}
// 5. Date Range
$dates = array_merge(array_column($assignments, 'Start_Date'), array_column($assignments, 'End_Date'));
$start = new DateTime(min($dates));
$end = (new DateTime(max($dates)))->modify('+1 day');
$range = new DatePeriod($start, new DateInterval('P1D'), $end);
echo "
Schedule for Group: {$groupName}
";
echo "
";
echo "
";
echo "
Date
Course
Teacher
Time Slot
Time
Type
";
foreach ($range as $date) {
$current = $date->format('Y-m-d');
$day = $date->format('l');
// Always display holiday regardless of class day
//if (isset($holidayMap[$current])) {
// $h = $holidayMap[$current];
// echo "
$current
{$h['title']}
-
-
-
Holiday
";
//}
if (isset($holidayMap[$current])) {
$h = $holidayMap[$current];
echo "
$current
{$h['title']}
-
-
-
Holiday
";
continue; // ✅ prevent further rows on this holiday
}
// Only skip non-class days if not a holiday
if (!in_array($day, $classDays) && !isset($holidayMap[$current])) continue;
$usedSlots = [];
// Holidays (full day event, doesn't skip other events)
// Holidays (skip the rest of the loop if it's a holiday)
// Holidays (display holiday but still show other events on this day)
// Retakes
foreach ($retakes as $r) {
if ($r['Retake_Date'] === $current) {
$slotKey = strtolower(trim($r['Time_Slot']));
if (!in_array($slotKey, $usedSlots)) {
$usedSlots[] = $slotKey;
echo "