- Library Borrowing School and Inventory Controls: Student and staff borrower lists and histories are limited to the signed-in school, and database text is safely escaped in the catalogue and history views. Borrowing now verifies active borrowers and prevents the same catalogue copy from being checked out twice at once.
- Library Management in the Admin Portal: Admin, Super Admin and Principal accounts can manage the library catalogue and borrowing records directly. Staff assigned the Librarian role retain access through their staff dashboard.
- Library Form Consistency: Catalogue search now has a readable full-size field, library inputs can use the shared admin field style, form controls include clear prompts, and delete confirmations identify the selected record.
- CSV Result Upload Workflow: Course, exam type, school year and grade selectors now use labeled, responsive, standard-height controls with clear selection prompts. The setup action and file upload remain distinct and retain their validation behavior. Removed an obsolete missing include that caused PHP warnings on page load.
- Staff Role Removal Confirmation: Removing a staff role now uses an accessible confirmation dialog that identifies the staff member and role, with cancel and Escape-key support.
- Family Link Removal Confirmation: Removing a parent–student link now uses a confirmation dialog that identifies both accounts and explains that the parent can request the link again. Approve and return-to-review actions remain direct.
- Family Link Audit Trail: Successful approvals, returns to review and removals now record the parent, student and link in the Activity Log.
- School Fees Payment Redirect: Recording payments and confirming receipts now uses a post/redirect/get flow with a session notice, avoiding late-header warnings after the admin page begins rendering and preventing duplicate submissions on refresh.
- Student Document Deletion Confirmation: Deleting an uploaded student document now uses an accessible confirmation dialog that names the file and supports Cancel and Escape before anything is removed.
- Portal Mail Deletion Confirmation: Deleting a message from either the inbox list or its detail view now opens one modal that identifies the subject and sender, with Cancel and Escape support.
- Shared Admin Delete Confirmation: Configuration lists, PIN management, room actions, parent links, module controls and payment verification now use the shared in-page confirmation dialog instead of browser popups. The shared dialog supports keyboard cancel and focus return.
- Student Document Safety and Session Filters: Document downloads and cleanup now stay inside the managed student-documents folder, file paths are not returned by the JSON endpoint, and uploads must match an allowed PDF or Word extension and content type. Session filters include every configured school year, and stored filenames display without their internal prefixes.
- School Fee Card Verification Safety: Verified card payments now create one receipt even if the balance changes during checkout, and repeat verification is idempotent. Student and parent verification is scoped to the correct account and child, payment references are harder to guess, and gateway currency and amount are validated before recording.
- Duplicate School Fee Checkout Protection: Only one unresolved card checkout can remain open for a student invoice. Wallet and staff-recorded payments are blocked while that card charge is unresolved, and pending checkout status is limited to the selected student, session, grade and term.
- Calendar Event Workflow: Create and edit forms preserve entered data after validation errors, use database-length limits, and log changes. Delete now uses an in-page confirmation modal instead of a browser prompt.
- Student Registration Date Filters: Student lists can be narrowed by registration date and sorted newest-first or oldest-first. Date ranges and sort order stay applied across search, grade/status filters and pagination.
- Admission Batch Validation and Save Errors: Admission batch names and applicant instructions now follow their database field limits, and failed batch creates or edits return a clear message instead of exposing a database exception.
- Staff Role Account Scoping: Staff lists, role filters and role changes now include the supported NYSC profile and select active staff account types, updating only the role currently matched to that staff record to prevent relation-ID collisions from affecting another account.
- Staff Archive and Login Actions: Staff archive and Login As Staff now use the linked staff account’s actual profile type. Duplicate account links are reported for correction, and Master Admin accounts are protected from archiving or impersonation.
- Parent Archive Account Scope: Archiving a parent now updates only the matching parent account type and relation ID, preventing unrelated login rows from being disabled if IDs overlap across account types.
- Student Delete Linked History Protection: Student profile deletion now stops when attendance, health, hostel, finance, wallet, LMS, document or delivery history is linked, preserving those records instead of leaving them orphaned. The confirmation explains this safeguard.
Release notes Each release below is a collapsible section. The current release is open; select any earlier release to read its changes.
v6.0 Fees, Admissions and Student Profiles Current
Class Activities Search and Status Filters
- Added title and description search plus Published and Hidden filters to the activity manager, and preserved the selected list state while editing or paging through posts.
- Filtered empty results now explain that no posts match and offer a clear-filters action. Validation errors while creating an activity reopen the create form.
- Newest Students Date Range and Paging: Registration date filters now show all matching students four at a time, with a result count and Previous/Next controls that keep the selected date range.
- Student Directory Table Layout: Student profile columns now keep consistent readable widths, with a contained horizontal scroll on narrower screens and compact row action buttons.
- Admin Profile Photo Fallbacks: Staff role assignments, student class management and hostel occupant lists now resolve saved photos safely and use the portal’s gender-aware avatars when profile photos are missing.
- Admission Photo Card Avatars: Candidate photo cards now use the portal’s verified photo resolver and gender-aware fallback avatar, preventing broken images when an applicant has no uploaded photo.
- Bed Space Editor Layout: The bed-space settings dialog now uses a responsive two-column form with consistent labels, inputs and action buttons, and displays validation feedback inside the editor.
- Admission Applicant Document Cleanup: When a pending applicant or batch is deleted, associated student-document files are now removed after the database transaction commits. Cleanup is restricted to the managed upload folder, and any file that needs manual cleanup is reported.
- Family Link Photo Fallback: Student photos in the parent and child relationship manager now use the portal’s verified photo path and gender-aware fallback avatar, including the full-size photo link.
- Default Fees and Room Filter Validation: Malformed grade, room page, fee-row and total IDs are now rejected safely in room assignment and default fee workflows, avoiding PHP type errors or unintended record selection.
- Calendar and Term Schedule Input Validation: Calendar event IDs and timetable session IDs are now validated as scalar values. Invalid edit, delete or save payloads cannot trigger PHP type errors or be coerced into another record.
- Parent and Class Assignment Input Validation: Parent assignment, student room assignment and class change endpoints now reject array-shaped IDs and flags with their normal validation responses before any records are changed.
- Academic and Fee Form Input Validation: Academic year and term simulation, term switching, and live/default fee component forms now reject array-shaped IDs cleanly before validation or database changes.
- Room Manager Input Validation: Malformed grade, room edit and delete IDs are rejected safely instead of raising PHP type errors or being coerced into another room ID.
- Student Document Request Validation: Malformed document filters, delete IDs and flash values are now handled safely, preventing array-shaped query or form values from breaking the page or delete flow.
- Wallet and Fee Grid Filter Validation: Malformed array or non-scalar grade, page, session and term filters now fall back safely instead of triggering PHP type errors in the wallet and school-fee grid. The fee-grid data endpoints also reject invalid IDs instead of interpreting arrays as ID 1.
- Admission Batch Edit Feedback: Batch edits now distinguish an unchanged batch from a batch that no longer exists, so stale edit requests no longer report a false success state.
- Admission Batch Modal Cancel State: Closing or cancelling the new-batch form clears its deep-link flag, so refreshing Admissions returns to the batch list instead of reopening a cancelled form.
- Staff Role Protection: Staff role changes now reject Master Admin grants and protect existing Master Admin accounts from changes through the regular staff form. Invalid role and pagination inputs return safe validation behavior.
- Staff Login Status Scope: Staff activation, archiving and profile password updates now target staff login records only, preventing shared numeric IDs from affecting parent or student accounts.
- Profile Form Output Escaping: Student and staff contact, photo, banking and demographic forms now escape stored values before rendering them into HTML, protecting profile editors from stored markup or script injection.
- Admission Photo Card Filter Validation: Invalid batch and grade filters now show a clear recovery message instead of raising a PHP type error or silently broadening the candidate list.
- Additional Payment Input Validation: Malformed category and classroom filter values now return safe validation states instead of causing PHP type errors in the additional-payments page.
- Pending Fee Payment Protection: School Fees Manager now highlights the amount awaiting confirmation, blocks another payment entry while a receipt is pending, and enforces the same protection on submitted requests.
- Atomic Graduate Reinstatement: Save a graduate’s admission status and current class assignment together, with a locked status recheck, so a failed class save cannot leave the student partially reinstated.
- Parent Password Reset Access: Limited parent password resets to Admin and Super Admin roles, validated active parent login records and password input, and returned through a one-time message to prevent accidental repeat submissions.
- Retired Legacy Parent Profile Handlers: Disabled obsolete parent profile and photo endpoints that accepted unchecked updates. Parent profile changes continue through the current validated profile page; direct requests to the retired routes cannot modify records.
- Activity Log Clear Flow: After a clear request, return to the Activity Log with a one-time result message so browser refresh does not repeat the POST action. Malformed array-valued filters now fall back safely instead of raising PHP type errors.
- Student Document Assignment Access: Restricted teacher document lists, uploads, deletions and direct downloads to students in the teacher’s current assigned classes, matching the class-sharing permissions.
Dashboard Student Registration Filter
- Added registration date range filters to the Newest Students panel, sorted matching students by their actual registration date, and added clear empty and error states.
- Fixed missing student photos in the dashboard panel by using the portal's verified, gender-aware avatar fallback.
- Legacy Student Profile Endpoint: Retired an obsolete profile mutation endpoint that accepted unvalidated form values and lacked role and CSRF checks, and removed its unused tutorial-form caller. Current profile forms continue using the protected student profile handler.
- Dashboard Summary Access: Required a valid active admin session before the dashboard summary endpoint loads student, staff, fee or message totals.
- Dashboard Summary Warnings: Buffered summary rendering so legacy count helpers can set response headers without generating warnings in the dashboard’s message totals.
- Dashboard Fee Summary: Removed unpaid and expired invoice rows that displayed placeholder text instead of calculated totals.
- Student Profile Modal Output: Escaped student names in every legacy profile modal heading so stored profile text cannot be interpreted as HTML or script.
- Staff Profile Output Safety: Escaped staff names in profile dialog headings, salary scale text, and page titles before rendering them as HTML.
- Hostel Occupant Record Resilience: Encoded occupant labels and image URLs, restricted stored photo paths to filenames, and skipped missing room-mate profiles instead of breaking the occupants table.
- Student Documents List Safety: Escaped session, term, date and description labels in the document list and constrained file-type icons to known safe classes.
- Class Document Teacher Permissions: Limited teacher-role accounts to the classes and sub classes assigned for each session, and allowed them to remove only documents they uploaded. Added upload field validation consistent with the staff workflow.
- Class Document Download Access: Restricted class-document downloads to authorized admin roles or the teacher’s assigned classes, blocked direct downloads when the module is disabled, and validated document identifiers before lookup.
- Staff profile reliability: Removed a stale bank-detail modal that loaded a missing PHP file, and fixed the staff photo preview to use the profile image safely. The default-fees action handles an unset grade without emitting PHP deprecation warnings.
- Staff entry year editing: Existing entry years now appear selected in the staff account editor, including legacy records stored with the session label, and unchanged submissions preserve the correct session ID.
- Student list pagination: Combined the local table and server pagers into one server-side pager, retained a rows-per-page choice of 10, 25, 50 or 100, and kept search and filters across page changes.
- Student list accuracy: Current students without an active-session class now show “No current class” instead of “Graduate,” and invalid or empty login timestamps display as “N/A” instead of 1 Jan 1970.
- Parent directory safety: Parent names, usernames, contact details and account-status codes are encoded before rendering, and missing or invalid last-login timestamps show “N/A.”
- Staff directory safety: Staff names, usernames, contact details, grade and room labels, and teaching subjects are encoded before rendering. Missing or malformed last-login timestamps display as “N/A.”
- Librarian role management: Corrected the displayed role name across library access assignment, removal, and confirmation messages while retaining the existing database role key.
- Admission route recovery: The retired admission setup URL now redirects to the admission batch list before page output, avoiding a headers-sent warning and providing a working route for old bookmarks.
- Admission batch creation: Reconnected the “New Admission Batch” action to its creation dialog. The form now opens from the batch list and supports a direct create-form link for navigation recovery.
- Admission form resilience: Malformed array values submitted for batch fields no longer trigger a PHP type error when the creation form reopens with validation feedback.
- Admission audit handling: Loaded the shared activity logger for admission actions and protected successful batch creation from audit-log failures, so a logging problem cannot leave a created batch looking like a failed request.
- Staff Timetable: Create and edit forms now show every configured period, leave unassigned slots blank, limit teachers to the current school and subjects to the selected grade, and let staff add or clear periods while enforcing permission, request-token, and timetable-clash checks. Request fields can no longer override the permission or school context.
- Admission Photo Card Printing: Print and Save PDF output now expands the responsive table wrapper, fits the candidate list to the landscape page, and keeps candidate rows together across page breaks.
- School Fees Audit Reliability: Failure to write an activity log no longer reports a committed manual payment or receipt confirmation as failed, which avoids misleading staff and duplicate retries. Failures to log rejected payment attempts are contained as well.
- School Fees Manager: Payment status and receipt confirmation filters are easier to find, with grade and classroom filters retained. Invalid grade/classroom filters now show a clear error rather than falling back to a broader list. Manual payment and receipt confirmation validate the request token, current session and term, and the student's enrollment in the filtered classroom before changing financial records; audit and confirmation messages use the student's database record. Student fee totals, receipt statuses and latest-payment details load in batches to keep large school lists responsive, and table status labels now match the summary filters. The legacy Payments page now matches the published Super Admin, Principal, and Bursar access rules, validates category, grade and classroom filters, binds classroom IDs in queries, correctly decodes fee-confirmation tokens, and scopes receipt confirmation to the selected records. The account menu now shows Current School Fees to Principals, matching their existing sidebar and grid access. Adding live fee components now checks the request token, validates selected records and prevents duplicates; result-checking fee updates also validate the user's role, request token, amounts and fee groups.
- School Fees Manager and wallet payments: Pending receipt totals are shown in the table and confirmation dialog, manual payment entry accepts whole Naira to match the integer receipt fields, and payment dialogs adapt to narrow screens. Wallet fee charges now lock the current enrollment and wallet, then recheck the outstanding fee and wallet balances inside the transaction to prevent concurrent requests from overspending or double-paying an invoice.
- Administrative Rooms: Room creation now preserves its success response when activity logging is unavailable, so staff are not prompted to retry an action that already completed.
- Student and Class Documents: Document endpoints now enforce the module switch and verify selected students, classes, rooms, sessions and terms. Deletes remove the database record before the file and report missing records accurately. Class uploads clean up files when saving fails, and audit-log errors no longer make a completed action look unsuccessful.
- Default School Fees: Opening a grade no longer creates missing term totals in the background. Missing totals start at the component sum and are saved only when the authorized user submits the validated, CSRF-protected fee form. The Add Fee Component dialog now uses a responsive form and validates the grade, session, term, amount and duplicate component name.
- SMS Center: Added request-token checks to message sending and recipient selection, so cross-site requests cannot trigger SMS sends or replace the stored bulk recipient list. The existing single and bulk sender forms include the same session token.
- Admissions: The landing page presents admission batches first, with a single clear entry point for creating a batch. Batches can now be edited or deleted when no student records reference them; linked history is protected. Opening applicants, closing or reopening a batch, and applicant actions remain available in their relevant views. Applicant deletion and batch cleanup retain records with report-card or Online Exam attempts/reviews so academic history stays linked, and lock pending profiles while cleanup runs to avoid deleting a student admitted concurrently. Stale actions report when a batch no longer exists. Batch inputs and interview times are validated, applicant admission checks the selected grade and room, committed batch updates and deletions remain clearly reported if audit logging fails, and failed requests show a readable message.
- Student Profiles: Student search now uses safe parameterized filters across names, registration numbers and mobile numbers, with accurate counts and results across grade, room, graduate and other-student views. Large lists are paginated consistently, and grade/room navigation preserves the active search. Student deletion, report-card removal, sign-in-as-student and parent assignment now use verified POST actions with CSRF protection and clear return feedback. Parent names in the assignment dialog are displayed as text. Student records continue into the detailed profile. Permanent deletion is blocked when report-card results or Online Exam attempts/reviews exist, preserving linked academic history.
- Staff and Parent Profiles: Verification, archiving and sign-in-as-staff now submit verified POST actions with CSRF checks and clear return feedback. Parent profile edits, child unlinking and password resets validate request tokens, and password resets target only parent login accounts. Large staff and parent lists use 100-record pages with corrected page offsets instead of loading up to 1,000 rows at once.
- Personal Notepads: Staff and students can create, edit, view and delete only their own notes. Note actions now validate session request tokens, note IDs and ownership.
- Staff Homework: Homework deletion now uses a CSRF-checked POST and is restricted to the signed-in teacher's records.
- Admission cleanup: The batch cleanup action is disabled and labeled clearly when no pending applicants exist, preventing an unnecessary destructive-action prompt.
- Staff Class Notes: Deletion now requires a confirmation and CSRF-checked POST, verifies the note belongs to the signed-in teacher, and safely removes its file only after the database deletion succeeds.
- Staff Credit Score: Marking a student as not promoted now requires a CSRF-checked POST, validates the reason and class enrollment, blocks duplicate entries, and reports save failures clearly.
- Credit Score context: Year and grade parameters are now shape and record checked before the score sheet loads, so missing, malformed or nonexistent selections show a clear response instead of triggering warnings or empty queries.
- Student profile permissions: Student edit buttons now appear only for the same roles accepted by the profile save handler, avoiding edit actions that would fail for read-only roles.
- Principal report comments: Individual comments now require the signed-in Principal role, a session request token, and an active-term report card. Bulk comment generation uses a confirmed, one-use POST action, the subject-report shortcut opens the working report-card view, and report initialization now uses a role-checked POST with duplicate protection.
- Portal Settings: Opening the settings page no longer silently rewrites configuration descriptions; the same friendly labels are rendered without a database write.
- Staff Homework workflow: Teachers can edit their own assignments, and create/update and class lookup requests verify a session token. Subject, grade, room, due date and attachment inputs are validated; replacements and deletions clean up old files, and empty filtered lists explain how to add homework.
- Personal Calendars: Staff and students can add, edit and delete their own events. Saves validate dates and approved colours, use bound database values and require a session token; edit and delete actions check event ownership.
- Payment Categories: Added a category manager to Payments with create, rename and activate/deactivate controls. Inactive categories stay linked to past receipts, and the manager explains when the category list is empty.
- Payments empty state: Grade and classroom filters now appear only after an active payment category is selected. When no category is active, the page explains how to configure one instead of offering filters that lead to an empty view.
- School Shop: Staff can add, edit and safely remove unused sales items and locations; receipt-linked items and locations still in use are protected. Item and location forms validate inputs and verify requests, empty tables show a clean prompt, and successful changes refresh the list. Student checkout uses the saved price and live stock, checks the wallet and inventory in one transaction, and reports when an item sells out or the wallet balance changes.
- Hostel Applications: Bed requests now use the signed-in student's current class, gender and academic period, reserve a matching bed under a transaction lock, and prevent duplicate allocations. Fee payments use the configured fee and current wallet balance, then debit the wallet, create the receipt and confirm the allocation atomically. Expired reservations are released safely, pending or paid status is clear, and broken allocation links cannot trigger a second reservation.
- Safer fee actions: Manual payment and receipt confirmation validate their submitted context before updating financial records, and successful changes are recorded in the activity log where supported.
- Admissions and family links: Applicant class, room and registration controls use consistent sizing and alignment, and module redirects work after the shared admin header loads. Parent & Child Map groups each family in a full-width parent card, arranges children four across on wide screens with responsive narrower layouts, prioritizes parents with pending requests, and supports server-side search, status filters and pagination for large schools.
- Internal Portal Mail: Read, delete and reply actions validate the request; marking a message read or deleting it uses POST with a CSRF token. Sender records that have since been removed no longer break the message view, public replies use the configured SMTP sender and correct reply content, and mail history pages use consistent 100-message pagination.
- Discussion History Review: The admin post list now pages through records in groups of 100, opens post details and comments with validated identifiers, safely displays contributed text and photos, and omits retired-endpoint error responses from the review list.
- Calendar and Student Documents: Calendar create, edit and delete actions now use CSRF-checked POST requests, validated dates and colours, and bound SQL parameters; the edit form retains the event’s current colour. Student document deletion now uses a confirmed, CSRF-checked POST request instead of a destructive link.
- Family Link Layout: Each parent remains a full-width family card, with children arranged four across on wide screens, three across on medium screens, two across on smaller screens and one per row on phones. Parents with pending confirmation appear first. Parent results are paginated in groups of 12 with Previous/Next navigation, server-side search and status filters for large school populations. Malformed IDs and filter values are rejected safely.
- Parent & Child Map: Links removed by a parent are labeled accurately and can be filtered and reviewed separately from pending and approved family links.
- Wallet Management: Wallet credits, wallet creation, freezing and unfreezing now require a valid request token. Wallet creation confirms the student record exists, and crediting locks and verifies the target wallet before updating its balance.
- PIN Management: Wallet, result-check and registration PIN generation now validates the selected type, quantity, price and description, checks a request token, and creates each batch transactionally so a failed batch does not leave partial PINs. The Set as used and Delete controls now perform their stated actions with request verification and delete confirmation. Malformed PIN IDs, page numbers, and request tokens are rejected safely. The PIN list now has one server-side pager, clear result counts, and search within the current page.
- Roles & access guide: Clarified that administrators assign librarian access while assigned staff manage the catalogue, and that WhatsApp result-delivery credentials are restricted to Super Admins.
- Staff role assignments: Bulk role changes now save in one transaction, including staff role flags that are blank, and audit-log failures no longer hide a completed assignment or removal.
- Hostel access: Restricted hostel and bed-space management to Super Admins and Principals. The sidebar, module pages and direct bed-space endpoint now enforce the same roles.
- Installation access: Repaired the legacy Installations route with a link to the existing setup guide, and restricted portal installation and academic-year setup to Super Admin accounts.
- Online Exams access: The CBT list, exam editing, questions, audience, results and JSON result actions now enforce the same Super Admin, Principal, Vice Principal and Student Manager access shown in the sidebar. Schema provisioning and global staff-result policy controls are Super Admin only, and exam pages no longer attempt database schema changes for other roles.
- Student Class and Admission Status: Class changes, admission status updates and class regularization verify the administrator role and request token. Student, grade, room and admission-status identifiers are validated, classroom ownership is checked, and record changes use bound database parameters. Malformed array values in applicant admission requests now return a validation response instead of raising PHP type errors. The grade and room filters use validated values, student lists are limited to the active school year, and displayed student details are escaped safely.
- Student Profile Editing: Name, registration/account, contact and photo edits now require the student-management request token and an authorized admin session. Profile updates use bound SQL, validate dates, email and selected records, prevent duplicate usernames or email addresses, and report expired requests clearly.
- CSV Result Upload: A downloadable template now documents registration, term, exam, up to four CA scores and comment columns. Uploads verify the request token, selected records and student enrollment; apply grade-specific score limits; skip duplicate or invalid rows; and save valid results transactionally with clear imported and skipped counts.
- Duty Roster: Fixed the roster list query, corrected duty page links and pagination, escaped displayed notes and staff details, repaired duty creation feedback, and changed deletion to a CSRF-checked POST action with confirmation. Fixed edit options failing when the assigned staff member was already selected, and added an inline confirmation that works without modal JavaScript. Summary counts now refresh after creating or deleting an assignment.
- School Term Settings: Term creation, editing and deletion now validate the 40-character name limit and use prepared SQL; all write actions require a session CSRF token, and deletion uses POST with a reference check. Editing a term without changing its name is accepted, and successful changes redirect safely with clear feedback. The session/authentication check now runs before the settings frame writes its HTML.
- Class Period Settings: Fixed period creation to execute the correct insert query, added CSRF-checked POST actions and prepared SQL for writes, validated the period and description lengths, and protected periods assigned to duty rosters or timetables from deletion. Changes redirect with clear success feedback.
- Attendance Code Settings: Repaired the edit lookup, made create/edit/delete use CSRF-checked POST requests and prepared SQL, prevented removal of codes in attendance history, validated the 50-character limit, and added clear save feedback.
- Exam Type Settings: Built-in result types 1–3 now show a locked status instead of edit/delete controls, preserving report-column order. Custom type changes use CSRF-checked POST requests and prepared SQL; types referenced by saved results cannot be deleted, and success feedback is clear.
- Ethnicity Settings: Add, edit and remove actions now validate names and IDs, use prepared SQL and CSRF-checked POST requests, block removal when student profiles reference the value, and show clear success or error feedback.
- Classroom Settings: Fixed the broken room deletion reference checks, require CSRF-checked POST requests for changes, validate room names and IDs, preserve existing grade assignments when renaming, create new general room labels with grade 0, and prevent deletion while enrollments, timetables or class activities use a room.
- Subject Settings: Repaired subject creation with the required grade and description fields, aligned name and code limits to the database, use prepared SQL and CSRF-checked POST actions, prevent duplicate subjects and codes, and block deletion while results, timetables, homework or online exams reference a subject.
- Title Settings: Added validated, CSRF-checked POST create/edit/delete actions and prepared SQL, enforced the database’s 15-character limit, and prevent title deletion while student, staff, parent or contact records use it.
- Name Suffix Settings: Added validated, CSRF-checked POST create/edit/delete actions and prepared SQL, enforced the 10-character database limit, protected the “--” placeholder, and prevent removal of suffixes assigned to student profiles.
- Relationship Settings: Repaired the invalid relationship reference check and protect relationships assigned to student contacts or staff next-of-kin records. Create, edit and delete now validate inputs, use prepared SQL and CSRF-checked POST requests, and report results clearly.
- Health Code Settings: Create, edit and delete now validate names and IDs, use prepared SQL and CSRF-checked POST requests, and protect codes referenced by health history. Success and validation feedback is visible.
- Allergy Code Settings: Replaced legacy GET deletion and unsafe writes with validated, CSRF-checked POST actions and prepared SQL, and protect allergy codes referenced by allergy history.
- Medicine Code Settings: Fixed the deletion check to use the actual health history medicine columns, protect medicines referenced in either medicine slot, and secure create/edit/delete with validation, prepared SQL and CSRF-checked POST requests.
- Immunization Code Settings: Create, edit and delete now validate names and IDs, use prepared SQL and CSRF-checked POST requests, and protect codes referenced by immunization history.
- School Year Settings: Create/edit/delete now use validated, CSRF-checked POST requests and prepared SQL. New years and all three term-day defaults are created in one transaction. Deletion checks 27 current and historical year references, current-year removal is blocked in both the UI and handler, and labels follow the existing consecutive YYYY/YYYY format.
- Library Catalogue: Replaced the obsolete “under development” page title with a clear notice that library administration is assigned through staff roles.
- Library staff workflows: Catalogue create, edit and delete actions and borrower create, return and delete actions now use real session CSRF tokens, validate input and record IDs, and bind values in SQL. Catalogue books with borrowing history cannot be deleted. Borrower records take school, year and user identity from the signed-in session, and changes are scoped to the current school and borrower type.
- Classroom Management and Activity Log: Room names save with bound SQL and a verified form; removing an unused room now requires a CSRF-checked confirmation and checks existing student and teacher assignments. Room, grade, session and teacher details are escaped before display, and teacher lookup uses bound values. Clearing the activity log also validates a CSRF token and reports failures.
- Room Creation and Editing: Create and rename forms now enforce the database’s 35-character room-name limit, prevent duplicate names within a grade, and show the selected grade as the creation default. A successful room creation refreshes the assignment list so the new room is available immediately.
- Hostel setup: Hostel records can be created without an optional image, while invalid image uploads still receive a clear validation error. Hostel image links now resolve both current uploads and legacy image locations, with a working default image when no file exists.
- Hostel edit accuracy: The saved hostel type, occupant ability and faculty/grade now remain selected when the settings form opens, preventing a location edit from silently changing eligibility settings.
- Academic Adviser Assignments: Replaced repeated student dropdowns in every staff row with one searchable multi-select assignment dialog. Teacher lists now use 50-record server pages with working navigation. Assign and remove actions validate the staff role, CSRF token, active enrollment and existing assignment before changing records, use explicit POST action fields, and safely handle malformed IDs. Audit-log failures no longer interrupt assignment results. The public roles guide lists access for Super Admins, Principals and Vice Principals. The teacher-group count is now labeled separately from the table’s current-page count.
- Module and Term Controls: Plugin activation/deactivation and term switching now use CSRF-checked POST requests. Term IDs are validated against the available terms, plugin changes remain transactional, and old direct-action links no longer modify settings.
- Class Activities: Creating, editing, publishing, hiding and deleting class activities now require a valid session token, while the existing staff and class ownership checks remain in force.
- Staff Roles: Role assignment and removal require a valid session token, verify active staff and existing assignments, and escape staff details. The overview links the six supported staff-permission groups directly, filters out staff already assigned to a role, and shows accurate group counts without opening extra database connections.
- Term Day Settings: Saving session dates and notes and repairing missing term setup now require a valid session token; opening a repair link no longer changes records through GET.
- Term Day Data Validation: Invalid session IDs cannot create orphan term-day rows. Date validation rejects blank and impossible dates, vacation cannot precede resumption, and term-day values must be whole numbers from 1 to 366. Legacy empty-date placeholders display as “Not set,” and incomplete sessions are labeled for setup.
- School Calendar: Empty calendars render cleanly; event status now shows upcoming, in progress, completed or dates needing review. Editing preserves the saved date and colour, and calendar event titles are safely encoded before rendering.
- Admission applicant recovery: Pending profiles without a linked login now appear in batch counts, applicant lists and photo cards. They can be reviewed or deleted, while admission is disabled until the missing login is restored; batch cleanup now includes these orphan profiles. If two admission requests race for the same registration number, the database constraint is translated into a clear retry message.
- Learning Management System: Course, lesson, material, assignment, quiz, question and grading changes now validate a session token on every POST form, including course publishing, archiving and deletion.
- WhatsApp Result Blast: Creating, preparing, clearing, regenerating and sending result blasts, retrying failed sends, and importing WhatsApp numbers now require a verified page token as well as the existing role permissions. Import columns are checked before updating records.
- Online Exam Question Bank: Creating, editing, deleting and importing questions from the global bank or an exam now require a valid session token. Invalid question or exam identifiers receive clear feedback instead of reaching an unintended action.
- Portal Settings: Document labels, result display options, portal controls, API credentials, WhatsApp settings and General Configuration saves require a session token. API control actions are scoped to the selected setting type and signed-in role, WhatsApp credentials resolve through their fixed integration key, and saved API secrets are no longer exposed in page markup. General Configuration page loads no longer write data, all settings values use bound SQL, and state/date inputs are validated with the date picker using day/month/year. Blank API secret fields retain the saved value.
- Email Center Security and Send Recovery: Bulk and single email actions, including recipient generation and preview, require an authorized Email Center role, POST requests and a session-bound request token. Single-email form values are escaped on restore, and opening a bulk composer clears a stale recipient selection. Bulk sends now wait for the server to finish instead of timing out after 15 seconds, and failed recipients can be retried from a dedicated Retry failed only button without resending successful deliveries.
- Legacy Speaking Hours route: The old standalone page no longer accepts direct URL-based changes or unprotected form actions. Existing links now open the current Staff Duty Roster, where updates and deletions use the protected workflow.
- School Fees grid editing: Active status changes now save through the validated fee handler, and the nonexistent School field has been removed from fee-grid views. The retired grid’s update URL uses the active editor’s POST, authorization, CSRF and field validation. Both grid views validate filter IDs before building loader URLs, and the legacy fee loaders now bind their filter values correctly.
- Parent & Child Map actions: Approve, return-to-review and remove actions now use a refresh-safe post/redirect flow that preserves the selected filter and search. Feedback is shown after the redirect, preventing accidental repeat submission when the page is refreshed.
- Online Exam Management: Exam create, list delete, detail editing, schema updates and staff result-control changes now require a valid session token. Exam IDs, subjects, numeric settings, statuses and date ranges are validated before an edit is saved; malformed URL IDs no longer coerce silently, and redirect messages display once on the exam list instead of appearing on a later page. Results actions now require a valid session token and validate IDs, selected-attempt arrays, scores, notes and confirmation fields before import, review, transfer, correction, rejection or reset through either form or JSON requests. Admin exam edits now attribute audit entries to the portal session user ID. Schema failures display as errors instead of success alerts, the rich-text exam instructions editor now initializes correctly, and active exams missing questions or an eligible audience display a setup warning with direct links to finish configuration.
- School Profile: Profile edits, login-background changes, and result-signature uploads now validate the administrator request token. Logo and badge uploads also require administrator access, validate image content and size, use safe generated filenames and update the selected image field with a bound query. Failed background uploads no longer delete the current background first.
- Grading Configuration: CA scoring, grade/comment boundaries, principal comments and cognitive-domain changes now verify the administrator session token before saving.
- Profile Detail Actions: Login-as-student and login-as-staff now work from detailed profile pages through the same CSRF-verified POST workflow as the profile lists, replacing stale GET links.
- Student class-list printing: Printing is limited to authorized admin and principal roles; grade and room selections are validated, room filters use bound SQL parameters, and missing student login records no longer break the print view.
- Class Room Assignment: Student lists now use correct 100-student pages with grade filters preserved. Room changes validate the student enrollment, selected grade and room, and session token; repeated clicks no longer submit duplicate updates. Creating rooms also verifies the request token and grade.
- Class Documents: Admin and staff uploads and deletes verify a session token before sharing or removing files. Staff can switch academic sessions to see the classes and shared documents for that year; uploads validate the selected session and term, remain limited to assigned classes, and remove the stored file if saving its record fails. Staff can delete only documents they uploaded.
- Legacy admin links: Replaced unfinished Library and Forum messages with links to the current librarian-access and discussion-moderation workflows. Unknown admin routes now explain that the page is unavailable and provide a route back to the dashboard or module list.
- Student Wallet: Wallet student lists now number 1,000-record page groups from the first group, include the final partial group, clamp invalid page selections, and retain the selected grade and page after wallet actions.
- Wallet management: Wallet creation, freezing/unfreezing and credits now use CSRF-checked requests, transactional updates and clear refresh-safe success messages. Credits validate the wallet, whole-Naira amount, method, note length and balance limit; audit failures no longer make a committed credit appear unsuccessful. Grade-filtered wallet lists avoid duplicate students when enrollment rows repeat.
- Online Exam audiences: Admin and staff audience editing now validate every row, grade and room ownership, dates and result components before saving the batch atomically. Staff changes require a session token; malformed requests and invalid exam IDs receive clear feedback, and audit logging cannot make a committed change appear unsuccessful.
- Hostel records and images: Names and locations now match the database’s 50-character limits. Duplicate names are checked before an image is uploaded, stored image names are generated safely, and failed hostel saves remove the new image. Replacing an image removes the old file only after the settings save succeeds.
- Hostel overview: Reorganized the hostel list into standard columns for hostel, spaces, occupancy, eligibility, location, fees, status and actions. Reduced oversized controls, grouped actions into a responsive toolbar, and made Bed Spaces, Occupants and All Hostels direct links. Tables fit desktop screens without page-wide horizontal scrolling. Hostel fee displays now distinguish an explicitly saved ₦0.00 fee from a term whose fee has not been set.
- Quick forms: Hostel creation, series creation, room/bed-space additions, fee setup and settings open in compact dialogs with consistent Save/Cancel controls. The bed-space editor’s Cancel button now matches the Save button and closes the dialog without reloading the iframe. Validation and save results keep the relevant dialog open so feedback is visible. Saved fees can be cleared for the current hostel and session with an explicit confirmation.
- Safer room setup: Series and room choices are limited to the selected hostel, generated room/space inserts run atomically, and fee changes save for all terms together.
- Bed-space editor: Loads the selected space's current values from the database, fixes the Open/Closed selector, saves settings with bound parameters and blocks deletion while any allocation record refers to the space. The Cancel button now matches the save control and closes the editor; successful updates and deletes close it, refresh the hostel list and show a confirmation.
- Safer hostel changes: Creating hostels, editing settings and fees, adding rooms or bed spaces, deleting hostels or bed spaces, and clearing reservations require a valid session token. Bed-space settings validate selected type, ability and grade records, and save feedback now reflects the database result. Hostel, fee, allocation, student and bed-space lookups use bound parameters. Successful hostel series, room, bed-space, fee and settings changes now return to a clean page with a confirmation, avoiding accidental repeat submission on refresh. Clearing reservations leaves active student allocations intact.
- Hostel request validation: Hostel and bed-space screens now reject malformed array values in IDs, actions, and numeric settings safely instead of raising PHP type errors.
- Hostel bed-space session checks: The embedded bed-space manager now applies the portal’s configured session timeout, falls back to the portal default when configuration is unavailable in the include context, and refreshes session activity after an authorized request.
- Appearance settings session checks: Portal color updates now validate the session timeout safely, distinguish expired sessions from role denials, and refresh session activity only for authorized accounts.
- Library and class document session checks: Library records and class-document actions now reject expired admin sessions and refresh activity only after a valid read or CSRF-verified request.
- Duty roster validation: Add and edit actions now reject malformed form values, confirm staff/day/period records before saving, and limit new assignments to active staff. Existing assignments to inactive staff remain editable so they can be transferred safely. The public roles guide lists duty-roster access for Super Admins, Principals and Vice Principals.
- Duty roster workflow: Add, edit and delete now use CSRF protection, term-scoped database changes and refresh-safe redirects. Validation reopens the correct form with entered values preserved, duty notes accept up to 2,000 Unicode characters, and an empty roster explains how to add the first assignment. Audit logging failures no longer make a completed change appear unsuccessful.
- Staff profile validation: School, class, entry year, subject, staff ID and username values are checked against valid options and database limits before saving. Room options are loaded with validated IDs and escaped labels.
- Staff photo uploads: Only valid JPEG and PNG images are accepted, with random server-generated names and safe size checks. The saved profile image is updated before an older managed upload is removed, and failed saves clean up the new file.
- Student profile safeguards: Registration number, username, email and personal details now respect the database field limits, with duplicate registration numbers rejected before saving. Profile edit values are escaped, phone fields preserve leading zeros, new passwords are masked, and unchanged submissions no longer create misleading audit entries.
- Occupant view: Removed unavailable placeholder actions, handled missing student/class records safely, and limited roommate results to students in the same room and series for the current period.
- Grade settings: Grade creation, editing and progression updates now validate inputs and use CSRF-protected POST requests. Deletion checks grade references across student profiles, enrollments, results, attendance, fees, rooms, teaching, exams, hostels and related modules, preserves linked records, and safely reconnects the progression when an unused intermediate grade is removed.
- School configuration lists: Infraction codes, bank names and multi-school names now use validated, CSRF-protected create/edit/delete workflows with prepared queries and duplicate checks. Removal is blocked when the code or bank is referenced, and new school names receive all required default configuration fields.
- Banned words settings: Replaced direct SQL interpolation and GET-based deletion with validated, CSRF-protected POST actions. Duplicate words are checked, displayed values are escaped, and add, edit and delete results use refresh-safe feedback.
- School logo and badge uploads: Fixed the iframe form to send the required CSRF token, added session and role checks before output, restricted the file picker to supported image formats, and safely encoded current image filenames.
- Admin list pagination: Table totals now use an exact row count, offsets accept only nonnegative integers, current page links override stale cookies, and offsets beyond the last page return to the last available page. This prevents broken counts, empty lists after deletions, and overlapping rows between pages.
- School Calendar Refresh Safety: After adding, editing or deleting a calendar event, the page now redirects to a clean calendar view with a one-time status message. Refreshing no longer repeats the submitted change.
- Class Room Grade Filter: Grade chips on the sub-class room manager now stay on that page and filter the room list to the selected grade. Grades without extra rooms show a concise empty state with a direct add-room action.
- Room Assignment Feedback: Previous-room names no longer repeat, and the previous classroom is looked up from the prior configured school year. New room forms inherit the selected grade, successful assignments update the visible classroom immediately, and empty grade lists explain why there are no assignments to make.
- Room Edit and Delete Refresh Safety: Successful room edits and deletions now return to the selected grade with a one-time status message, avoiding duplicate submissions and misleading repeat-action errors on refresh.