Skip to content

Timetable and exams

Both modules work for K-12 (class and section) and higher ed (branch and semester). Higher-ed admins schedule against Branch + Semester directly.

Timetable

Routes: /erp/timetable for staff, /parent/timetable for guardians.

The week is a grid of periods per cohort. Each entry binds a cohort, subject, faculty member, period, weekday and room. The module refuses:

  • two entries in one cohort slot
  • a faculty member in two places at once
  • a room booked twice
  • overlapping periods

Safe swaps

An admin can move or swap periods on the grid. A dry run shows every conflict a change would cause before anything is committed, including cross-department consequences: "Moving CSE-S1 Maths to Wed P2 conflicts with Kavya Nagaraj teaching ME-S1 at that slot."

Generated timetables

Kwilo builds a clash-free week with a constraint solver (Google OR-Tools CP-SAT), not an LLM.

  • Inputs: weekly periods per cohort and subject (the weightage), who teaches what, rooms and the bell schedule.
  • Hard rules: exact weekly periods, no cohort, faculty or room double-booking, nothing in breaks, labs in consecutive periods.
  • Soft goals: spread subjects across days, minimise idle gaps.
  • Repair: after a disruption the solver re-solves while staying close to the current grid. In testing, a lecturer losing a whole day moved 3 cells out of 88.
  • Infeasible requests: the solver names the smallest conflicting set, for example one over-committed lecturer.

Faculty who teach across departments tie those departments into one problem, so the solver works on groups of cohorts that share faculty rather than on the org chart. Solves run in the eval-service through a queue, never in the backend request path. A generated timetable is a draft until an admin publishes it.

Exam operations

Controllers of examinations run exam sessions: schedule, rooms, seat allocation and hall tickets, then invigilator duty.

Seating

When a room holds students from more than one branch, seating alternates branches across each row, so no two students from the same branch sit side by side. Same branch front to back is fine. Rooms with three or more branches use a round-robin that carries across rows. Allocation refuses to exceed room capacity.

Hall tickets

Printable hall tickets with room and seat, generated per student.

Invigilator duty

Duty is assigned per sitting (room, date, start time), because cross-branch seating puts several exams in one room.

  • Invigilators needed = headcount รท students per invigilator (default 40), minimum 1.
  • Candidates are teaching staff from HR, minus anyone on leave and anyone already booked in that slot anywhere in the institution.
  • Assignment is least-loaded first, in a stable order, so re-running gives the same roster.
  • Regenerating replaces only auto-assigned rows. Manual swaps survive.
  • A sitting the pool can't fill is shown as a shortfall, not an error.
  • The duty-load panel shows every eligible person's count, zeros included.

Marks

Every final mark for a paper is one row in the ERP, whichever way it arrived: typed into the marks grid, imported from a faculty spreadsheet, or finalised in the answer-sheet evaluation flow, which hands the total over automatically. The grid lists the paper's whole roster, so a missing mark is visible, not silent. A student is either marked or carries a status: absent, withheld, malpractice or exempt.

A session may hold one paper per subject and component (CIE, SEE, practical, internal), so a semester's internal and end-semester papers sit side by side and combine on the grade card.

Who enters marks

Faculty enter marks for the papers they teach from My Exams (My Records group). It lists only papers whose section and subject they teach, needs no exam-operations grant, and closes once the office locks results. The examination office sees every paper on the session's Marks tab, locks the session and issues documents. Corrections after the lock are office-only and carry a reason.

Spreadsheet import

Faculty upload the sheet they already keep, CSV or Excel, in any column order. An import assistant reads the headers, decides which column is the identifier and which the marks, learns how absence is written, and matches every row to the roster. The person sees a preview with one decision per row (ready, confirm the match, duplicate, dropped summary line, out of range), fixes the few that need it, and applies. Nothing is written until then. Blank cells are never recorded as absences.

Locking results

The Documents tab shows, before the lock, every paper's entered, absent and missing counts and a Lock results action that stays disabled with the reason until every student has a mark or a status. A review beside it lists what a controller should glance at first: papers with gaps, students marked absent who had a seat, a paper far below a student's own average, a paper whose average sits far from the rest. The facts are computed by the system; an assistant only writes the sentences.

Marks documents

No document is stored. Every document is rendered from the marks table, the institution record and a grading preset at the moment someone asks for it, so a reprint always reflects the current marks and carries a hash of the marks it was built from.

Which documents an institution may issue follows its record, not a setting:

Institution Documents Signatories
School, PU college Progress Report (subject rows, attendance for the session so far, class teacher's remark), Statement of Marks Class teacher, Principal, Parent
Affiliated degree or engineering college Internal Assessment Statement, stamped "internal, not a university document"; SEE papers are omitted because the affiliating university issues the semester marks card Head of department, Principal
Autonomous college, university Grade Card (one row per course, CIE and SEE combined, letter grade, grade point, SGPA), Statement of Marks, Transcript (every published semester, SGPA each, CGPA) Controller of Examinations, Principal or Registrar (Evaluation)
Corporate workspace none

Grading presets are code, tested against the published tables: VTU 2022, UGC CBCS, CBSE school, Karnataka State Board, percentage only. A session uses its institution type's default unless the office picks another before the lock. Grades, percentages, SGPA and CGPA are computed by the preset, never typed.

The class teacher's remark on a progress report is the one piece of prose that is stored. An assistant drafts it from the student's rows and attendance when asked; the teacher edits and saves it, and the report labels it AI-assisted until the teacher rewrites it.

Documents are available once the session is in Results. The office downloads one student's document or the whole cohort from the Documents tab; learners and guardians download their own from the portal.

Where it lives

  • Web: ErpTimetablePage, ErpExamOpsPage, ErpExamOpsSessionPage
  • Backend: apps/backend/src/erp/timetable/, apps/backend/src/erp/exam_ops/ (marks, import, grading presets and documents)
  • Solver: kwiloai_eval_service