The Department of Social Services runs welfare programs across every district of Bangladesh. Its workforce was managed across ledgers, spreadsheets, and a handful of loosely-connected tools. The brief was to replace all of it with one HRMS that an officer in Dhaka and a clerk in a district office could both trust.
┌──────────────────────────────────────────┐
│ Angular SPA · role-scoped dashboards │
│ (officer · clerk · auditor · admin) │
└────────────────────┬─────────────────────┘
│
┌───────────▼────────────┐
│ Laravel REST API │
│ · session + policy │
│ · bilingual renderer │
└───┬───┬───┬───┬────────┘
│ │ │ │
┌───────────┘ │ │ └────────────┐
│ │ │ │
┌────────▼──────┐ ┌──────▼─┐ ┌────▼──────┐ ┌──▼────────┐
│ Payroll │ │Attend. │ │ Leave │ │ Loan │
│ · cycles │ │ · shift│ │ · balance │ │ · schedule│
│ · deductions │ │ · bio- │ │ · routing │ │ · repay- │
│ · bank file │ │ metric│ │ workflow│ │ ments │
└────────┬──────┘ └──┬─────┘ └────┬──────┘ └──┬────────┘
│ │ │ │
└───────────┴────┬───────┴───────────┘
│
┌────────▼────────┐ ┌──────────┐
│ MySQL │◄───┤ Redis │
│ · partitioned │ │ · cache │
│ · audit table │ │ · queues │
└─────────────────┘ └──────────┘ Each payroll cycle was written once and never mutated. Corrections happened as explicit reversal + re-issue entries. Three years in, when an auditor asked why a 2022 cycle looked the way it did, we could replay it byte-for-byte — including the bugs we'd since fixed.
Rather than building abstract roles and wiring permissions into them, we modeled the actual DSS civil-service hierarchy as a first-class graph. A district officer's view was derived from their position in the graph, not from a hand-maintained permission list.
Attendance clerks in weak-signal districts needed forms to submit reliably. The client queued submissions locally, surfaced sync state to the user honestly ('3 entries pending · last synced 11:42'), and refused to silently lose anything.
The app UI was English; printable artefacts — pay slips, leave orders, loan agreements — were always rendered with both Bangla and English side-by-side, from the same templating layer. One source of truth, two audiences.