/
home
/
techb158
/
workloadmatch.com
/
Manager
/
Inc
/
/home/techb158/workloadmatch.com/Manager/Inc
mkdir
upload
Name
Size
Mode
Actions
LLMProviders/
-
0755
rm
AddCourse.php
2556
0644
edit
dl
rm
AddCourseTime.php
1904
0644
edit
dl
rm
AddGroup - Copy.php
4633
0644
edit
dl
rm
AddGroup.php
5698
0644
edit
dl
rm
AddHoliday.php
1772
0644
edit
dl
rm
AddTeacherLevel.php
2307
0644
edit
dl
rm
AddUser.php
12821
0644
edit
dl
rm
Add_Retake_Remediation.php
1334
0644
edit
dl
rm
AIScheduleOptimizer.php
11919
0644
edit
dl
rm
Assignment-1.php
75380
0644
edit
dl
rm
Assignment-2.php
75380
0644
edit
dl
rm
Assignment - BackUp- orgenal.php
73272
0644
edit
dl
rm
Assignment - BackUp.php
62761
0644
edit
dl
rm
Assignment - Copy (Last File Updated 2025-05-15).php
72933
0644
edit
dl
rm
Assignment - Copy.php
61826
0644
edit
dl
rm
Assignment.php
74308
0644
edit
dl
rm
Assignment_BackUp.php
79047
0644
edit
dl
rm
Assign_Teacher_Manual.php
20957
0644
edit
dl
rm
Assign_Teacher_Manual_bak.php.disabled
20535
0644
edit
dl
rm
Assign_Teacher_Manual_Force_conflict.php
21106
0644
edit
dl
rm
Available_Teacher_Report.php
2342
0644
edit
dl
rm
BatchScheduler.php
3588
0644
edit
dl
rm
CombinedScheduler.php
8130
0644
edit
dl
rm
ConflictResolver.php
4920
0644
edit
dl
rm
error_log
869
0644
edit
dl
rm
Lockup_to_Assign.php
6367
0644
edit
dl
rm
Process_Assignment - Copy.php
4233
0644
edit
dl
rm
Process_Assignment.php
5813
0644
edit
dl
rm
ScheduleEngine.php
5596
0644
edit
dl
rm
ScheduleGenerator.php
8811
0644
edit
dl
rm
Schedule_Report_by_Group.php
3074
0644
edit
dl
rm
TeacherAssignmentEngine.php
12487
0644
edit
dl
rm
Update_Course.php
2717
0644
edit
dl
rm
Update_Course_Time.php
1947
0644
edit
dl
rm
Update_Group - Copy.php
3489
0644
edit
dl
rm
Update_Group.php
9657
0644
edit
dl
rm
Update_Holiday.php
2357
0644
edit
dl
rm
Update_Profile.php
4923
0644
edit
dl
rm
Update_User.php
5547
0644
edit
dl
rm
Edit:
/home/techb158/workloadmatch.com/Manager/Inc/CombinedScheduler.php
(8130B)
<?php require_once __DIR__ . '/ScheduleEngine.php'; require_once __DIR__ . '/ScheduleGenerator.php'; require_once __DIR__ . '/TeacherAssignmentEngine.php'; require_once __DIR__ . '/AIScheduleOptimizer.php'; class CombinedScheduler { private mysqli $db; private ScheduleEngine $engine; private ScheduleGenerator $generator; private TeacherAssignmentEngine $assignmentEngine; private AIScheduleOptimizer $aiOptimizer; public function __construct(mysqli $db) { $this->db = $db; $this->engine = new ScheduleEngine($db); $this->generator = new ScheduleGenerator($db); $this->assignmentEngine = new TeacherAssignmentEngine($db); $this->aiOptimizer = new AIScheduleOptimizer($db); } public function setProvider(ProviderInterface $provider): void { $this->aiOptimizer->setProvider($provider); } public function hasProvider(): bool { return $this->aiOptimizer->hasProvider(); } public function generateAndAssign( int $programId, int $groupId, string $startDate, ?string $endDate = null, array $selectedCourses = [], array $priorityCourses = [], bool $saveToDb = false, bool $useAi = true ): array { $scheduleResult = $this->generateSchedule($programId, $groupId, $startDate, $endDate, $selectedCourses, $priorityCourses, $useAi); $savedEntries = []; if ($saveToDb && !empty($scheduleResult['schedule'])) { $savedEntries = $this->saveScheduleToDb($scheduleResult['schedule'], $programId, $groupId); } $assignmentResults = []; if ($saveToDb && !empty($savedEntries)) { $assignmentResults = $this->assignmentEngine->assignTeachers($programId, $groupId); } return [ 'schedule_result' => $scheduleResult, 'saved_entries' => $savedEntries, 'assignment_results' => $assignmentResults, 'ai_generated' => $scheduleResult['ai_generated'] ?? false, ]; } private function generateSchedule(int $programId, int $groupId, string $startDate, ?string $endDate, array $selectedCourses, array $priorityCourses, bool $useAi): array { if ($useAi && $this->aiOptimizer->hasProvider()) { return $this->aiOptimizer->optimize($programId, $groupId, $startDate, $endDate, $selectedCourses, $priorityCourses); } return $this->generator->generate($programId, $groupId, $startDate, $endDate, $selectedCourses, $priorityCourses); } private function saveScheduleToDb(array $schedule, int $programId, int $groupId): array { $courseNames = $this->engine->getCourseNames(); $courseHours = []; $res = $this->db->query("SELECT Course_ID, Course_Time, Course_Name FROM Courses"); while ($row = $res->fetch_assoc()) { $courseHours[$row['Course_ID']] = $row; } $saved = []; $groupSlots = []; $stmt = $this->db->prepare("SELECT Group_Slot_ID, Time_Slot, Time_From, Time_To FROM group_slot_mapping WHERE Group_ID = ?"); $stmt->bind_param("i", $groupId); $stmt->execute(); $groupSlots = $stmt->get_result()->fetch_all(MYSQLI_ASSOC); $stmt->close(); $slotLookup = []; foreach ($groupSlots as $gs) { $slotLookup[trim($gs['Time_Slot'])] = $gs; } $grouped = []; foreach ($schedule as $entry) { $date = $entry['Date']; $slot = $entry['Slot']; $courseId = $entry['Course_ID']; $slotName = $slot; $numericSlot = filter_var($slot, FILTER_SANITIZE_NUMBER_INT); if ($numericSlot) { $slotIndex = (int)$numericSlot - 1; $groupInfo = $this->engine->getGroupInfo($groupId); if ($groupInfo) { $slotLabels = explode(',', $groupInfo['Time_Slot']); $slotName = trim($slotLabels[$slotIndex] ?? $slot); } } $groupKey = "$courseId-$groupId-$slotName"; if (!isset($grouped[$groupKey])) { $grouped[$groupKey] = [ 'course_id' => $courseId, 'group_id' => $groupId, 'time_slot' => $slotName, 'dates' => [], 'start_date' => $date, 'end_date' => $date, ]; } $grouped[$groupKey]['dates'][] = $date; if ($date < $grouped[$groupKey]['start_date']) $grouped[$groupKey]['start_date'] = $date; if ($date > $grouped[$groupKey]['end_date']) $grouped[$groupKey]['end_date'] = $date; } foreach ($grouped as $key => $g) { $courseId = $g['course_id']; $slotName = $g['time_slot']; $startDate = $g['start_date']; $endDate = $g['end_date']; $courseData = $courseHours[$courseId] ?? ['Course_Time' => 0, 'Course_Name' => '']; $courseName = $courseData['Course_Name']; $courseTime = (int)$courseData['Course_Time']; $reserveCourse = 0; $groupSlotId = 0; $startTime = '08:30:00'; $endTime = '12:30:00'; if (isset($slotLookup[trim($slotName)])) { $gs = $slotLookup[trim($slotName)]; $groupSlotId = (int)$gs['Group_Slot_ID']; $startTime = $gs['Time_From']; $endTime = $gs['Time_To']; } $stmt = $this->db->prepare(" SELECT Schedule_ID FROM course_group_schedule_main WHERE Program_ID = ? AND Course_ID = ? AND Group_ID = ? AND Time_Slot = ? AND Start_Date = ? AND End_Date = ? AND Start_Time = ? AND End_Time = ? "); $stmt->bind_param('iiisssss', $programId, $courseId, $groupId, $slotName, $startDate, $endDate, $startTime, $endTime); $stmt->execute(); $existing = $stmt->get_result()->fetch_assoc(); $stmt->close(); $mainScheduleId = $existing ? (int)$existing['Schedule_ID'] : null; if (!$mainScheduleId) { $stmt = $this->db->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()) "); $stmt->bind_param('iiiiissssss', $programId, $courseId, $groupId, $groupSlotId, $courseTime, $reserveCourse, $slotName, $startDate, $endDate, $startTime, $endTime); $stmt->execute(); $mainScheduleId = (int)$stmt->insert_id; $stmt->close(); } foreach ($g['dates'] as $date) { $stmt = $this->db->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()) "); $stmt->bind_param('iiiiiisssssss', $mainScheduleId, $programId, $courseId, $groupId, $groupSlotId, $courseTime, $courseName, $reserveCourse, $slotName, $date, $date, $startTime, $endTime); $stmt->execute(); $saved[] = [ 'schedule_id' => $mainScheduleId, 'session_id' => (int)$stmt->insert_id, 'course_id' => $courseId, 'date' => $date, 'slot' => $slotName, ]; $stmt->close(); } } return $saved; } }
Save
cmd:
run