Changelog
Notable changes to the KLASSCI platform, grouped by month.
The format loosely follows Keep a Changelog.
This file is curated by hand from the release log. Minor fixes, internal refactors, and infrastructure changes aren't always listed. For the full technical history, check the repo's git log.
July 2026
Added
- KLASSCI multi-universe architecture (
/,/universite,/college,/lms): the homepage becomes a hub that routes visitors to KLASSCI University, KLASSCI College and the future LMS. The University landing remains available on its own route, College gets a product presentation with desktop and mobile interfaces, and the Fumadocs architecture is prepared for each universe.
Improved
- Stronger social SEO: dedicated metadata per universe with OpenGraph, Twitter Cards, canonical links and FR/EN alternates for WhatsApp, Slack, LinkedIn and X previews.
June 2026
Added
-
Premium redesign of the grade detail page (
/esbtp/notes/{id}) — the single-grade detail page adopts the KLASSCI premium design: gradient hero with the student's identity and the assessment, at-a-glance KPIs (raw score, score out of 20, honors mention, assessment type) and a "Result" panel with a level-colored score, comment and traceability (who entered it, last edit). -
More readable audit log (
/esbtp/audit) — entity types shown in the audit log, per-user activity and PDF / Excel exports no longer display a technical prefix: you now read "Note", "Student", "Payment" instead of technical labels. -
OHADA Cash Reconciliation module (
/esbtp/comptabilite/reconciliation) — full bookkeeping workflow that reconciles physical cash on hand vs. recorded payments in 6 steps (draft → review → approval with separation of duties → close with payment lock → official signable PV PDF, archived 10 years). Per-mode cash count entry (cash, mobile money, wire transfer, cheque, Wave, Orange Money, MTN MoMo, Moov Money) with automatic discrepancy detection and a premium resolution wizard offering four actions: create a corrective payment, adjust an existing payment, cancel a payment, or accept the discrepancy with a justified reason. A "View transactions" button on each mode card lets the accountant tick off line by line against the merchant portal, with a direct link if the portal URL (Orange Money, MTN MoMo, Moov Money, Wave) is configured in Settings. Health dashboard embedded in the Accounting page with a red alert banner whenever a session has been open for too long, KPIs (overdue sessions, drafts + in review, days since last close, % of sessions with no discrepancy over 90 days). Email notifications sent automatically every morning at 8 AM to users who can open a reconciliation. Fully configurable per school (daily / weekly / monthly frequency, discrepancy tolerance threshold in FCFA, merchant portal URLs, overdue delay). -
SAARI / Sage Ligne 100 accounting export (
/esbtp/paiements) — new Excel export format compatible with the Sage Ligne 100 BNI BKE layout, configurable per school (journal code, default account, fee-category → SAARI account JSON mapping, tenant colors for headers). The export faithfully reproduces the structure Sage expects, with a visible thead row and column labels that match. -
Premium redesign of the Payments page (
/esbtp/paiements) — KLASSCI gradient hero, clickable KPIs that instantly filter the list (total collected, validated payments, pending, rejected), infinite scroll instead of classic pagination, subtle animation on new rows, premium pickers everywhere (zero native select). -
Premium redesign of the Bulletins page (
/esbtp/bulletins) — gradient hero, modern click-row table to open a bulletin, bulk actions (publish, export, email the whole class), AJAX without page reload. -
Premium redesign of the Students page (
/esbtp/etudiants) — modern click-row table, infinite scroll, premium edit modal to quickly tweak a student without leaving the page, bulk corrective actions (class reassignment, matricule update, archive). -
"Universal dropdowns" saga — cross-cutting technical rule that guarantees every dropdown menu always renders above all other content (cards, modals, hovered KPIs, gradient hero), everywhere in the platform. No more menus clipped at the viewport bottom or hidden behind a neighbour.
Improved
-
Yakro bulletin PDF — enlarged font for better legibility, optimized A4 layout (reduced margins and padding, mojibake "Matière" → "Matière" fixed, info rows in a 2-column label/value table), everything now fits on a single A4 page with mentions in a 2-column grid, compacted results and statistics tables, signature and stamp zone with breathing room. The ministry name becomes a configurable multi-line field (no more "Recherche Scientifique" repetition).
-
S1 / S2 coefficients tracked separately — distinct per-semester coefficient management (each subject can have a different coefficient in S1 vs. S2) with copy across periods (override/merge preview with confirmation) and an enriched coefficient modal (inline S1/S2 switch, completion gauge showing how many subjects are configured, preview of changes before applying).
-
Subject configuration redesigned premium (
/esbtp/config-matieres) — full redesign, S1 / S2 / Annual switch as AJAX without reload, copy modal across periods, immediate propagation to the active class. -
5-tier attendance scale — the attendance grade becomes more nuanced (instead of a binary bonus/penalty, 5 configurable tiers) with a full premium redesign of the absences edit page (
/esbtp/absences/edit). -
Formal accounting audit — full audit of the Accounting module (dashboard KPIs vs CLI vs UI, safeguards, rendering perf) which revealed and fixed 5 production bugs before any school had to report them.
Fixed
-
Coordinator attendance dashboard made reliable (
/coordinateur/attendance-dashboard) — some indicators (closed sessions, sign-in rate, alerts for unclosed sessions) could stay at zero or empty following an internal change. They now show the correct values again. -
Absence justification processing page accessible again (
/esbtp/attendances/justifications) — the screen listing justifications to process returned a not-found page; it now opens normally. -
Student-side notifications — fixed an error message that could appear when opening the notifications bell for a student.
-
Grades visible before the report card is generated (
/esbtp/etudiants/{id}) — on a student's profile, the Academic tab showed "No grade recorded for this year" until the report card was generated, even though grades already existed. Provisional results computed from the entered grades now show (clearly flagged as provisional) and are automatically replaced by the official report card once it is generated. -
Free decimals in fast grade entry (BTS and LMD fast entry, single grade edit, Notes page, teacher dashboard, external grading) — the grid was blocking any decimal other than 0.25 / 0.50 / 0.75 (impossible to enter 11.44 or 12.23). Every entry view now accepts free decimals in French format (the backend and the DB already supported that precision).
-
Grade draft banner (
/esbtp/notes) — the "Unsaved draft detected" banner now correctly disappears after saving and no longer reappears when reopening the modal for the same class / subject / period. -
Personnel page (
/esbtp/personnel/unified) — the "New staff member" dropdown in the hero was clipped by the section below and a KPI was rendering on top. Hero refactored to free the menu from the surrounding stacking contexts. -
Universal dropdowns — menus are now teleported to the page root on open to escape stacking contexts created by some parents (cards, modals, gradient hero).
-
BTS common trunk — hierarchical fallback — if no orientation target is configured, the class climbs to its parent track to surface the right specializations.
-
Bulletin — canonical training type resolution — the training type (BTS, LMD, etc.) is now resolved consistently across the subject configuration, the bulletin and the global subject.
-
Results page — query refactor (union instead of an indirect join that was buggy) and arithmetic-average fallback when coefficients are not yet configured.
-
Absences edit — fixed the 500 crash on open (missing internal method) and a Blade rendering bug that prevented saving.
-
Special bulletin routes (
/esbtp-special/bulletins/*) — now open to the "Configure bulletins" permission (customizable-roles rule: no hardcoded role), instead of being reserved to a fixed role. -
Subject configuration — the S1 / S2 switch was missing a selector on
<button>elements (only<a>was wired), fixed. The coefficient modal now shows a "Saving…" state on the Save button. -
Subject create page (
/esbtp/matieres/create) — the JavaScript was never loaded on the page (wrong Blade directive), fixed.
Security
-
Post-reconciliation lock — validated payments included in a closed reconciliation session can no longer be modified, cancelled or deleted, except through an explicit superAdmin override (always journalled). Permission
comptabilite.reconciliation.bypass_lockrequired and traced in the audit log. -
OHADA separation of duties on reconciliation — the user who opens a reconciliation session can no longer approve it themselves (configurable per school via setting
comptabilite.reconciliation.require_separation_of_duties, enabled by default to align with the OHADA standard). -
"Manage enrollment specialization" permission introduced instead of a hardcoded role on the BTS common-trunk workflow — every school now picks which role gets the post-common-trunk specialization (customizable-roles rule: no extra hardcoded role).
May 2026
Added
-
LMD-aware class create / edit form with automatic BTS/LMD switch (
/esbtp/classes) — when you pick a Licence, Master or Doctorate level, the form automatically switches into LMD mode with a distinct panel: premium Mention picker grouped by Domain (Legal Sciences, Humanities, Life Sciences…) with live search and a secondary domain chip, read-only Domain display inherited automatically from the selected Mention, premium cascading Parcours picker filtered by the chosen mention (code chip, live search, always-visible "No track = common-trunk mention" sentinel). For BTS levels, the form shows the classic Filière selector. If you change the level while editing (BTS to LMD or the other way), the incompatible fields are automatically cleared. Strict server-side validation: impossible to create a Licence/Master/Doctorate class without selecting at least one mention. If no LMD mention has been configured for your instance yet, a clear message invites you to ask the administration to configure them. The form works both on the dedicated page and inside the « New class » and « Edit class » modals on the classes list. -
Premium redesign of the teacher « Grade management » page (
/dashboard/teacher/grades) — KLASSCI gradient hero with 4 embedded indicators (Total assessments, Published, Drafts, Recently entered grades), premium grid of assessments with monochrome blue type badges (Lecture, Tutorial, Lab, Project, Supervised work, Exam, Other) that differ only by icon (semantic red preserved for Exam), timeline list of the latest entered grades with gradient avatar + semantic score chip (green ≥10/20, red <10/20, gray « Absent »), elegant empty states with call-to-action, full mobile/tablet responsive. -
LMD academic blueprint fully editable inline — on the LMD Planning page, every cell of the table (lectures, tutorials, lab work, project, supervised work, ECTS credits) becomes editable on a single click. Changes save instantly without page reload, and the total hours recalculate automatically. Assigning a teacher to an ECUE happens through an elegant picker (grouped by role, with profile photos). Every change is traced in the audit log for compliance.
-
Bulk edit of pedagogical volumes — select multiple ECUEs at once (per-row checkbox or "select all"), an action bar appears at the bottom of the screen. Click "Bulk edit" to open a compact editor where you choose which fields to apply (for example: "Supervised work = 30h for the 12 selected ECUEs, without touching the rest"). Ideal for applying a uniform pedagogical policy across a full cohort in seconds.
-
Ready-to-use UEMOA Licence blueprints — 5 specialized Licence 3 tracks added on Ephrata (Private Law, Public Law, Economics, Management, Agroeconomics), alongside the Licence 1 and 2 common cores already imported. In total, 9 full tracks (Law, Economic & Management Sciences, Life & Earth Sciences, Modern Letters) covering 232 teaching units and 447 ECUEs, compliant with the UEMOA standard (30 credits per semester). No more manual entry of the pedagogical blueprint — everything is pre-filled, editable, audited.
-
Disability supervision for students (
/esbtp/accessibility) — a new dedicated page to oversee the cohort of students with pedagogical accommodations. Per student: official recognition, categories (motor, visual, hearing, cognitive, psychiatric, learning disorders, chronic illness), concrete accommodations (extended time as a configurable percentage, adapted room, large-print materials, sign language interpreter, note-taking aid, laptop allowed, exam breaks), assistant required, validity period. The student profile gains a new "Accessibility & accommodations" section with a premium editor panel (colored chips, toggles, validity dates). A discrete pictogram appears next to the student's name in the students list, in attendance and full class rosters, in grade-entry sheets, and in every PDF / Excel export — so teachers spot affected students at a glance. Class attendance sheets and full class rosters now include a footer "Accommodations to respect" block listing the adaptations for each affected student. Medical detail is strictly separated from the teacher-visible summary: by default only coordinators and secretaries can access it. All edits are tracked in the audit log. Five new permissions configurable per school via the custom roles matrix. Dedicated cohort export (preview + PDF + Excel + email delivery).
Fixed
-
« New class » / « Edit class » modal not switching to LMD mode (
/esbtp/classes) — when you picked a Licence/Master/Doctorate level inside the AJAX modal, the form stayed on its initial display without showing the Mention/Domain/Parcours selectors. Silent bug (no error shown) that forced using the standalone page/esbtp/classes/create. The mode switch now works both inside modals and on the standalone page, with an animated transition and automatic reset of incompatible fields. -
« New class » modal returning HTTP 500 (
/esbtp/classes) — clicking the button failed to load the form (server error). Caused by a variable used before its definition in the form partial. The modal now opens cleanly on all instances. -
Filter and badges on the session list (
/esbtp/seances-cours) — after the session-type normalization to UPPERCASE (Lecture, Tutorial, Lab, Project, Supervised work, Exam, Other), the dropdown filter and colored badges no longer recognized the values (old lowercase format). The filter, badges and per-type statistics are now aligned with the new canonical values. Multicolored badges are replaced by monochrome KLASSCI blue (the icon distinguishes the type, semantic red preserved for Exam). -
Level → semester cascade in LMD planning — the semester filter now automatically adapts to the chosen level (Licence 1 → S1+S2, Licence 2 → S3+S4, Licence 3 → S5+S6) per the UEMOA standard, regardless of which units are already attached to the selected track. The level filter displays every active LMD level.
-
Multi-user editing robustness — when two people edit the same cell simultaneously, a clear conflict message appears ("This planification was modified by another user, please refresh the page") instead of a generic error. Expired sessions, lost permissions, and server-side validation errors all show precise contextual messages.
Security
- Audit log extended to pedagogical blueprints — every change to teaching hours, credits, coefficient, or assigned teacher is now traced in the audit log accessible from the "Security & Audit" menu (permission
security.audit.view). You know exactly who changed what, when, and with which before/after values.
Improved
-
Resilient grade entry, even on flaky wifi (
/esbtp/notes, entry modal) — every keystroke is now saved locally in the browser. If the connection drops while the teacher is entering 600 grades in class, nothing is lost: the next time the modal opens for the same class / subject / period, a yellow banner « Unsaved draft detected — 4 min ago · 38 grades pending sync » offers to restore everything in one click. A network badge in the modal header constantly shows the sync state: green « Synced », orange « Saving… », red « Offline — local draft ». If the teacher tries to close the modal while saves are still in flight, a premium confirmation prevents accidental data loss. -
Excel-like keyboard navigation (
/esbtp/notes, entry modal) —TabandShift+Tabmove across columns,EnterandShift+Entermove across rows,Ctrl+Ssaves all pending grades,Escblurs the cell,Ctrl+Fopens the search bar. On the very first focus of the first cell, a discreet tooltip surfaces the shortcuts once (auto-dismiss after 6 seconds or on the firstTab). -
Premium redesign of the grade entry modal (
/esbtp/notes) — the table header (Students, Semester 1/2, Assessments, Summary) stays sticky at the top while scrolling vertically. An integrated toolbar shows a live student search (filter by name, first name or matricule) and live counters (« 87 students · 6 assessments · 12 visible »). Beyond 80 students per class, the grid renders only the first 50 and a « Load 30 more students » button appears at the bottom to avoid jank. When the table overflows to the right, a subtle gradient and a floating arrow invite horizontal scrolling. -
More visible save: premium toast instead of row flash (
/esbtp/notes) — every saved grade now triggers an elegant toast in the top-right (« Grade saved — Marie Konaté · average 14.25/20 ») which intelligently batches if multiple grades save in less than half a second (« 8 grades saved — Marie, Aïcha, Jean, +5 »). The row flash is also kept for direct visual confirmation. -
Visually clear absent toggle (
/esbtp/notes) — the tiny checkbox is replaced by a red form switch with the « Abs » label. When a student is marked absent, their row is gently tinted red, their name turns italic and an « Absent » badge (or « Absent 3/6 » if only some assessments) appears next to their name. -
Readable assessment headers + quick edit (
/esbtp/notes) — the tiny score-scale and coefficient inputs are replaced by a clean three-line display: assessment title, « / 20 · Coef 1 », type badge. A subtle pencil button appears on hover and opens a mini form to quickly edit the title, score scale (1 to 100) and coefficient (0.1 to 10) without leaving the page. -
« Save and continue » in assessment creation (
/esbtp/notes) — a new button next to « Create assessment » saves the new assessment and keeps the form open with the class, subject, date, time, score scale and coefficient preserved, so teachers can string two or three assessments together in the same session without reopening the modal each time.
Added
-
Offline grade entry: Excel export + re-import with Before/After preview (
/esbtp/notes) — every grade entry modal now offers an "Export to Excel" button (one row per student, one column per assessment with the score scale and coefficient in the header, freeze pane on the student and name columns, autoFilter, matricule kept as text to preserve leading zeros) for offline entry, e.g. in the classroom or at home. On the way back, an "Import Excel" button with drag-and-drop opens a premium preview modal showing, with four colored KPIs (to create, to update, unchanged, errors) and a row-by-row table, exactly what will change before confirmation. Validation is per-cell (score within scale, matricule must exist, French decimal format12,5accepted,ABSmarker recognized for absence) and the apply step is atomic. 5 MB file limit, 10 exports per minute, 5 previews and 3 imports per minute to prevent abuse. -
Real-time impact preview on the bulletin (
/esbtp/notes) — every time a teacher types a grade in the entry grid, a discreet panel appears under the student row and shows in less than a second the new subject average, the new general average, and the CAMES mention change (Outstanding / Very Good / Good / Pass / Insufficient) if the grade tips the student into a different mention bracket. Guard against typos and instant visual confirmation of the academic impact. -
Premium redesign of the teacher create / edit pages — single-page form with KLASSCI gradient hero, three required fields to get started (full name, phone, specialization), a "Contract regime" section with radio cards (Contractor / Permanent / Consultant) and conditional fields per regime, a collapsible "Detailed profile" panel for diplomas and grade, optional start-of-activity date prefilled to today.
-
Premium redesign of the bulk-availability editor (
/esbtp/enseignants/bulk-availability) — every teacher item is repainted: gradient avatar with initials, premium stats (Preferred / Available / Unavailable) with semantic colors, 7×11 calendar grid with per-status gradients, edit mode with active blue outline, legend in a grey card. -
Unified PDF / Excel export pattern with preview, email delivery, and per-tenant premium export settings. The same flow now powers payments, class rosters, bulletins, and accounting reports.
-
Per-tenant PDF customization — tenant settings for accent color, logo position, footer signature, margins, and rendering preview in a new tab without intermediate download.
-
Interactive chat with event-driven notifications — messaging reacts in real time to business events (payment validated, enrollment validated, payment created) and surfaces matching notifications in the recipient's sidebar.
-
Premium "New message" modal in chat — gradient header, circular recipient avatars, real-time search, full keyboard accessibility.
-
Chat UI 2026 polish — consecutive messages from the same sender are grouped, optimistic UI on send (the message shows up instantly), "New" banner on unread conversations.
-
Actionable collections page (
/esbtp/comptabilite/relances) — every overdue line offers a pre-filled WhatsApp deeplink with the personalized reminder message, plus an accuracy widget showing the success rate of reminders by communication channel. -
Full workflow gating — every role (cashier, accountant, secretary, coordinator, teacher) sees only the sidebar sections, routes, and action buttons that match their scope. A CLI command lets you supervise permissions granted per tenant.
Improved
- Merged
esbtp_enseignant_profilesintoesbtp_teachers— one editing screen, one schema. The "contract type" and "employment status" fields are unified in a single "Regime" field (Contractor / Permanent / Consultant). "Hire date" becomes "Start-of-activity date". Theesbtp_enseignant_profiles,esbtp_enseignant_disponibilites,esbtp_enseignant_affectationstables (never actually populated by the modern UI) are dropped. - Cleanup of out-of-context fields on the teacher profile — Laboratory, Motivation, Teaching Methods, Pedagogical Tools, CV upload and photo (coming via progressive upload) are removed. The "Department" filter and column on the list are also removed (KLASSCI targets higher education without department layering).
- "Secondary view" banner on the teacher list reminding that the primary staff management surface is
/esbtp/personnel/unified. - Centralized teacher access via the new Eloquent relation — every screen (teacher dashboard, attendances, grades, planning) now uses the same relation to access the profile of the connected teacher. Pages no longer crash after schema migrations.
Security
- Throttling on teacher routes — 60 requests per minute on the teacher group, and 5 per minute on password reset (which creates a random password).
Improved
- The "Print" button now prints the actual document, not the web page (preview screens for attendance sheet, full class roster, student financial situation, attendance certificate, school certificate, timetable, report card, payment receipt, attendance report) — previously the button printed the whole page (KLASSCI sidebar, topbar, and KPI cards all visible in the print preview). Now clicking "Print" opens the real PDF of the document in a new tab; just click the printer icon in the PDF viewer (or hit Ctrl+P) for a clean printout, identical to the PDF that gets downloaded. Bonus: if the user accidentally hits Ctrl+P on any other page of the app, the sidebar and topbar are now auto-hidden so only the meaningful content prints.
Removed
- Purged "ESBTP" references that leaked through as fallback values in emails, SMS, PDFs, and the install screens — KLASSCI being a multi-tenant product, seeing "ESBTP" as a default whenever a school hadn't yet filled in its own name was incoherent. Parent notification emails now use "votre enfant" / "your child" as the fallback (instead of "ESBTP"), reminder SMSes use the configured school acronym from Settings (instead of a hardcoded "ESBTP:" prefix), and every PDF (receipts, certificates, timetable, grades report, attestations) now reads its header (school name, address, phone, email, city) live from the school's Settings — no more "Ecole Spéciale du Bâtiment et des Travaux Publics", "BP 2541 Yamoussoukro", or "esbtp@aviso.ci" hardcoded in if config was incomplete. Form placeholders and subtitles cleaned up too. Legitimate references — "ESBTP Yakro" and "ESBTP Abidjan" on the bulletin style picker (which are the real names of the two bundled style templates) — are preserved.
Fixed
- School logo not appearing (blank rectangle) on attendance sheets, full class rosters, student/class exports, and several accounting PDFs — on the blue header banners of these documents, the logo collapsed to a white rectangle due to a legacy CSS filtering effect, and the file lookup only tried a single storage location (so it went missing for any tenant whose logo had landed in a different subfolder over time). The logo now renders in its real colors, framed in a white card so it stays readable on the colored banner, and the file resolution now tries every plausible location (with two bundled KLASSCI logos as last-resort fallbacks so the header is never logo-less).
Security
- "Record payment" button now actually works for roles that hold the "create payment" permission (student profile
/esbtp/etudiants/{id}and enrollment profile/esbtp/inscriptions/{id}) — previously, the "Record a payment", "Make a payment" and "Pay" buttons were rendered (the create-payment permission was granted) but clicking them and submitting the form silently failed with a 403, because the endpoint also required the "validate enrollment" permission which isn't actually used in this flow. The cashier and any custom role with the create-payment permission can now record a payment from those two screens, as expected. - "Validate payment immediately" checkbox restricted to the self-override permission (payment modals on student profile and enrollment profile) — the checkbox used to show up for everyone, and was even pre-checked on the student profile. Ticking it let a user validate their own payment in one step, bypassing the anti-fraud separation of duties. The checkbox is now visible only for users who explicitly hold the "Self-validate own payments" permission (reserved for very small schools with a single accounting account). For everyone else, the payment is created pending validation and a separate accountant must validate it.
Fixed
- Pre-enrollment of a new student by the cashier (
/esbtp/inscriptions/pre-inscription) — the "Save pre-enrollment" button failed with a database integrity error whenever a brand-new student (never previously enrolled) was submitted. Only re-enrollment of an existing student worked. The bug had been there since the very first cashier release. Fixed: pre-enrollment of a new student now goes through and parks the enrollment as a "prospect" with its subscribed fees and any partial down-payment recorded. RelationNotFoundException [enseignantProfile]on the Planning Général page and several endpoints related to attendances, grades, and the teacher dashboard — fixed. A newUser → teacherProfilerelation (withteacherandenseignantaliases) is exposed and used by every affected screen.- "Create teacher" modals on
/esbtp/planning-generaland on the session creation form — were still displaying the old fields (Department, Contract Type, Employment Status, Hire Date) after the DB merge. Now aligned with the new schema: Regime + Start-of-activity date. - Phone field required on teacher edit — the form was blocking legacy teachers whose phone was not on file. The field is now optional on the edit form (server validation accepts empty).
April 2026
Added
-
Premium redesign of the subjects list (
/esbtp/matieres) — gradient hero with 4 live KPIs, hybrid filters (3 always-visible selects + collapsible advanced button), sticky bulk actions bar, per-row kebab menu (View / Configure / Edit / Delete), modal confirmations, AJAX bulk delete, premium empty state. -
Premium redesign of re-enrollment (
/esbtp/reinscription) — tabs and indicators fed from the same source (yearly per-class KPIs), clear status badges (Re-enrolled / To re-enroll / Pending), real-time sort and search, aligned with the visual pattern of other modules. -
Premium redesign of announcements (five views: index, create, edit, detail, manage) — KLASSCI gradient header, semantic badges per audience (students / teachers / all),
iiConfirmconfirmations everywhere, removed the legacy green background in favor of the KLASSCI monochrome blue palette. -
Conditional enrollment for upcoming year — a student can enroll before the term starts with a grace period on missing documents or fees. Dedicated dashboard at
/esbtp/inscriptions/sous-reservewith automatic detection of missing documents, smart alerts by reserve condition, click-to-detail navigation, sidebar link. The Overview, Academic, and Attendance tabs of the student profile now show an explicit fallback when the current year is still under conditional enrollment. -
Premium redesign of the enrollment detail page — two-column info-grid for parents / student, summarized finance bar (expected / paid / balance), list of other enrollments for the same student, premium empty states, modernized payment table. Edit page also refactored (removed redundant address field, parents info-grid, section headers).
-
Bulletin configuration redesigned — per-school configuration page rebuilt (template, mentions, calculation formulas, signatures, /20 or /100 grading), fixed broken sidebar links.
-
Password expiry alert at 6 months — contextual warning message in the header ("your password expires in X days"), redirect to the change form, visual distinction between first login and expiration. A CLI command unblocks an expired account without UI access.
-
Show / hide password toggle on the admin creation page during initial install, and on the premium password change modals (4 profiles: superadmin, secretary, accountant, coordinator).
-
Per-tenant module activation and deactivation — every tenant can enable or disable the Teachers / Grades & Evaluations / Timetable / Attendance / LMD / Accounting / Cashier / Communication / Tech Support modules. The sidebar and dashboard KPIs hide deactivated sections. Corresponding permissions (
module.*.access) are managed from the role configuration screen. -
Remote tenant management CLI — REST endpoints + Artisan commands to create a user, list accounts, soft-delete, create or set the current academic year, unblock an expired password. Sanctum token auth. Lets you operate a tenant without UI access (useful for support and onboarding).
-
Bulk attendance entry without a course — the new interface lets you log class hours without assigning a specific course, useful for shared lectures and conferences.
UNIQUE+NULLpattern, cross-compatible MariaDB/MySQL via a generated column. -
Group portal for founders — cross-tenant aggregation of financial, academic, and operational metrics, with per-school health scoring, automated alerts (plan mismatch, inactive tenant, SSL expiry, enrollment drop), and a transverse subscription banner.
-
Group member onboarding — new DGA role, email-based invite flow with auto-generated password and a 24-hour signed URL, forced password change on first login,
usernamefallback (auto-generatedfirstname.lastnamewith collision-handling). -
Cross-tenant notifications — invoice system, faculty notifications, founder notifications, dedicated table with per-user preferences.
-
Block enrollments on full classes in the enrollment form: live display of available seats with colored thresholds (green above 30%, orange 10-30%, dark orange below 10%, red full), automatic disabling of the submit button, only validated enrollments for the current year are counted.
-
Conversational context for the Claude chatbot — the bot now remembers the last tool result (students or classes) so it can answer follow-up questions like "and the next class over?" without you having to re-specify the class.
-
Richer chatbot filters — student lookup by workflow step and status, class lookup by system (BTS / LMD) and seat availability.
-
Signature 2026 pricing scheme — three tiers (Essentiel, PRO, ELITE) aligned with higher education, Partner formula at 15,000 XOF per year, 3-month trial, grandfathering of existing subscriptions for 24/18/12 months.
Improved
- Full overhaul of the accounting module — six premium pages redesigned: bursar dashboard, payments, category tracking, fee configuration, dashboard, reminders. Two-row
planning-headerpattern with KPIs embedded in the hero. - Redesigned Attendance tab on the student profile — single unified dark hero gathering the synthesis, white sub-cards for granular detail, gating of past years to prevent visual regressions.
- Redesigned class schedule page — day/week/month views with colored session pills, per-session kebab menu, legend, dynamic per-school PDF settings, one-click week duplication.
- Premium overhaul of enrollments — live-updating KPIs, bulk actions (cancellation, export), modal
iiConfirmconfirmations, uniform toasts, shared styles viacommon.jsandii-*CSS namespace. - Redesigned classes page — restructured layout, semantic badges, modernized table, AJAX filters.
- Redesigned admin modals — unified on the KLASSCI monochrome blue palette, removed non-semantic decorative colors.
- Hardened money-related actions —
throttle:60,1and10,1on payment routes, every nativewindow.confirm()replaced with customiiConfirmdialogs.
Fixed
- N+1 fix in the chatbot's class lookup — went from 300 queries per call down to 2, using a filtered
withCountand a single current-year lookup. - Double
selectClasse()definition in the class picker: the second hoisted definition silently overwrote the first without callingtoggleSubmitButton(), so the button was never disabled by the "class full" modal. The two functions are merged. - "Notes" button on the assessments page now redirects to quick entry; bulk delete fixed.
- Removed a
composer installat deploy time that froze some tenants on shared environments.
Security
- IDOR audit phase 1 — three Policies created,
authorize()calls added to sensitive routes,viewFinancialsmasked for unauthorized roles. - Cleanup of stack traces exposed in production on ten identified routes.
- Migration of 230+
hasRole()calls to the Spatie permission system (@can,@cannot), removed hardcoded role checks in controllers.
March 2026
Added
- Full LMD system alongside BTS — UE, ECUE, and credits per semester, many-to-many ECUE↔UE pivot with contextual coefficients, student parcours with progressive credit validation, LMD report cards with weighted averages, configurable calculation formulas (AQ, NAQ, APC).
- Tronc commun module — common-core enrollment flow then specialisation, original-class report card, shared courses, strict scheduling, three configuration parameters (report card, courses, schedule).
- Conduct grade — automatic calculation on a 16/20 scale (one point off per 4 hours of absence), Reprimand and Warning mentions, eight tiers of appreciation, per-school configuration, factors in absences per course.
- Cashier role — dedicated workspace with cash dashboard, multi-step pre-enrollment flow with category-by-category fee entry, partial payment, automatic credentials via
UserService, administrative completion banner with safeguards. - Multi-tenant LMS API — public school discovery endpoints (no permanent token required), dedicated authentication with
lms-discoveryrate limiting, internal documentation accessible viaGET /api/lms/documentation. - Student documents module — upload, list, download, extension badge, role-based read permissions.
- BTS/LMD differentiation on the student profile — semester tabs, residual fees by category, lifetime CECT, unified
photo_urlaccessor. - Interactive fee configuration — artisan command to manage fee subscriptions interactively, no-duplicate generation, archive of inactive entries.
- ECUE module — two-tab modal with credit validation, premium Select2 tabs, fully-AJAX UE page (zero reload), UE↔Parcours linking across multiple semesters.
Improved
- Coordinator dashboard overhaul — premium design with KPIs and AJAX navigation between tabs, no reloads.
- Class schedule page overhaul — premium design, KPIs, ECharts scrollable charts, HH:MM time format everywhere.
- Results pages overhaul (index, classes, class) — annual / S1 / S2 views, attendance integration, fix for inconsistent grade filtering.
- Notes page overhaul — availability calendar with inline editing, real-time search in selection modals, standalone modal replacing the legacy AJAX embed.
- Pre-enrollment page overhaul — premium analytics cards, centered steps with continuous lines between circles, student lookup for the re-enrollment flow.
- Annual planning page overhaul — Events tab merged in, balanced calendar (900 px, 48 px cells), KPIs corrected on every tab, save modal without reload.
- Coordinator and Class workload sections overhaul — premium design, sign-in modal aligned with the attendance-codes page.
- Financial standing overhaul — preview as a dark hero in the student-profile style, PDF in formal-document style, action buttons on the Finances tab, SVG fallback for missing avatars.
- Staff page overhaul — premium design, role masking based on permissions, cashier tab added to the unified view.
- Performance tweaks — extracted fee-configuration constants, removed hardcoded email, fixed N+1 in LMD via proper eager loading.
Fixed
- LMD report card averages stuck at zero — period-format inconsistency in the query, added
getPeriodeVariants(). - Enrollment workflow fix — a validated payment is now required before the enrollment itself can be validated, alert on the student page when the enrollment is pending, automatic redirect after validation.
- superAdmin dashboard fix — white background, softer warning text, AJAX refresh fixed for class/faculty loads.
- Parent modal rendering fix — eliminated hover flash, removed transitions, custom modal replacing the Bootstrap one for parent search.
- Select2 in modals fix — z-index 1075, dropdown forced downward, dropdownParent on body to escape
overflow-y:auto. - "Edit availability" button fix in the faculty grid.
February 2026
Added
- Enriched report-card system — semester weighting for the annual average, persistence of results on generation, report-card style picker, "Abidjan style" toggle.
- Per-student report card — coefficient modal self-contained on the student profile, no round-trip to a separate page.
- Filières & Levels overhaul — selectable pills, per-filière handling of levels in the linkages.
- Faculty sign-in module — "Coming up" badges, bulk editing, report modal, tracking of completed hours, availability polling.
- Administrative PDF documents — full overhaul of the previews, configurable color settings, generation via Browserless for reliability, stronger watermarks, themed header applied to certificates.
- Blank grade-sheet PDF generation for manual entry.
- Quick faculty creation from the course-session modal.
- Real-time search in selection modals for students, classes, and courses.
Improved
- Availability calendar overhaul — inline editing right inside
add-seance. - Fullscreen notes modal overhaul + fix for the 500 error on faculty
quick-create. - Faculty attendance stats overhaul + faculty report page overhaul.
- "Hours per course" tracking section overhaul on the class page.
- Class filters in the planner + standardized HH:MM time format.
- Student management modals on the class page (add, remove, transfer).
Fixed
- bulk-update-status fix for faculty attendance — uses
url()instead ofroute()to avoid crashes when the route isn't cached on the server. - Matricule regeneration fix — changes are now applied during student edits.
- Auto-generated matricule fix — pulls info from the most recent enrollment.
January 2026
Added
- Premium overhaul of the landing page — editorial design inspired by zed.dev, IBM Plex Serif/Sans/Mono, KLASSCI blue on a beige background, dot grid + grain texture, premium animations (gradient text shimmer, morphing blobs, clip-path text reveal, button pulse, pillar stagger), 9 real screenshots in the hero marquee, feature modals, full dark mode, mobile-responsive.
- Per-role permission manager — dedicated UI, permissions grouped by module, automatic group expansion, role grouping in the UI.
- Full Notes module overhaul — modal-based workflow, dedicated API endpoints.
- Faculty attendance module — per-faculty drilldown, individual stats, PDF button in the bulk banner, accordion for bulk editing, time pickers in the embed, conflict confirmations during quick generation.
- Bulk schedule editing for sessions, with conflict handling for faculty.
- Auto-generated matricules for new students.
- Coefficients per filière and level — strict application instead of a global fallback.
- Schedule helper tip — step-by-step guide modal.
- plan-and-confirm workflow — validation step before code for significant changes.
Improved
- Average-coefficient unblock — improved UX for tronc commun cases.
- ESBTP-ABIDJAN cleanup — MASTER/L3 matricules adjusted, full-class handling.
- Bulk faculty availability management — dedicated UI, mass apply.
Last updated: April 25, 2026
