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

Library Management, Evening School & Production Backups

  • 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
  • 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
  • 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)
  • 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)

NGO Module, Academic Suite & Multi-Shift

  • 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
  • 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
  • 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
  • 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

Push Notifications, Expense Management & Vehicle Logbook

  • 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
  • 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
  • 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
  • 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

Passkeys, Google Sign-In & Operations Suite

  • 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
  • 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
  • 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
  • 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

Admin Portal Audit & Employee PWA

  • 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
  • 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
  • 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

Foundation Release

  • 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
  • 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