44 KiB
44 KiB
Database Control Matrix (datacontrol.md)
This document maps all available backend controllers to the SQLite database tables they interact with, detailing the operations performed (reads, writes, updates, soft-deletes) and the transaction patterns they use.
Design Principles & Patterns
- Write Operations (
INSERT/UPDATE): Under nextgen server conventions, all direct write operations setsync_status = 'pending', generate a new UUIDv4uidon creation, and stamp the local timestampupdated_at. - Soft Deletes: Deletion operations do not drop DB table records. Instead, they run an
UPDATEcommand settingis_deleted = 1(and often setis_active = 0or similar lifecycle flags when relevant). - Transactional Integrity: Multi-step operations (e.g. bulk CSV marks upload in
marks.controller.js, bulk attendance marks, or invoice calculations) use explicit database transactions (viabetter-sqlite3'sdb.transaction(...)) to guarantee all-or-nothing execution. - Read Scoping: Read operations are filtered globally on
is_deleted = 0and scoped appropriately (e.g., student/parent portals only view records matched to their specific user or linked dependent IDs). - Grading Scale Resolutions: Complex entities like
grades.controller.jsandexams.controller.jsdynamically resolve percentages against a cascading grading-scale chain (specific row scale override -> default school configuration scale -> ZIMSEC standard fallback bands).
Controllers & Database Interactions
1. academic-rollover.controller.js
academic_years:SELECT(retrieve status, lists)INSERT(create new year:uid,name,status = 'draft',start_date,end_date)UPDATE(change status to'active','completed'; soft-delete withis_deleted = 1)
classes:SELECT(fetch classes to rollover)INSERT(clone/rollover classes into new academic year)
subjects:SELECT(fetch subjects to rollover)INSERT(clone/rollover subjects into new academic year)
enrollments:SELECT(active enrollment state checks)INSERT(auto-promote students to new classes in the rolling year)
users:SELECT(link student roles)
2. assignments.controller.js
assignments:SELECT(list active assignments with class/subject boundaries)INSERT(create assignment:uid,title,description,subject_id,due_date,max_score,created_by)UPDATE(edit fields; soft-delete withis_deleted = 1)
submissions:SELECT(check user submissions history)INSERT(create draft/initial submission:uid,assignment_id,student_id,status = 'submitted',submitted_at)UPDATE(grade submission:grade,feedback,graded_by,graded_at,status = 'graded'; soft-delete withis_deleted = 1)
users:SELECT(joining names for graders/students)
enrollments:SELECT(verify active student status in target class)
3. attendance.controller.js
attendance_new:SELECT(retrieve rosters, historical summaries)INSERT(bulk insert roll-call records:uid,student_id,class_id,date,status,remarks,marked_by)UPDATE(modify status, remarks, marked_by, or soft-delete withis_deleted = 1)
users:SELECT(verify students name)
enrollments:SELECT(active student list for class roster)
classes:SELECT(validate target class)
parent_students:SELECT(scoped lookup for parent portal self-read)
4. audit.controller.js
audit_logs:SELECT(list recent events filtered by email, action, date)INSERT(log technical actions/events:uid,user_id,user_email,action,entity_type,entity_id,old_data,new_data,ip_address,user_agent)
users:SELECT(look up user emails)
5. calendar.controller.js
events:SELECT(list active events filterable by category, date range)INSERT(create calendar event:uid,title,description,start_time,end_time,category,is_all_day,location,created_by)UPDATE(modify properties; soft-delete withis_deleted = 1)
users:SELECT(join creator profile)
6. classes.controller.js
classes:SELECT(list active classes with counts)INSERT(create class:uid,name,section,grade_level,room_number,class_teacher_id)UPDATE(modify properties; soft-delete withis_deleted = 1)
users:SELECT(join teacher names)
enrollments:SELECT(calculate active student roll counts)
7. club-attendance.controller.js
club_attendance:SELECT(list roll-call entries)INSERT(bulk insert club logs:uid,club_id,student_id,date,status,remarks,marked_by)UPDATE(modify attendance details; soft-delete withis_deleted = 1)
clubs:SELECT(verify active status)
users:SELECT(verify students)
8. clubs.controller.js
clubs:SELECT(active clubs catalog list)INSERT(create club:uid,name,type,description,teacher_in_charge_id,schedule,max_members)UPDATE(modify properties, status; soft-delete withis_deleted = 1)
club_memberships:SELECT(check active student enrollments)INSERT(join a club:uid,club_id,student_id,status = 'active',join_date = CURRENT_DATE)UPDATE(re-enroll/join; leave a club: setstatus = 'inactive')
club_announcements:SELECT(list recent club notices)INSERT(post notice:uid,club_id,title,content,created_by)
club_attendance:SELECT(active roll-call records)INSERT/UPDATE(bulk upsert marks matching(club_id, student_id, date))
club_chats:SELECT(list messages)INSERT(post message:uid,club_id,sender_id,message,image_url)
users:SELECT(joining names for dashboard/contacts)
9. courseGrades.controller.js
course_grades:SELECT(list student performance scores)INSERT(record grade:uid,student_id,course_id,grade_letter,grade_points,percentage,remarks,graded_by)UPDATE(modify grade letter, percentage, remarks, graded_by; soft-delete withis_deleted = 1)
course_enrolments:SELECT(verify active status in courses)
courses:SELECT(verify existence)
users:SELECT(verify roles)
10. course_enrolments.controller.js
course_enrolments:SELECT(active, pending, and filterable enrolment requests lists)INSERT(create enrolment:uid,student_id,course_id,status,request_status,requested_at,approved_by,approved_at,progress = 0,sync_status = 'pending')UPDATE(modifyrequest_statusto'approved','rejected', or'withdrawn'; modifystatusto'active'or'dropped'; modifyapproved_by,approved_at,rejection_reason,updated_at,sync_status = 'pending', soft-deleteis_deleted = 1)
courses:SELECT(existence checks)
users:SELECT(joining student profiles)
11. courses.controller.js
subjects: (Note: The routes query/modifysubjectstable name, not acoursestable name directly, although the controller is calledcourses.controller.js).SELECT(catalog list with filters)INSERT(create course:uid,name,code,class_id,teacher_id,description,credit_hours)UPDATE(modify attributes, or soft-delete withis_deleted = 1)
classes:SELECT(class details)
users:SELECT(teacher and student directories)
enrollments:SELECT(verify class list)
grades:SELECT(calculate percentage average and recent history list)
12. crossword.controller.js
crossword_games:SELECT(active games lists with role/status filters, metadata detail fetch)INSERT(create game layout details:uid,title,description,subject_id,class_id,created_by,status = 'ready',grid_layoutJSON,word_count,difficulty,reward_points,time_limit_seconds,is_published = 0,sync_status = 'pending',created_at,updated_at)UPDATE(modify game attributes:title,description,reward_points,time_limit_seconds,is_published,updated_at, soft-delete withis_deleted = 1)
crossword_clues:SELECT(clues details for active games)INSERT(create clues per placement:uid,game_id,clue_text,answer,direction,start_row,start_col,clue_number,hint,sync_status = 'pending',created_at,updated_at)UPDATE(soft-delete withis_deleted = 1)
crossword_sessions:SELECT(active/completed history matching student user, leaderboard statistics)INSERT(start new session:uid,game_id,student_id,current_state = '{}',correct_count = 0,total_count,points_earned = 0,sync_status = 'pending',created_at,updated_at)UPDATE(save debounced statecurrent_state; submit completion updates:correct_count,total_count,points_earned,time_taken_seconds,completed_at = CURRENT_TIMESTAMP,updated_at = CURRENT_TIMESTAMP,sync_status = 'pending')
users:SELECT(joining student profiles for dashboard ranking leaderboard counts)
13. dashboard.controller.js
(Note: Completely READ-ONLY SELECT operations)
enrollments,attendance/attendance_new,grades,subjects_new/subjects,classes,users,payments,student_fees,audit_logs,courses,course_enrolments,course_grades,submissions,assignments,crossword_sessions,parent_students,messages,events:SELECT(aggregate dashboard stats, unread announcements, schedule items)
14. departments.controller.js
departments:SELECT(flat lists and tree detail views)INSERT(create department:uid,name,code,head_teacher_id,description)UPDATE(modify attributes, or soft-delete withis_deleted = 1if no active subjects link)
subjects_new:SELECT(active subject counts checks)
staff_records:SELECT(fetch head teachers),UPDATE(modifydepartmentname reference if changed)
users:SELECT(teacher links),UPDATE(modifydepartment_idassignment)
enrollments:SELECT(count active students)
15. edutainment.controller.js
edutainment_content:SELECT(scramble and trivia pool lists)INSERT(create catalog content:uid,game_type,subject_id,created_by,question_text,hint_text,optionsJSON,correct_answer)UPDATE(soft-delete withis_deleted = 1)
edutainment_games:SELECT(list custom puzzles)INSERT(create custom game template:uid,game_type,title,description,subject_id,created_by,difficulty,reward_points,time_limit_seconds,game_configJSON,is_published = 1)UPDATE(soft-delete withis_deleted = 1)
edutainment_sessions:SELECT(attempt count summaries)INSERT(record student game attempt session:uid,game_id,student_id,score,completed_at = CURRENT_TIMESTAMP,points_earned)
subjects_new:SELECT(joining subject names)
users:SELECT(joining teacher names)
16. enrollments.controller.js
enrollments:SELECT(enrolment request lists, active/pending profiles)INSERT(create request:uid,student_id,class_id,roll_number,academic_year,section,status,request_status,requested_at,approved_by,approved_at,sync_status = 'pending')UPDATE(approve request: status'active', request_status'approved'; reject request: status'inactive', request_status'rejected',rejection_reason; withdraw request: status'inactive', request_status'withdrawn'; soft-delete withis_deleted = 1and status'inactive')
classes:SELECT(checking class properties and sections)
users:SELECT(verifying active student roles)
17. exams.controller.js
exam_groups:SELECT(list templates)INSERT(create exam group:uid,name,description,exam_type,duration_minutes,total_marks,passing_marks,is_random_order,show_results,allow_review,max_attempts,academic_year,term,grading_scale)UPDATE(modify mutable fields, grading_scale; soft-delete withis_deleted = 1)
question_banks:SELECT(questions with difficulty lists)INSERT(single and bulk insert:uid,exam_group_id,subject_id,question_type,question,options,correct_answer,marks,difficulty,tags)UPDATE(modify question attributes; soft-delete withis_deleted = 1)
exam_schedules:SELECT(scheduled exams index)INSERT(create schedule:uid,exam_group_id,class_id,subject_id,start_time,end_time,duration_minutes,instructions)
exam_attempts:SELECT(attempt counts and performance averages)INSERT(start new attempt:uid,student_id,exam_group_id,schedule_id,started_at)UPDATE(submit attempt:submitted_at,time_spent_seconds,total_marks,obtained_marks,percentage,status = 'submitted',ip_address,user_agent)
exam_answers:SELECT(fetch student answers)INSERT/UPDATE(upsert answer:answer,answered_at/ write grade results:is_correct,marks_obtained)
enrollments,subjects,classes,users:SELECT(verify relationship linkages)
18. fees.controller.js
fee_groups:SELECT(list definitions)INSERT(create fee type:uid,name,description,amount,type,frequency,academic_year,due_date)UPDATE(modify attributes; soft-delete withis_deleted = 1)
student_fees:SELECT(student ledger profiles list)INSERT(assign fee type:uid,student_id,fee_group_id,amount,due_date)
fee_plans:SELECT(list schedules)INSERT(create plan:uid,name,fee_group_id,total_amount,installments_count,start_date,end_date,academic_year,auto_apply_to_class_id,notes,created_by)UPDATE(modify mutable fields; soft-delete withis_deleted = 1)
fee_plan_installments:SELECT(fetch split amounts)INSERT(create installment rows:uid,fee_plan_id,sequence,label,amount,due_date)UPDATE(soft-delete withis_deleted = 1on plan delete/reset)
discounts:SELECT(list discounts)INSERT(create discount rate:uid,name,kind,value,scope,scope_id,reason,valid_from,valid_to,academic_year,created_by)UPDATE(modify details; soft-delete withis_deleted = 1)
student_fee_discounts:UPDATE(soft-delete withis_deleted = 1on discount delete)
users,enrollments,classes:SELECT(validate student scopes)
19. finance-banking.controller.js
bank_accounts:SELECT(list cash/assets balances)INSERT(create account:uid,name,bank_name,account_number,account_type,currency,opening_balance,current_balance,chart_account_id,is_active)UPDATE(modify account settings; soft-delete withis_deleted = 1,is_active = 0)
bank_reconciliations:SELECT(list bank recon history)INSERT(create draft recon:uid,bank_account_id,period_start,period_end,statement_balance,status = 'draft',created_by)UPDATE(modify status:'balanced'or'discrepancy', settingbook_balance)
bank_reconciliation_lines:SELECT(fetch lines list)INSERT(auto-match statement lines:uid,reconciliation_id,payment_id,statement_date,statement_amount,statement_reference,match_status)UPDATE(resolve line match: updatematch_statusandpayment_id)
chart_of_accounts,payments:SELECT(verify transaction linkages)
20. finance-coa.controller.js
chart_of_accounts:SELECT(ledger codes flat lists and tree hierarchies)INSERT(create account:uid,code,name,type,parent_id,color,is_active)UPDATE(modify codes attributes; soft-delete withis_deleted = 1,is_active = 0)
bank_accounts:SELECT(constraint validation checks)
21. finance-engine.controller.js
student_groups:SELECT(groups search and detail metrics)INSERT(create student cohort:uid,name,description,type,color,class_id,capacity,auto_track_class,created_by)UPDATE(modify properties; soft-delete withis_deleted = 1)
student_group_members:SELECT(member details and student count calculations)INSERT(add member mapping:uid,group_id,student_id)UPDATE(soft-delete withis_deleted = 1)
student_fees:SELECT(check applied plans)INSERT(apply plan installment:uid,student_id,fee_group_id,plan_id,amount,due_date,status = 'pending',sync_status = 'pending')UPDATE(re-aggregate discount_amount; soft-delete withis_deleted = 1andsync_status = 'pending'when revoking unpaid plans)
student_fee_discounts:SELECT(applied discount lines checks)INSERT(apply discount:uid,student_fee_id,discount_id,amount_applied,applied_by)UPDATE(modify amount_applied, or soft-delete withis_deleted = 1)
classes,users,enrollments,fee_plans,fee_plan_installments,discounts,fee_groups:SELECT(scope verification checks)
22. finance-invoices.controller.js
invoices:SELECT(invoice search pages index)INSERT(create invoice:uid,invoice_number,student_id,fee_group_id,plan_id,period_label,subtotal,discount_amount,total,paid_amount = 0,currency,status = 'issued',issued_at,due_date,notes,created_by)UPDATE(modify status, notes, subtotal; soft-delete withis_deleted = 1and status'cancelled')
users,fee_groups,student_fees,fee_plans:SELECT(verify billing components)
23. finance-suppliers.controller.js
suppliers:SELECT(supplier details search catalog list)INSERT(create supplier:uid,name,code,contact_person,email,phone,address,city,country,tax_id,bank_details,notes,is_active,sync_status = 'pending')UPDATE(modify supplier details; soft-delete withis_deleted = 1,is_active = 0)
24. finance-trips.controller.js
trips:SELECT(bookings catalog)INSERT(create field trip:uid,name,destination,departure_date,return_date,cost_per_student,total_capacity,status = 'draft',description,created_by)UPDATE(modify trip details; soft-delete withis_deleted = 1,status = 'cancelled')
trip_payments:SELECT(passenger booking accounts checks)INSERT(assign student passenger:uid,trip_id,student_id,invoiced_amount,status = 'pending',created_by)UPDATE(pay/refund:paid_amount,status,paid_at,updated_at; soft-delete withis_deleted = 1andstatus = 'cancelled')
users,enrollments:SELECT(look up student eligibility)
25. finance.controller.js
(Note: Proxies payroll routes to hr.controller.js)
payments:SELECT(sum payment amounts this month)
student_fees:SELECT(sum outstanding amount:amount - paid_amount)
payroll_runs:SELECT(details of latest run)
expenses:SELECT(list with filters/pagination)INSERT(create expense:uid,category,subcategory,description,amount,expense_date,vendor,invoice_number,payment_method,status,receipt_image,created_by)UPDATE(modify fields, change status to'approved'/'rejected', or soft-delete withis_deleted = 1)
invoices,trips,bank_reconciliations,student_groups:SELECT(additional tile aggregations)
26. front-office.controller.js
visitor_logs:SELECT(visitor log registry)INSERT(log visitor check-in:uid,visitor_name,visitor_type,phone,email,id_number,purpose,person_to_visit,badge_number,remarks,created_by)UPDATE(check out: setcheck_outtime; soft-delete withis_deleted = 1)
admission_enquiries:SELECT(enquiry follow-up checklist)INSERT(create enquiry:uid,full_name,email,phone,address,class_interested,source,follow_up_date,notes,next_action,assigned_to)UPDATE(modify enquiry details; soft-delete withis_deleted = 1)
complaints:SELECT(complaint tracking files)INSERT(file complaint:uid,complainant_name,complainant_type,contact_phone,contact_email,category,priority,subject,description,assigned_to,status = 'open')UPDATE(resolve complaint: setstatus = 'resolved',resolution,resolved_by,resolved_at)
phone_call_logs:SELECT(phone checklists logs)INSERT(single / bulk record phone logs:uid,caller_name,caller_phone,caller_type,direction,call_time,duration_seconds,purpose,response,follow_up_required,follow_up_date,handled_by,notes)UPDATE(modify details; clear follow-up: setfollow_up_required = 0; soft-delete withis_deleted = 1)
postal_dispatch:SELECT(mailroom delivery registries)INSERT(single / bulk log mail items:uid,type,reference_number,sender,receiver,address,courier,tracking_number,dispatch_date,description,status = 'pending',created_by)UPDATE(modify details; mark sent: setstatus = 'sent'; mark delivered: setstatus = 'delivered',received_date; soft-delete withis_deleted = 1)
users:SELECT(consultant names check)
27. grades.controller.js
grades:SELECT(list results with filters, calculate average summaries)INSERT(single and bulk:uid,student_id,subject_id,exam_type,marks,total_marks,grade,grading_scale,remarks,graded_by,academic_year,term)UPDATE(modify marks, grade letter, remarks, grading_scale, graded_by; soft-delete withis_deleted = 1)
users,subjects,classes,enrollments:SELECT(verify relationships)
28. hostel-attendance.controller.js
hostel_attendance:SELECT(hostel attendance counts checklist)INSERT(record check-in:uid,hostel_id,room_id,student_id,date,status,marked_by)UPDATE(modify status, marked_by, updated_at)
hostels,rooms,room_assignments:SELECT(verify boarding occupancy)
users,parent_students:SELECT(verify child boundaries)
29. hostel.controller.js
hostels:SELECT(active hostels catalog list)INSERT(create hostel:uid,name,code,type,address,warden_id,phone,description)
rooms:SELECT(rooms in hostel catalog)INSERT(create room:uid,hostel_id,room_type_id,room_number,floor,bed_count,status = 'available',description)UPDATE(change status to'available'/'occupied')
room_assignments:SELECT(list assignments)INSERT(assign student to bed:uid,student_id,room_id,bed_number,start_date,end_date,status = 'active',remarks,assigned_by)UPDATE(check out assignment: setstatus = 'inactive',end_date = today)
room_types:SELECT(list room configurations)
hostel_attendance:SELECT(attendance logs index)INSERT/UPDATE(bulk upsert hostel attendance matching(hostel_id, student_id, date))
users:SELECT(warden/student validation checks)
30. hr.controller.js
staff_roles:SELECT(list active roles)INSERT(create role:uid,name,description,is_teaching_role,permissions)
salary_grades:SELECT(list pay grades)INSERT(create salary grade:uid,name,grade_level,basic_salary,housing_allowance,transport_allowance,medical_allowance,other_allowances,description,effective_date)
staff_records:SELECT(list employment cards details)INSERT(create record:uid,user_id,staff_number,role_id,salary_grade_id,employment_type,appointment_date,bank_name,account_number,department,designation)UPDATE(modify role, pay scale, active status; soft-delete withis_deleted = 1)
leave_types:SELECT(list categories)
leave_requests:SELECT(requests history lists)INSERT(submit request:uid,staff_id,leave_type_id,start_date,end_date,days_count,reason)UPDATE(approve/reject: setstatus,rejection_reason,approved_by,approved_at)
staff_attendance:SELECT(roster index)INSERT(log day check:uid,staff_id,date,status,remarks,marked_by)
payroll_runs:SELECT(list runs)INSERT(create run:uid,period_month,period_year,description,status = 'draft',created_by)UPDATE(calculate totals:total_gross,total_deductions,total_net,status = 'calculated'; mark paid: setstatus = 'paid',paid_at; cancel run: reset status to'draft', zero out totals)
payslips:SELECT(list slips)INSERT(generate payslips for run)UPDATE(cascading update to status'paid'andpaid_at)DELETE(recalculating run deletes old slips)
vacancies:SELECT(list vacancies)INSERT(create job posting:uid,title,description,requirements,department,status = 'open',closing_date)UPDATE(modify details, status; soft-delete withis_deleted = 1)
applicants:SELECT(list candidates)INSERT(add applicant:uid,vacancy_id,first_name,last_name,email,phone,resume_url,status = 'pending',notes)UPDATE(modify status, interview_date, notes)
users:SELECT(validate identities)
31. inventory.controller.js
item_categories:SELECT(list categories)INSERT(create category:uid,name,code,description,parent_id)
suppliers:SELECT(list vendors)INSERT(create vendor:uid,name,code,contact_person,email,phone)
store_locations:SELECT(list store spaces)
items:SELECT(list items)INSERT(create item card:uid,name,code,barcode,description,category_id,unit,purchase_price,selling_price,reorder_level,supplier_id)
item_stock:SELECT(current inventory balances list)INSERT(create stock row if missing)UPDATE(increment/decrement quantity)
stock_transactions:INSERT(record ledger transaction:uid,item_id,store_id,type,quantity,unit_price,total_amount,reference_number,supplier_id,notes,created_by)
item_issues:SELECT(issued items tracking list)INSERT(issue item:uid,item_id,issued_to_type,issued_to_id,quantity,purpose,return_due_date,notes,issued_by)UPDATE(return items: updatereturned_quantity,returned_date,status = 'returned'|'partially_returned',condition_on_return)
users:SELECT(join issuer profile)
32. library.controller.js
library_books:SELECT(catalog lists)INSERT(single and bulk book import:uid,isbn,title,author,category,publisher,year_published,total_copies,available_copies,shelf_location)UPDATE(modify book attributes, increase/decrease total/available copies; soft-delete withis_deleted = 1)
library_issues:SELECT(borrow logs history)INSERT(borrow book copy:uid,book_id,user_id,issue_date,due_date,status = 'issued',issued_by)UPDATE(return book: setreturn_date,status = 'returned'|'lost')
library_reservations:SELECT(booking reserves lists)INSERT(reserve copies:uid,book_id,user_id,notes)UPDATE(auto-fulfill when book is issued: setstatus = 'fulfilled'; cancel reservation: setstatus = 'cancelled')
library_fines:SELECT(fine accounts details)INSERT(fine citation:uid,issue_id,user_id,amount,reason,status = 'unpaid')UPDATE(pay/waive: setstatus = 'paid'|'waived')
users:SELECT(verify member roles)
33. marks.controller.js
assignments:SELECT(caching max score scales verification checks)
users:SELECT(caching student roles checks)
submissions:SELECT(find existing submission matching student/assignment)INSERT(create submission:uid,assignment_id,student_id,status = 'graded',grade,feedback,graded_by,graded_at)UPDATE(grade modification:grade,feedback,graded_by,graded_at,status = 'graded')
34. medical.controller.js
student_medical_profiles:SELECT(retrieve student health profile cards)INSERT(create profile:uid,student_id,blood_group,allergies,dietary_restrictions,contraindications,chronic_conditions,emergency_instructions,updated_by)UPDATE(modify profile settings, emergency contacts; update last modifierupdated_by)
student_medication_logs:SELECT(list administrations history)INSERT(record dispensation:uid,student_id,medication_name,dosage,administered_at,administered_by,reason,notes)
student_medical_history:SELECT(illness/injury history)INSERT(record diagnostic event:uid,student_id,event_type,description,severity,onset_date,resolution_date,treatment_details,doctor_notes,is_visible_to_teachers,reported_by)
users,parent_students,enrollments,classes:SELECT(verify student access scope boundaries)
35. messages.controller.js
messages:SELECT(inbox/sent directories index, conversations threads)INSERT(send direct/group/announcement message:uid,sender_id,recipient_id,body,subject,is_announcement,attachment_url,attachment_name,attachment_type)UPDATE(mark read:is_read = 1; mark delivered:is_delivered = 1; soft-delete withis_deleted = 1)
chat_groups:SELECT(conversations lists)
chat_group_members:SELECT(membership access checks)
clubs,club_chats,club_memberships:SELECT(extracurricular messages thread index)
users:SELECT(recipient search directories)
36. notices.controller.js
notices:SELECT(pinboard index, detail fetch with audience filters)INSERT(create notice:uid,title,content,category,priority,audience,is_pinned,created_by,expiry_date)UPDATE(modify notice attributes; soft-delete withis_deleted = 1)
users:SELECT(join creator names)
37. payments.controller.js
payments:SELECT(lists of invoices paid)INSERT(record transaction payment:uid,student_fee_id,amount,payment_method,transaction_reference,payment_date,created_by,sync_status = 'pending')UPDATE(modify notes details; soft-delete withis_deleted = 1)
student_fees:SELECT(check fee balances),UPDATE(incrementpaid_amount, modify status to'paid'/'partial')
users:SELECT(validate student name)
38. reports.controller.js
(Note: Completely READ-ONLY SELECT operations)
grades,attendance_new,student_fees,enrollments,users,classes,subjects:SELECT(aggregate term averages, attendance percentages, unpaid balances summaries)
39. schoolSettings.controller.js
school_settings:SELECT(get system details)INSERT/UPDATE(upsert global key-value preferences:setting_key,setting_value,category,updated_by)
40. settings.controller.js
settings:SELECT(list system configuration keys)INSERT/UPDATE(upsert preferences:key,value,category,description)
41. social.controller.js
posts:SELECT(feed index)INSERT(create social post:uid,author_id,content,image_url)UPDATE(modify post; soft-delete withis_deleted = 1)
post_comments:SELECT(comments for post)INSERT(post comment:uid,post_id,author_id,content)UPDATE(soft-delete withis_deleted = 1)
post_likes:SELECT(likes count checks)INSERT(like a post:uid,post_id,user_id)DELETE(unlike a post: remove row matching user/post)
users:SELECT(join author names)
42. staff-attendance.controller.js
staff_attendance:SELECT(attendance status details roster checklist)INSERT/UPDATE(bulk upsert checklist logs:uid,staff_id,date,status,remarks,marked_by,sync_status = 'pending')
users:SELECT(joining active staff names)
43. students-fees.controller.js
(Note: Completely READ-ONLY SELECT operations)
student_fees,fee_groups,fee_plans,student_fee_discounts,discounts,trip_payments,trips,users,parent_students:SELECT(scoped lookup of child balances, travel bookings, installment plans)
44. students.controller.js
(Note: Completely READ-ONLY SELECT operations)
users,parent_students,enrollments,subjects,grades,submissions,assignments,exam_attempts,exam_schedules,exam_groups,attendance_new:SELECT(academic dashboard grade averages, term attendance percentages, exam schedule bounds)
45. subjects.controller.js
subjects:SELECT(list classes courses)INSERT(create subject:uid,name,code,class_id,teacher_id,description,credit_hours)UPDATE(modify subject details; soft-delete withis_deleted = 1)
classes,users:SELECT(validate bounds)
46. sync.controller.js
- SyncEngine Tables:
- This controller initiates standard manual cloud sync cycles. Under the hood, the transaction engine targets all sync-aware tables having the
sync_statuscolumn (includingusers,grades,attendance_new,student_fees,expenses,visitor_logs,notices,assignments,classes, etc.). SELECT(fetch rows wheresync_status = 'pending')UPDATE(update target rows tosync_status = 'synced'orsync_status = 'conflict'upon completion)
- This controller initiates standard manual cloud sync cycles. Under the hood, the transaction engine targets all sync-aware tables having the
47. sysadmin.controller.js
(Note: Technical infrastructure telemetry and diagnostics)
audit_logs:SELECT(count active logins last 24h, list recent technical audit lines)
sqlite_master:SELECT(find tables containingsync_statuscolumn to verify conflicts)
48. teacher.controller.js
syllabuses:SELECT(list syllabus catalog filterable by subject)INSERT(create syllabus:uid,subject_id,title,description,file_path,version,created_by)
schemes_of_work:SELECT(list schemes)INSERT(create scheme:uid,subject_id,teacher_id,term,academic_year,content)
focus_points:SELECT(topic items catalog)INSERT(create focus point:uid,scheme_id,topic,objectives,key_concepts,resources_needed)
lesson_plans:SELECT(lesson plans details lists)INSERT(create plan:uid,teacher_id,subject_id,scheme_id,focus_point_id,date,topic,objectives,introduction,development,conclusion,assessment_method,homework,reflections)
departments,subjects_new,users:SELECT(verify teacher departments constraints)
49. transport-attendance.controller.js
transport_attendance:SELECT(attendance logs lists)INSERT/UPDATE(bulk upsert roll-call logs matching(route_id, student_id, date))
routes,users,parent_students,transport_allocations:SELECT(check active student allocations on route)
50. transport.controller.js
vehicles:SELECT(list vehicles catalog)INSERT(create vehicle:uid,registration_number,model,capacity,vehicle_type,fuel_type,status = 'active',description)
routes:SELECT(list routes catalog)INSERT(create route:uid,name,code,start_point,end_point,distance_km,estimated_time_minutes,status = 'active',description)
vehicle_routes:SELECT(active assignments catalog)INSERT(create assignment:uid,vehicle_id,route_id,driver_id,start_time = '07:00',end_time = '16:00',is_active = 1)UPDATE(modify vehicle/driver details)
transport_allocations:SELECT(active student passenger rolls)INSERT(allocate student passenger:uid,student_id,route_id,pickup_point_id,vehicle_route_id,fee_amount,effective_from,effective_to,is_active = 1)UPDATE(deallocate passenger: setis_active = 0,is_deleted = 1)
pickup_points:SELECT(list pickup locations)
transport_attendance:SELECT(list attendance)INSERT/UPDATE(bulk upsert attendance matching(route_id, student_id, date))
users:SELECT(verify drivers/students)
51. users.controller.js
users:SELECT(list directory, authentication detail fetch)INSERT(register user:uid,email,password,role,first_name,last_name,phone,is_active = 1,created_at)UPDATE(modify user details, profile_image, active status, reset password; soft-delete withis_deleted = 1)
parent_students:SELECT(check linkages)INSERT(link child student to parent:uid,parent_id,student_id)UPDATE(unlink student: soft-delete withis_deleted = 1)