diff --git a/app/xlsx_grid_helper.py b/app/xlsx_grid_helper.py index 5fa33a1..2a5c7dc 100644 --- a/app/xlsx_grid_helper.py +++ b/app/xlsx_grid_helper.py @@ -14,10 +14,10 @@ DAYS = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"] HEADER_FILL = PatternFill(start_color="1F4E78", end_color="1F4E78", fill_type="solid") HEADER_FONT = Font(color="FFFFFF", bold=True) -LUNCH_FILL = PatternFill(start_color="D9D9D9", end_color="D9D9D9", fill_type="solid") GENERAL_FILL = PatternFill(start_color="FFF2CC", end_color="FFF2CC", fill_type="solid") LAB_FILL = PatternFill(start_color="D9EAD3", end_color="D9EAD3", fill_type="solid") THEORY_FILL = PatternFill(start_color="DDEBF7", end_color="DDEBF7", fill_type="solid") +LONG_LECTURE_FILL = PatternFill(start_color="F4CCCC", end_color="F4CCCC", fill_type="solid") THIN_BORDER = Border( left=Side(style="thin"), right=Side(style="thin"), top=Side(style="thin"), bottom=Side(style="thin"), @@ -28,6 +28,8 @@ CENTER = Alignment(horizontal="center", vertical="center", wrap_text=True) def cell_fill_for(session): if session is None: return None + if session.get("duration_minutes") == 120: + return LONG_LECTURE_FILL if session.get("is_general"): return GENERAL_FILL if session.get("course_type") == "lab": @@ -35,16 +37,21 @@ def cell_fill_for(session): return THEORY_FILL -def build_grid_sheet(ws, title, subtitle, time_slots, sessions_by_day_slot, cell_text_fn): +def build_grid_sheet(ws, title, subtitle, display_rows, sessions_by_cell, cell_text_fn): """ Renders one timetable grid onto worksheet `ws`. - time_slots: ordered list of dicts: {"label": str, "start": str, "end": str, - "is_lunch": bool} - sessions_by_day_slot: dict[(day, slot_index)] -> session dict (or list of - session dicts for slots spanning a double/lab period), used - only to decide fill color via cell_fill_for(). - cell_text_fn: function(day, slot_index) -> str to render into the cell. + display_rows: ordered list of dicts, one per rendered row: + {"label": str, "start": str, "end": str, + "slot_index": int, "duration_minutes": int} + The special 08:30-10:30 long-lecture row and the normal + 09:00-10:30 row both use slot_index 0 (they clash-track + against the same slot) but are distinguished by + duration_minutes (120 vs 90) so they render as separate rows. + sessions_by_cell: dict[(day, slot_index, duration_minutes)] -> session + dict, used only to decide fill color via cell_fill_for(). + cell_text_fn: function(day, slot_index, duration_minutes) -> str to + render into the cell. """ invalid_chars = ':\\/?*[]' sheet_name = "".join(c for c in title if c not in invalid_chars) @@ -74,14 +81,12 @@ def build_grid_sheet(ws, title, subtitle, time_slots, sessions_by_day_slot, cell c.alignment = CENTER c.border = THIN_BORDER - for row_offset, slot in enumerate(time_slots): + for row_offset, slot in enumerate(display_rows): row = header_row + 1 + row_offset time_cell = ws.cell(row=row, column=1, value=f'{slot["start"]} - {slot["end"]}') time_cell.font = Font(bold=True, size=9) time_cell.alignment = CENTER time_cell.border = THIN_BORDER - if slot.get("is_lunch"): - time_cell.fill = LUNCH_FILL for col, day in enumerate(DAYS, start=2): cell = ws.cell(row=row, column=col) @@ -89,15 +94,10 @@ def build_grid_sheet(ws, title, subtitle, time_slots, sessions_by_day_slot, cell cell.alignment = CENTER cell.font = Font(size=9) - if slot.get("is_lunch"): - cell.fill = LUNCH_FILL - cell.value = "LUNCH BREAK" - continue - - text = cell_text_fn(day, row_offset) + text = cell_text_fn(day, slot["slot_index"], slot["duration_minutes"]) cell.value = text if text else "" - session = sessions_by_day_slot.get((day, row_offset)) + session = sessions_by_cell.get((day, slot["slot_index"], slot["duration_minutes"])) fill = cell_fill_for(session) if fill: cell.fill = fill @@ -106,7 +106,7 @@ def build_grid_sheet(ws, title, subtitle, time_slots, sessions_by_day_slot, cell for col in range(2, 2 + len(DAYS)): ws.column_dimensions[get_column_letter(col)].width = 26 - for row_offset in range(len(time_slots)): + for row_offset in range(len(display_rows)): ws.row_dimensions[header_row + 1 + row_offset].height = 42 diff --git a/controller/template_controller.py b/controller/template_controller.py index 9203dce..75e1269 100644 --- a/controller/template_controller.py +++ b/controller/template_controller.py @@ -20,6 +20,12 @@ earlier phase, later phases can never reuse it. sorted batch_code order: for each batch, every one of its remaining offerings is placed and locked before the next batch is considered. +Time grid: 5 normal 90-minute slots, 09:00-16:30, no lunch break. Labs use +180-minute double-slots (09:00-12:00 and 12:00-15:00). A course whose +lecture_duration_minutes is 120 ("2 hours once a week") is instead placed +in a special fixed 08:30-10:30 slot, which overlaps normal slot 0 +(09:00-10:30) in wall-clock time and is tracked as clashing with it. + Room selection always tries a course's preferred lecture_room_id / lab_room_id first, falling back to another same-type room only if the preferred one is busy for that day/slot. @@ -32,24 +38,49 @@ DATA_DIR = os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__ DAYS = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"] -# Theory grid: 5 x 90-minute slots with a lunch break, 08:30-16:30 +# Normal theory grid: 5 x 90-minute slots, 09:00-16:30, no lunch break. +# Every placeable session (normal lecture, lab, or the special long +# lecture) is expressed as one or more of these slot indices (0-4) for +# clash-tracking purposes — see LONG_LECTURE_SLOT below for why the long +# lecture also uses index 0 despite rendering at a different clock time. TIME_SLOTS = [ - {"label": "S1", "start": "08:30", "end": "10:00", "is_lunch": False}, - {"label": "S2", "start": "10:00", "end": "11:30", "is_lunch": False}, - {"label": "S3", "start": "11:30", "end": "13:00", "is_lunch": False}, - {"label": "LUNCH", "start": "13:00", "end": "13:30", "is_lunch": True}, + {"label": "S1", "start": "09:00", "end": "10:30", "is_lunch": False}, + {"label": "S2", "start": "10:30", "end": "12:00", "is_lunch": False}, + {"label": "S3", "start": "12:00", "end": "13:30", "is_lunch": False}, {"label": "S4", "start": "13:30", "end": "15:00", "is_lunch": False}, {"label": "S5", "start": "15:00", "end": "16:30", "is_lunch": False}, ] -# Indices into TIME_SLOTS that are real teaching slots (skip lunch) +# Indices into TIME_SLOTS that are real teaching slots (no lunch to skip +# anymore, but kept for readability at call sites) TEACHING_SLOT_INDICES = [i for i, s in enumerate(TIME_SLOTS) if not s["is_lunch"]] -# Consecutive pairs of teaching slots usable as a 180-minute lab double-slot -LAB_SLOT_PAIRS = [ - (a, b) - for a, b in zip(TEACHING_SLOT_INDICES, TEACHING_SLOT_INDICES[1:]) - if TIME_SLOTS[b]["start"] == TIME_SLOTS[a]["end"] +# Consecutive pairs of normal slots usable as a 180-minute lab double-slot: +# 09:00-12:00 (S1+S2) and 12:00-15:00 (S3+S4). +LAB_SLOT_PAIRS = [(0, 1), (2, 3)] + +# The special fixed slot for courses whose lecture is "2 hours once a +# week": 08:30-10:30. This overlaps 09:00-10:30 (normal slot index 0) in +# wall-clock time, so a long-lecture session is tracked as occupying slot +# index 0 too (same key _is_free/_mark_busy use) — that's what makes it +# correctly clash with anything else placed in normal slot 0 that day for +# the same room/instructor/batch. duration_minutes on the session dict is +# what distinguishes it from a normal 90-minute slot-0 session at render time. +LONG_LECTURE_SLOT_INDEX = 0 +LONG_LECTURE_START = "08:30" +LONG_LECTURE_END = "10:30" + +# Rows to render on every generated timetable grid: the special long-lecture +# row first (it starts earliest, 08:30), then the 5 normal 90-minute rows. +# Templates/xlsx_grid_helper key session lookups on (day, slot_index, +# duration_minutes) using these rows' slot_index/duration_minutes pairs. +DISPLAY_ROWS = [ + {"label": "Long", "start": LONG_LECTURE_START, "end": LONG_LECTURE_END, + "slot_index": LONG_LECTURE_SLOT_INDEX, "duration_minutes": 120}, +] + [ + {"label": s["label"], "start": s["start"], "end": s["end"], + "slot_index": i, "duration_minutes": 90} + for i, s in enumerate(TIME_SLOTS) ] @@ -82,6 +113,7 @@ def load_data(): c["lectures_per_week"] = int(c["lectures_per_week"]) c["labs_per_week"] = int(c["labs_per_week"]) c["is_general"] = c["is_general"].lower() == "yes" + c["lecture_duration_minutes"] = int(c.get("lecture_duration_minutes") or 90) courses_by_id[c["course_id"]] = c # normalize offerings: expand "batch1|batch2" section batch groups into @@ -183,16 +215,23 @@ class Scheduler: rest = [r for r in room_pool if r["room_id"] != preferred_room_id] return ([preferred] if preferred else []) + rest - def _add_session(self, offering, day, slot_indices, room): + def _add_session(self, offering, day, slot_indices, room, is_long_lecture=False): course = offering["course"] - start = TIME_SLOTS[slot_indices[0]]["start"] - end = TIME_SLOTS[slot_indices[-1]]["end"] - session_type = "lab" if len(slot_indices) > 1 else "theory" + if is_long_lecture: + start, end = LONG_LECTURE_START, LONG_LECTURE_END + duration_minutes = 120 + session_type = "theory" + else: + start = TIME_SLOTS[slot_indices[0]]["start"] + end = TIME_SLOTS[slot_indices[-1]]["end"] + duration_minutes = 90 * len(slot_indices) + session_type = "lab" if len(slot_indices) > 1 else "theory" session = { "day": day, "slot_indices": slot_indices, "start": start, "end": end, + "duration_minutes": duration_minutes, "course_id": offering["course_id"], "course_name": course["course_name"], "course_type": session_type, @@ -208,7 +247,7 @@ class Scheduler: return session def _place_theory_session(self, offering, room_candidates, day_order): - """Finds and locks a free single-slot session; returns the session dict or None.""" + """Finds and locks a free normal 90-minute single-slot session; returns the session dict or None.""" for day in day_order: for slot_index in TEACHING_SLOT_INDICES: for room in room_candidates: @@ -217,6 +256,26 @@ class Scheduler: return self._add_session(offering, day, [slot_index], room) return None + def _place_long_lecture(self, offering, room_candidates, day_order): + """ + Finds and locks a free 08:30-10:30 long-lecture session (for + courses with lecture_duration_minutes=120). Occupies the same + clash-tracking slot index as normal slot 0 since they overlap in + wall-clock time (09:00-10:30). Returns the session dict or None. + """ + for day in day_order: + for room in room_candidates: + if self._is_free(day, LONG_LECTURE_SLOT_INDEX, room["room_id"], offering["instructor_code"], offering["batch_codes"]): + self._mark_busy(day, LONG_LECTURE_SLOT_INDEX, room["room_id"], offering["instructor_code"], offering["batch_codes"]) + return self._add_session(offering, day, [LONG_LECTURE_SLOT_INDEX], room, is_long_lecture=True) + return None + + def _place_lecture(self, offering, room_candidates, day_order): + """Dispatches to the long (120-min) or normal (90-min) lecture placement based on the course's lecture_duration_minutes.""" + if offering["course"]["lecture_duration_minutes"] == 120: + return self._place_long_lecture(offering, room_candidates, day_order) + return self._place_theory_session(offering, room_candidates, day_order) + def phase_1_general_courses(self, preferred_days=("Tuesday", "Thursday"), max_repair_attempts=20): """ Places every general-course offering's weekly lectures, preferring @@ -233,7 +292,7 @@ class Scheduler: course = offering["course"] room_candidates = self._room_candidates(course["lecture_room_id"], self.classrooms) for _ in range(course["lectures_per_week"]): - session = self._place_theory_session(offering, room_candidates, preferred_order) + session = self._place_lecture(offering, room_candidates, preferred_order) if session is None: print(f"WARNING: could not place a lecture for general course {offering['course_id']} section {offering['section_id']}") @@ -266,7 +325,7 @@ class Scheduler: phase_sessions.remove(losing_session) room_candidates = self._room_candidates(offering["course"]["lecture_room_id"], self.classrooms) - new_session = self._place_theory_session(offering, room_candidates, any_day_order) + new_session = self._place_lecture(offering, room_candidates, any_day_order) if new_session is None: print(f"WARNING: could not repair general-course conflict for {offering['course_id']} section {offering['section_id']}") return @@ -326,7 +385,7 @@ class Scheduler: course = offering["course"] room_candidates = self._room_candidates(course["lecture_room_id"], self.classrooms) for _ in range(course["lectures_per_week"]): - session = self._place_theory_session(offering, room_candidates, DAYS) + session = self._place_lecture(offering, room_candidates, DAYS) if session is None: print(f"WARNING: could not place a lecture for course {offering['course_id']} section {offering['section_id']} ({offering['batch_codes']})") diff --git a/data/dummy/batch_codes/25/batches.csv b/data/dummy/batch_codes/25/batches.csv index 99fb6f5..4696597 100644 --- a/data/dummy/batch_codes/25/batches.csv +++ b/data/dummy/batch_codes/25/batches.csv @@ -2,3 +2,6 @@ batch_code,department,program,session 25021519,CS,BSCS,25 25021520,CS,BSSE,25 25031519,EE,BSEE,25 +25031520,EE,BSCE,25 +25041519,BBA,BBA,25 +25041520,BBA,BSAF,25 diff --git a/data/dummy/batch_codes/26/batches.csv b/data/dummy/batch_codes/26/batches.csv index ef25f8a..23ab5c4 100644 --- a/data/dummy/batch_codes/26/batches.csv +++ b/data/dummy/batch_codes/26/batches.csv @@ -2,3 +2,6 @@ batch_code,department,program,session 26021519,CS,BSCS,26 26021520,CS,BSSE,26 26031519,EE,BSEE,26 +26031520,EE,BSCE,26 +26041519,BBA,BBA,26 +26041520,BBA,BSAF,26 diff --git a/data/dummy/blocks/blocks.csv b/data/dummy/blocks/blocks.csv index cc42f81..dbb0680 100644 --- a/data/dummy/blocks/blocks.csv +++ b/data/dummy/blocks/blocks.csv @@ -1,2 +1,3 @@ block_id,block_name A,Block A +B,Block B diff --git a/data/dummy/blocks/rooms.csv b/data/dummy/blocks/rooms.csv index 5306ce8..29111fc 100644 --- a/data/dummy/blocks/rooms.csv +++ b/data/dummy/blocks/rooms.csv @@ -5,3 +5,6 @@ A-103,Room 103,A,classroom,50 A-201,Room 201,A,classroom,60 A-L01,Computer Lab 1,A,lab,35 A-L02,Computer Lab 2,A,lab,35 +B-101,Room 101 (B),B,classroom,50 +B-102,Room 102 (B),B,classroom,50 +B-L01,Electronics Lab,B,lab,30 diff --git a/data/dummy/courses/course_offering.csv b/data/dummy/courses/course_offering.csv index 39cfde3..d9422dd 100644 --- a/data/dummy/courses/course_offering.csv +++ b/data/dummy/courses/course_offering.csv @@ -1,15 +1,47 @@ course_id,section_id,batch_codes,instructor_code CS101,A,25021519,1001 CS201,A,25021519,1002 +CS301,A,25021519,1003 +CS302,A,25021519,1001 CS101,B,25021520,1001 CS201,B,25021520,1002 +CS301,B,25021520,1003 +CS302,B,25021520,1001 EE101,A,25031519,1004 +EE201,A,25031519,1005 +EE301,A,25031519,1004 +EE101,B,25031520,1004 +EE201,B,25031520,1005 +EE301,B,25031520,1004 +BBA101,A,25041519,1007 +BBA201,A,25041519,1008 +BBA301,A,25041519,1007 +BBA101,B,25041520,1007 +BBA201,B,25041520,1008 +BBA301,B,25041520,1007 CS101,C,26021519,1001 CS201,C,26021519,1002 +CS301,C,26021519,1003 +CS302,C,26021519,1001 CS101,D,26021520,1001 CS201,D,26021520,1002 -EE101,B,26031519,1004 -GEN101,A,25021519|25021520|25031519,1002 -GEN102,A,25021519|25021520|25031519,1006 -GEN101,B,26021519|26021520|26031519,1002 -GEN102,B,26021519|26021520|26031519,1006 +CS301,D,26021520,1003 +CS302,D,26021520,1001 +EE101,C,26031519,1004 +EE201,C,26031519,1005 +EE301,C,26031519,1004 +EE101,D,26031520,1004 +EE201,D,26031520,1005 +EE301,D,26031520,1004 +BBA101,C,26041519,1007 +BBA201,C,26041519,1008 +BBA301,C,26041519,1007 +BBA101,D,26041520,1007 +BBA201,D,26041520,1008 +BBA301,D,26041520,1007 +GEN101,ALL,25021519|25021520|25031519|25031520|25041519|25041520,1002 +GEN102,ALL,25021519|25021520|25031519|25031520|25041519|25041520,1006 +GEN103,ALL,25021519|25021520|25031519|25031520|25041519|25041520,1006 +GEN101,ALL,26021519|26021520|26031519|26031520|26041519|26041520,1002 +GEN102,ALL,26021519|26021520|26031519|26031520|26041519|26041520,1006 +GEN103,ALL,26021519|26021520|26031519|26031520|26041519|26041520,1006 diff --git a/data/dummy/courses/courses.csv b/data/dummy/courses/courses.csv index e4a2e1e..0c32b96 100644 --- a/data/dummy/courses/courses.csv +++ b/data/dummy/courses/courses.csv @@ -1,6 +1,14 @@ -course_id,course_name,credit_hours,lectures_per_week,labs_per_week,is_general,lecture_room_id,lab_room_id -CS101,Programming Fundamentals,4,2,1,no,A-101,A-L01 -CS201,Data Structures,4,2,1,no,A-102,A-L01 -EE101,Basic Electronics,4,2,1,no,A-201,A-L02 -GEN101,Functional English,3,2,0,yes,A-103, -GEN102,Islamic Studies,2,1,0,yes,A-103, +course_id,course_name,credit_hours,lectures_per_week,labs_per_week,is_general,lecture_room_id,lab_room_id,lecture_duration_minutes +CS101,Programming Fundamentals,4,2,1,no,A-101,A-L01,90 +CS201,Data Structures,4,2,1,no,A-102,A-L01,90 +CS301,Operating Systems,3,1,1,no,A-101,A-L02,120 +CS302,Database Systems,4,2,2,no,A-102,A-L02,90 +EE101,Basic Electronics,4,2,1,no,A-201,A-L02,90 +EE201,Digital Logic Design,4,2,1,no,B-101,B-L01,90 +EE301,Signals and Systems,3,1,0,no,B-102,,120 +BBA101,Principles of Management,3,2,0,no,B-101,,90 +BBA201,Financial Accounting,3,2,0,no,B-102,,90 +BBA301,Marketing Management,3,1,0,no,A-103,,120 +GEN101,Functional English,3,2,0,yes,A-103,,90 +GEN102,Islamic Studies,2,1,0,yes,A-103,,90 +GEN103,Pakistan Studies,2,1,0,yes,B-101,,120 diff --git a/data/dummy/generate_dummy_data.py b/data/dummy/generate_dummy_data.py index 7a0de23..41e766e 100644 --- a/data/dummy/generate_dummy_data.py +++ b/data/dummy/generate_dummy_data.py @@ -1,6 +1,11 @@ """ -Generates small illustrative dummy CSV datasets under data/dummy/ so the -timetable template generator has something to schedule and render. +Generates a larger, deliberately harder dummy CSV dataset under data/dummy/ +so the timetable template generator has something non-trivial to schedule +and render — more departments/batches/sections than the previous small +dataset, tighter room and instructor contention (fewer rooms/instructors +relative to demand), a second block, and mixed lecture durations (90 vs +120 minutes) so weaknesses in the scheduler surface as WARNINGs/conflicts +instead of everything trivially fitting. Run once: python data/dummy/generate_dummy_data.py @@ -23,13 +28,18 @@ def write_csv(relative_path, header, rows): def main(): - # ---- blocks & rooms (Building/Block A only) ---- + # ---- blocks: two blocks now, Block A (bigger) and Block B (smaller) ---- write_csv( "blocks/blocks.csv", ["block_id", "block_name"], - [["A", "Block A"]], + [ + ["A", "Block A"], + ["B", "Block B"], + ], ) + # ---- rooms: deliberately tight relative to demand (see offerings + # below) so room contention is real, spread across both blocks ---- write_csv( "blocks/rooms.csv", ["room_id", "room_name", "block_id", "room_type", "capacity"], @@ -40,21 +50,32 @@ def main(): ["A-201", "Room 201", "A", "classroom", 60], ["A-L01", "Computer Lab 1", "A", "lab", 35], ["A-L02", "Computer Lab 2", "A", "lab", 35], + ["B-101", "Room 101 (B)", "B", "classroom", 50], + ["B-102", "Room 102 (B)", "B", "classroom", 50], + ["B-L01", "Electronics Lab", "B", "lab", 30], ], ) - # ---- departments / programs / batches ---- - # batch_code = session(2) + program_id(6) e.g. 25021519 - batches_25 = [ - ["25021519", "CS", "BSCS", "25"], - ["25021520", "CS", "BSSE", "25"], - ["25031519", "EE", "BSEE", "25"], - ] - batches_26 = [ - ["26021519", "CS", "BSCS", "26"], - ["26021520", "CS", "BSSE", "26"], - ["26031519", "EE", "BSEE", "26"], - ] + # ---- departments / programs / batches: 3 departments, 2 programs + # each, 2 sessions (25/26) -> 12 batches total (was 6) ---- + department_programs = { + "CS": ["BSCS", "BSSE"], + "EE": ["BSEE", "BSCE"], + "BBA": ["BBA", "BSAF"], + } + program_codes = { + "BSCS": "021519", "BSSE": "021520", + "BSEE": "031519", "BSCE": "031520", + "BBA": "041519", "BSAF": "041520", + } + + batches_25 = [] + batches_26 = [] + for department, programs in department_programs.items(): + for program in programs: + code = program_codes[program] + batches_25.append([f"25{code}", department, program, "25"]) + batches_26.append([f"26{code}", department, program, "26"]) write_csv( "batch_codes/25/batches.csv", @@ -70,62 +91,86 @@ def main(): all_batches = batches_25 + batches_26 # ---- courses ---- - # One row per subject: lectures/labs per week are counted separately so - # a single course can carry both, and each course names its preferred - # lecture/lab room (the scheduler falls back to another same-type room - # only if the preferred one is busy). - # is_general courses are shared across every batch of the same session - # (so they can be scheduled together on Tuesday first, with no clash). + # course_id, course_name, credit_hours, lectures_per_week, + # labs_per_week, is_general, lecture_room_id, lab_room_id, + # lecture_duration_minutes + # + # Mixed lecture durations: most courses are 90-min x N/week, but a few + # are the special "2 hours once a week" case (lecture_duration_minutes + # 120, lectures_per_week 1). Labs vary 0/1/2 per week. Deliberately + # more courses per department than the room/instructor pool can + # comfortably absorb without contention. courses = [ - # course_id, course_name, credit_hours, lectures_per_week, labs_per_week, is_general, lecture_room_id, lab_room_id - ["CS101", "Programming Fundamentals", 4, 2, 1, "no", "A-101", "A-L01"], - ["CS201", "Data Structures", 4, 2, 1, "no", "A-102", "A-L01"], - ["EE101", "Basic Electronics", 4, 2, 1, "no", "A-201", "A-L02"], - ["GEN101", "Functional English", 3, 2, 0, "yes", "A-103", ""], - ["GEN102", "Islamic Studies", 2, 1, 0, "yes", "A-103", ""], + # CS department courses + ["CS101", "Programming Fundamentals", 4, 2, 1, "no", "A-101", "A-L01", 90], + ["CS201", "Data Structures", 4, 2, 1, "no", "A-102", "A-L01", 90], + ["CS301", "Operating Systems", 3, 1, 1, "no", "A-101", "A-L02", 120], + ["CS302", "Database Systems", 4, 2, 2, "no", "A-102", "A-L02", 90], + # EE department courses + ["EE101", "Basic Electronics", 4, 2, 1, "no", "A-201", "A-L02", 90], + ["EE201", "Digital Logic Design", 4, 2, 1, "no", "B-101", "B-L01", 90], + ["EE301", "Signals and Systems", 3, 1, 0, "no", "B-102", "", 120], + # BBA department courses + ["BBA101", "Principles of Management", 3, 2, 0, "no", "B-101", "", 90], + ["BBA201", "Financial Accounting", 3, 2, 0, "no", "B-102", "", 90], + ["BBA301", "Marketing Management", 3, 1, 0, "no", "A-103", "", 120], + # General (shared) courses + ["GEN101", "Functional English", 3, 2, 0, "yes", "A-103", "", 90], + ["GEN102", "Islamic Studies", 2, 1, 0, "yes", "A-103", "", 90], + ["GEN103", "Pakistan Studies", 2, 1, 0, "yes", "B-101", "", 120], ] write_csv( "courses/courses.csv", [ "course_id", "course_name", "credit_hours", "lectures_per_week", "labs_per_week", "is_general", "lecture_room_id", "lab_room_id", + "lecture_duration_minutes", ], courses, ) - # ---- course offerings: course + section (a section groups the batches - # taking that section together) + who teaches it ---- - # A course can have many sections; here each CS/EE batch of a session is - # its own section (Section A/B/...), while general courses have a single - # section "ALL" grouping every batch of that session. - offerings = [] - - dept_course = {"CS": ["CS101", "CS201"], "EE": ["EE101"]} + # ---- course offerings: course + section (batches in that section) + + # instructor ---- + # Deliberately tight instructor pool reused across many sections/ + # courses (some instructors will end up wanted in overlapping slots), + # forcing real contention in Phase 2/Phase 3. + dept_courses = { + "CS": ["CS101", "CS201", "CS301", "CS302"], + "EE": ["EE101", "EE201", "EE301"], + "BBA": ["BBA101", "BBA201", "BBA301"], + } + # Small pools relative to (department batches x courses) demand. dept_instructors = { - "CS": ["1001", "1002", "1003", "1006"], + "CS": ["1001", "1002", "1003"], "EE": ["1004", "1005"], + "BBA": ["1007", "1008"], } + offerings = [] section_letters = ["A", "B", "C", "D"] - dept_section_counter = {"CS": 0, "EE": 0} + dept_section_counter = {"CS": 0, "EE": 0, "BBA": 0} for batch_code, department, program, session in all_batches: section_id = section_letters[dept_section_counter[department] % len(section_letters)] dept_section_counter[department] += 1 - for i, course_id in enumerate(dept_course[department]): - instr_pool = dept_instructors[department] + instr_pool = dept_instructors[department] + for i, course_id in enumerate(dept_courses[department]): + # Deliberately narrow instructor rotation (2-3 instructors + # covering 3-4 courses per department) so the same instructor + # teaches multiple courses/sections -> instructor contention. instr = instr_pool[i % len(instr_pool)] offerings.append([course_id, section_id, batch_code, instr]) # general courses: one offering per (course, session), section "ALL" - # grouping every batch code sharing that session, separated by "|" + # grouping every batch code sharing that session for session, batch_group in ( ("25", [b[0] for b in batches_25]), ("26", [b[0] for b in batches_26]), ): offerings.append(["GEN101", "ALL", "|".join(batch_group), "1002"]) offerings.append(["GEN102", "ALL", "|".join(batch_group), "1006"]) + offerings.append(["GEN103", "ALL", "|".join(batch_group), "1006"]) write_csv( "courses/course_offering.csv", @@ -143,6 +188,8 @@ def main(): "1004": "Dr. Farah Iqbal", "1005": "Mr. Usman Ali", "1006": "Ms. Hira Shah", + "1007": "Dr. Nadia Farooq", + "1008": "Mr. Kamran Sheikh", } instructors = [] for course_id, section_id, batch_codes, instr_code in offerings: @@ -154,10 +201,10 @@ def main(): instructors, ) - # ---- students (roll_no = batch_code-seq) ---- + # ---- students (roll_no = batch_code-seq): 18 per batch (was 5) ---- students = [] for batch_code, department, program, session in all_batches: - for seq in range(1, 6): # 5 sample students per batch + for seq in range(1, 19): roll_no = f"{batch_code}-{seq:03d}" students.append([roll_no, batch_code, f"Student {roll_no}"]) diff --git a/data/dummy/instructor/instructors.csv b/data/dummy/instructor/instructors.csv index bf73e17..41e82d0 100644 --- a/data/dummy/instructor/instructors.csv +++ b/data/dummy/instructor/instructors.csv @@ -1,15 +1,47 @@ instructor_code,instructor_name,course_id,section_id 1001,Dr. Ahsan Raza,CS101,A 1002,Ms. Sana Tariq,CS201,A +1003,Mr. Bilal Khan,CS301,A +1001,Dr. Ahsan Raza,CS302,A 1001,Dr. Ahsan Raza,CS101,B 1002,Ms. Sana Tariq,CS201,B +1003,Mr. Bilal Khan,CS301,B +1001,Dr. Ahsan Raza,CS302,B 1004,Dr. Farah Iqbal,EE101,A +1005,Mr. Usman Ali,EE201,A +1004,Dr. Farah Iqbal,EE301,A +1004,Dr. Farah Iqbal,EE101,B +1005,Mr. Usman Ali,EE201,B +1004,Dr. Farah Iqbal,EE301,B +1007,Dr. Nadia Farooq,BBA101,A +1008,Mr. Kamran Sheikh,BBA201,A +1007,Dr. Nadia Farooq,BBA301,A +1007,Dr. Nadia Farooq,BBA101,B +1008,Mr. Kamran Sheikh,BBA201,B +1007,Dr. Nadia Farooq,BBA301,B 1001,Dr. Ahsan Raza,CS101,C 1002,Ms. Sana Tariq,CS201,C +1003,Mr. Bilal Khan,CS301,C +1001,Dr. Ahsan Raza,CS302,C 1001,Dr. Ahsan Raza,CS101,D 1002,Ms. Sana Tariq,CS201,D -1004,Dr. Farah Iqbal,EE101,B +1003,Mr. Bilal Khan,CS301,D +1001,Dr. Ahsan Raza,CS302,D +1004,Dr. Farah Iqbal,EE101,C +1005,Mr. Usman Ali,EE201,C +1004,Dr. Farah Iqbal,EE301,C +1004,Dr. Farah Iqbal,EE101,D +1005,Mr. Usman Ali,EE201,D +1004,Dr. Farah Iqbal,EE301,D +1007,Dr. Nadia Farooq,BBA101,C +1008,Mr. Kamran Sheikh,BBA201,C +1007,Dr. Nadia Farooq,BBA301,C +1007,Dr. Nadia Farooq,BBA101,D +1008,Mr. Kamran Sheikh,BBA201,D +1007,Dr. Nadia Farooq,BBA301,D 1002,Ms. Sana Tariq,GEN101,ALL 1006,Ms. Hira Shah,GEN102,ALL +1006,Ms. Hira Shah,GEN103,ALL 1002,Ms. Sana Tariq,GEN101,ALL 1006,Ms. Hira Shah,GEN102,ALL +1006,Ms. Hira Shah,GEN103,ALL diff --git a/data/dummy/roll_no/students.csv b/data/dummy/roll_no/students.csv index 31327da..a71e39c 100644 --- a/data/dummy/roll_no/students.csv +++ b/data/dummy/roll_no/students.csv @@ -4,28 +4,214 @@ roll_no,batch_code,student_name 25021519-003,25021519,Student 25021519-003 25021519-004,25021519,Student 25021519-004 25021519-005,25021519,Student 25021519-005 +25021519-006,25021519,Student 25021519-006 +25021519-007,25021519,Student 25021519-007 +25021519-008,25021519,Student 25021519-008 +25021519-009,25021519,Student 25021519-009 +25021519-010,25021519,Student 25021519-010 +25021519-011,25021519,Student 25021519-011 +25021519-012,25021519,Student 25021519-012 +25021519-013,25021519,Student 25021519-013 +25021519-014,25021519,Student 25021519-014 +25021519-015,25021519,Student 25021519-015 +25021519-016,25021519,Student 25021519-016 +25021519-017,25021519,Student 25021519-017 +25021519-018,25021519,Student 25021519-018 25021520-001,25021520,Student 25021520-001 25021520-002,25021520,Student 25021520-002 25021520-003,25021520,Student 25021520-003 25021520-004,25021520,Student 25021520-004 25021520-005,25021520,Student 25021520-005 +25021520-006,25021520,Student 25021520-006 +25021520-007,25021520,Student 25021520-007 +25021520-008,25021520,Student 25021520-008 +25021520-009,25021520,Student 25021520-009 +25021520-010,25021520,Student 25021520-010 +25021520-011,25021520,Student 25021520-011 +25021520-012,25021520,Student 25021520-012 +25021520-013,25021520,Student 25021520-013 +25021520-014,25021520,Student 25021520-014 +25021520-015,25021520,Student 25021520-015 +25021520-016,25021520,Student 25021520-016 +25021520-017,25021520,Student 25021520-017 +25021520-018,25021520,Student 25021520-018 25031519-001,25031519,Student 25031519-001 25031519-002,25031519,Student 25031519-002 25031519-003,25031519,Student 25031519-003 25031519-004,25031519,Student 25031519-004 25031519-005,25031519,Student 25031519-005 +25031519-006,25031519,Student 25031519-006 +25031519-007,25031519,Student 25031519-007 +25031519-008,25031519,Student 25031519-008 +25031519-009,25031519,Student 25031519-009 +25031519-010,25031519,Student 25031519-010 +25031519-011,25031519,Student 25031519-011 +25031519-012,25031519,Student 25031519-012 +25031519-013,25031519,Student 25031519-013 +25031519-014,25031519,Student 25031519-014 +25031519-015,25031519,Student 25031519-015 +25031519-016,25031519,Student 25031519-016 +25031519-017,25031519,Student 25031519-017 +25031519-018,25031519,Student 25031519-018 +25031520-001,25031520,Student 25031520-001 +25031520-002,25031520,Student 25031520-002 +25031520-003,25031520,Student 25031520-003 +25031520-004,25031520,Student 25031520-004 +25031520-005,25031520,Student 25031520-005 +25031520-006,25031520,Student 25031520-006 +25031520-007,25031520,Student 25031520-007 +25031520-008,25031520,Student 25031520-008 +25031520-009,25031520,Student 25031520-009 +25031520-010,25031520,Student 25031520-010 +25031520-011,25031520,Student 25031520-011 +25031520-012,25031520,Student 25031520-012 +25031520-013,25031520,Student 25031520-013 +25031520-014,25031520,Student 25031520-014 +25031520-015,25031520,Student 25031520-015 +25031520-016,25031520,Student 25031520-016 +25031520-017,25031520,Student 25031520-017 +25031520-018,25031520,Student 25031520-018 +25041519-001,25041519,Student 25041519-001 +25041519-002,25041519,Student 25041519-002 +25041519-003,25041519,Student 25041519-003 +25041519-004,25041519,Student 25041519-004 +25041519-005,25041519,Student 25041519-005 +25041519-006,25041519,Student 25041519-006 +25041519-007,25041519,Student 25041519-007 +25041519-008,25041519,Student 25041519-008 +25041519-009,25041519,Student 25041519-009 +25041519-010,25041519,Student 25041519-010 +25041519-011,25041519,Student 25041519-011 +25041519-012,25041519,Student 25041519-012 +25041519-013,25041519,Student 25041519-013 +25041519-014,25041519,Student 25041519-014 +25041519-015,25041519,Student 25041519-015 +25041519-016,25041519,Student 25041519-016 +25041519-017,25041519,Student 25041519-017 +25041519-018,25041519,Student 25041519-018 +25041520-001,25041520,Student 25041520-001 +25041520-002,25041520,Student 25041520-002 +25041520-003,25041520,Student 25041520-003 +25041520-004,25041520,Student 25041520-004 +25041520-005,25041520,Student 25041520-005 +25041520-006,25041520,Student 25041520-006 +25041520-007,25041520,Student 25041520-007 +25041520-008,25041520,Student 25041520-008 +25041520-009,25041520,Student 25041520-009 +25041520-010,25041520,Student 25041520-010 +25041520-011,25041520,Student 25041520-011 +25041520-012,25041520,Student 25041520-012 +25041520-013,25041520,Student 25041520-013 +25041520-014,25041520,Student 25041520-014 +25041520-015,25041520,Student 25041520-015 +25041520-016,25041520,Student 25041520-016 +25041520-017,25041520,Student 25041520-017 +25041520-018,25041520,Student 25041520-018 26021519-001,26021519,Student 26021519-001 26021519-002,26021519,Student 26021519-002 26021519-003,26021519,Student 26021519-003 26021519-004,26021519,Student 26021519-004 26021519-005,26021519,Student 26021519-005 +26021519-006,26021519,Student 26021519-006 +26021519-007,26021519,Student 26021519-007 +26021519-008,26021519,Student 26021519-008 +26021519-009,26021519,Student 26021519-009 +26021519-010,26021519,Student 26021519-010 +26021519-011,26021519,Student 26021519-011 +26021519-012,26021519,Student 26021519-012 +26021519-013,26021519,Student 26021519-013 +26021519-014,26021519,Student 26021519-014 +26021519-015,26021519,Student 26021519-015 +26021519-016,26021519,Student 26021519-016 +26021519-017,26021519,Student 26021519-017 +26021519-018,26021519,Student 26021519-018 26021520-001,26021520,Student 26021520-001 26021520-002,26021520,Student 26021520-002 26021520-003,26021520,Student 26021520-003 26021520-004,26021520,Student 26021520-004 26021520-005,26021520,Student 26021520-005 +26021520-006,26021520,Student 26021520-006 +26021520-007,26021520,Student 26021520-007 +26021520-008,26021520,Student 26021520-008 +26021520-009,26021520,Student 26021520-009 +26021520-010,26021520,Student 26021520-010 +26021520-011,26021520,Student 26021520-011 +26021520-012,26021520,Student 26021520-012 +26021520-013,26021520,Student 26021520-013 +26021520-014,26021520,Student 26021520-014 +26021520-015,26021520,Student 26021520-015 +26021520-016,26021520,Student 26021520-016 +26021520-017,26021520,Student 26021520-017 +26021520-018,26021520,Student 26021520-018 26031519-001,26031519,Student 26031519-001 26031519-002,26031519,Student 26031519-002 26031519-003,26031519,Student 26031519-003 26031519-004,26031519,Student 26031519-004 26031519-005,26031519,Student 26031519-005 +26031519-006,26031519,Student 26031519-006 +26031519-007,26031519,Student 26031519-007 +26031519-008,26031519,Student 26031519-008 +26031519-009,26031519,Student 26031519-009 +26031519-010,26031519,Student 26031519-010 +26031519-011,26031519,Student 26031519-011 +26031519-012,26031519,Student 26031519-012 +26031519-013,26031519,Student 26031519-013 +26031519-014,26031519,Student 26031519-014 +26031519-015,26031519,Student 26031519-015 +26031519-016,26031519,Student 26031519-016 +26031519-017,26031519,Student 26031519-017 +26031519-018,26031519,Student 26031519-018 +26031520-001,26031520,Student 26031520-001 +26031520-002,26031520,Student 26031520-002 +26031520-003,26031520,Student 26031520-003 +26031520-004,26031520,Student 26031520-004 +26031520-005,26031520,Student 26031520-005 +26031520-006,26031520,Student 26031520-006 +26031520-007,26031520,Student 26031520-007 +26031520-008,26031520,Student 26031520-008 +26031520-009,26031520,Student 26031520-009 +26031520-010,26031520,Student 26031520-010 +26031520-011,26031520,Student 26031520-011 +26031520-012,26031520,Student 26031520-012 +26031520-013,26031520,Student 26031520-013 +26031520-014,26031520,Student 26031520-014 +26031520-015,26031520,Student 26031520-015 +26031520-016,26031520,Student 26031520-016 +26031520-017,26031520,Student 26031520-017 +26031520-018,26031520,Student 26031520-018 +26041519-001,26041519,Student 26041519-001 +26041519-002,26041519,Student 26041519-002 +26041519-003,26041519,Student 26041519-003 +26041519-004,26041519,Student 26041519-004 +26041519-005,26041519,Student 26041519-005 +26041519-006,26041519,Student 26041519-006 +26041519-007,26041519,Student 26041519-007 +26041519-008,26041519,Student 26041519-008 +26041519-009,26041519,Student 26041519-009 +26041519-010,26041519,Student 26041519-010 +26041519-011,26041519,Student 26041519-011 +26041519-012,26041519,Student 26041519-012 +26041519-013,26041519,Student 26041519-013 +26041519-014,26041519,Student 26041519-014 +26041519-015,26041519,Student 26041519-015 +26041519-016,26041519,Student 26041519-016 +26041519-017,26041519,Student 26041519-017 +26041519-018,26041519,Student 26041519-018 +26041520-001,26041520,Student 26041520-001 +26041520-002,26041520,Student 26041520-002 +26041520-003,26041520,Student 26041520-003 +26041520-004,26041520,Student 26041520-004 +26041520-005,26041520,Student 26041520-005 +26041520-006,26041520,Student 26041520-006 +26041520-007,26041520,Student 26041520-007 +26041520-008,26041520,Student 26041520-008 +26041520-009,26041520,Student 26041520-009 +26041520-010,26041520,Student 26041520-010 +26041520-011,26041520,Student 26041520-011 +26041520-012,26041520,Student 26041520-012 +26041520-013,26041520,Student 26041520-013 +26041520-014,26041520,Student 26041520-014 +26041520-015,26041520,Student 26041520-015 +26041520-016,26041520,Student 26041520-016 +26041520-017,26041520,Student 26041520-017 +26041520-018,26041520,Student 26041520-018 diff --git a/logs/template_generator.log b/logs/template_generator.log index 6bd8633..d186498 100644 --- a/logs/template_generator.log +++ b/logs/template_generator.log @@ -1,3 +1,12 @@ -Timetable generation log - started 2026-09-09T18:10:11.467126 +Timetable generation log - started 2026-09-09T18:19:44.655145 ================================================================================ -[18:10:11] INFO: clear_all: schedule state, result templates, and log have been reset. Run phase_1 to start over. +[18:19:44] INFO: clear_all: schedule state, result templates, and log have been reset. Run phase_1 to start over. +[18:19:48] INFO: Phase 1/3: scheduling general courses (Tue/Thu preferred)... +[18:19:48] INFO: [Phase 1 (general courses)] No conflicts found — clash-free. +[18:19:48] INFO: phase_1 complete: 8 session(s) added this phase, 8 total so far. State saved to D:\projects\UORM\timetable\result\schedule_state.json. +[18:19:57] INFO: Phase 2/3: scheduling labs (on top of phase_1's fixed placements)... +[18:19:57] INFO: [Phase 2 (general courses + labs)] No conflicts found — clash-free. +[18:19:57] INFO: phase_2 complete: 23 session(s) added this phase, 31 total so far. State saved to D:\projects\UORM\timetable\result\schedule_state.json. +[18:20:05] INFO: Phase 3/3: scheduling remaining courses (batch by batch)... +[18:20:05] INFO: [Phase 3 (full schedule)] No conflicts found — clash-free. +[18:20:05] INFO: phase_3 complete: 51 session(s) added this phase, 82 total so far. State saved to D:\projects\UORM\timetable\result\schedule_state.json. diff --git a/result/schedule_state.json b/result/schedule_state.json new file mode 100644 index 0000000..896a8bc --- /dev/null +++ b/result/schedule_state.json @@ -0,0 +1,2305 @@ +{ + "sessions": [ + { + "day": "Tuesday", + "slot_indices": [ + 0 + ], + "start": "09:00", + "end": "10:30", + "duration_minutes": 90, + "course_id": "GEN101", + "course_name": "Functional English", + "course_type": "theory", + "is_general": true, + "section_id": "ALL", + "instructor_code": "1002", + "instructor_name": "Ms. Sana Tariq", + "room_id": "A-103", + "room_name": "Room 103", + "batch_codes": [ + "25021519", + "25021520", + "25031519", + "25031520", + "25041519", + "25041520" + ] + }, + { + "day": "Tuesday", + "slot_indices": [ + 1 + ], + "start": "10:30", + "end": "12:00", + "duration_minutes": 90, + "course_id": "GEN101", + "course_name": "Functional English", + "course_type": "theory", + "is_general": true, + "section_id": "ALL", + "instructor_code": "1002", + "instructor_name": "Ms. Sana Tariq", + "room_id": "A-103", + "room_name": "Room 103", + "batch_codes": [ + "25021519", + "25021520", + "25031519", + "25031520", + "25041519", + "25041520" + ] + }, + { + "day": "Tuesday", + "slot_indices": [ + 2 + ], + "start": "12:00", + "end": "13:30", + "duration_minutes": 90, + "course_id": "GEN102", + "course_name": "Islamic Studies", + "course_type": "theory", + "is_general": true, + "section_id": "ALL", + "instructor_code": "1006", + "instructor_name": "Ms. Hira Shah", + "room_id": "A-103", + "room_name": "Room 103", + "batch_codes": [ + "25021519", + "25021520", + "25031519", + "25031520", + "25041519", + "25041520" + ] + }, + { + "day": "Thursday", + "slot_indices": [ + 0 + ], + "start": "08:30", + "end": "10:30", + "duration_minutes": 120, + "course_id": "GEN103", + "course_name": "Pakistan Studies", + "course_type": "theory", + "is_general": true, + "section_id": "ALL", + "instructor_code": "1006", + "instructor_name": "Ms. Hira Shah", + "room_id": "B-101", + "room_name": "Room 101 (B)", + "batch_codes": [ + "25021519", + "25021520", + "25031519", + "25031520", + "25041519", + "25041520" + ] + }, + { + "day": "Tuesday", + "slot_indices": [ + 2 + ], + "start": "12:00", + "end": "13:30", + "duration_minutes": 90, + "course_id": "GEN101", + "course_name": "Functional English", + "course_type": "theory", + "is_general": true, + "section_id": "ALL", + "instructor_code": "1002", + "instructor_name": "Ms. Sana Tariq", + "room_id": "A-101", + "room_name": "Room 101", + "batch_codes": [ + "26021519", + "26021520", + "26031519", + "26031520", + "26041519", + "26041520" + ] + }, + { + "day": "Tuesday", + "slot_indices": [ + 3 + ], + "start": "13:30", + "end": "15:00", + "duration_minutes": 90, + "course_id": "GEN101", + "course_name": "Functional English", + "course_type": "theory", + "is_general": true, + "section_id": "ALL", + "instructor_code": "1002", + "instructor_name": "Ms. Sana Tariq", + "room_id": "A-103", + "room_name": "Room 103", + "batch_codes": [ + "26021519", + "26021520", + "26031519", + "26031520", + "26041519", + "26041520" + ] + }, + { + "day": "Tuesday", + "slot_indices": [ + 0 + ], + "start": "09:00", + "end": "10:30", + "duration_minutes": 90, + "course_id": "GEN102", + "course_name": "Islamic Studies", + "course_type": "theory", + "is_general": true, + "section_id": "ALL", + "instructor_code": "1006", + "instructor_name": "Ms. Hira Shah", + "room_id": "A-101", + "room_name": "Room 101", + "batch_codes": [ + "26021519", + "26021520", + "26031519", + "26031520", + "26041519", + "26041520" + ] + }, + { + "day": "Monday", + "slot_indices": [ + 0 + ], + "start": "08:30", + "end": "10:30", + "duration_minutes": 120, + "course_id": "GEN103", + "course_name": "Pakistan Studies", + "course_type": "theory", + "is_general": true, + "section_id": "ALL", + "instructor_code": "1006", + "instructor_name": "Ms. Hira Shah", + "room_id": "B-101", + "room_name": "Room 101 (B)", + "batch_codes": [ + "26021519", + "26021520", + "26031519", + "26031520", + "26041519", + "26041520" + ] + }, + { + "day": "Monday", + "slot_indices": [ + 0, + 1 + ], + "start": "09:00", + "end": "12:00", + "duration_minutes": 180, + "course_id": "CS101", + "course_name": "Programming Fundamentals", + "course_type": "lab", + "is_general": false, + "section_id": "A", + "instructor_code": "1001", + "instructor_name": "Dr. Ahsan Raza", + "room_id": "A-L01", + "room_name": "Computer Lab 1", + "batch_codes": [ + "25021519" + ] + }, + { + "day": "Monday", + "slot_indices": [ + 2, + 3 + ], + "start": "12:00", + "end": "15:00", + "duration_minutes": 180, + "course_id": "CS201", + "course_name": "Data Structures", + "course_type": "lab", + "is_general": false, + "section_id": "A", + "instructor_code": "1002", + "instructor_name": "Ms. Sana Tariq", + "room_id": "A-L01", + "room_name": "Computer Lab 1", + "batch_codes": [ + "25021519" + ] + }, + { + "day": "Wednesday", + "slot_indices": [ + 0, + 1 + ], + "start": "09:00", + "end": "12:00", + "duration_minutes": 180, + "course_id": "CS301", + "course_name": "Operating Systems", + "course_type": "lab", + "is_general": false, + "section_id": "A", + "instructor_code": "1003", + "instructor_name": "Mr. Bilal Khan", + "room_id": "A-L02", + "room_name": "Computer Lab 2", + "batch_codes": [ + "25021519" + ] + }, + { + "day": "Wednesday", + "slot_indices": [ + 2, + 3 + ], + "start": "12:00", + "end": "15:00", + "duration_minutes": 180, + "course_id": "CS302", + "course_name": "Database Systems", + "course_type": "lab", + "is_general": false, + "section_id": "A", + "instructor_code": "1001", + "instructor_name": "Dr. Ahsan Raza", + "room_id": "A-L02", + "room_name": "Computer Lab 2", + "batch_codes": [ + "25021519" + ] + }, + { + "day": "Thursday", + "slot_indices": [ + 2, + 3 + ], + "start": "12:00", + "end": "15:00", + "duration_minutes": 180, + "course_id": "CS302", + "course_name": "Database Systems", + "course_type": "lab", + "is_general": false, + "section_id": "A", + "instructor_code": "1001", + "instructor_name": "Dr. Ahsan Raza", + "room_id": "A-L02", + "room_name": "Computer Lab 2", + "batch_codes": [ + "25021519" + ] + }, + { + "day": "Monday", + "slot_indices": [ + 2, + 3 + ], + "start": "12:00", + "end": "15:00", + "duration_minutes": 180, + "course_id": "CS101", + "course_name": "Programming Fundamentals", + "course_type": "lab", + "is_general": false, + "section_id": "B", + "instructor_code": "1001", + "instructor_name": "Dr. Ahsan Raza", + "room_id": "A-L02", + "room_name": "Computer Lab 2", + "batch_codes": [ + "25021520" + ] + }, + { + "day": "Monday", + "slot_indices": [ + 0, + 1 + ], + "start": "09:00", + "end": "12:00", + "duration_minutes": 180, + "course_id": "CS201", + "course_name": "Data Structures", + "course_type": "lab", + "is_general": false, + "section_id": "B", + "instructor_code": "1002", + "instructor_name": "Ms. Sana Tariq", + "room_id": "A-L02", + "room_name": "Computer Lab 2", + "batch_codes": [ + "25021520" + ] + }, + { + "day": "Wednesday", + "slot_indices": [ + 2, + 3 + ], + "start": "12:00", + "end": "15:00", + "duration_minutes": 180, + "course_id": "CS301", + "course_name": "Operating Systems", + "course_type": "lab", + "is_general": false, + "section_id": "B", + "instructor_code": "1003", + "instructor_name": "Mr. Bilal Khan", + "room_id": "A-L01", + "room_name": "Computer Lab 1", + "batch_codes": [ + "25021520" + ] + }, + { + "day": "Wednesday", + "slot_indices": [ + 0, + 1 + ], + "start": "09:00", + "end": "12:00", + "duration_minutes": 180, + "course_id": "CS302", + "course_name": "Database Systems", + "course_type": "lab", + "is_general": false, + "section_id": "B", + "instructor_code": "1001", + "instructor_name": "Dr. Ahsan Raza", + "room_id": "A-L01", + "room_name": "Computer Lab 1", + "batch_codes": [ + "25021520" + ] + }, + { + "day": "Friday", + "slot_indices": [ + 0, + 1 + ], + "start": "09:00", + "end": "12:00", + "duration_minutes": 180, + "course_id": "CS302", + "course_name": "Database Systems", + "course_type": "lab", + "is_general": false, + "section_id": "B", + "instructor_code": "1001", + "instructor_name": "Dr. Ahsan Raza", + "room_id": "A-L02", + "room_name": "Computer Lab 2", + "batch_codes": [ + "25021520" + ] + }, + { + "day": "Monday", + "slot_indices": [ + 0, + 1 + ], + "start": "09:00", + "end": "12:00", + "duration_minutes": 180, + "course_id": "EE101", + "course_name": "Basic Electronics", + "course_type": "lab", + "is_general": false, + "section_id": "A", + "instructor_code": "1004", + "instructor_name": "Dr. Farah Iqbal", + "room_id": "B-L01", + "room_name": "Electronics Lab", + "batch_codes": [ + "25031519" + ] + }, + { + "day": "Monday", + "slot_indices": [ + 2, + 3 + ], + "start": "12:00", + "end": "15:00", + "duration_minutes": 180, + "course_id": "EE201", + "course_name": "Digital Logic Design", + "course_type": "lab", + "is_general": false, + "section_id": "A", + "instructor_code": "1005", + "instructor_name": "Mr. Usman Ali", + "room_id": "B-L01", + "room_name": "Electronics Lab", + "batch_codes": [ + "25031519" + ] + }, + { + "day": "Wednesday", + "slot_indices": [ + 0, + 1 + ], + "start": "09:00", + "end": "12:00", + "duration_minutes": 180, + "course_id": "EE101", + "course_name": "Basic Electronics", + "course_type": "lab", + "is_general": false, + "section_id": "B", + "instructor_code": "1004", + "instructor_name": "Dr. Farah Iqbal", + "room_id": "B-L01", + "room_name": "Electronics Lab", + "batch_codes": [ + "25031520" + ] + }, + { + "day": "Wednesday", + "slot_indices": [ + 2, + 3 + ], + "start": "12:00", + "end": "15:00", + "duration_minutes": 180, + "course_id": "EE201", + "course_name": "Digital Logic Design", + "course_type": "lab", + "is_general": false, + "section_id": "B", + "instructor_code": "1005", + "instructor_name": "Mr. Usman Ali", + "room_id": "B-L01", + "room_name": "Electronics Lab", + "batch_codes": [ + "25031520" + ] + }, + { + "day": "Thursday", + "slot_indices": [ + 0, + 1 + ], + "start": "09:00", + "end": "12:00", + "duration_minutes": 180, + "course_id": "CS101", + "course_name": "Programming Fundamentals", + "course_type": "lab", + "is_general": false, + "section_id": "C", + "instructor_code": "1001", + "instructor_name": "Dr. Ahsan Raza", + "room_id": "A-L01", + "room_name": "Computer Lab 1", + "batch_codes": [ + "26021519" + ] + }, + { + "day": "Thursday", + "slot_indices": [ + 2, + 3 + ], + "start": "12:00", + "end": "15:00", + "duration_minutes": 180, + "course_id": "CS201", + "course_name": "Data Structures", + "course_type": "lab", + "is_general": false, + "section_id": "C", + "instructor_code": "1002", + "instructor_name": "Ms. Sana Tariq", + "room_id": "A-L01", + "room_name": "Computer Lab 1", + "batch_codes": [ + "26021519" + ] + }, + { + "day": "Friday", + "slot_indices": [ + 0, + 1 + ], + "start": "09:00", + "end": "12:00", + "duration_minutes": 180, + "course_id": "CS301", + "course_name": "Operating Systems", + "course_type": "lab", + "is_general": false, + "section_id": "C", + "instructor_code": "1003", + "instructor_name": "Mr. Bilal Khan", + "room_id": "A-L01", + "room_name": "Computer Lab 1", + "batch_codes": [ + "26021519" + ] + }, + { + "day": "Friday", + "slot_indices": [ + 2, + 3 + ], + "start": "12:00", + "end": "15:00", + "duration_minutes": 180, + "course_id": "CS302", + "course_name": "Database Systems", + "course_type": "lab", + "is_general": false, + "section_id": "C", + "instructor_code": "1001", + "instructor_name": "Dr. Ahsan Raza", + "room_id": "A-L02", + "room_name": "Computer Lab 2", + "batch_codes": [ + "26021519" + ] + }, + { + "day": "Thursday", + "slot_indices": [ + 0, + 1 + ], + "start": "09:00", + "end": "12:00", + "duration_minutes": 180, + "course_id": "CS201", + "course_name": "Data Structures", + "course_type": "lab", + "is_general": false, + "section_id": "D", + "instructor_code": "1002", + "instructor_name": "Ms. Sana Tariq", + "room_id": "A-L02", + "room_name": "Computer Lab 2", + "batch_codes": [ + "26021520" + ] + }, + { + "day": "Thursday", + "slot_indices": [ + 2, + 3 + ], + "start": "12:00", + "end": "15:00", + "duration_minutes": 180, + "course_id": "CS301", + "course_name": "Operating Systems", + "course_type": "lab", + "is_general": false, + "section_id": "D", + "instructor_code": "1003", + "instructor_name": "Mr. Bilal Khan", + "room_id": "B-L01", + "room_name": "Electronics Lab", + "batch_codes": [ + "26021520" + ] + }, + { + "day": "Thursday", + "slot_indices": [ + 0, + 1 + ], + "start": "09:00", + "end": "12:00", + "duration_minutes": 180, + "course_id": "EE101", + "course_name": "Basic Electronics", + "course_type": "lab", + "is_general": false, + "section_id": "C", + "instructor_code": "1004", + "instructor_name": "Dr. Farah Iqbal", + "room_id": "B-L01", + "room_name": "Electronics Lab", + "batch_codes": [ + "26031519" + ] + }, + { + "day": "Friday", + "slot_indices": [ + 0, + 1 + ], + "start": "09:00", + "end": "12:00", + "duration_minutes": 180, + "course_id": "EE201", + "course_name": "Digital Logic Design", + "course_type": "lab", + "is_general": false, + "section_id": "C", + "instructor_code": "1005", + "instructor_name": "Mr. Usman Ali", + "room_id": "B-L01", + "room_name": "Electronics Lab", + "batch_codes": [ + "26031519" + ] + }, + { + "day": "Friday", + "slot_indices": [ + 2, + 3 + ], + "start": "12:00", + "end": "15:00", + "duration_minutes": 180, + "course_id": "EE101", + "course_name": "Basic Electronics", + "course_type": "lab", + "is_general": false, + "section_id": "D", + "instructor_code": "1004", + "instructor_name": "Dr. Farah Iqbal", + "room_id": "A-L01", + "room_name": "Computer Lab 1", + "batch_codes": [ + "26031520" + ] + }, + { + "day": "Monday", + "slot_indices": [ + 4 + ], + "start": "15:00", + "end": "16:30", + "duration_minutes": 90, + "course_id": "CS101", + "course_name": "Programming Fundamentals", + "course_type": "theory", + "is_general": false, + "section_id": "A", + "instructor_code": "1001", + "instructor_name": "Dr. Ahsan Raza", + "room_id": "A-101", + "room_name": "Room 101", + "batch_codes": [ + "25021519" + ] + }, + { + "day": "Tuesday", + "slot_indices": [ + 3 + ], + "start": "13:30", + "end": "15:00", + "duration_minutes": 90, + "course_id": "CS101", + "course_name": "Programming Fundamentals", + "course_type": "theory", + "is_general": false, + "section_id": "A", + "instructor_code": "1001", + "instructor_name": "Dr. Ahsan Raza", + "room_id": "A-101", + "room_name": "Room 101", + "batch_codes": [ + "25021519" + ] + }, + { + "day": "Tuesday", + "slot_indices": [ + 4 + ], + "start": "15:00", + "end": "16:30", + "duration_minutes": 90, + "course_id": "CS201", + "course_name": "Data Structures", + "course_type": "theory", + "is_general": false, + "section_id": "A", + "instructor_code": "1002", + "instructor_name": "Ms. Sana Tariq", + "room_id": "A-102", + "room_name": "Room 102", + "batch_codes": [ + "25021519" + ] + }, + { + "day": "Wednesday", + "slot_indices": [ + 4 + ], + "start": "15:00", + "end": "16:30", + "duration_minutes": 90, + "course_id": "CS201", + "course_name": "Data Structures", + "course_type": "theory", + "is_general": false, + "section_id": "A", + "instructor_code": "1002", + "instructor_name": "Ms. Sana Tariq", + "room_id": "A-102", + "room_name": "Room 102", + "batch_codes": [ + "25021519" + ] + }, + { + "day": "Thursday", + "slot_indices": [ + 4 + ], + "start": "15:00", + "end": "16:30", + "duration_minutes": 90, + "course_id": "CS302", + "course_name": "Database Systems", + "course_type": "theory", + "is_general": false, + "section_id": "A", + "instructor_code": "1001", + "instructor_name": "Dr. Ahsan Raza", + "room_id": "A-102", + "room_name": "Room 102", + "batch_codes": [ + "25021519" + ] + }, + { + "day": "Friday", + "slot_indices": [ + 4 + ], + "start": "15:00", + "end": "16:30", + "duration_minutes": 90, + "course_id": "CS302", + "course_name": "Database Systems", + "course_type": "theory", + "is_general": false, + "section_id": "A", + "instructor_code": "1001", + "instructor_name": "Dr. Ahsan Raza", + "room_id": "A-102", + "room_name": "Room 102", + "batch_codes": [ + "25021519" + ] + }, + { + "day": "Tuesday", + "slot_indices": [ + 4 + ], + "start": "15:00", + "end": "16:30", + "duration_minutes": 90, + "course_id": "CS101", + "course_name": "Programming Fundamentals", + "course_type": "theory", + "is_general": false, + "section_id": "B", + "instructor_code": "1001", + "instructor_name": "Dr. Ahsan Raza", + "room_id": "A-101", + "room_name": "Room 101", + "batch_codes": [ + "25021520" + ] + }, + { + "day": "Wednesday", + "slot_indices": [ + 4 + ], + "start": "15:00", + "end": "16:30", + "duration_minutes": 90, + "course_id": "CS101", + "course_name": "Programming Fundamentals", + "course_type": "theory", + "is_general": false, + "section_id": "B", + "instructor_code": "1001", + "instructor_name": "Dr. Ahsan Raza", + "room_id": "A-101", + "room_name": "Room 101", + "batch_codes": [ + "25021520" + ] + }, + { + "day": "Monday", + "slot_indices": [ + 4 + ], + "start": "15:00", + "end": "16:30", + "duration_minutes": 90, + "course_id": "CS201", + "course_name": "Data Structures", + "course_type": "theory", + "is_general": false, + "section_id": "B", + "instructor_code": "1002", + "instructor_name": "Ms. Sana Tariq", + "room_id": "A-102", + "room_name": "Room 102", + "batch_codes": [ + "25021520" + ] + }, + { + "day": "Thursday", + "slot_indices": [ + 4 + ], + "start": "15:00", + "end": "16:30", + "duration_minutes": 90, + "course_id": "CS201", + "course_name": "Data Structures", + "course_type": "theory", + "is_general": false, + "section_id": "B", + "instructor_code": "1002", + "instructor_name": "Ms. Sana Tariq", + "room_id": "A-101", + "room_name": "Room 101", + "batch_codes": [ + "25021520" + ] + }, + { + "day": "Monday", + "slot_indices": [ + 4 + ], + "start": "15:00", + "end": "16:30", + "duration_minutes": 90, + "course_id": "EE101", + "course_name": "Basic Electronics", + "course_type": "theory", + "is_general": false, + "section_id": "A", + "instructor_code": "1004", + "instructor_name": "Dr. Farah Iqbal", + "room_id": "A-201", + "room_name": "Room 201", + "batch_codes": [ + "25031519" + ] + }, + { + "day": "Tuesday", + "slot_indices": [ + 3 + ], + "start": "13:30", + "end": "15:00", + "duration_minutes": 90, + "course_id": "EE101", + "course_name": "Basic Electronics", + "course_type": "theory", + "is_general": false, + "section_id": "A", + "instructor_code": "1004", + "instructor_name": "Dr. Farah Iqbal", + "room_id": "A-201", + "room_name": "Room 201", + "batch_codes": [ + "25031519" + ] + }, + { + "day": "Tuesday", + "slot_indices": [ + 4 + ], + "start": "15:00", + "end": "16:30", + "duration_minutes": 90, + "course_id": "EE201", + "course_name": "Digital Logic Design", + "course_type": "theory", + "is_general": false, + "section_id": "A", + "instructor_code": "1005", + "instructor_name": "Mr. Usman Ali", + "room_id": "B-101", + "room_name": "Room 101 (B)", + "batch_codes": [ + "25031519" + ] + }, + { + "day": "Wednesday", + "slot_indices": [ + 0 + ], + "start": "09:00", + "end": "10:30", + "duration_minutes": 90, + "course_id": "EE201", + "course_name": "Digital Logic Design", + "course_type": "theory", + "is_general": false, + "section_id": "A", + "instructor_code": "1005", + "instructor_name": "Mr. Usman Ali", + "room_id": "B-101", + "room_name": "Room 101 (B)", + "batch_codes": [ + "25031519" + ] + }, + { + "day": "Friday", + "slot_indices": [ + 0 + ], + "start": "08:30", + "end": "10:30", + "duration_minutes": 120, + "course_id": "EE301", + "course_name": "Signals and Systems", + "course_type": "theory", + "is_general": false, + "section_id": "A", + "instructor_code": "1004", + "instructor_name": "Dr. Farah Iqbal", + "room_id": "B-102", + "room_name": "Room 102 (B)", + "batch_codes": [ + "25031519" + ] + }, + { + "day": "Monday", + "slot_indices": [ + 2 + ], + "start": "12:00", + "end": "13:30", + "duration_minutes": 90, + "course_id": "EE101", + "course_name": "Basic Electronics", + "course_type": "theory", + "is_general": false, + "section_id": "B", + "instructor_code": "1004", + "instructor_name": "Dr. Farah Iqbal", + "room_id": "A-201", + "room_name": "Room 201", + "batch_codes": [ + "25031520" + ] + }, + { + "day": "Monday", + "slot_indices": [ + 3 + ], + "start": "13:30", + "end": "15:00", + "duration_minutes": 90, + "course_id": "EE101", + "course_name": "Basic Electronics", + "course_type": "theory", + "is_general": false, + "section_id": "B", + "instructor_code": "1004", + "instructor_name": "Dr. Farah Iqbal", + "room_id": "A-201", + "room_name": "Room 201", + "batch_codes": [ + "25031520" + ] + }, + { + "day": "Monday", + "slot_indices": [ + 0 + ], + "start": "09:00", + "end": "10:30", + "duration_minutes": 90, + "course_id": "EE201", + "course_name": "Digital Logic Design", + "course_type": "theory", + "is_general": false, + "section_id": "B", + "instructor_code": "1005", + "instructor_name": "Mr. Usman Ali", + "room_id": "A-101", + "room_name": "Room 101", + "batch_codes": [ + "25031520" + ] + }, + { + "day": "Monday", + "slot_indices": [ + 1 + ], + "start": "10:30", + "end": "12:00", + "duration_minutes": 90, + "course_id": "EE201", + "course_name": "Digital Logic Design", + "course_type": "theory", + "is_general": false, + "section_id": "B", + "instructor_code": "1005", + "instructor_name": "Mr. Usman Ali", + "room_id": "B-101", + "room_name": "Room 101 (B)", + "batch_codes": [ + "25031520" + ] + }, + { + "day": "Monday", + "slot_indices": [ + 0 + ], + "start": "09:00", + "end": "10:30", + "duration_minutes": 90, + "course_id": "BBA101", + "course_name": "Principles of Management", + "course_type": "theory", + "is_general": false, + "section_id": "A", + "instructor_code": "1007", + "instructor_name": "Dr. Nadia Farooq", + "room_id": "A-102", + "room_name": "Room 102", + "batch_codes": [ + "25041519" + ] + }, + { + "day": "Monday", + "slot_indices": [ + 1 + ], + "start": "10:30", + "end": "12:00", + "duration_minutes": 90, + "course_id": "BBA101", + "course_name": "Principles of Management", + "course_type": "theory", + "is_general": false, + "section_id": "A", + "instructor_code": "1007", + "instructor_name": "Dr. Nadia Farooq", + "room_id": "A-101", + "room_name": "Room 101", + "batch_codes": [ + "25041519" + ] + }, + { + "day": "Monday", + "slot_indices": [ + 2 + ], + "start": "12:00", + "end": "13:30", + "duration_minutes": 90, + "course_id": "BBA201", + "course_name": "Financial Accounting", + "course_type": "theory", + "is_general": false, + "section_id": "A", + "instructor_code": "1008", + "instructor_name": "Mr. Kamran Sheikh", + "room_id": "B-102", + "room_name": "Room 102 (B)", + "batch_codes": [ + "25041519" + ] + }, + { + "day": "Monday", + "slot_indices": [ + 3 + ], + "start": "13:30", + "end": "15:00", + "duration_minutes": 90, + "course_id": "BBA201", + "course_name": "Financial Accounting", + "course_type": "theory", + "is_general": false, + "section_id": "A", + "instructor_code": "1008", + "instructor_name": "Mr. Kamran Sheikh", + "room_id": "B-102", + "room_name": "Room 102 (B)", + "batch_codes": [ + "25041519" + ] + }, + { + "day": "Wednesday", + "slot_indices": [ + 0 + ], + "start": "08:30", + "end": "10:30", + "duration_minutes": 120, + "course_id": "BBA301", + "course_name": "Marketing Management", + "course_type": "theory", + "is_general": false, + "section_id": "A", + "instructor_code": "1007", + "instructor_name": "Dr. Nadia Farooq", + "room_id": "A-103", + "room_name": "Room 103", + "batch_codes": [ + "25041519" + ] + }, + { + "day": "Monday", + "slot_indices": [ + 2 + ], + "start": "12:00", + "end": "13:30", + "duration_minutes": 90, + "course_id": "BBA101", + "course_name": "Principles of Management", + "course_type": "theory", + "is_general": false, + "section_id": "B", + "instructor_code": "1007", + "instructor_name": "Dr. Nadia Farooq", + "room_id": "B-101", + "room_name": "Room 101 (B)", + "batch_codes": [ + "25041520" + ] + }, + { + "day": "Monday", + "slot_indices": [ + 3 + ], + "start": "13:30", + "end": "15:00", + "duration_minutes": 90, + "course_id": "BBA101", + "course_name": "Principles of Management", + "course_type": "theory", + "is_general": false, + "section_id": "B", + "instructor_code": "1007", + "instructor_name": "Dr. Nadia Farooq", + "room_id": "B-101", + "room_name": "Room 101 (B)", + "batch_codes": [ + "25041520" + ] + }, + { + "day": "Monday", + "slot_indices": [ + 0 + ], + "start": "09:00", + "end": "10:30", + "duration_minutes": 90, + "course_id": "BBA201", + "course_name": "Financial Accounting", + "course_type": "theory", + "is_general": false, + "section_id": "B", + "instructor_code": "1008", + "instructor_name": "Mr. Kamran Sheikh", + "room_id": "B-102", + "room_name": "Room 102 (B)", + "batch_codes": [ + "25041520" + ] + }, + { + "day": "Monday", + "slot_indices": [ + 1 + ], + "start": "10:30", + "end": "12:00", + "duration_minutes": 90, + "course_id": "BBA201", + "course_name": "Financial Accounting", + "course_type": "theory", + "is_general": false, + "section_id": "B", + "instructor_code": "1008", + "instructor_name": "Mr. Kamran Sheikh", + "room_id": "B-102", + "room_name": "Room 102 (B)", + "batch_codes": [ + "25041520" + ] + }, + { + "day": "Friday", + "slot_indices": [ + 0 + ], + "start": "08:30", + "end": "10:30", + "duration_minutes": 120, + "course_id": "BBA301", + "course_name": "Marketing Management", + "course_type": "theory", + "is_general": false, + "section_id": "B", + "instructor_code": "1007", + "instructor_name": "Dr. Nadia Farooq", + "room_id": "A-103", + "room_name": "Room 103", + "batch_codes": [ + "25041520" + ] + }, + { + "day": "Tuesday", + "slot_indices": [ + 1 + ], + "start": "10:30", + "end": "12:00", + "duration_minutes": 90, + "course_id": "CS101", + "course_name": "Programming Fundamentals", + "course_type": "theory", + "is_general": false, + "section_id": "C", + "instructor_code": "1001", + "instructor_name": "Dr. Ahsan Raza", + "room_id": "A-101", + "room_name": "Room 101", + "batch_codes": [ + "26021519" + ] + }, + { + "day": "Wednesday", + "slot_indices": [ + 0 + ], + "start": "09:00", + "end": "10:30", + "duration_minutes": 90, + "course_id": "CS201", + "course_name": "Data Structures", + "course_type": "theory", + "is_general": false, + "section_id": "C", + "instructor_code": "1002", + "instructor_name": "Ms. Sana Tariq", + "room_id": "A-102", + "room_name": "Room 102", + "batch_codes": [ + "26021519" + ] + }, + { + "day": "Wednesday", + "slot_indices": [ + 1 + ], + "start": "10:30", + "end": "12:00", + "duration_minutes": 90, + "course_id": "CS201", + "course_name": "Data Structures", + "course_type": "theory", + "is_general": false, + "section_id": "C", + "instructor_code": "1002", + "instructor_name": "Ms. Sana Tariq", + "room_id": "A-102", + "room_name": "Room 102", + "batch_codes": [ + "26021519" + ] + }, + { + "day": "Wednesday", + "slot_indices": [ + 2 + ], + "start": "12:00", + "end": "13:30", + "duration_minutes": 90, + "course_id": "CS201", + "course_name": "Data Structures", + "course_type": "theory", + "is_general": false, + "section_id": "D", + "instructor_code": "1002", + "instructor_name": "Ms. Sana Tariq", + "room_id": "A-102", + "room_name": "Room 102", + "batch_codes": [ + "26021520" + ] + }, + { + "day": "Wednesday", + "slot_indices": [ + 3 + ], + "start": "13:30", + "end": "15:00", + "duration_minutes": 90, + "course_id": "CS201", + "course_name": "Data Structures", + "course_type": "theory", + "is_general": false, + "section_id": "D", + "instructor_code": "1002", + "instructor_name": "Ms. Sana Tariq", + "room_id": "A-102", + "room_name": "Room 102", + "batch_codes": [ + "26021520" + ] + }, + { + "day": "Tuesday", + "slot_indices": [ + 1 + ], + "start": "10:30", + "end": "12:00", + "duration_minutes": 90, + "course_id": "EE101", + "course_name": "Basic Electronics", + "course_type": "theory", + "is_general": false, + "section_id": "C", + "instructor_code": "1004", + "instructor_name": "Dr. Farah Iqbal", + "room_id": "A-201", + "room_name": "Room 201", + "batch_codes": [ + "26031519" + ] + }, + { + "day": "Tuesday", + "slot_indices": [ + 4 + ], + "start": "15:00", + "end": "16:30", + "duration_minutes": 90, + "course_id": "EE101", + "course_name": "Basic Electronics", + "course_type": "theory", + "is_general": false, + "section_id": "C", + "instructor_code": "1004", + "instructor_name": "Dr. Farah Iqbal", + "room_id": "A-201", + "room_name": "Room 201", + "batch_codes": [ + "26031519" + ] + }, + { + "day": "Monday", + "slot_indices": [ + 4 + ], + "start": "15:00", + "end": "16:30", + "duration_minutes": 90, + "course_id": "EE201", + "course_name": "Digital Logic Design", + "course_type": "theory", + "is_general": false, + "section_id": "C", + "instructor_code": "1005", + "instructor_name": "Mr. Usman Ali", + "room_id": "B-101", + "room_name": "Room 101 (B)", + "batch_codes": [ + "26031519" + ] + }, + { + "day": "Wednesday", + "slot_indices": [ + 1 + ], + "start": "10:30", + "end": "12:00", + "duration_minutes": 90, + "course_id": "EE201", + "course_name": "Digital Logic Design", + "course_type": "theory", + "is_general": false, + "section_id": "C", + "instructor_code": "1005", + "instructor_name": "Mr. Usman Ali", + "room_id": "B-101", + "room_name": "Room 101 (B)", + "batch_codes": [ + "26031519" + ] + }, + { + "day": "Wednesday", + "slot_indices": [ + 2 + ], + "start": "12:00", + "end": "13:30", + "duration_minutes": 90, + "course_id": "EE101", + "course_name": "Basic Electronics", + "course_type": "theory", + "is_general": false, + "section_id": "D", + "instructor_code": "1004", + "instructor_name": "Dr. Farah Iqbal", + "room_id": "A-201", + "room_name": "Room 201", + "batch_codes": [ + "26031520" + ] + }, + { + "day": "Wednesday", + "slot_indices": [ + 3 + ], + "start": "13:30", + "end": "15:00", + "duration_minutes": 90, + "course_id": "EE101", + "course_name": "Basic Electronics", + "course_type": "theory", + "is_general": false, + "section_id": "D", + "instructor_code": "1004", + "instructor_name": "Dr. Farah Iqbal", + "room_id": "A-201", + "room_name": "Room 201", + "batch_codes": [ + "26031520" + ] + }, + { + "day": "Tuesday", + "slot_indices": [ + 1 + ], + "start": "10:30", + "end": "12:00", + "duration_minutes": 90, + "course_id": "EE201", + "course_name": "Digital Logic Design", + "course_type": "theory", + "is_general": false, + "section_id": "D", + "instructor_code": "1005", + "instructor_name": "Mr. Usman Ali", + "room_id": "B-101", + "room_name": "Room 101 (B)", + "batch_codes": [ + "26031520" + ] + }, + { + "day": "Wednesday", + "slot_indices": [ + 4 + ], + "start": "15:00", + "end": "16:30", + "duration_minutes": 90, + "course_id": "EE201", + "course_name": "Digital Logic Design", + "course_type": "theory", + "is_general": false, + "section_id": "D", + "instructor_code": "1005", + "instructor_name": "Mr. Usman Ali", + "room_id": "B-101", + "room_name": "Room 101 (B)", + "batch_codes": [ + "26031520" + ] + }, + { + "day": "Monday", + "slot_indices": [ + 4 + ], + "start": "15:00", + "end": "16:30", + "duration_minutes": 90, + "course_id": "BBA101", + "course_name": "Principles of Management", + "course_type": "theory", + "is_general": false, + "section_id": "C", + "instructor_code": "1007", + "instructor_name": "Dr. Nadia Farooq", + "room_id": "A-103", + "room_name": "Room 103", + "batch_codes": [ + "26041519" + ] + }, + { + "day": "Tuesday", + "slot_indices": [ + 1 + ], + "start": "10:30", + "end": "12:00", + "duration_minutes": 90, + "course_id": "BBA101", + "course_name": "Principles of Management", + "course_type": "theory", + "is_general": false, + "section_id": "C", + "instructor_code": "1007", + "instructor_name": "Dr. Nadia Farooq", + "room_id": "A-102", + "room_name": "Room 102", + "batch_codes": [ + "26041519" + ] + }, + { + "day": "Tuesday", + "slot_indices": [ + 4 + ], + "start": "15:00", + "end": "16:30", + "duration_minutes": 90, + "course_id": "BBA201", + "course_name": "Financial Accounting", + "course_type": "theory", + "is_general": false, + "section_id": "C", + "instructor_code": "1008", + "instructor_name": "Mr. Kamran Sheikh", + "room_id": "B-102", + "room_name": "Room 102 (B)", + "batch_codes": [ + "26041519" + ] + }, + { + "day": "Wednesday", + "slot_indices": [ + 0 + ], + "start": "09:00", + "end": "10:30", + "duration_minutes": 90, + "course_id": "BBA201", + "course_name": "Financial Accounting", + "course_type": "theory", + "is_general": false, + "section_id": "C", + "instructor_code": "1008", + "instructor_name": "Mr. Kamran Sheikh", + "room_id": "B-102", + "room_name": "Room 102 (B)", + "batch_codes": [ + "26041519" + ] + }, + { + "day": "Thursday", + "slot_indices": [ + 0 + ], + "start": "08:30", + "end": "10:30", + "duration_minutes": 120, + "course_id": "BBA301", + "course_name": "Marketing Management", + "course_type": "theory", + "is_general": false, + "section_id": "C", + "instructor_code": "1007", + "instructor_name": "Dr. Nadia Farooq", + "room_id": "A-103", + "room_name": "Room 103", + "batch_codes": [ + "26041519" + ] + }, + { + "day": "Tuesday", + "slot_indices": [ + 4 + ], + "start": "15:00", + "end": "16:30", + "duration_minutes": 90, + "course_id": "BBA101", + "course_name": "Principles of Management", + "course_type": "theory", + "is_general": false, + "section_id": "D", + "instructor_code": "1007", + "instructor_name": "Dr. Nadia Farooq", + "room_id": "A-103", + "room_name": "Room 103", + "batch_codes": [ + "26041520" + ] + }, + { + "day": "Wednesday", + "slot_indices": [ + 1 + ], + "start": "10:30", + "end": "12:00", + "duration_minutes": 90, + "course_id": "BBA101", + "course_name": "Principles of Management", + "course_type": "theory", + "is_general": false, + "section_id": "D", + "instructor_code": "1007", + "instructor_name": "Dr. Nadia Farooq", + "room_id": "A-101", + "room_name": "Room 101", + "batch_codes": [ + "26041520" + ] + }, + { + "day": "Monday", + "slot_indices": [ + 4 + ], + "start": "15:00", + "end": "16:30", + "duration_minutes": 90, + "course_id": "BBA201", + "course_name": "Financial Accounting", + "course_type": "theory", + "is_general": false, + "section_id": "D", + "instructor_code": "1008", + "instructor_name": "Mr. Kamran Sheikh", + "room_id": "B-102", + "room_name": "Room 102 (B)", + "batch_codes": [ + "26041520" + ] + }, + { + "day": "Tuesday", + "slot_indices": [ + 1 + ], + "start": "10:30", + "end": "12:00", + "duration_minutes": 90, + "course_id": "BBA201", + "course_name": "Financial Accounting", + "course_type": "theory", + "is_general": false, + "section_id": "D", + "instructor_code": "1008", + "instructor_name": "Mr. Kamran Sheikh", + "room_id": "B-102", + "room_name": "Room 102 (B)", + "batch_codes": [ + "26041520" + ] + } + ], + "room_busy": { + "Tuesday|0": [ + "A-101", + "A-103" + ], + "Tuesday|1": [ + "A-101", + "A-102", + "A-103", + "A-201", + "B-101", + "B-102" + ], + "Tuesday|2": [ + "A-101", + "A-103" + ], + "Thursday|0": [ + "A-103", + "A-L01", + "A-L02", + "B-101", + "B-L01" + ], + "Tuesday|3": [ + "A-101", + "A-103", + "A-201" + ], + "Monday|0": [ + "A-101", + "A-102", + "A-L01", + "A-L02", + "B-101", + "B-102", + "B-L01" + ], + "Monday|1": [ + "A-101", + "A-L01", + "A-L02", + "B-101", + "B-102", + "B-L01" + ], + "Monday|2": [ + "A-201", + "A-L01", + "A-L02", + "B-101", + "B-102", + "B-L01" + ], + "Monday|3": [ + "A-201", + "A-L01", + "A-L02", + "B-101", + "B-102", + "B-L01" + ], + "Wednesday|0": [ + "A-102", + "A-103", + "A-L01", + "A-L02", + "B-101", + "B-102", + "B-L01" + ], + "Wednesday|1": [ + "A-101", + "A-102", + "A-L01", + "A-L02", + "B-101", + "B-L01" + ], + "Wednesday|2": [ + "A-102", + "A-201", + "A-L01", + "A-L02", + "B-L01" + ], + "Wednesday|3": [ + "A-102", + "A-201", + "A-L01", + "A-L02", + "B-L01" + ], + "Thursday|2": [ + "A-L01", + "A-L02", + "B-L01" + ], + "Thursday|3": [ + "A-L01", + "A-L02", + "B-L01" + ], + "Friday|0": [ + "A-103", + "A-L01", + "A-L02", + "B-102", + "B-L01" + ], + "Friday|1": [ + "A-L01", + "A-L02", + "B-L01" + ], + "Thursday|1": [ + "A-L01", + "A-L02", + "B-L01" + ], + "Friday|2": [ + "A-L01", + "A-L02" + ], + "Friday|3": [ + "A-L01", + "A-L02" + ], + "Monday|4": [ + "A-101", + "A-102", + "A-103", + "A-201", + "B-101", + "B-102" + ], + "Tuesday|4": [ + "A-101", + "A-102", + "A-103", + "A-201", + "B-101", + "B-102" + ], + "Wednesday|4": [ + "A-101", + "A-102", + "B-101" + ], + "Thursday|4": [ + "A-101", + "A-102" + ], + "Friday|4": [ + "A-102" + ] + }, + "instructor_busy": { + "Tuesday|0": [ + "1002", + "1006" + ], + "Tuesday|1": [ + "1001", + "1002", + "1004", + "1005", + "1007", + "1008" + ], + "Tuesday|2": [ + "1002", + "1006" + ], + "Thursday|0": [ + "1001", + "1002", + "1004", + "1006", + "1007" + ], + "Tuesday|3": [ + "1001", + "1002", + "1004" + ], + "Monday|0": [ + "1001", + "1002", + "1004", + "1005", + "1006", + "1007", + "1008" + ], + "Monday|1": [ + "1001", + "1002", + "1004", + "1005", + "1007", + "1008" + ], + "Monday|2": [ + "1001", + "1002", + "1004", + "1005", + "1007", + "1008" + ], + "Monday|3": [ + "1001", + "1002", + "1004", + "1005", + "1007", + "1008" + ], + "Wednesday|0": [ + "1001", + "1002", + "1003", + "1004", + "1005", + "1007", + "1008" + ], + "Wednesday|1": [ + "1001", + "1002", + "1003", + "1004", + "1005", + "1007" + ], + "Wednesday|2": [ + "1001", + "1002", + "1003", + "1004", + "1005" + ], + "Wednesday|3": [ + "1001", + "1002", + "1003", + "1004", + "1005" + ], + "Thursday|2": [ + "1001", + "1002", + "1003" + ], + "Thursday|3": [ + "1001", + "1002", + "1003" + ], + "Friday|0": [ + "1001", + "1003", + "1004", + "1005", + "1007" + ], + "Friday|1": [ + "1001", + "1003", + "1005" + ], + "Thursday|1": [ + "1001", + "1002", + "1004" + ], + "Friday|2": [ + "1001", + "1004" + ], + "Friday|3": [ + "1001", + "1004" + ], + "Monday|4": [ + "1001", + "1002", + "1004", + "1005", + "1007", + "1008" + ], + "Tuesday|4": [ + "1001", + "1002", + "1004", + "1005", + "1007", + "1008" + ], + "Wednesday|4": [ + "1001", + "1002", + "1005" + ], + "Thursday|4": [ + "1001", + "1002" + ], + "Friday|4": [ + "1001" + ] + }, + "batch_busy": { + "Tuesday|0": [ + "25021519", + "25021520", + "25031519", + "25031520", + "25041519", + "25041520", + "26021519", + "26021520", + "26031519", + "26031520", + "26041519", + "26041520" + ], + "Tuesday|1": [ + "25021519", + "25021520", + "25031519", + "25031520", + "25041519", + "25041520", + "26021519", + "26031519", + "26031520", + "26041519", + "26041520" + ], + "Tuesday|2": [ + "25021519", + "25021520", + "25031519", + "25031520", + "25041519", + "25041520", + "26021519", + "26021520", + "26031519", + "26031520", + "26041519", + "26041520" + ], + "Thursday|0": [ + "25021519", + "25021520", + "25031519", + "25031520", + "25041519", + "25041520", + "26021519", + "26021520", + "26031519", + "26041519" + ], + "Tuesday|3": [ + "25021519", + "25031519", + "26021519", + "26021520", + "26031519", + "26031520", + "26041519", + "26041520" + ], + "Monday|0": [ + "25021519", + "25021520", + "25031519", + "25031520", + "25041519", + "25041520", + "26021519", + "26021520", + "26031519", + "26031520", + "26041519", + "26041520" + ], + "Monday|1": [ + "25021519", + "25021520", + "25031519", + "25031520", + "25041519", + "25041520" + ], + "Monday|2": [ + "25021519", + "25021520", + "25031519", + "25031520", + "25041519", + "25041520" + ], + "Monday|3": [ + "25021519", + "25021520", + "25031519", + "25031520", + "25041519", + "25041520" + ], + "Wednesday|0": [ + "25021519", + "25021520", + "25031519", + "25031520", + "25041519", + "26021519", + "26041519" + ], + "Wednesday|1": [ + "25021519", + "25021520", + "25031520", + "26021519", + "26031519", + "26041520" + ], + "Wednesday|2": [ + "25021519", + "25021520", + "25031520", + "26021520", + "26031520" + ], + "Wednesday|3": [ + "25021519", + "25021520", + "25031520", + "26021520", + "26031520" + ], + "Thursday|2": [ + "25021519", + "26021519", + "26021520" + ], + "Thursday|3": [ + "25021519", + "26021519", + "26021520" + ], + "Friday|0": [ + "25021520", + "25031519", + "25041520", + "26021519", + "26031519" + ], + "Friday|1": [ + "25021520", + "26021519", + "26031519" + ], + "Thursday|1": [ + "26021519", + "26021520", + "26031519" + ], + "Friday|2": [ + "26021519", + "26031520" + ], + "Friday|3": [ + "26021519", + "26031520" + ], + "Monday|4": [ + "25021519", + "25021520", + "25031519", + "26031519", + "26041519", + "26041520" + ], + "Tuesday|4": [ + "25021519", + "25021520", + "25031519", + "26031519", + "26041519", + "26041520" + ], + "Wednesday|4": [ + "25021519", + "25021520", + "26031520" + ], + "Thursday|4": [ + "25021519", + "25021520" + ], + "Friday|4": [ + "25021519" + ] + }, + "phases_completed": [ + "phase_1", + "phase_2", + "phase_3" + ] +} \ No newline at end of file diff --git a/result/templates/batch-wise/25021519.xlsx b/result/templates/batch-wise/25021519.xlsx new file mode 100644 index 0000000..3156bc8 Binary files /dev/null and b/result/templates/batch-wise/25021519.xlsx differ diff --git a/result/templates/batch-wise/25021520.xlsx b/result/templates/batch-wise/25021520.xlsx new file mode 100644 index 0000000..debb9dd Binary files /dev/null and b/result/templates/batch-wise/25021520.xlsx differ diff --git a/result/templates/batch-wise/25031519.xlsx b/result/templates/batch-wise/25031519.xlsx new file mode 100644 index 0000000..3964a56 Binary files /dev/null and b/result/templates/batch-wise/25031519.xlsx differ diff --git a/result/templates/batch-wise/25031520.xlsx b/result/templates/batch-wise/25031520.xlsx new file mode 100644 index 0000000..6907be5 Binary files /dev/null and b/result/templates/batch-wise/25031520.xlsx differ diff --git a/result/templates/batch-wise/25041519.xlsx b/result/templates/batch-wise/25041519.xlsx new file mode 100644 index 0000000..8f3c3cb Binary files /dev/null and b/result/templates/batch-wise/25041519.xlsx differ diff --git a/result/templates/batch-wise/25041520.xlsx b/result/templates/batch-wise/25041520.xlsx new file mode 100644 index 0000000..ef6eee9 Binary files /dev/null and b/result/templates/batch-wise/25041520.xlsx differ diff --git a/result/templates/batch-wise/26021519.xlsx b/result/templates/batch-wise/26021519.xlsx new file mode 100644 index 0000000..066949a Binary files /dev/null and b/result/templates/batch-wise/26021519.xlsx differ diff --git a/result/templates/batch-wise/26021520.xlsx b/result/templates/batch-wise/26021520.xlsx new file mode 100644 index 0000000..d620cb6 Binary files /dev/null and b/result/templates/batch-wise/26021520.xlsx differ diff --git a/result/templates/batch-wise/26031519.xlsx b/result/templates/batch-wise/26031519.xlsx new file mode 100644 index 0000000..df6efb8 Binary files /dev/null and b/result/templates/batch-wise/26031519.xlsx differ diff --git a/result/templates/batch-wise/26031520.xlsx b/result/templates/batch-wise/26031520.xlsx new file mode 100644 index 0000000..812594a Binary files /dev/null and b/result/templates/batch-wise/26031520.xlsx differ diff --git a/result/templates/batch-wise/26041519.xlsx b/result/templates/batch-wise/26041519.xlsx new file mode 100644 index 0000000..6a4daff Binary files /dev/null and b/result/templates/batch-wise/26041519.xlsx differ diff --git a/result/templates/batch-wise/26041520.xlsx b/result/templates/batch-wise/26041520.xlsx new file mode 100644 index 0000000..54162ff Binary files /dev/null and b/result/templates/batch-wise/26041520.xlsx differ diff --git a/result/templates/department-wise/BBA.xlsx b/result/templates/department-wise/BBA.xlsx new file mode 100644 index 0000000..691c7ef Binary files /dev/null and b/result/templates/department-wise/BBA.xlsx differ diff --git a/result/templates/department-wise/CS.xlsx b/result/templates/department-wise/CS.xlsx new file mode 100644 index 0000000..ed7c10e Binary files /dev/null and b/result/templates/department-wise/CS.xlsx differ diff --git a/result/templates/department-wise/EE.xlsx b/result/templates/department-wise/EE.xlsx new file mode 100644 index 0000000..5c15157 Binary files /dev/null and b/result/templates/department-wise/EE.xlsx differ diff --git a/result/templates/room-wise/A-101.xlsx b/result/templates/room-wise/A-101.xlsx new file mode 100644 index 0000000..99868c6 Binary files /dev/null and b/result/templates/room-wise/A-101.xlsx differ diff --git a/result/templates/room-wise/A-102.xlsx b/result/templates/room-wise/A-102.xlsx new file mode 100644 index 0000000..4b303a4 Binary files /dev/null and b/result/templates/room-wise/A-102.xlsx differ diff --git a/result/templates/room-wise/A-103.xlsx b/result/templates/room-wise/A-103.xlsx new file mode 100644 index 0000000..000831a Binary files /dev/null and b/result/templates/room-wise/A-103.xlsx differ diff --git a/result/templates/room-wise/A-201.xlsx b/result/templates/room-wise/A-201.xlsx new file mode 100644 index 0000000..b562aa8 Binary files /dev/null and b/result/templates/room-wise/A-201.xlsx differ diff --git a/result/templates/room-wise/A-L01.xlsx b/result/templates/room-wise/A-L01.xlsx new file mode 100644 index 0000000..1c84013 Binary files /dev/null and b/result/templates/room-wise/A-L01.xlsx differ diff --git a/result/templates/room-wise/A-L02.xlsx b/result/templates/room-wise/A-L02.xlsx new file mode 100644 index 0000000..f78614b Binary files /dev/null and b/result/templates/room-wise/A-L02.xlsx differ diff --git a/result/templates/room-wise/B-101.xlsx b/result/templates/room-wise/B-101.xlsx new file mode 100644 index 0000000..a1ceb52 Binary files /dev/null and b/result/templates/room-wise/B-101.xlsx differ diff --git a/result/templates/room-wise/B-102.xlsx b/result/templates/room-wise/B-102.xlsx new file mode 100644 index 0000000..d92474f Binary files /dev/null and b/result/templates/room-wise/B-102.xlsx differ diff --git a/result/templates/room-wise/B-L01.xlsx b/result/templates/room-wise/B-L01.xlsx new file mode 100644 index 0000000..aa78c1c Binary files /dev/null and b/result/templates/room-wise/B-L01.xlsx differ diff --git a/result/templates/student-wise/25021519-001.xlsx b/result/templates/student-wise/25021519-001.xlsx new file mode 100644 index 0000000..5139658 Binary files /dev/null and b/result/templates/student-wise/25021519-001.xlsx differ diff --git a/result/templates/student-wise/25021519-002.xlsx b/result/templates/student-wise/25021519-002.xlsx new file mode 100644 index 0000000..40bd2ec Binary files /dev/null and b/result/templates/student-wise/25021519-002.xlsx differ diff --git a/result/templates/student-wise/25021519-003.xlsx b/result/templates/student-wise/25021519-003.xlsx new file mode 100644 index 0000000..191947c Binary files /dev/null and b/result/templates/student-wise/25021519-003.xlsx differ diff --git a/result/templates/student-wise/25021519-004.xlsx b/result/templates/student-wise/25021519-004.xlsx new file mode 100644 index 0000000..caca024 Binary files /dev/null and b/result/templates/student-wise/25021519-004.xlsx differ diff --git a/result/templates/student-wise/25021519-005.xlsx b/result/templates/student-wise/25021519-005.xlsx new file mode 100644 index 0000000..a974649 Binary files /dev/null and b/result/templates/student-wise/25021519-005.xlsx differ diff --git a/result/templates/student-wise/25021519-006.xlsx b/result/templates/student-wise/25021519-006.xlsx new file mode 100644 index 0000000..43a7629 Binary files /dev/null and b/result/templates/student-wise/25021519-006.xlsx differ diff --git a/result/templates/student-wise/25021519-007.xlsx b/result/templates/student-wise/25021519-007.xlsx new file mode 100644 index 0000000..a09a058 Binary files /dev/null and b/result/templates/student-wise/25021519-007.xlsx differ diff --git a/result/templates/student-wise/25021519-008.xlsx b/result/templates/student-wise/25021519-008.xlsx new file mode 100644 index 0000000..216ce65 Binary files /dev/null and b/result/templates/student-wise/25021519-008.xlsx differ diff --git a/result/templates/student-wise/25021519-009.xlsx b/result/templates/student-wise/25021519-009.xlsx new file mode 100644 index 0000000..608f559 Binary files /dev/null and b/result/templates/student-wise/25021519-009.xlsx differ diff --git a/result/templates/student-wise/25021519-010.xlsx b/result/templates/student-wise/25021519-010.xlsx new file mode 100644 index 0000000..9e311b2 Binary files /dev/null and b/result/templates/student-wise/25021519-010.xlsx differ diff --git a/result/templates/student-wise/25021519-011.xlsx b/result/templates/student-wise/25021519-011.xlsx new file mode 100644 index 0000000..6b1b7b6 Binary files /dev/null and b/result/templates/student-wise/25021519-011.xlsx differ diff --git a/result/templates/student-wise/25021519-012.xlsx b/result/templates/student-wise/25021519-012.xlsx new file mode 100644 index 0000000..6b54962 Binary files /dev/null and b/result/templates/student-wise/25021519-012.xlsx differ diff --git a/result/templates/student-wise/25021519-013.xlsx b/result/templates/student-wise/25021519-013.xlsx new file mode 100644 index 0000000..209132e Binary files /dev/null and b/result/templates/student-wise/25021519-013.xlsx differ diff --git a/result/templates/student-wise/25021519-014.xlsx b/result/templates/student-wise/25021519-014.xlsx new file mode 100644 index 0000000..a2fe4e5 Binary files /dev/null and b/result/templates/student-wise/25021519-014.xlsx differ diff --git a/result/templates/student-wise/25021519-015.xlsx b/result/templates/student-wise/25021519-015.xlsx new file mode 100644 index 0000000..6240273 Binary files /dev/null and b/result/templates/student-wise/25021519-015.xlsx differ diff --git a/result/templates/student-wise/25021519-016.xlsx b/result/templates/student-wise/25021519-016.xlsx new file mode 100644 index 0000000..496c671 Binary files /dev/null and b/result/templates/student-wise/25021519-016.xlsx differ diff --git a/result/templates/student-wise/25021519-017.xlsx b/result/templates/student-wise/25021519-017.xlsx new file mode 100644 index 0000000..2616d7b Binary files /dev/null and b/result/templates/student-wise/25021519-017.xlsx differ diff --git a/result/templates/student-wise/25021519-018.xlsx b/result/templates/student-wise/25021519-018.xlsx new file mode 100644 index 0000000..12eda8a Binary files /dev/null and b/result/templates/student-wise/25021519-018.xlsx differ diff --git a/result/templates/student-wise/25021520-001.xlsx b/result/templates/student-wise/25021520-001.xlsx new file mode 100644 index 0000000..01f619d Binary files /dev/null and b/result/templates/student-wise/25021520-001.xlsx differ diff --git a/result/templates/student-wise/25021520-002.xlsx b/result/templates/student-wise/25021520-002.xlsx new file mode 100644 index 0000000..5759a17 Binary files /dev/null and b/result/templates/student-wise/25021520-002.xlsx differ diff --git a/result/templates/student-wise/25021520-003.xlsx b/result/templates/student-wise/25021520-003.xlsx new file mode 100644 index 0000000..80bbe69 Binary files /dev/null and b/result/templates/student-wise/25021520-003.xlsx differ diff --git a/result/templates/student-wise/25021520-004.xlsx b/result/templates/student-wise/25021520-004.xlsx new file mode 100644 index 0000000..0b61f94 Binary files /dev/null and b/result/templates/student-wise/25021520-004.xlsx differ diff --git a/result/templates/student-wise/25021520-005.xlsx b/result/templates/student-wise/25021520-005.xlsx new file mode 100644 index 0000000..0cbe672 Binary files /dev/null and b/result/templates/student-wise/25021520-005.xlsx differ diff --git a/result/templates/student-wise/25021520-006.xlsx b/result/templates/student-wise/25021520-006.xlsx new file mode 100644 index 0000000..b454abc Binary files /dev/null and b/result/templates/student-wise/25021520-006.xlsx differ diff --git a/result/templates/student-wise/25021520-007.xlsx b/result/templates/student-wise/25021520-007.xlsx new file mode 100644 index 0000000..e43ad23 Binary files /dev/null and b/result/templates/student-wise/25021520-007.xlsx differ diff --git a/result/templates/student-wise/25021520-008.xlsx b/result/templates/student-wise/25021520-008.xlsx new file mode 100644 index 0000000..8785730 Binary files /dev/null and b/result/templates/student-wise/25021520-008.xlsx differ diff --git a/result/templates/student-wise/25021520-009.xlsx b/result/templates/student-wise/25021520-009.xlsx new file mode 100644 index 0000000..a6bd57b Binary files /dev/null and b/result/templates/student-wise/25021520-009.xlsx differ diff --git a/result/templates/student-wise/25021520-010.xlsx b/result/templates/student-wise/25021520-010.xlsx new file mode 100644 index 0000000..0d278fc Binary files /dev/null and b/result/templates/student-wise/25021520-010.xlsx differ diff --git a/result/templates/student-wise/25021520-011.xlsx b/result/templates/student-wise/25021520-011.xlsx new file mode 100644 index 0000000..9a50699 Binary files /dev/null and b/result/templates/student-wise/25021520-011.xlsx differ diff --git a/result/templates/student-wise/25021520-012.xlsx b/result/templates/student-wise/25021520-012.xlsx new file mode 100644 index 0000000..94fcb19 Binary files /dev/null and b/result/templates/student-wise/25021520-012.xlsx differ diff --git a/result/templates/student-wise/25021520-013.xlsx b/result/templates/student-wise/25021520-013.xlsx new file mode 100644 index 0000000..0c5427a Binary files /dev/null and b/result/templates/student-wise/25021520-013.xlsx differ diff --git a/result/templates/student-wise/25021520-014.xlsx b/result/templates/student-wise/25021520-014.xlsx new file mode 100644 index 0000000..5e4feb1 Binary files /dev/null and b/result/templates/student-wise/25021520-014.xlsx differ diff --git a/result/templates/student-wise/25021520-015.xlsx b/result/templates/student-wise/25021520-015.xlsx new file mode 100644 index 0000000..69bcf27 Binary files /dev/null and b/result/templates/student-wise/25021520-015.xlsx differ diff --git a/result/templates/student-wise/25021520-016.xlsx b/result/templates/student-wise/25021520-016.xlsx new file mode 100644 index 0000000..b1c7959 Binary files /dev/null and b/result/templates/student-wise/25021520-016.xlsx differ diff --git a/result/templates/student-wise/25021520-017.xlsx b/result/templates/student-wise/25021520-017.xlsx new file mode 100644 index 0000000..06c192b Binary files /dev/null and b/result/templates/student-wise/25021520-017.xlsx differ diff --git a/result/templates/student-wise/25021520-018.xlsx b/result/templates/student-wise/25021520-018.xlsx new file mode 100644 index 0000000..5a791de Binary files /dev/null and b/result/templates/student-wise/25021520-018.xlsx differ diff --git a/result/templates/student-wise/25031519-001.xlsx b/result/templates/student-wise/25031519-001.xlsx new file mode 100644 index 0000000..709cd16 Binary files /dev/null and b/result/templates/student-wise/25031519-001.xlsx differ diff --git a/result/templates/student-wise/25031519-002.xlsx b/result/templates/student-wise/25031519-002.xlsx new file mode 100644 index 0000000..6f034df Binary files /dev/null and b/result/templates/student-wise/25031519-002.xlsx differ diff --git a/result/templates/student-wise/25031519-003.xlsx b/result/templates/student-wise/25031519-003.xlsx new file mode 100644 index 0000000..6d3504a Binary files /dev/null and b/result/templates/student-wise/25031519-003.xlsx differ diff --git a/result/templates/student-wise/25031519-004.xlsx b/result/templates/student-wise/25031519-004.xlsx new file mode 100644 index 0000000..02b5a33 Binary files /dev/null and b/result/templates/student-wise/25031519-004.xlsx differ diff --git a/result/templates/student-wise/25031519-005.xlsx b/result/templates/student-wise/25031519-005.xlsx new file mode 100644 index 0000000..975824b Binary files /dev/null and b/result/templates/student-wise/25031519-005.xlsx differ diff --git a/result/templates/student-wise/25031519-006.xlsx b/result/templates/student-wise/25031519-006.xlsx new file mode 100644 index 0000000..03f79f0 Binary files /dev/null and b/result/templates/student-wise/25031519-006.xlsx differ diff --git a/result/templates/student-wise/25031519-007.xlsx b/result/templates/student-wise/25031519-007.xlsx new file mode 100644 index 0000000..413f793 Binary files /dev/null and b/result/templates/student-wise/25031519-007.xlsx differ diff --git a/result/templates/student-wise/25031519-008.xlsx b/result/templates/student-wise/25031519-008.xlsx new file mode 100644 index 0000000..2240bf0 Binary files /dev/null and b/result/templates/student-wise/25031519-008.xlsx differ diff --git a/result/templates/student-wise/25031519-009.xlsx b/result/templates/student-wise/25031519-009.xlsx new file mode 100644 index 0000000..d61f437 Binary files /dev/null and b/result/templates/student-wise/25031519-009.xlsx differ diff --git a/result/templates/student-wise/25031519-010.xlsx b/result/templates/student-wise/25031519-010.xlsx new file mode 100644 index 0000000..ee6c513 Binary files /dev/null and b/result/templates/student-wise/25031519-010.xlsx differ diff --git a/result/templates/student-wise/25031519-011.xlsx b/result/templates/student-wise/25031519-011.xlsx new file mode 100644 index 0000000..e476cc0 Binary files /dev/null and b/result/templates/student-wise/25031519-011.xlsx differ diff --git a/result/templates/student-wise/25031519-012.xlsx b/result/templates/student-wise/25031519-012.xlsx new file mode 100644 index 0000000..29b1147 Binary files /dev/null and b/result/templates/student-wise/25031519-012.xlsx differ diff --git a/result/templates/student-wise/25031519-013.xlsx b/result/templates/student-wise/25031519-013.xlsx new file mode 100644 index 0000000..3076064 Binary files /dev/null and b/result/templates/student-wise/25031519-013.xlsx differ diff --git a/result/templates/student-wise/25031519-014.xlsx b/result/templates/student-wise/25031519-014.xlsx new file mode 100644 index 0000000..4647114 Binary files /dev/null and b/result/templates/student-wise/25031519-014.xlsx differ diff --git a/result/templates/student-wise/25031519-015.xlsx b/result/templates/student-wise/25031519-015.xlsx new file mode 100644 index 0000000..ebcde97 Binary files /dev/null and b/result/templates/student-wise/25031519-015.xlsx differ diff --git a/result/templates/student-wise/25031519-016.xlsx b/result/templates/student-wise/25031519-016.xlsx new file mode 100644 index 0000000..4c04e0d Binary files /dev/null and b/result/templates/student-wise/25031519-016.xlsx differ diff --git a/result/templates/student-wise/25031519-017.xlsx b/result/templates/student-wise/25031519-017.xlsx new file mode 100644 index 0000000..d61f003 Binary files /dev/null and b/result/templates/student-wise/25031519-017.xlsx differ diff --git a/result/templates/student-wise/25031519-018.xlsx b/result/templates/student-wise/25031519-018.xlsx new file mode 100644 index 0000000..68ee398 Binary files /dev/null and b/result/templates/student-wise/25031519-018.xlsx differ diff --git a/result/templates/student-wise/25031520-001.xlsx b/result/templates/student-wise/25031520-001.xlsx new file mode 100644 index 0000000..47ea409 Binary files /dev/null and b/result/templates/student-wise/25031520-001.xlsx differ diff --git a/result/templates/student-wise/25031520-002.xlsx b/result/templates/student-wise/25031520-002.xlsx new file mode 100644 index 0000000..3b04f20 Binary files /dev/null and b/result/templates/student-wise/25031520-002.xlsx differ diff --git a/result/templates/student-wise/25031520-003.xlsx b/result/templates/student-wise/25031520-003.xlsx new file mode 100644 index 0000000..b9cf1d4 Binary files /dev/null and b/result/templates/student-wise/25031520-003.xlsx differ diff --git a/result/templates/student-wise/25031520-004.xlsx b/result/templates/student-wise/25031520-004.xlsx new file mode 100644 index 0000000..003b8df Binary files /dev/null and b/result/templates/student-wise/25031520-004.xlsx differ diff --git a/result/templates/student-wise/25031520-005.xlsx b/result/templates/student-wise/25031520-005.xlsx new file mode 100644 index 0000000..841c276 Binary files /dev/null and b/result/templates/student-wise/25031520-005.xlsx differ diff --git a/result/templates/student-wise/25031520-006.xlsx b/result/templates/student-wise/25031520-006.xlsx new file mode 100644 index 0000000..79b8817 Binary files /dev/null and b/result/templates/student-wise/25031520-006.xlsx differ diff --git a/result/templates/student-wise/25031520-007.xlsx b/result/templates/student-wise/25031520-007.xlsx new file mode 100644 index 0000000..f6264ae Binary files /dev/null and b/result/templates/student-wise/25031520-007.xlsx differ diff --git a/result/templates/student-wise/25031520-008.xlsx b/result/templates/student-wise/25031520-008.xlsx new file mode 100644 index 0000000..35924f1 Binary files /dev/null and b/result/templates/student-wise/25031520-008.xlsx differ diff --git a/result/templates/student-wise/25031520-009.xlsx b/result/templates/student-wise/25031520-009.xlsx new file mode 100644 index 0000000..47ca042 Binary files /dev/null and b/result/templates/student-wise/25031520-009.xlsx differ diff --git a/result/templates/student-wise/25031520-010.xlsx b/result/templates/student-wise/25031520-010.xlsx new file mode 100644 index 0000000..76ea6e6 Binary files /dev/null and b/result/templates/student-wise/25031520-010.xlsx differ diff --git a/result/templates/student-wise/25031520-011.xlsx b/result/templates/student-wise/25031520-011.xlsx new file mode 100644 index 0000000..3ee5d30 Binary files /dev/null and b/result/templates/student-wise/25031520-011.xlsx differ diff --git a/result/templates/student-wise/25031520-012.xlsx b/result/templates/student-wise/25031520-012.xlsx new file mode 100644 index 0000000..2412e45 Binary files /dev/null and b/result/templates/student-wise/25031520-012.xlsx differ diff --git a/result/templates/student-wise/25031520-013.xlsx b/result/templates/student-wise/25031520-013.xlsx new file mode 100644 index 0000000..97f3f01 Binary files /dev/null and b/result/templates/student-wise/25031520-013.xlsx differ diff --git a/result/templates/student-wise/25031520-014.xlsx b/result/templates/student-wise/25031520-014.xlsx new file mode 100644 index 0000000..d4ef445 Binary files /dev/null and b/result/templates/student-wise/25031520-014.xlsx differ diff --git a/result/templates/student-wise/25031520-015.xlsx b/result/templates/student-wise/25031520-015.xlsx new file mode 100644 index 0000000..ddc8083 Binary files /dev/null and b/result/templates/student-wise/25031520-015.xlsx differ diff --git a/result/templates/student-wise/25031520-016.xlsx b/result/templates/student-wise/25031520-016.xlsx new file mode 100644 index 0000000..4eafcb8 Binary files /dev/null and b/result/templates/student-wise/25031520-016.xlsx differ diff --git a/result/templates/student-wise/25031520-017.xlsx b/result/templates/student-wise/25031520-017.xlsx new file mode 100644 index 0000000..361aa16 Binary files /dev/null and b/result/templates/student-wise/25031520-017.xlsx differ diff --git a/result/templates/student-wise/25031520-018.xlsx b/result/templates/student-wise/25031520-018.xlsx new file mode 100644 index 0000000..c953c9d Binary files /dev/null and b/result/templates/student-wise/25031520-018.xlsx differ diff --git a/result/templates/student-wise/25041519-001.xlsx b/result/templates/student-wise/25041519-001.xlsx new file mode 100644 index 0000000..3f8b23a Binary files /dev/null and b/result/templates/student-wise/25041519-001.xlsx differ diff --git a/result/templates/student-wise/25041519-002.xlsx b/result/templates/student-wise/25041519-002.xlsx new file mode 100644 index 0000000..6e6e903 Binary files /dev/null and b/result/templates/student-wise/25041519-002.xlsx differ diff --git a/result/templates/student-wise/25041519-003.xlsx b/result/templates/student-wise/25041519-003.xlsx new file mode 100644 index 0000000..10302f6 Binary files /dev/null and b/result/templates/student-wise/25041519-003.xlsx differ diff --git a/result/templates/student-wise/25041519-004.xlsx b/result/templates/student-wise/25041519-004.xlsx new file mode 100644 index 0000000..188db56 Binary files /dev/null and b/result/templates/student-wise/25041519-004.xlsx differ diff --git a/result/templates/student-wise/25041519-005.xlsx b/result/templates/student-wise/25041519-005.xlsx new file mode 100644 index 0000000..4e6b64b Binary files /dev/null and b/result/templates/student-wise/25041519-005.xlsx differ diff --git a/result/templates/student-wise/25041519-006.xlsx b/result/templates/student-wise/25041519-006.xlsx new file mode 100644 index 0000000..12dd4cc Binary files /dev/null and b/result/templates/student-wise/25041519-006.xlsx differ diff --git a/result/templates/student-wise/25041519-007.xlsx b/result/templates/student-wise/25041519-007.xlsx new file mode 100644 index 0000000..d44c9cc Binary files /dev/null and b/result/templates/student-wise/25041519-007.xlsx differ diff --git a/result/templates/student-wise/25041519-008.xlsx b/result/templates/student-wise/25041519-008.xlsx new file mode 100644 index 0000000..c57d38a Binary files /dev/null and b/result/templates/student-wise/25041519-008.xlsx differ diff --git a/result/templates/student-wise/25041519-009.xlsx b/result/templates/student-wise/25041519-009.xlsx new file mode 100644 index 0000000..5663362 Binary files /dev/null and b/result/templates/student-wise/25041519-009.xlsx differ diff --git a/result/templates/student-wise/25041519-010.xlsx b/result/templates/student-wise/25041519-010.xlsx new file mode 100644 index 0000000..11f6f0f Binary files /dev/null and b/result/templates/student-wise/25041519-010.xlsx differ diff --git a/result/templates/student-wise/25041519-011.xlsx b/result/templates/student-wise/25041519-011.xlsx new file mode 100644 index 0000000..91ec11e Binary files /dev/null and b/result/templates/student-wise/25041519-011.xlsx differ diff --git a/result/templates/student-wise/25041519-012.xlsx b/result/templates/student-wise/25041519-012.xlsx new file mode 100644 index 0000000..60fffd4 Binary files /dev/null and b/result/templates/student-wise/25041519-012.xlsx differ diff --git a/result/templates/student-wise/25041519-013.xlsx b/result/templates/student-wise/25041519-013.xlsx new file mode 100644 index 0000000..48cf742 Binary files /dev/null and b/result/templates/student-wise/25041519-013.xlsx differ diff --git a/result/templates/student-wise/25041519-014.xlsx b/result/templates/student-wise/25041519-014.xlsx new file mode 100644 index 0000000..dfcc2d2 Binary files /dev/null and b/result/templates/student-wise/25041519-014.xlsx differ diff --git a/result/templates/student-wise/25041519-015.xlsx b/result/templates/student-wise/25041519-015.xlsx new file mode 100644 index 0000000..164a46d Binary files /dev/null and b/result/templates/student-wise/25041519-015.xlsx differ diff --git a/result/templates/student-wise/25041519-016.xlsx b/result/templates/student-wise/25041519-016.xlsx new file mode 100644 index 0000000..7f6f866 Binary files /dev/null and b/result/templates/student-wise/25041519-016.xlsx differ diff --git a/result/templates/student-wise/25041519-017.xlsx b/result/templates/student-wise/25041519-017.xlsx new file mode 100644 index 0000000..6b9ae7e Binary files /dev/null and b/result/templates/student-wise/25041519-017.xlsx differ diff --git a/result/templates/student-wise/25041519-018.xlsx b/result/templates/student-wise/25041519-018.xlsx new file mode 100644 index 0000000..1ab4aa6 Binary files /dev/null and b/result/templates/student-wise/25041519-018.xlsx differ diff --git a/result/templates/student-wise/25041520-001.xlsx b/result/templates/student-wise/25041520-001.xlsx new file mode 100644 index 0000000..0d1e915 Binary files /dev/null and b/result/templates/student-wise/25041520-001.xlsx differ diff --git a/result/templates/student-wise/25041520-002.xlsx b/result/templates/student-wise/25041520-002.xlsx new file mode 100644 index 0000000..eb75566 Binary files /dev/null and b/result/templates/student-wise/25041520-002.xlsx differ diff --git a/result/templates/student-wise/25041520-003.xlsx b/result/templates/student-wise/25041520-003.xlsx new file mode 100644 index 0000000..6c81d17 Binary files /dev/null and b/result/templates/student-wise/25041520-003.xlsx differ diff --git a/result/templates/student-wise/25041520-004.xlsx b/result/templates/student-wise/25041520-004.xlsx new file mode 100644 index 0000000..c47f307 Binary files /dev/null and b/result/templates/student-wise/25041520-004.xlsx differ diff --git a/result/templates/student-wise/25041520-005.xlsx b/result/templates/student-wise/25041520-005.xlsx new file mode 100644 index 0000000..53b9c41 Binary files /dev/null and b/result/templates/student-wise/25041520-005.xlsx differ diff --git a/result/templates/student-wise/25041520-006.xlsx b/result/templates/student-wise/25041520-006.xlsx new file mode 100644 index 0000000..ef04e03 Binary files /dev/null and b/result/templates/student-wise/25041520-006.xlsx differ diff --git a/result/templates/student-wise/25041520-007.xlsx b/result/templates/student-wise/25041520-007.xlsx new file mode 100644 index 0000000..e59d01e Binary files /dev/null and b/result/templates/student-wise/25041520-007.xlsx differ diff --git a/result/templates/student-wise/25041520-008.xlsx b/result/templates/student-wise/25041520-008.xlsx new file mode 100644 index 0000000..e6227cf Binary files /dev/null and b/result/templates/student-wise/25041520-008.xlsx differ diff --git a/result/templates/student-wise/25041520-009.xlsx b/result/templates/student-wise/25041520-009.xlsx new file mode 100644 index 0000000..d8cb78b Binary files /dev/null and b/result/templates/student-wise/25041520-009.xlsx differ diff --git a/result/templates/student-wise/25041520-010.xlsx b/result/templates/student-wise/25041520-010.xlsx new file mode 100644 index 0000000..b819473 Binary files /dev/null and b/result/templates/student-wise/25041520-010.xlsx differ diff --git a/result/templates/student-wise/25041520-011.xlsx b/result/templates/student-wise/25041520-011.xlsx new file mode 100644 index 0000000..7fcc11a Binary files /dev/null and b/result/templates/student-wise/25041520-011.xlsx differ diff --git a/result/templates/student-wise/25041520-012.xlsx b/result/templates/student-wise/25041520-012.xlsx new file mode 100644 index 0000000..3fc45b1 Binary files /dev/null and b/result/templates/student-wise/25041520-012.xlsx differ diff --git a/result/templates/student-wise/25041520-013.xlsx b/result/templates/student-wise/25041520-013.xlsx new file mode 100644 index 0000000..5facf39 Binary files /dev/null and b/result/templates/student-wise/25041520-013.xlsx differ diff --git a/result/templates/student-wise/25041520-014.xlsx b/result/templates/student-wise/25041520-014.xlsx new file mode 100644 index 0000000..145c438 Binary files /dev/null and b/result/templates/student-wise/25041520-014.xlsx differ diff --git a/result/templates/student-wise/25041520-015.xlsx b/result/templates/student-wise/25041520-015.xlsx new file mode 100644 index 0000000..471b3be Binary files /dev/null and b/result/templates/student-wise/25041520-015.xlsx differ diff --git a/result/templates/student-wise/25041520-016.xlsx b/result/templates/student-wise/25041520-016.xlsx new file mode 100644 index 0000000..0ccfe8c Binary files /dev/null and b/result/templates/student-wise/25041520-016.xlsx differ diff --git a/result/templates/student-wise/25041520-017.xlsx b/result/templates/student-wise/25041520-017.xlsx new file mode 100644 index 0000000..e4e347d Binary files /dev/null and b/result/templates/student-wise/25041520-017.xlsx differ diff --git a/result/templates/student-wise/25041520-018.xlsx b/result/templates/student-wise/25041520-018.xlsx new file mode 100644 index 0000000..5df1ef3 Binary files /dev/null and b/result/templates/student-wise/25041520-018.xlsx differ diff --git a/result/templates/student-wise/26021519-001.xlsx b/result/templates/student-wise/26021519-001.xlsx new file mode 100644 index 0000000..15bdcf1 Binary files /dev/null and b/result/templates/student-wise/26021519-001.xlsx differ diff --git a/result/templates/student-wise/26021519-002.xlsx b/result/templates/student-wise/26021519-002.xlsx new file mode 100644 index 0000000..95c028f Binary files /dev/null and b/result/templates/student-wise/26021519-002.xlsx differ diff --git a/result/templates/student-wise/26021519-003.xlsx b/result/templates/student-wise/26021519-003.xlsx new file mode 100644 index 0000000..03fb133 Binary files /dev/null and b/result/templates/student-wise/26021519-003.xlsx differ diff --git a/result/templates/student-wise/26021519-004.xlsx b/result/templates/student-wise/26021519-004.xlsx new file mode 100644 index 0000000..3ab985f Binary files /dev/null and b/result/templates/student-wise/26021519-004.xlsx differ diff --git a/result/templates/student-wise/26021519-005.xlsx b/result/templates/student-wise/26021519-005.xlsx new file mode 100644 index 0000000..1ba1b9e Binary files /dev/null and b/result/templates/student-wise/26021519-005.xlsx differ diff --git a/result/templates/student-wise/26021519-006.xlsx b/result/templates/student-wise/26021519-006.xlsx new file mode 100644 index 0000000..38fb7f2 Binary files /dev/null and b/result/templates/student-wise/26021519-006.xlsx differ diff --git a/result/templates/student-wise/26021519-007.xlsx b/result/templates/student-wise/26021519-007.xlsx new file mode 100644 index 0000000..86a9863 Binary files /dev/null and b/result/templates/student-wise/26021519-007.xlsx differ diff --git a/result/templates/student-wise/26021519-008.xlsx b/result/templates/student-wise/26021519-008.xlsx new file mode 100644 index 0000000..d96a442 Binary files /dev/null and b/result/templates/student-wise/26021519-008.xlsx differ diff --git a/result/templates/student-wise/26021519-009.xlsx b/result/templates/student-wise/26021519-009.xlsx new file mode 100644 index 0000000..18af3b7 Binary files /dev/null and b/result/templates/student-wise/26021519-009.xlsx differ diff --git a/result/templates/student-wise/26021519-010.xlsx b/result/templates/student-wise/26021519-010.xlsx new file mode 100644 index 0000000..37ee231 Binary files /dev/null and b/result/templates/student-wise/26021519-010.xlsx differ diff --git a/result/templates/student-wise/26021519-011.xlsx b/result/templates/student-wise/26021519-011.xlsx new file mode 100644 index 0000000..3258aee Binary files /dev/null and b/result/templates/student-wise/26021519-011.xlsx differ diff --git a/result/templates/student-wise/26021519-012.xlsx b/result/templates/student-wise/26021519-012.xlsx new file mode 100644 index 0000000..e78289e Binary files /dev/null and b/result/templates/student-wise/26021519-012.xlsx differ diff --git a/result/templates/student-wise/26021519-013.xlsx b/result/templates/student-wise/26021519-013.xlsx new file mode 100644 index 0000000..b903dae Binary files /dev/null and b/result/templates/student-wise/26021519-013.xlsx differ diff --git a/result/templates/student-wise/26021519-014.xlsx b/result/templates/student-wise/26021519-014.xlsx new file mode 100644 index 0000000..f40ed47 Binary files /dev/null and b/result/templates/student-wise/26021519-014.xlsx differ diff --git a/result/templates/student-wise/26021519-015.xlsx b/result/templates/student-wise/26021519-015.xlsx new file mode 100644 index 0000000..07bea1d Binary files /dev/null and b/result/templates/student-wise/26021519-015.xlsx differ diff --git a/result/templates/student-wise/26021519-016.xlsx b/result/templates/student-wise/26021519-016.xlsx new file mode 100644 index 0000000..45961a7 Binary files /dev/null and b/result/templates/student-wise/26021519-016.xlsx differ diff --git a/result/templates/student-wise/26021519-017.xlsx b/result/templates/student-wise/26021519-017.xlsx new file mode 100644 index 0000000..7b18cd1 Binary files /dev/null and b/result/templates/student-wise/26021519-017.xlsx differ diff --git a/result/templates/student-wise/26021519-018.xlsx b/result/templates/student-wise/26021519-018.xlsx new file mode 100644 index 0000000..be0ec2f Binary files /dev/null and b/result/templates/student-wise/26021519-018.xlsx differ diff --git a/result/templates/student-wise/26021520-001.xlsx b/result/templates/student-wise/26021520-001.xlsx new file mode 100644 index 0000000..f45419f Binary files /dev/null and b/result/templates/student-wise/26021520-001.xlsx differ diff --git a/result/templates/student-wise/26021520-002.xlsx b/result/templates/student-wise/26021520-002.xlsx new file mode 100644 index 0000000..c74f14e Binary files /dev/null and b/result/templates/student-wise/26021520-002.xlsx differ diff --git a/result/templates/student-wise/26021520-003.xlsx b/result/templates/student-wise/26021520-003.xlsx new file mode 100644 index 0000000..cb354a6 Binary files /dev/null and b/result/templates/student-wise/26021520-003.xlsx differ diff --git a/result/templates/student-wise/26021520-004.xlsx b/result/templates/student-wise/26021520-004.xlsx new file mode 100644 index 0000000..8d48b27 Binary files /dev/null and b/result/templates/student-wise/26021520-004.xlsx differ diff --git a/result/templates/student-wise/26021520-005.xlsx b/result/templates/student-wise/26021520-005.xlsx new file mode 100644 index 0000000..61d40c3 Binary files /dev/null and b/result/templates/student-wise/26021520-005.xlsx differ diff --git a/result/templates/student-wise/26021520-006.xlsx b/result/templates/student-wise/26021520-006.xlsx new file mode 100644 index 0000000..c3319d1 Binary files /dev/null and b/result/templates/student-wise/26021520-006.xlsx differ diff --git a/result/templates/student-wise/26021520-007.xlsx b/result/templates/student-wise/26021520-007.xlsx new file mode 100644 index 0000000..125710e Binary files /dev/null and b/result/templates/student-wise/26021520-007.xlsx differ diff --git a/result/templates/student-wise/26021520-008.xlsx b/result/templates/student-wise/26021520-008.xlsx new file mode 100644 index 0000000..af38168 Binary files /dev/null and b/result/templates/student-wise/26021520-008.xlsx differ diff --git a/result/templates/student-wise/26021520-009.xlsx b/result/templates/student-wise/26021520-009.xlsx new file mode 100644 index 0000000..72f6ae8 Binary files /dev/null and b/result/templates/student-wise/26021520-009.xlsx differ diff --git a/result/templates/student-wise/26021520-010.xlsx b/result/templates/student-wise/26021520-010.xlsx new file mode 100644 index 0000000..0307f45 Binary files /dev/null and b/result/templates/student-wise/26021520-010.xlsx differ diff --git a/result/templates/student-wise/26021520-011.xlsx b/result/templates/student-wise/26021520-011.xlsx new file mode 100644 index 0000000..b795237 Binary files /dev/null and b/result/templates/student-wise/26021520-011.xlsx differ diff --git a/result/templates/student-wise/26021520-012.xlsx b/result/templates/student-wise/26021520-012.xlsx new file mode 100644 index 0000000..529f04d Binary files /dev/null and b/result/templates/student-wise/26021520-012.xlsx differ diff --git a/result/templates/student-wise/26021520-013.xlsx b/result/templates/student-wise/26021520-013.xlsx new file mode 100644 index 0000000..d803546 Binary files /dev/null and b/result/templates/student-wise/26021520-013.xlsx differ diff --git a/result/templates/student-wise/26021520-014.xlsx b/result/templates/student-wise/26021520-014.xlsx new file mode 100644 index 0000000..2482e96 Binary files /dev/null and b/result/templates/student-wise/26021520-014.xlsx differ diff --git a/result/templates/student-wise/26021520-015.xlsx b/result/templates/student-wise/26021520-015.xlsx new file mode 100644 index 0000000..031c9ea Binary files /dev/null and b/result/templates/student-wise/26021520-015.xlsx differ diff --git a/result/templates/student-wise/26021520-016.xlsx b/result/templates/student-wise/26021520-016.xlsx new file mode 100644 index 0000000..c9b2d14 Binary files /dev/null and b/result/templates/student-wise/26021520-016.xlsx differ diff --git a/result/templates/student-wise/26021520-017.xlsx b/result/templates/student-wise/26021520-017.xlsx new file mode 100644 index 0000000..0b65668 Binary files /dev/null and b/result/templates/student-wise/26021520-017.xlsx differ diff --git a/result/templates/student-wise/26021520-018.xlsx b/result/templates/student-wise/26021520-018.xlsx new file mode 100644 index 0000000..7240a19 Binary files /dev/null and b/result/templates/student-wise/26021520-018.xlsx differ diff --git a/result/templates/student-wise/26031519-001.xlsx b/result/templates/student-wise/26031519-001.xlsx new file mode 100644 index 0000000..44460fb Binary files /dev/null and b/result/templates/student-wise/26031519-001.xlsx differ diff --git a/result/templates/student-wise/26031519-002.xlsx b/result/templates/student-wise/26031519-002.xlsx new file mode 100644 index 0000000..4fdbc93 Binary files /dev/null and b/result/templates/student-wise/26031519-002.xlsx differ diff --git a/result/templates/student-wise/26031519-003.xlsx b/result/templates/student-wise/26031519-003.xlsx new file mode 100644 index 0000000..d0f595e Binary files /dev/null and b/result/templates/student-wise/26031519-003.xlsx differ diff --git a/result/templates/student-wise/26031519-004.xlsx b/result/templates/student-wise/26031519-004.xlsx new file mode 100644 index 0000000..e8c2c53 Binary files /dev/null and b/result/templates/student-wise/26031519-004.xlsx differ diff --git a/result/templates/student-wise/26031519-005.xlsx b/result/templates/student-wise/26031519-005.xlsx new file mode 100644 index 0000000..7b53f1f Binary files /dev/null and b/result/templates/student-wise/26031519-005.xlsx differ diff --git a/result/templates/student-wise/26031519-006.xlsx b/result/templates/student-wise/26031519-006.xlsx new file mode 100644 index 0000000..519c55e Binary files /dev/null and b/result/templates/student-wise/26031519-006.xlsx differ diff --git a/result/templates/student-wise/26031519-007.xlsx b/result/templates/student-wise/26031519-007.xlsx new file mode 100644 index 0000000..bbc3aec Binary files /dev/null and b/result/templates/student-wise/26031519-007.xlsx differ diff --git a/result/templates/student-wise/26031519-008.xlsx b/result/templates/student-wise/26031519-008.xlsx new file mode 100644 index 0000000..4b1a286 Binary files /dev/null and b/result/templates/student-wise/26031519-008.xlsx differ diff --git a/result/templates/student-wise/26031519-009.xlsx b/result/templates/student-wise/26031519-009.xlsx new file mode 100644 index 0000000..d817662 Binary files /dev/null and b/result/templates/student-wise/26031519-009.xlsx differ diff --git a/result/templates/student-wise/26031519-010.xlsx b/result/templates/student-wise/26031519-010.xlsx new file mode 100644 index 0000000..b7f3eac Binary files /dev/null and b/result/templates/student-wise/26031519-010.xlsx differ diff --git a/result/templates/student-wise/26031519-011.xlsx b/result/templates/student-wise/26031519-011.xlsx new file mode 100644 index 0000000..586072b Binary files /dev/null and b/result/templates/student-wise/26031519-011.xlsx differ diff --git a/result/templates/student-wise/26031519-012.xlsx b/result/templates/student-wise/26031519-012.xlsx new file mode 100644 index 0000000..3fc328f Binary files /dev/null and b/result/templates/student-wise/26031519-012.xlsx differ diff --git a/result/templates/student-wise/26031519-013.xlsx b/result/templates/student-wise/26031519-013.xlsx new file mode 100644 index 0000000..cfd694f Binary files /dev/null and b/result/templates/student-wise/26031519-013.xlsx differ diff --git a/result/templates/student-wise/26031519-014.xlsx b/result/templates/student-wise/26031519-014.xlsx new file mode 100644 index 0000000..641c4d1 Binary files /dev/null and b/result/templates/student-wise/26031519-014.xlsx differ diff --git a/result/templates/student-wise/26031519-015.xlsx b/result/templates/student-wise/26031519-015.xlsx new file mode 100644 index 0000000..7806654 Binary files /dev/null and b/result/templates/student-wise/26031519-015.xlsx differ diff --git a/result/templates/student-wise/26031519-016.xlsx b/result/templates/student-wise/26031519-016.xlsx new file mode 100644 index 0000000..4fec3d2 Binary files /dev/null and b/result/templates/student-wise/26031519-016.xlsx differ diff --git a/result/templates/student-wise/26031519-017.xlsx b/result/templates/student-wise/26031519-017.xlsx new file mode 100644 index 0000000..7763a88 Binary files /dev/null and b/result/templates/student-wise/26031519-017.xlsx differ diff --git a/result/templates/student-wise/26031519-018.xlsx b/result/templates/student-wise/26031519-018.xlsx new file mode 100644 index 0000000..a3d9b32 Binary files /dev/null and b/result/templates/student-wise/26031519-018.xlsx differ diff --git a/result/templates/student-wise/26031520-001.xlsx b/result/templates/student-wise/26031520-001.xlsx new file mode 100644 index 0000000..42577ed Binary files /dev/null and b/result/templates/student-wise/26031520-001.xlsx differ diff --git a/result/templates/student-wise/26031520-002.xlsx b/result/templates/student-wise/26031520-002.xlsx new file mode 100644 index 0000000..af799c3 Binary files /dev/null and b/result/templates/student-wise/26031520-002.xlsx differ diff --git a/result/templates/student-wise/26031520-003.xlsx b/result/templates/student-wise/26031520-003.xlsx new file mode 100644 index 0000000..9467805 Binary files /dev/null and b/result/templates/student-wise/26031520-003.xlsx differ diff --git a/result/templates/student-wise/26031520-004.xlsx b/result/templates/student-wise/26031520-004.xlsx new file mode 100644 index 0000000..0426afa Binary files /dev/null and b/result/templates/student-wise/26031520-004.xlsx differ diff --git a/result/templates/student-wise/26031520-005.xlsx b/result/templates/student-wise/26031520-005.xlsx new file mode 100644 index 0000000..82dc4cc Binary files /dev/null and b/result/templates/student-wise/26031520-005.xlsx differ diff --git a/result/templates/student-wise/26031520-006.xlsx b/result/templates/student-wise/26031520-006.xlsx new file mode 100644 index 0000000..91049b1 Binary files /dev/null and b/result/templates/student-wise/26031520-006.xlsx differ diff --git a/result/templates/student-wise/26031520-007.xlsx b/result/templates/student-wise/26031520-007.xlsx new file mode 100644 index 0000000..846d3c6 Binary files /dev/null and b/result/templates/student-wise/26031520-007.xlsx differ diff --git a/result/templates/student-wise/26031520-008.xlsx b/result/templates/student-wise/26031520-008.xlsx new file mode 100644 index 0000000..a0657be Binary files /dev/null and b/result/templates/student-wise/26031520-008.xlsx differ diff --git a/result/templates/student-wise/26031520-009.xlsx b/result/templates/student-wise/26031520-009.xlsx new file mode 100644 index 0000000..3bb83f7 Binary files /dev/null and b/result/templates/student-wise/26031520-009.xlsx differ diff --git a/result/templates/student-wise/26031520-010.xlsx b/result/templates/student-wise/26031520-010.xlsx new file mode 100644 index 0000000..59eea05 Binary files /dev/null and b/result/templates/student-wise/26031520-010.xlsx differ diff --git a/result/templates/student-wise/26031520-011.xlsx b/result/templates/student-wise/26031520-011.xlsx new file mode 100644 index 0000000..36c7f66 Binary files /dev/null and b/result/templates/student-wise/26031520-011.xlsx differ diff --git a/result/templates/student-wise/26031520-012.xlsx b/result/templates/student-wise/26031520-012.xlsx new file mode 100644 index 0000000..fc432d3 Binary files /dev/null and b/result/templates/student-wise/26031520-012.xlsx differ diff --git a/result/templates/student-wise/26031520-013.xlsx b/result/templates/student-wise/26031520-013.xlsx new file mode 100644 index 0000000..33ccbf9 Binary files /dev/null and b/result/templates/student-wise/26031520-013.xlsx differ diff --git a/result/templates/student-wise/26031520-014.xlsx b/result/templates/student-wise/26031520-014.xlsx new file mode 100644 index 0000000..310d9ca Binary files /dev/null and b/result/templates/student-wise/26031520-014.xlsx differ diff --git a/result/templates/student-wise/26031520-015.xlsx b/result/templates/student-wise/26031520-015.xlsx new file mode 100644 index 0000000..9f71bd9 Binary files /dev/null and b/result/templates/student-wise/26031520-015.xlsx differ diff --git a/result/templates/student-wise/26031520-016.xlsx b/result/templates/student-wise/26031520-016.xlsx new file mode 100644 index 0000000..4884765 Binary files /dev/null and b/result/templates/student-wise/26031520-016.xlsx differ diff --git a/result/templates/student-wise/26031520-017.xlsx b/result/templates/student-wise/26031520-017.xlsx new file mode 100644 index 0000000..aca12b8 Binary files /dev/null and b/result/templates/student-wise/26031520-017.xlsx differ diff --git a/result/templates/student-wise/26031520-018.xlsx b/result/templates/student-wise/26031520-018.xlsx new file mode 100644 index 0000000..c31f260 Binary files /dev/null and b/result/templates/student-wise/26031520-018.xlsx differ diff --git a/result/templates/student-wise/26041519-001.xlsx b/result/templates/student-wise/26041519-001.xlsx new file mode 100644 index 0000000..5952af8 Binary files /dev/null and b/result/templates/student-wise/26041519-001.xlsx differ diff --git a/result/templates/student-wise/26041519-002.xlsx b/result/templates/student-wise/26041519-002.xlsx new file mode 100644 index 0000000..8ca3a67 Binary files /dev/null and b/result/templates/student-wise/26041519-002.xlsx differ diff --git a/result/templates/student-wise/26041519-003.xlsx b/result/templates/student-wise/26041519-003.xlsx new file mode 100644 index 0000000..91cca5d Binary files /dev/null and b/result/templates/student-wise/26041519-003.xlsx differ diff --git a/result/templates/student-wise/26041519-004.xlsx b/result/templates/student-wise/26041519-004.xlsx new file mode 100644 index 0000000..8f95515 Binary files /dev/null and b/result/templates/student-wise/26041519-004.xlsx differ diff --git a/result/templates/student-wise/26041519-005.xlsx b/result/templates/student-wise/26041519-005.xlsx new file mode 100644 index 0000000..7b5c926 Binary files /dev/null and b/result/templates/student-wise/26041519-005.xlsx differ diff --git a/result/templates/student-wise/26041519-006.xlsx b/result/templates/student-wise/26041519-006.xlsx new file mode 100644 index 0000000..1c0771b Binary files /dev/null and b/result/templates/student-wise/26041519-006.xlsx differ diff --git a/result/templates/student-wise/26041519-007.xlsx b/result/templates/student-wise/26041519-007.xlsx new file mode 100644 index 0000000..2a281f5 Binary files /dev/null and b/result/templates/student-wise/26041519-007.xlsx differ diff --git a/result/templates/student-wise/26041519-008.xlsx b/result/templates/student-wise/26041519-008.xlsx new file mode 100644 index 0000000..09ee269 Binary files /dev/null and b/result/templates/student-wise/26041519-008.xlsx differ diff --git a/result/templates/student-wise/26041519-009.xlsx b/result/templates/student-wise/26041519-009.xlsx new file mode 100644 index 0000000..c86d136 Binary files /dev/null and b/result/templates/student-wise/26041519-009.xlsx differ diff --git a/result/templates/student-wise/26041519-010.xlsx b/result/templates/student-wise/26041519-010.xlsx new file mode 100644 index 0000000..92191cd Binary files /dev/null and b/result/templates/student-wise/26041519-010.xlsx differ diff --git a/result/templates/student-wise/26041519-011.xlsx b/result/templates/student-wise/26041519-011.xlsx new file mode 100644 index 0000000..d620505 Binary files /dev/null and b/result/templates/student-wise/26041519-011.xlsx differ diff --git a/result/templates/student-wise/26041519-012.xlsx b/result/templates/student-wise/26041519-012.xlsx new file mode 100644 index 0000000..7a808c1 Binary files /dev/null and b/result/templates/student-wise/26041519-012.xlsx differ diff --git a/result/templates/student-wise/26041519-013.xlsx b/result/templates/student-wise/26041519-013.xlsx new file mode 100644 index 0000000..9451bd7 Binary files /dev/null and b/result/templates/student-wise/26041519-013.xlsx differ diff --git a/result/templates/student-wise/26041519-014.xlsx b/result/templates/student-wise/26041519-014.xlsx new file mode 100644 index 0000000..bdc40c3 Binary files /dev/null and b/result/templates/student-wise/26041519-014.xlsx differ diff --git a/result/templates/student-wise/26041519-015.xlsx b/result/templates/student-wise/26041519-015.xlsx new file mode 100644 index 0000000..f5f5377 Binary files /dev/null and b/result/templates/student-wise/26041519-015.xlsx differ diff --git a/result/templates/student-wise/26041519-016.xlsx b/result/templates/student-wise/26041519-016.xlsx new file mode 100644 index 0000000..41d2f15 Binary files /dev/null and b/result/templates/student-wise/26041519-016.xlsx differ diff --git a/result/templates/student-wise/26041519-017.xlsx b/result/templates/student-wise/26041519-017.xlsx new file mode 100644 index 0000000..3108130 Binary files /dev/null and b/result/templates/student-wise/26041519-017.xlsx differ diff --git a/result/templates/student-wise/26041519-018.xlsx b/result/templates/student-wise/26041519-018.xlsx new file mode 100644 index 0000000..a3a17ad Binary files /dev/null and b/result/templates/student-wise/26041519-018.xlsx differ diff --git a/result/templates/student-wise/26041520-001.xlsx b/result/templates/student-wise/26041520-001.xlsx new file mode 100644 index 0000000..8e7b03d Binary files /dev/null and b/result/templates/student-wise/26041520-001.xlsx differ diff --git a/result/templates/student-wise/26041520-002.xlsx b/result/templates/student-wise/26041520-002.xlsx new file mode 100644 index 0000000..71f480a Binary files /dev/null and b/result/templates/student-wise/26041520-002.xlsx differ diff --git a/result/templates/student-wise/26041520-003.xlsx b/result/templates/student-wise/26041520-003.xlsx new file mode 100644 index 0000000..ffcfae7 Binary files /dev/null and b/result/templates/student-wise/26041520-003.xlsx differ diff --git a/result/templates/student-wise/26041520-004.xlsx b/result/templates/student-wise/26041520-004.xlsx new file mode 100644 index 0000000..ee449c8 Binary files /dev/null and b/result/templates/student-wise/26041520-004.xlsx differ diff --git a/result/templates/student-wise/26041520-005.xlsx b/result/templates/student-wise/26041520-005.xlsx new file mode 100644 index 0000000..4eaa6df Binary files /dev/null and b/result/templates/student-wise/26041520-005.xlsx differ diff --git a/result/templates/student-wise/26041520-006.xlsx b/result/templates/student-wise/26041520-006.xlsx new file mode 100644 index 0000000..7c96a71 Binary files /dev/null and b/result/templates/student-wise/26041520-006.xlsx differ diff --git a/result/templates/student-wise/26041520-007.xlsx b/result/templates/student-wise/26041520-007.xlsx new file mode 100644 index 0000000..1c103b9 Binary files /dev/null and b/result/templates/student-wise/26041520-007.xlsx differ diff --git a/result/templates/student-wise/26041520-008.xlsx b/result/templates/student-wise/26041520-008.xlsx new file mode 100644 index 0000000..9880f00 Binary files /dev/null and b/result/templates/student-wise/26041520-008.xlsx differ diff --git a/result/templates/student-wise/26041520-009.xlsx b/result/templates/student-wise/26041520-009.xlsx new file mode 100644 index 0000000..30bee96 Binary files /dev/null and b/result/templates/student-wise/26041520-009.xlsx differ diff --git a/result/templates/student-wise/26041520-010.xlsx b/result/templates/student-wise/26041520-010.xlsx new file mode 100644 index 0000000..d68397b Binary files /dev/null and b/result/templates/student-wise/26041520-010.xlsx differ diff --git a/result/templates/student-wise/26041520-011.xlsx b/result/templates/student-wise/26041520-011.xlsx new file mode 100644 index 0000000..942880b Binary files /dev/null and b/result/templates/student-wise/26041520-011.xlsx differ diff --git a/result/templates/student-wise/26041520-012.xlsx b/result/templates/student-wise/26041520-012.xlsx new file mode 100644 index 0000000..f405248 Binary files /dev/null and b/result/templates/student-wise/26041520-012.xlsx differ diff --git a/result/templates/student-wise/26041520-013.xlsx b/result/templates/student-wise/26041520-013.xlsx new file mode 100644 index 0000000..e3cb434 Binary files /dev/null and b/result/templates/student-wise/26041520-013.xlsx differ diff --git a/result/templates/student-wise/26041520-014.xlsx b/result/templates/student-wise/26041520-014.xlsx new file mode 100644 index 0000000..34f9097 Binary files /dev/null and b/result/templates/student-wise/26041520-014.xlsx differ diff --git a/result/templates/student-wise/26041520-015.xlsx b/result/templates/student-wise/26041520-015.xlsx new file mode 100644 index 0000000..96ad941 Binary files /dev/null and b/result/templates/student-wise/26041520-015.xlsx differ diff --git a/result/templates/student-wise/26041520-016.xlsx b/result/templates/student-wise/26041520-016.xlsx new file mode 100644 index 0000000..53b0fd3 Binary files /dev/null and b/result/templates/student-wise/26041520-016.xlsx differ diff --git a/result/templates/student-wise/26041520-017.xlsx b/result/templates/student-wise/26041520-017.xlsx new file mode 100644 index 0000000..8f73334 Binary files /dev/null and b/result/templates/student-wise/26041520-017.xlsx differ diff --git a/result/templates/student-wise/26041520-018.xlsx b/result/templates/student-wise/26041520-018.xlsx new file mode 100644 index 0000000..d5130e3 Binary files /dev/null and b/result/templates/student-wise/26041520-018.xlsx differ diff --git a/result/templates/teacher-wise/1001.xlsx b/result/templates/teacher-wise/1001.xlsx new file mode 100644 index 0000000..5935cb6 Binary files /dev/null and b/result/templates/teacher-wise/1001.xlsx differ diff --git a/result/templates/teacher-wise/1002.xlsx b/result/templates/teacher-wise/1002.xlsx new file mode 100644 index 0000000..b98fefe Binary files /dev/null and b/result/templates/teacher-wise/1002.xlsx differ diff --git a/result/templates/teacher-wise/1003.xlsx b/result/templates/teacher-wise/1003.xlsx new file mode 100644 index 0000000..8ec0bdf Binary files /dev/null and b/result/templates/teacher-wise/1003.xlsx differ diff --git a/result/templates/teacher-wise/1004.xlsx b/result/templates/teacher-wise/1004.xlsx new file mode 100644 index 0000000..1aac2df Binary files /dev/null and b/result/templates/teacher-wise/1004.xlsx differ diff --git a/result/templates/teacher-wise/1005.xlsx b/result/templates/teacher-wise/1005.xlsx new file mode 100644 index 0000000..2ff94b4 Binary files /dev/null and b/result/templates/teacher-wise/1005.xlsx differ diff --git a/result/templates/teacher-wise/1006.xlsx b/result/templates/teacher-wise/1006.xlsx new file mode 100644 index 0000000..66290e9 Binary files /dev/null and b/result/templates/teacher-wise/1006.xlsx differ diff --git a/result/templates/teacher-wise/1007.xlsx b/result/templates/teacher-wise/1007.xlsx new file mode 100644 index 0000000..631ac5a Binary files /dev/null and b/result/templates/teacher-wise/1007.xlsx differ diff --git a/result/templates/teacher-wise/1008.xlsx b/result/templates/teacher-wise/1008.xlsx new file mode 100644 index 0000000..0aede4e Binary files /dev/null and b/result/templates/teacher-wise/1008.xlsx differ diff --git a/templates/batch-wise/batch_wise_template.py b/templates/batch-wise/batch_wise_template.py index 9ca736b..83a38b2 100644 --- a/templates/batch-wise/batch_wise_template.py +++ b/templates/batch-wise/batch_wise_template.py @@ -8,7 +8,7 @@ sys.path.insert(0, os.path.join(_ROOT, "app")) sys.path.insert(0, os.path.join(_ROOT, "controller")) from xlsx_grid_helper import build_grid_sheet, new_workbook, save_workbook # noqa: E402 -from template_controller import TIME_SLOTS as GRID_TIME_SLOTS # noqa: E402 +from template_controller import DISPLAY_ROWS # noqa: E402 def _sessions_for_batch(sessions, batch_code): @@ -28,10 +28,10 @@ def generate_batch_wise_templates(sessions, data, output_dir): by_day_slot = {} for s in batch_sessions: for slot_index in s["slot_indices"]: - by_day_slot.setdefault((s["day"], slot_index), []).append(s) + by_day_slot.setdefault((s["day"], slot_index, s["duration_minutes"]), []).append(s) - def cell_text(day, slot_index, by_day_slot=by_day_slot): - entries = by_day_slot.get((day, slot_index)) + def cell_text(day, slot_index, duration_minutes, by_day_slot=by_day_slot): + entries = by_day_slot.get((day, slot_index, duration_minutes)) if not entries: return "" lines = [] @@ -49,8 +49,8 @@ def generate_batch_wise_templates(sessions, data, output_dir): ws, title=f"Batch {batch_code}", subtitle=subtitle, - time_slots=GRID_TIME_SLOTS, - sessions_by_day_slot=first_by_day_slot, + display_rows=DISPLAY_ROWS, + sessions_by_cell=first_by_day_slot, cell_text_fn=cell_text, ) path = save_workbook(wb, output_dir, f"{batch_code}.xlsx") diff --git a/templates/department-wise/department_wise_template.py b/templates/department-wise/department_wise_template.py index 3aff6ad..2a6b8d8 100644 --- a/templates/department-wise/department_wise_template.py +++ b/templates/department-wise/department_wise_template.py @@ -8,7 +8,7 @@ sys.path.insert(0, os.path.join(_ROOT, "app")) sys.path.insert(0, os.path.join(_ROOT, "controller")) from xlsx_grid_helper import build_grid_sheet, new_workbook, save_workbook # noqa: E402 -from template_controller import TIME_SLOTS as GRID_TIME_SLOTS # noqa: E402 +from template_controller import DISPLAY_ROWS # noqa: E402 def generate_department_wise_templates(sessions, data, output_dir): @@ -22,10 +22,10 @@ def generate_department_wise_templates(sessions, data, output_dir): by_day_slot = {} for s in dept_sessions: for slot_index in s["slot_indices"]: - by_day_slot.setdefault((s["day"], slot_index), []).append(s) + by_day_slot.setdefault((s["day"], slot_index, s["duration_minutes"]), []).append(s) - def cell_text(day, slot_index, by_day_slot=by_day_slot): - entries = by_day_slot.get((day, slot_index)) + def cell_text(day, slot_index, duration_minutes, by_day_slot=by_day_slot): + entries = by_day_slot.get((day, slot_index, duration_minutes)) if not entries: return "" lines = [] @@ -44,8 +44,8 @@ def generate_department_wise_templates(sessions, data, output_dir): ws, title=f"Department: {department}", subtitle="All batches / programs", - time_slots=GRID_TIME_SLOTS, - sessions_by_day_slot=first_by_day_slot, + display_rows=DISPLAY_ROWS, + sessions_by_cell=first_by_day_slot, cell_text_fn=cell_text, ) path = save_workbook(wb, output_dir, f"{department}.xlsx") diff --git a/templates/room-wise/room_wise_template.py b/templates/room-wise/room_wise_template.py index 0620630..b50399b 100644 --- a/templates/room-wise/room_wise_template.py +++ b/templates/room-wise/room_wise_template.py @@ -8,7 +8,7 @@ sys.path.insert(0, os.path.join(_ROOT, "app")) sys.path.insert(0, os.path.join(_ROOT, "controller")) from xlsx_grid_helper import build_grid_sheet, new_workbook, save_workbook # noqa: E402 -from template_controller import TIME_SLOTS as GRID_TIME_SLOTS # noqa: E402 +from template_controller import DISPLAY_ROWS # noqa: E402 def generate_room_wise_templates(sessions, data, output_dir): @@ -23,10 +23,10 @@ def generate_room_wise_templates(sessions, data, output_dir): by_day_slot = {} for s in room_sessions: for slot_index in s["slot_indices"]: - by_day_slot.setdefault((s["day"], slot_index), []).append(s) + by_day_slot.setdefault((s["day"], slot_index, s["duration_minutes"]), []).append(s) - def cell_text(day, slot_index, by_day_slot=by_day_slot): - entries = by_day_slot.get((day, slot_index)) + def cell_text(day, slot_index, duration_minutes, by_day_slot=by_day_slot): + entries = by_day_slot.get((day, slot_index, duration_minutes)) if not entries: return "" lines = [] @@ -44,8 +44,8 @@ def generate_room_wise_templates(sessions, data, output_dir): ws, title=f'{room["room_name"]} ({room_id})', subtitle=f'Block {room["block_id"]} - {room["room_type"].title()} - Capacity {room["capacity"]}', - time_slots=GRID_TIME_SLOTS, - sessions_by_day_slot=first_by_day_slot, + display_rows=DISPLAY_ROWS, + sessions_by_cell=first_by_day_slot, cell_text_fn=cell_text, ) path = save_workbook(wb, output_dir, f"{room_id}.xlsx") diff --git a/templates/student-wise/student_wise_template.py b/templates/student-wise/student_wise_template.py index f6edb77..fc94b3f 100644 --- a/templates/student-wise/student_wise_template.py +++ b/templates/student-wise/student_wise_template.py @@ -8,7 +8,7 @@ sys.path.insert(0, os.path.join(_ROOT, "app")) sys.path.insert(0, os.path.join(_ROOT, "controller")) from xlsx_grid_helper import build_grid_sheet, new_workbook, save_workbook # noqa: E402 -from template_controller import TIME_SLOTS as GRID_TIME_SLOTS # noqa: E402 +from template_controller import DISPLAY_ROWS # noqa: E402 from template_logger import log_error # noqa: E402 @@ -24,17 +24,17 @@ def generate_student_wise_templates(sessions, data, output_dir): batch = data["batches_by_code"].get(batch_code) student_sessions = _sessions_for_batch(sessions, batch_code) - # A student can only be in one place at a time: each (day, slot) - # must resolve to exactly one session. If the schedule places more - # than one, that's a real scheduling error - log it instead of - # silently picking/overwriting one. + # A student can only be in one place at a time: each (day, slot, + # duration) must resolve to exactly one session. If the schedule + # places more than one, that's a real scheduling error - log it + # instead of silently picking/overwriting one. raw_by_day_slot = {} for s in student_sessions: for slot_index in s["slot_indices"]: - raw_by_day_slot.setdefault((s["day"], slot_index), []).append(s) + raw_by_day_slot.setdefault((s["day"], slot_index, s["duration_minutes"]), []).append(s) by_day_slot = {} - for (day, slot_index), entries in raw_by_day_slot.items(): + for (day, slot_index, duration_minutes), entries in raw_by_day_slot.items(): if len(entries) > 1: course_list = ", ".join( f'{e["course_id"]} Sec {e["section_id"]} ({e["course_type"]}) with {e["instructor_name"]} in {e["room_id"]}' @@ -44,10 +44,10 @@ def generate_student_wise_templates(sessions, data, output_dir): f"Student conflict: roll {roll_no} (batch {batch_code}) has " f"{len(entries)} overlapping courses on {day} slot {slot_index}: {course_list}" ) - by_day_slot[(day, slot_index)] = entries[0] + by_day_slot[(day, slot_index, duration_minutes)] = entries[0] - def cell_text(day, slot_index, raw_by_day_slot=raw_by_day_slot): - entries = raw_by_day_slot.get((day, slot_index)) + def cell_text(day, slot_index, duration_minutes, raw_by_day_slot=raw_by_day_slot): + entries = raw_by_day_slot.get((day, slot_index, duration_minutes)) if not entries: return "" s = entries[0] @@ -67,8 +67,8 @@ def generate_student_wise_templates(sessions, data, output_dir): ws, title=f"Roll No: {roll_no}", subtitle=subtitle, - time_slots=GRID_TIME_SLOTS, - sessions_by_day_slot=by_day_slot, + display_rows=DISPLAY_ROWS, + sessions_by_cell=by_day_slot, cell_text_fn=cell_text, ) path = save_workbook(wb, output_dir, f"{roll_no}.xlsx") diff --git a/templates/teacher-wise/teacher_wise_template.py b/templates/teacher-wise/teacher_wise_template.py index 069f419..aa4b4c0 100644 --- a/templates/teacher-wise/teacher_wise_template.py +++ b/templates/teacher-wise/teacher_wise_template.py @@ -8,7 +8,7 @@ sys.path.insert(0, os.path.join(_ROOT, "app")) sys.path.insert(0, os.path.join(_ROOT, "controller")) from xlsx_grid_helper import build_grid_sheet, new_workbook, save_workbook # noqa: E402 -from template_controller import TIME_SLOTS as GRID_TIME_SLOTS # noqa: E402 +from template_controller import DISPLAY_ROWS # noqa: E402 from template_logger import log_error # noqa: E402 @@ -33,17 +33,17 @@ def generate_teacher_wise_templates(sessions, data, output_dir): instructor_name = name_by_code[code] instr_sessions = [s for s in sessions if s["instructor_code"] == code] - # A teacher can only be in one place at a time: each (day, slot) - # must resolve to exactly one session. If the schedule places more - # than one, that's a real scheduling error - log it instead of - # silently picking/overwriting one. + # A teacher can only be in one place at a time: each (day, slot, + # duration) must resolve to exactly one session. If the schedule + # places more than one, that's a real scheduling error - log it + # instead of silently picking/overwriting one. raw_by_day_slot = {} for s in instr_sessions: for slot_index in s["slot_indices"]: - raw_by_day_slot.setdefault((s["day"], slot_index), []).append(s) + raw_by_day_slot.setdefault((s["day"], slot_index, s["duration_minutes"]), []).append(s) by_day_slot = {} - for (day, slot_index), entries in raw_by_day_slot.items(): + for (day, slot_index, duration_minutes), entries in raw_by_day_slot.items(): if len(entries) > 1: course_list = ", ".join( f'{e["course_id"]} ({e["course_type"]}) for batch(es) {"+".join(e["batch_codes"])} in {e["room_id"]}' @@ -53,10 +53,10 @@ def generate_teacher_wise_templates(sessions, data, output_dir): f"Teacher conflict: {instructor_name} ({code}) is double-booked on " f"{day} slot {slot_index}: {course_list}" ) - by_day_slot[(day, slot_index)] = entries[0] + by_day_slot[(day, slot_index, duration_minutes)] = entries[0] - def cell_text(day, slot_index, raw_by_day_slot=raw_by_day_slot): - entries = raw_by_day_slot.get((day, slot_index)) + def cell_text(day, slot_index, duration_minutes, raw_by_day_slot=raw_by_day_slot): + entries = raw_by_day_slot.get((day, slot_index, duration_minutes)) if not entries: return "" s = entries[0] @@ -75,8 +75,8 @@ def generate_teacher_wise_templates(sessions, data, output_dir): ws, title=f'{instructor_name} ({code})', subtitle=subtitle, - time_slots=GRID_TIME_SLOTS, - sessions_by_day_slot=by_day_slot, + display_rows=DISPLAY_ROWS, + sessions_by_cell=by_day_slot, cell_text_fn=cell_text, ) path = save_workbook(wb, output_dir, f"{code}.xlsx")