Release Notes
What's New in Ophillia HRMS
Every release, every improvement, every bug fix — documented here in full. Subscribe to be notified of new releases.
Subscribe to Updates - Full library management system with OPAC, circulation, member portal and acquisitions
- Evening School context for community literacy programmes with village dashboard and risk flags
- pgBackRest production backup system fully operational across all service databases
- Attendance records view with calendar + register layout and day-level drill-down
New Features
- library-svc (port 8009): full catalog with full-text OPAC search and copy tracking
- Library: circulation desk — issue, return, renew with automatic hold queue promotion
- Library: member management for student, employee and external patrons
- Library: acquisitions workflow — book requests → vendors → purchase orders → goods received notes
- Library: nightly overdue sweep cron with push notifications to patrons
- Library: dedicated member portal at library.hrms.ophillia.xyz (card-number JWT auth)
- Library: librarian mode in employee PWA for quick desk operations with barcode scanner support
- Evening School context: new academic_context_type system (identity migration 0008_pub)
- Evening School: village centre dashboard with per-section attendance, risk flags and alert counts
- Evening School: at-risk child flags with HR/Admin notification on creation
- Evening School: home visit logging (field worker records visit details per child)
- Evening School: daily attendance alert scheduler — auto-creates alerts after 14-day absence window
- Evening School: all admin views adapt terminology dynamically (Section → Village Centre, etc.)
- Production backup system: WAL archiving + scheduled full and incremental backups per database
- Admin portal: attendance records view at /academic/attendance/records with calendar and register layout
- Admin portal: day-level drill-down from attendance records — see every employee's status for any date
Improvements
- Academic help guide is fully dynamic — content, TOC and FAQ adapt to standard school vs. evening school context
- Evening school and standard school nav items are now mutually exclusive — no view overlap
- Terminology composable (useAcademicTerms) provides 10 reactive labels across all academic views
- Library member push subscription stored on member record and registered with notification-svc
- Hold promotion is synchronous within the return transaction — no async race on popular titles
- Attendance summary data available for payroll module integration (coming in v0.7.0)
Bug Fixes
- Fix: sentinel PATCH did not fire model_validator on partial update — added model_fields_set guard (#41)
- Fix: re-emitted identity.company.provisioned event was missing new fields added in later migrations (#42)
- Fix: create and edit forms had different default field values causing parity gap on existing record edit (#43)
- Fix: composable naming conflict — two composables exported the same symbol causing silent override (#44)
- Fix: evening school views did not use useAcademicTerms composable — hardcoded labels persisted (#45)
- Fix: table columns missing newly added fields after schema change — all tables now include model changes (#46)
- Fix: employee PWA has both BottomNav and SideNav — deduplication guard added (#47)
- Fix: bootstrap hydration guard swallowed company-context refresh for non-teacher roles (#48)
- Fix: GET /identity/company is POWER_ADMIN-only — switched to /me/company-context for employee PWA (#49)
- Fix: FastAPI new endpoint returned 404 until service was restarted — added reload trigger to migration step (#50)
- Fix: student attendance section_id stuck on wrong section after upsert — partial-index fixed (#51)
- Fix: evening school scheduler queried public.companies cross-DB — switched to per-tenant query (#52)
- Fix: asyncpg rejected ANY(:param::uuid[]) — replaced with explicit CAST syntax (#53)
- Fix: scope_to_tenant uses underscores; hyphens in tenant IDs were not stripped (#54)
- Fix: library views used VITE_API_GATEWAY_URL instead of VITE_API_BASE_URL — fell back to localhost in prod (#56)
- Fix: nginx gateway CORS failure — conf files baked into image, not volume-mounted (#57)
- Fix: VPS port conflict — portal-library moved 8093 → 8101 (#58)
- Full NGO module: donors, grants, volunteers, 80G receipts, Form 10BD, FCRA
- Academic suite: grade book, homework with push, grade promotion wizard, parent PIN
- Multi-shift support with allow_concurrent_shifts flag per company
- Multi-industry support replacing the single industry_type column
New Features
- NGO module (ngo-svc, port 8008): full donor CRM with donation history and 80G PDF receipt generation
- NGO: Form 10BD CSV export for Income Tax filing (one click)
- NGO: FCRA compliance tracker — registration number, annual return date, renewal reminders
- NGO: Grant lifecycle management with milestones, disbursement schedules and utilisation reporting
- NGO: Volunteer management with clock-in bridge — volunteer hours merge into the same attendance pipeline as staff
- NGO: _merge_sessions endpoint reconciles overlapping volunteer and employee attendance windows
- Academic: Grade book — Exam and ExamScore models (migration 0002_acad_ten)
- Academic: Homework posts with WebPush delivery to students (migration 0003_acad_ten)
- Academic: Grade promotion wizard — 3-step: configure cohort, preview promotions, execute archive
- Academic: Parent view PIN toggle — SHA-256 client hash, BottomNav filtering per PIN state
- Multi-shift: allow_concurrent_shifts company flag enables simultaneous overlapping shifts for a single employee
- Multi-industry: company_industries join table replaces the single industry_type enum column
- Multi-industry: NGO added as a selectable industry; super-admin multi-checkbox selector
- Admin portal: Monthly Attendance Overview grid with PDF/CSV export (jsPDF + autotable)
- Admin portal: Student Attendance view at /academic/attendance with upsert partial-index fix
Improvements
- AssignmentOut schema now hydrates full department and designation name strings
- Volunteer PWA bootstrap branching: VOLUNTEER role gets a trimmed 6-route app shell
- Grade promotion archives source year records before overwriting — no data loss on re-run
- Absence push notifications sent only once per shift window (dedup guard added)
- Admin portal expense approval table shows L1 and HR decision timestamps side by side
- Push notification preference centre in employee PWA allows per-event opt-out
- FCRA renewal calendar widget surfaces upcoming deadlines on the NGO compliance dashboard
Bug Fixes
- Fix: MissingGreenlet error after flush() on server-default columns — moved .refresh() calls outside async context (#33)
- Fix: Vue mojibake — â€" characters rendering instead of em dashes (â€" → —) in StudentsView and TimetableView (#34)
- Fix: allPeriods computed property fallback bug returning undefined on first render when timetable fetch is in-flight (#35)
- Fix: crosses_midnight auto-compute validator was not firing on shift update — added explicit @validates decorator
- Fix: Multi-shift 409 Conflict false positive when two shifts on separate calendar days share the same clock-out hour
- Fix: Regularisation 404 when an employee had zero attendance records for the target date
- Fix: Employee code prefix reset to empty string on localStorage clear — now falls back to company default
- Fix: Migration constraint ck_user_roles_role_enum failed on PostgreSQL 14 — rewritten as deferred constraint
- Fix: PATCH /identity/companies/{id} was returning 403 for POWER_ADMIN on valid company edit
- VAPID/WebPush push notifications with 22 event templates
- Expense approval: two-level L1 then HR with S3 receipts
- Vehicle logbook: fleet management with auto-fill odometer and silent geo capture
- Auto clock-out toggle per company with crosses_midnight validator
New Features
- VAPID/WebPush push notifications — no third-party service; all keys stored server-side
- Per-event notification templates: 22 event types across attendance, leave, tasks, expenses, grades
- Custom broadcast API: HR can target individual, department, role or all employees
- Absence alert: push sent when employee misses clock-in by configurable threshold
- Shift reminder: push 30 minutes before scheduled shift start
- Vehicle logbook: 3 new DB tables + trip_sessions (migration 011)
- Vehicle management: nickname, FC date, road tax expiry stored per vehicle
- Employee PWA: Start/End trip flow with silent geo capture (no map UI during trip)
- Expense approval: L1 approver first, then HR — both decisions tracked with timestamps
- Expense S3 receipt upload — direct-to-S3 presigned URL flow
- Auto clock-out: configurable cut-off time per company; crosses_midnight auto-computed
- Early clock-out: employee submits reason; HR notified via push
- Student portal port changed from 8093 to 8100
Improvements
- Employee PWA bottom action sheet replaces inline modals for a more native feel
- Expanded notification inboxes with pagination (25 per page)
- Leave history tabs: Pending / Approved / Rejected with count badges
- Operations CompanySettings page for auto-clockout and expense threshold configuration
- Employee task creation now supports incharge delegation to another employee
Bug Fixes
- Fix: auto_clockout_enabled flag was not persisted — identity-svc missing forward to attendance-svc
- Fix: push subscription loop caused duplicate subscriptions on PWA reload
- Fix: nginx gateway IP stale cache causing 502 on service restarts — flush_cache added to proxy config
- Fix: orphan employee email typo in admin portal form validation regex
- Fix: assignment body/query param mismatch — API now accepts both consistently
- WebAuthn passkeys + Google Sign-In for employee PWA
- Operations Suite: tasks, projects, budget categories, expense claims
- Assets & Inventory module: full procurement PR → PO → GRN cycle
- DPDP Act HTTP 412 fix: POWER_ADMIN can set company timezone
New Features
- WebAuthn passkeys via py-webauthn — register and authenticate without passwords
- Google Sign-In via google-auth library — ID token validation server-side
- Credential Management API save/fill integrated into employee PWA login flow
- Operations-svc (port 8006): Task CRUD with status workflow (open → in_progress → review → done)
- Projects: budget categories, volunteer linking, expense integration
- Assets: SLM, WDV and UOP depreciation methods; assign/return/dispose lifecycle
- Inventory: purchase requisitions, purchase orders, goods received notes, issuance — atomic stock updates
- Geofence map picker using OpenStreetMap; Google Maps URL paste parser
- Admin portal: Operations Help Guide at /operations-help
- Backup-api micro-service with 7 pgBackRest stanzas for multi-tenant backup isolation
- Super-admin portal: company edit (PATCH /identity/companies/{id})
- Super-admin portal: Backups page with per-company backup status
Improvements
- Employee edit form expanded: code, joining_date and status fields added
- AssignmentOut hydrated with department and designation name strings
- Leave policy admin: CL/ML days editable from Settings → Company tab
- Holiday CRUD from Settings → Company tab
- PUT /leaves/policies/{type} seeds balances from attendance_days for existing employees
Bug Fixes
- Fix: company timezone HTTP 412 — POWER_ADMIN can now set timezone; re-emits provisioned event to self-heal attendance
- Fix: two-way nginx trailing-slash 301 loop on /admin/ sub-path
- Fix: Alembic tenant schema mismatch on fresh provision when previous tenant had been hard-deleted
- Fix: missing Depends() on attendance dataclass endpoint causing 422 on clock-out
- Employee PWA at portals/employee/ — offline clock-in queue, token refresh
- Admin portal audit fixes: 10 defects resolved
- Push notification infrastructure groundwork (VAPID key generation)
- Multi-tenant FastAPI architecture stabilised
New Features
- Employee PWA with offline clock-in queue and background sync
- Token refresh with silent re-auth using Credential Management API
- VOLUNTEER role bootstrap: trimmed 6-route app shell for volunteer-only users
- Admin portal: Monthly Attendance Overview grid
- Admin portal: PDF and CSV export for attendance reports
- i18n key gap audit — all missing translation keys back-filled
Bug Fixes
- Fix: FastAPI 422 on dataclass endpoints missing Depends() injection
- Fix: i18n key gaps causing silent empty strings in admin tables
- Fix: nginx trailing-slash 301 redirect loop on sub-path routes
- Fix: Alembic tenant schema mismatch on re-provision
- Multi-tenant FastAPI SaaS architecture with per-tenant PostgreSQL schemas
- Identity, attendance, leave and notification micro-services
- Admin portal (Vue 3) and HR portal
- DPDP Act 2023 compliance foundations
New Features
- Multi-tenant architecture: identity-svc, attendance-svc, leave-svc, notification-svc
- PostgreSQL per-tenant schema isolation with Alembic migration management
- Admin portal (Vue 3 + Vite) with employee, attendance and leave management
- HR portal for approvals and reporting
- GPS attendance clock-in/out via REST API
- Single-tenant geofence enforcement
- Casual Leave and Medical Leave policy engine
- Audit log foundations (append-only event stream)
- DPDP Act 2023 consent versioning groundwork
Stay up to date
Ophillia HRMS releases updates regularly. Subscribe via email to receive release notes as soon as they're published.
Subscribe via Email