prepare("SELECT * FROM teachers WHERE school_id = ? ORDER BY name"); $stmt->execute([$school_id]); return $stmt->fetchAll(PDO::FETCH_ASSOC); } function get_timeslots($pdo) { return $pdo->query("SELECT * FROM timeslots ORDER BY start_time")->fetchAll(PDO::FETCH_ASSOC); } function get_teacher_schedule($pdo, $teacher_id) { $sql = " SELECT s.id, s.day_of_week, s.timeslot_id, s.lesson_display_name, c.name as class_name, sub.name as subject_name, -- The specific subject for the teacher s.is_double, s.is_elective FROM schedules s JOIN schedule_teachers st ON s.id = st.schedule_id LEFT JOIN classes c ON s.class_id = c.id -- Find the specific subject this teacher teaches to this class from workloads LEFT JOIN workloads w ON st.teacher_id = w.teacher_id AND s.class_id = w.class_id LEFT JOIN subjects sub ON w.subject_id = sub.id WHERE st.teacher_id = :teacher_id ORDER BY s.day_of_week, s.timeslot_id "; $stmt = $pdo->prepare($sql); $stmt->execute([':teacher_id' => $teacher_id]); return $stmt->fetchAll(PDO::FETCH_ASSOC); } // --- Main Logic --- $pdoconn = db(); $school_id = $_SESSION['school_id']; $role = $_SESSION['role']; $user_id = $_SESSION['user_id']; $teachers = []; if ($role === 'admin') { $stmt = $pdoconn->prepare("SELECT * FROM teachers WHERE school_id = ? ORDER BY name"); $stmt->execute([$school_id]); $teachers = $stmt->fetchAll(PDO::FETCH_ASSOC); } else { // Teacher $stmt = $pdoconn->prepare("SELECT * FROM teachers WHERE user_id = ? AND school_id = ?"); $stmt->execute([$user_id, $school_id]); $teachers = $stmt->fetchAll(PDO::FETCH_ASSOC); } $timeslots = get_timeslots($pdoconn); $days_of_week = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']; $selected_teacher_id = null; if ($role === 'admin') { $selected_teacher_id = isset($_GET['teacher_id']) ? $_GET['teacher_id'] : null; } else { // Teacher if (!empty($teachers)) { $selected_teacher_id = $teachers[0]['id']; } } $selected_teacher_name = ''; $teacher_schedule_raw = []; if ($selected_teacher_id) { foreach ($teachers as $teacher) { if ($teacher['id'] == $selected_teacher_id) { $selected_teacher_name = $teacher['name']; break; } } $teacher_schedule_raw = get_teacher_schedule($pdoconn, $selected_teacher_id); // Gemini: Log the data for debugging error_log("--- Teacher Timetable Debug ---"); error_log("Selected Teacher ID: " . print_r($selected_teacher_id, true)); error_log("Raw schedule data from DB: " . print_r($teacher_schedule_raw, true)); } // Organize schedule for easy display $non_break_periods = array_values(array_filter($timeslots, function($ts) { return !$ts['is_break']; })); $timeslot_id_to_period_idx = []; foreach($non_break_periods as $idx => $period) { $timeslot_id_to_period_idx[$period['id']] = $idx; } $teacher_timetable_by_period = []; // Initialize the timetable array foreach ($days_of_week as $day_idx => $day) { $teacher_timetable_by_period[$day_idx] = array_fill(0, count($non_break_periods), null); } foreach ($teacher_schedule_raw as $lesson) { $day_idx = $lesson['day_of_week']; if (isset($timeslot_id_to_period_idx[$lesson['timeslot_id']])) { $period_idx = $timeslot_id_to_period_idx[$lesson['timeslot_id']]; // Skip if this slot is already filled by a continuation marker if (isset($teacher_timetable_by_period[$day_idx][$period_idx]) && isset($teacher_timetable_by_period[$day_idx][$period_idx]['continuation'])) { continue; } // Place the lesson. Handle co-teaching by making it an array. if (!isset($teacher_timetable_by_period[$day_idx][$period_idx]) || $teacher_timetable_by_period[$day_idx][$period_idx] === null) { $teacher_timetable_by_period[$day_idx][$period_idx] = [$lesson]; } else { $teacher_timetable_by_period[$day_idx][$period_idx][] = $lesson; } if (!empty($lesson['is_double'])) { $next_period_idx = $period_idx + 1; if (isset($non_break_periods[$next_period_idx])) { $continuation_marker = ['continuation' => true, 'original_lesson' => $lesson]; $teacher_timetable_by_period[$day_idx][$next_period_idx] = $continuation_marker; } } } } // Gemini: Log the final structure error_log("Final teacher_timetable_by_period structure: " . print_r($teacher_timetable_by_period, true)); ?>