Skip to content

About

A scalable Government Payroll Management System built with React, TypeScript, and Vite. Features include employee management, salary computation, deductions, payslip generation, and secure deployment using Docker and Nginx. Designed with enterprise-grade architecture and a modern UI.

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Latest commit

ย 

History

8 Commits

Folders and files

Repository files navigation

โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—
โ•‘                                                                                      โ•‘
โ•‘    โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•—  โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•— โ–ˆโ–ˆโ•—   โ–ˆโ–ˆโ•—โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•—  โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•— โ–ˆโ–ˆโ•—   โ–ˆโ–ˆโ•—                            โ•‘
โ•‘   โ–ˆโ–ˆโ•”โ•โ•โ•โ•โ• โ–ˆโ–ˆโ•”โ•โ•โ•โ–ˆโ–ˆโ•—โ–ˆโ–ˆโ•‘   โ–ˆโ–ˆโ•‘โ–ˆโ–ˆโ•”โ•โ•โ–ˆโ–ˆโ•—โ–ˆโ–ˆโ•”โ•โ•โ–ˆโ–ˆโ•—โ•šโ–ˆโ–ˆโ•— โ–ˆโ–ˆโ•”โ•                            โ•‘
โ•‘   โ–ˆโ–ˆโ•‘  โ–ˆโ–ˆโ–ˆโ•—โ–ˆโ–ˆโ•‘   โ–ˆโ–ˆโ•‘โ–ˆโ–ˆโ•‘   โ–ˆโ–ˆโ•‘โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•”โ•โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•‘ โ•šโ–ˆโ–ˆโ–ˆโ–ˆโ•”โ•                             โ•‘
โ•‘   โ–ˆโ–ˆโ•‘   โ–ˆโ–ˆโ•‘โ–ˆโ–ˆโ•‘   โ–ˆโ–ˆโ•‘โ•šโ–ˆโ–ˆโ•— โ–ˆโ–ˆโ•”โ•โ–ˆโ–ˆโ•”โ•โ•โ•โ• โ–ˆโ–ˆโ•”โ•โ•โ–ˆโ–ˆโ•‘  โ•šโ–ˆโ–ˆโ•”โ•                             โ•‘
โ•‘   โ•šโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•”โ•โ•šโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•”โ• โ•šโ–ˆโ–ˆโ–ˆโ–ˆโ•”โ• โ–ˆโ–ˆโ•‘     โ–ˆโ–ˆโ•‘  โ–ˆโ–ˆโ•‘   โ–ˆโ–ˆโ•‘                               โ•‘
โ•‘    โ•šโ•โ•โ•โ•โ•โ•  โ•šโ•โ•โ•โ•โ•โ•   โ•šโ•โ•โ•โ•  โ•šโ•โ•     โ•šโ•โ•  โ•šโ•โ•   โ•šโ•โ•                               โ•‘
โ•‘                                                                                      โ•‘
โ•‘     E N T E R P R I S E   G O V E R N M E N T   P A Y R O L L   P L A T F O R M   โ•‘
โ•‘                  v2.0 ยท Zero-Trust ยท Military-Grade ยท Battle-Tested                  โ•‘
โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•

React TypeScript Express SQLite3 Vite Docker NGINX JWT Helmet bcrypt Winston OWASP License Build CVEs PRs


A military-grade, dynamically configurable government payroll platform engineered with zero-trust architecture, real-time fraud detection, cryptographic dual-token management, chronological leave boundary enforcement, and immutable court-admissible audit trails โ€” purpose-built to replace legacy COBOL/mainframe payroll infrastructure and withstand enterprise-scale financial regulation, compliance audits, and adversarial threat actors.


๐ŸŒ Explore the Live Interactive Simulation Portal ยป


๐Ÿ› Report Bug ยท โœจ Request Feature ยท ๐Ÿ— Architecture Deep-Dive ยท ๐Ÿ” Zero-Trust Model ยท ๐Ÿ“ก API Reference ยท ๐Ÿš€ Quick Start


๐Ÿ“– Full Documentation Index

โ–ถ Click to expand complete index
# Section Description
01 ๐Ÿš€ Executive Summary Problem statement, paradigm shift, mission
02 ๐Ÿ“ Architectural Principles Why each technology was chosen with measurable proof
03 ๐ŸŒŸ Feature Matrix Full capability overview with security classification
04 ๐Ÿ— System Architecture Full topology, data flow, and component maps
05 ๐Ÿง  Component Deep-Dive Every module explained โ€” backend + frontend
06 ๐Ÿ—„ Database ERD & Schema Relational model, constraints, indexes, migrations
07 โš™๏ธ Core Technical Workflows Token lifecycle, rule engine, leave validator, anomaly
08 ๐Ÿ” Zero-Trust Security Model Threat matrix, OWASP coverage, attack mitigations
09 ๐Ÿ›ก Defense-in-Depth Architecture 7-layer defense diagram with enforcement details
10 ๐Ÿšจ Anomaly Sentinel Engine Fraud detection logic, thresholds, alert pipeline
11 ๐Ÿ“ก API Reference Complete endpoint catalog with auth levels & codes
12 ๐ŸŽจ UI Design System Design tokens, theming, typography, glassmorphism
13 ๐Ÿ“ Directory Structure Full MVC breakdown and annotated file manifest
14 ๐Ÿณ Deployment Guide Docker, NGINX, native Node.js setup
15 ๐Ÿ“Š Performance Benchmarks P50/P95/P99 targets, SQLite WAL analysis
16 ๐Ÿงช Testing & CI/CD Test pyramid, GitHub Actions pipeline
17 ๐Ÿ”„ Data Flow Diagrams End-to-end request tracing and lifecycle maps
18 ๐Ÿšจ Troubleshooting Guide Diagnostics table with root cause and fix
19 ๐Ÿงพ Changelog v1 โ†’ v2 migration guide and SQL scripts
20 ๐Ÿ”ฎ Future Roadmap v3.0 and v4.0 planned capabilities
21 ๐Ÿค Contributing Git-Flow standards, PR guidelines, commit convention

๐Ÿš€ Executive Summary & Paradigm Shift

The Catastrophic Failure of Legacy Government Payroll

โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—
โ•‘                    LEGACY GOVERNMENT PAYROLL FAILURE MODES                   โ•‘
โ• โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ฆโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ฃ
โ•‘  INFRASTRUCTURE                   โ•‘  FAILURE IMPACT                          โ•‘
โ• โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ฌโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ฃ
โ•‘  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”     โ•‘                                          โ•‘
โ•‘  โ”‚  COBOL / RPG Mainframe   โ”‚     โ•‘  โœ— Emergency DA changes require          โ•‘
โ•‘  โ”‚  โ†“                       โ”‚     โ•‘    full mainframe redeploy (days)        โ•‘
โ•‘  โ”‚  Hardcoded Tax Tables    โ”‚     โ•‘                                          โ•‘
โ•‘  โ”‚  โ†“                       โ”‚     โ•‘  โœ— Zero anomaly detection โ€” massive      โ•‘
โ•‘  โ”‚  Manual Override Layer   โ”‚     โ•‘    over-disbursement fraud vectors open  โ•‘
โ•‘  โ”‚  โ†“                       โ”‚     โ•‘                                          โ•‘
โ•‘  โ”‚  Batch Process (Weekly)  โ”‚     โ•‘  โœ— Single-factor auth โ€” credential       โ•‘
โ•‘  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜     โ•‘    stuffing attacks trivially succeed    โ•‘
โ•‘                                   โ•‘                                          โ•‘
โ•‘  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”     โ•‘  โœ— No audit trail โ€” forensic            โ•‘
โ•‘  โ”‚  Flat File Reports       โ”‚     โ•‘    reconstruction impossible             โ•‘
โ•‘  โ”‚  No Digital Audit Trail  โ”‚     โ•‘                                          โ•‘
โ•‘  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜     โ•‘  โœ— Leave double-booking creates          โ•‘
โ•‘                                   โ•‘    cascading financial liability          โ•‘
โ•‘  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”     โ•‘                                          โ•‘
โ•‘  โ”‚  Single Token Session    โ”‚     โ•‘  โœ— Session never expires โ€”              โ•‘
โ•‘  โ”‚  No Refresh Mechanism    โ”‚     โ•‘    stolen tokens are permanent           โ•‘
โ•‘  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜     โ•‘                                          โ•‘
โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ฉโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•

The GovPay v2.0 Solution Matrix

โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—
โ•‘                         GOVPAY v2.0 ยท SOLUTION MAP                           โ•‘
โ• โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ฆโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ฃ
โ•‘  LEGACY FAILURE          โ•‘  GOVPAY v2.0 RESOLUTION                          โ•‘
โ• โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ฌโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ฃ
โ•‘  Hardcoded DA/HRA        โ•‘  โœ“ Dynamic Rule Evaluator โ€” DB-driven,           โ•‘
โ•‘  (redeployment needed)   โ•‘    zero redeployment, live REST update           โ•‘
โ• โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ฌโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ฃ
โ•‘  No fraud detection      โ•‘  โœ“ Anomaly Sentinel โ€” 1.5ร— department            โ•‘
โ•‘                          โ•‘    average threshold with Winston WARN emit      โ•‘
โ• โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ฌโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ฃ
โ•‘  Single-factor auth      โ•‘  โœ“ Dual-Token JWT โ€” Access (15m) + Refresh       โ•‘
โ•‘                          โ•‘    (7d HttpOnly) โ€” XSS-immune by design          โ•‘
โ• โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ฌโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ฃ
โ•‘  No audit trail          โ•‘  โœ“ Winston rotating daily JSON logs โ€”            โ•‘
โ•‘                          โ•‘    court-admissible, tamper-resistant            โ•‘
โ• โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ฌโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ฃ
โ•‘  Leave double-booking    โ•‘  โœ“ Chronological Boundary Engine โ€”               โ•‘
โ•‘                          โ•‘    Max/Min mathematical overlap proof            โ•‘
โ• โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ฌโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ฃ
โ•‘  No rate limiting        โ•‘  โœ“ express-rate-limit โ€” 10 req/15min per IP,     โ•‘
โ•‘                          โ•‘    brute-force computationally infeasible        โ•‘
โ• โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ฌโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ฃ
โ•‘  SQL injection surface   โ•‘  โœ“ Parameterized queries only โ€”                  โ•‘
โ•‘                          โ•‘    zero raw concatenation to database            โ•‘
โ• โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ฌโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ฃ
โ•‘  No access control       โ•‘  โœ“ RBAC 3-tier โ€” ADMIN / OFFICER / EMPLOYEE     โ•‘
โ•‘                          โ•‘    enforced at every protected route handler     โ•‘
โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ฉโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•

๐Ÿ“ Architectural Principles & Tech Decisions

Technology Selection Rationale

Technology Rejected Alternative Core Rationale Measurable Benefit
React 18 + Vite CRA (Webpack) Native ESM module routing, true HMR Cold-start <1s vs ~15s with Webpack
SQLite 3 (WAL Mode) PostgreSQL Zero external dependency โ€” air-gapped gov deployment ready Self-contained, no cluster provisioning
Dual-Token JWT Session Cookies Stateless scale โ€” no Redis roundtrip per request Token validation <1ms cryptographically
Winston Logger console.log Persistent rotating audit trails with structured JSON Tamper-resistant filesystem records
Helmet.js Manual Headers One-line CSP, HSTS, X-Frame at global middleware Blocks 6+ OWASP categories at boot
express-rate-limit No limiting Hard ceiling on auth routes โ€” defeats credential bots 10 req/15min โ€” bruteforce unusable
Axios Interceptors Native fetch() Silent 401 intercept โ†’ token refresh โ†’ DOM resume Zero UX disruption on token expiry
bcrypt (cost-12) MD5 / SHA-256 Adaptive cost-factor โ€” GPU rainbow table infeasible 2^12 work factor โ€” NIST compliant
CORS Whitelist Open CORS * Origin restriction at API gateway layer Prevents cross-origin forged requests
WAL Mode SQLite Journal Mode Concurrent reads never block active writes 3โ€“5ร— read throughput for analytics

Technology Interaction Map

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                    TECHNOLOGY DEPENDENCY GRAPH                               โ”‚
โ”‚                                                                              โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”    HTTPS/REST     โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚
โ”‚  โ”‚  React 18    โ”‚ โ—„โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–บ โ”‚           NGINX :80/:443            โ”‚ โ”‚
โ”‚  โ”‚  + Vite      โ”‚                   โ”‚   (TLS Termination + Proxy)          โ”‚ โ”‚
โ”‚  โ”‚  + Context   โ”‚                   โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚
โ”‚  โ”‚  + Axios     โ”‚                                  โ”‚ upstream proxy_pass    โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜                   โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚
โ”‚                                     โ”‚        Express :5000                 โ”‚ โ”‚
โ”‚                                     โ”‚  Helmet โ†’ RateLimit โ†’ CORS โ†’ Morgan โ”‚ โ”‚
โ”‚                                     โ”‚  JWT Auth โ†’ RBAC โ†’ Route Handler    โ”‚ โ”‚
โ”‚                                     โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚
โ”‚                                                    โ”‚                        โ”‚
โ”‚           โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜                        โ”‚
โ”‚           โ”‚              โ”‚                โ”‚                                  โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ”€โ”                         โ”‚
โ”‚  โ”‚  PayrollSvc  โ”‚ โ”‚ AnomalySvc  โ”‚ โ”‚  LeaveSvc   โ”‚                         โ”‚
โ”‚  โ”‚  Rule Engine โ”‚ โ”‚ 1.5x Guard  โ”‚ โ”‚ Bound Check โ”‚                         โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”˜                         โ”‚
โ”‚         โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜                                  โ”‚
โ”‚                          โ”‚                                                   โ”‚
โ”‚                โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”                                       โ”‚
โ”‚                โ”‚  SQLite 3 WAL Mode โ”‚                                       โ”‚
โ”‚                โ”‚  + Foreign Keys    โ”‚                                       โ”‚
โ”‚                โ”‚  + CHECK Constraintsโ”‚                                       โ”‚
โ”‚                โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜                                       โ”‚
โ”‚                          โ”‚                                                   โ”‚
โ”‚                โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”                                       โ”‚
โ”‚                โ”‚  Winston Audit Log โ”‚                                       โ”‚
โ”‚                โ”‚  Daily JSON Rotate โ”‚                                       โ”‚
โ”‚                โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜                                       โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

๐ŸŒŸ Enterprise Feature Matrix (v2.0)

Feature Pillar Module Implementation Enterprise Impact Security Class
๐Ÿ”ง Dynamic Rule Evaluator payrollService.js PAYROLL_RULES DB table โ€” live-configurable (Basic ร— X%) or (FIXED Y) Zero code redeployment for legislative DA/HRA changes ๐ŸŸข Low Risk
๐Ÿšจ Fraud Anomaly Sentinel anomalyService.js Triggers if NetPay > Dept_Avg ร— 1.5 โ€” emits Winston WARN Eliminates catastrophic over-disbursement ๐Ÿ”ด Critical
๐Ÿ” Dual-Token JWT Engine auth.js middleware Access: 15m expiry ยท Refresh: 7d HttpOnly isolation 100% XSS-immune session architecture ๐Ÿ”ด Critical
๐Ÿ“… Boundary Leave Engine leaveValidator.js Max(A.start, B.start) โ‰ค Min(A.end, B.end) overlap proof Mathematically eliminates leave double-booking ๐ŸŸก Compliance
๐Ÿ”’ 3-Tier RBAC Shield roleMiddleware.js ADMIN / OFFICER / EMPLOYEE โ€” enforced per route Blocks horizontal privilege escalation at routing layer ๐Ÿ”ด Critical
๐Ÿ“‹ Immutable Audit Logs winston-daily-rotate Daily JSON log chunks to filesystem โ€” append-only Court-admissible forensic history ๐ŸŸก Compliance
๐Ÿ›ก CSP Header Stack Helmet.js Global CSP, HSTS, X-Content-Type, X-Frame at boot Blocks 6+ OWASP Top 10 vectors instantly ๐Ÿ”ด Critical
๐Ÿšฆ Anti-Automation Layer express-rate-limit 10 req / 15 min per IP on /auth/* routes Credential stuffing bots computationally useless ๐Ÿ”ด Critical
๐Ÿ”— Silent Token Intercept Axios Context 401 freeze โ†’ silent refresh โ†’ full DOM resume Zero UX disruption on token expiry ๐ŸŸข UX
๐Ÿงฎ Parameterized SQL All models Zero raw string concatenation to database SQLi attack surface completely eliminated ๐Ÿ”ด Critical
๐ŸŒ NGINX Reverse Proxy nginx.conf Static CDN + upstream API binding High-perf HTTP layer, hides backend topology ๐ŸŸก Perimeter
๐Ÿณ Docker Orchestration docker-compose.yml Multi-stage builds โ€” frontend + backend + nginx Reproducible environments on any host ๐ŸŸข DevOps
๐Ÿ“Š Analytics Dashboard AnalyticsService Top earners, anomaly heatmaps, dept aggregations Real-time financial intelligence for auditors ๐ŸŸก Compliance
๐Ÿ”‘ CORS Origin Whitelist cors middleware Strict origin allowlist at Express boot Blocks cross-origin forged API requests ๐Ÿ”ด Critical
๐Ÿ— bcrypt Cost-Factor 12 Employee.js Adaptive hash โ€” 2^12 work factor per attempt GPU rainbow table attacks infeasible ๐Ÿ”ด Critical

๐Ÿ— System Architecture

Full System Topology

โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—
โ•‘                         GOVPAY v2.0 ยท COMPLETE SYSTEM TOPOLOGY                    โ•‘
โ• โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ฃ
โ•‘                                                                                    โ•‘
โ•‘   โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ•‘
โ•‘   โ”‚                         CLIENT PRESENTATION LAYER                          โ”‚  โ•‘
โ•‘   โ”‚                                                                             โ”‚  โ•‘
โ•‘   โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”‚  โ•‘
โ•‘   โ”‚  โ”‚   Admin Panel    โ”‚  โ”‚  Officer Portal  โ”‚  โ”‚    Employee Self-Service  โ”‚  โ”‚  โ•‘
โ•‘   โ”‚  โ”‚                  โ”‚  โ”‚                  โ”‚  โ”‚                           โ”‚  โ”‚  โ•‘
โ•‘   โ”‚  โ”‚ โ€ข Employee CRUD  โ”‚  โ”‚ โ€ข Payroll Gen    โ”‚  โ”‚ โ€ข View Payslips           โ”‚  โ”‚  โ•‘
โ•‘   โ”‚  โ”‚ โ€ข Rule Manager   โ”‚  โ”‚ โ€ข Leave Approve  โ”‚  โ”‚ โ€ข Submit Leave Req        โ”‚  โ”‚  โ•‘
โ•‘   โ”‚  โ”‚ โ€ข Anomaly View   โ”‚  โ”‚ โ€ข Dept Reports   โ”‚  โ”‚ โ€ข Track Leave Status      โ”‚  โ”‚  โ•‘
โ•‘   โ”‚  โ”‚ โ€ข Audit Logs     โ”‚  โ”‚ โ€ข Disbursal Ops  โ”‚  โ”‚ โ€ข Profile View            โ”‚  โ”‚  โ•‘
โ•‘   โ”‚  โ”‚ โ€ข Analytics      โ”‚  โ”‚                  โ”‚  โ”‚                           โ”‚  โ”‚  โ•‘
โ•‘   โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ”‚  โ•‘
โ•‘   โ”‚           โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ โ”ผ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜               โ”‚  โ•‘
โ•‘   โ”‚                                  โ”‚                                         โ”‚  โ•‘
โ•‘   โ”‚         React 18 + Vite HMR ยท Context API ยท Axios Interceptors            โ”‚  โ•‘
โ•‘   โ”‚                  React Router v6 ยท TypeScript 5 Strict                     โ”‚  โ•‘
โ•‘   โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ โ”ผ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ•‘
โ•‘                                       โ”‚ HTTPS / TLS 1.3                           โ•‘
โ•‘   โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ โ–ผ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ•‘
โ•‘   โ”‚                        NGINX REVERSE PROXY :80/:443                        โ”‚  โ•‘
โ•‘   โ”‚                                                                             โ”‚  โ•‘
โ•‘   โ”‚   /            โ†’ React Static Build (/app/dist)                            โ”‚  โ•‘
โ•‘   โ”‚   /api/*       โ†’ proxy_pass โ†’ Express :5000                                โ”‚  โ•‘
โ•‘   โ”‚   /health      โ†’ 200 OK (container healthcheck)                            โ”‚  โ•‘
โ•‘   โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ โ”ผ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ•‘
โ•‘                                       โ”‚                                           โ•‘
โ•‘   โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ โ–ผ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ•‘
โ•‘   โ”‚                       EXPRESS API GATEWAY :5000                            โ”‚  โ•‘
โ•‘   โ”‚                                                                             โ”‚  โ•‘
โ•‘   โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”   โ”‚  โ•‘
โ•‘   โ”‚  โ”‚  Helmet.js  โ”‚ โ”‚Rate Limiterโ”‚ โ”‚   CORS   โ”‚ โ”‚  Morgan โ”‚ โ”‚  Body    โ”‚   โ”‚  โ•‘
โ•‘   โ”‚  โ”‚  CSP / HSTS โ”‚ โ”‚ 10/15min   โ”‚ โ”‚ Whitelistโ”‚ โ”‚ Request โ”‚ โ”‚  Parser  โ”‚   โ”‚  โ•‘
โ•‘   โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ Logger  โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜   โ”‚  โ•‘
โ•‘   โ”‚                                               โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜                 โ”‚  โ•‘
โ•‘   โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”‚  โ•‘
โ•‘   โ”‚  โ”‚                    JWT AUTH + RBAC MIDDLEWARE                        โ”‚  โ”‚  โ•‘
โ•‘   โ”‚  โ”‚  verifyToken() โ†’ decodeRole() โ†’ roleMiddleware(required_role)       โ”‚  โ”‚  โ•‘
โ•‘   โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ”‚  โ•‘
โ•‘   โ”‚                                     โ”‚                                       โ”‚  โ•‘
โ•‘   โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”‚  โ•‘
โ•‘   โ”‚  โ”‚                   MICRO-LOGIC SERVICE MESH                          โ”‚  โ”‚  โ•‘
โ•‘   โ”‚  โ”‚                                                                      โ”‚  โ”‚  โ•‘
โ•‘   โ”‚  โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚  โ”‚  โ•‘
โ•‘   โ”‚  โ”‚  โ”‚ PayrollSvc   โ”‚  โ”‚ AnomalySvc  โ”‚  โ”‚  LeaveSvc   โ”‚  โ”‚Analyticsโ”‚ โ”‚  โ”‚  โ•‘
โ•‘   โ”‚  โ”‚  โ”‚ Dynamic Rule โ”‚  โ”‚ 1.5x Guard  โ”‚  โ”‚ Bound Engineโ”‚  โ”‚ Aggregatโ”‚ โ”‚  โ”‚  โ•‘
โ•‘   โ”‚  โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”˜ โ”‚  โ”‚  โ•‘
โ•‘   โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ”‚  โ•‘
โ•‘   โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ•‘
โ•‘                โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜             โ•‘
โ•‘   โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ โ–ผ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ•‘
โ•‘   โ”‚                   SQLITE 3 ยท WAL MODE ยท FOREIGN KEYS ON                   โ”‚  โ•‘
โ•‘   โ”‚                                                                             โ”‚  โ•‘
โ•‘   โ”‚   [employees]  [payroll]  [payroll_rules]  [leaves]  [departments]         โ”‚  โ•‘
โ•‘   โ”‚   [service_history]  [refresh_tokens]  [audit_events]                      โ”‚  โ•‘
โ•‘   โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ•‘
โ•‘                                       โ”‚                                           โ•‘
โ•‘   โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ โ–ผ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ•‘
โ•‘   โ”‚              WINSTON ROTATING AUDIT LOG FILESYSTEM                         โ”‚  โ•‘
โ•‘   โ”‚          logs/govpay-YYYY-MM-DD.log  (structured JSON entries)             โ”‚  โ•‘
โ•‘   โ”‚          Retention: 30 days ยท Max size: 20MB ยท Compress: gzip              โ”‚  โ•‘
โ•‘   โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ•‘
โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•

Mermaid Architecture Graph

graph TD
    classDef frontend fill:#0ea5e9,stroke:#0369a1,color:#fff,stroke-width:2px
    classDef proxy fill:#f59e0b,stroke:#b45309,color:#fff,stroke-width:2px
    classDef gateway fill:#8b5cf6,stroke:#5b21b6,color:#fff,stroke-width:2px
    classDef service fill:#10b981,stroke:#047857,color:#fff,stroke-width:2px
    classDef db fill:#0f172a,stroke:#334155,color:#94a3b8,stroke-width:2px
    classDef log fill:#ef4444,stroke:#b91c1c,color:#fff,stroke-width:2px
    classDef security fill:#f43f5e,stroke:#be123c,color:#fff,stroke-width:2px
    classDef middleware fill:#6366f1,stroke:#4338ca,color:#fff,stroke-width:2px

    subgraph CLIENT ["๐Ÿ–ฅ Client Layer (React 18 + Vite)"]
        Admin["๐Ÿ‘‘ Admin Panel\nFull CRUD + Analytics"]:::frontend
        Officer["๐ŸŽฏ Officer Portal\nPayroll + Leave Ops"]:::frontend
        Employee["๐Ÿ‘ค Employee Portal\nSelf-Service"]:::frontend
    end

    Admin & Officer & Employee <-->|HTTPS / TLS 1.3| NGINX["๐Ÿ”€ NGINX Reverse Proxy\n:80 / :443"]:::proxy
    NGINX <-->|proxy_pass :5000| API["โšก Express API Gateway\n:5000"]:::gateway

    subgraph SECURITY ["๐Ÿ” Security Middleware Stack"]
        Helmet["๐Ÿช– Helmet.js\nCSP ยท HSTS ยท X-Frame"]:::security
        Rate["๐Ÿšฆ Rate Limiter\n10 req / 15 min / IP"]:::security
        CORS["๐ŸŒ CORS\nOrigin Whitelist"]:::security
        Auth["๐Ÿ”‘ JWT Verify\n+ RBAC Guard"]:::middleware
    end

    API --> Helmet --> Rate --> CORS --> Auth

    subgraph SERVICES ["โš™๏ธ Micro-Logic Service Mesh"]
        RuleEngine["๐Ÿ”ง Rule Evaluator\nDynamic ALLOWANCE/DEDUCTION"]:::service
        Anomaly["๐Ÿšจ Anomaly Sentinel\n1.5ร— Dept Avg Threshold"]:::service
        LeaveVal["๐Ÿ“… Boundary Engine\nMax/Min Overlap Proof"]:::service
        Analytics["๐Ÿ“Š Analytics Svc\nAggregation + Top Earners"]:::service
    end

    Auth --> RuleEngine & Anomaly & LeaveVal & Analytics

    RuleEngine & Anomaly & LeaveVal & Analytics <--> DB[("๐Ÿ—„ SQLite 3\nWAL Mode\nFK Enforced")]:::db
    API -.->|Structured JSON Events| Logger["๐Ÿ“‹ Winston Logs\nDaily Rotating JSON"]:::log
    Anomaly -.->|WARN Events| Logger
Loading

Request Flow State Machine

stateDiagram-v2
    [*] --> ClientRequest: User Action
    ClientRequest --> AxiosInterceptor: HTTP Request Dispatched

    AxiosInterceptor --> AttachBearer: Inject Authorization Header
    AttachBearer --> NGINXProxy: Request Forwarded

    NGINXProxy --> HelmetCSP: Apply Security Headers
    HelmetCSP --> RateLimiter: Check Request Quota

    RateLimiter --> RateLimitExceeded: > 10 req/15min
    RateLimitExceeded --> [*]: 429 Too Many Requests

    RateLimiter --> CORSCheck: Within Quota
    CORSCheck --> CORSBlocked: Origin Not Whitelisted
    CORSBlocked --> [*]: 403 Forbidden

    CORSCheck --> JWTVerify: Origin Allowed
    JWTVerify --> JWTExpired: Token Expired
    JWTExpired --> SilentRefresh: Axios Intercept 401
    SilentRefresh --> JWTVerify: New Token Issued

    JWTVerify --> RBACCheck: Token Valid
    RBACCheck --> AccessDenied: Insufficient Role
    AccessDenied --> [*]: 403 Role Blocked

    RBACCheck --> ServiceLayer: Role Authorized
    ServiceLayer --> DBOperation: Business Logic
    DBOperation --> AuditLog: Write Winston Event
    AuditLog --> ResponsePayload: Build Response
    ResponsePayload --> [*]: 200/201 Success
Loading

๐Ÿง  Component Deep-Dive

Backend Module Responsibilities

โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—
โ•‘                    BACKEND COMPONENT RESPONSIBILITY MAP                   โ•‘
โ• โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ฆโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ฃ
โ•‘  FILE                        โ•‘  RESPONSIBILITY                           โ•‘
โ• โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ฌโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ฃ
โ•‘  server.js                   โ•‘  API bootstrap, global error sink,        โ•‘
โ•‘                              โ•‘  middleware chain mount, port bind        โ•‘
โ• โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ฌโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ฃ
โ•‘  config/db.js                โ•‘  SQLite WAL init, PRAGMA foreign_keys ON, โ•‘
โ•‘                              โ•‘  connection pool, migration runner        โ•‘
โ• โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ฌโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ฃ
โ•‘  config/environment.js       โ•‘  Validated .env loader โ€” throws on        โ•‘
โ•‘                              โ•‘  missing required keys at startup         โ•‘
โ• โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ฌโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ฃ
โ•‘  middleware/auth.js          โ•‘  JWT signature verify, role decode,       โ•‘
โ•‘                              โ•‘  injects req.user on every request        โ•‘
โ• โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ฌโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ฃ
โ•‘  middleware/roleMiddleware.js โ•‘  RBAC factory: role('ADMIN') โ€” blocks    โ•‘
โ•‘                              โ•‘  insufficient-tier requests with 403      โ•‘
โ• โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ฌโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ฃ
โ•‘  middleware/rateLimiter.js   โ•‘  express-rate-limit factory, sliding      โ•‘
โ•‘                              โ•‘  window per IP, configurable per group    โ•‘
โ• โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ฌโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ฃ
โ•‘  middleware/errorHandler.js  โ•‘  Global Express error sink โ€” normalizes   โ•‘
โ•‘                              โ•‘  and emits structured Winston events      โ•‘
โ• โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ฌโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ฃ
โ•‘  models/Employee.js          โ•‘  bcrypt hash, CRUD ops, department FK     โ•‘
โ•‘                              โ•‘  resolver, role validation                โ•‘
โ• โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ฌโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ฃ
โ•‘  models/Payroll.js           โ•‘  Rule application, net-pay computation,   โ•‘
โ•‘                              โ•‘  anomaly flag setter                      โ•‘
โ• โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ฌโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ฃ
โ•‘  models/Leave.js             โ•‘  Overlap bound check, status management,  โ•‘
โ•‘                              โ•‘  duration day calculator                  โ•‘
โ• โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ฌโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ฃ
โ•‘  services/payrollService.js  โ•‘  Rule engine loop, percentage/fixed eval, โ•‘
โ•‘                              โ•‘  anomaly threshold check                  โ•‘
โ• โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ฌโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ฃ
โ•‘  services/analyticsService.jsโ•‘  Aggregation queries, top-earner yields,  โ•‘
โ•‘                              โ•‘  department cost summaries                โ•‘
โ• โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ฌโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ฃ
โ•‘  services/leaveService.js    โ•‘  Chronological boundary validator,        โ•‘
โ•‘                              โ•‘  approved-leave overlap checker           โ•‘
โ• โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ฌโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ฃ
โ•‘  services/auditService.js    โ•‘  Structured Winston event emitter,        โ•‘
โ•‘                              โ•‘  severity routing (info/warn/error)       โ•‘
โ• โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ฌโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ฃ
โ•‘  routes/auth.js              โ•‘  Login, refresh-token, logout, /me        โ•‘
โ• โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ฌโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ฃ
โ•‘  routes/employees.js         โ•‘  Employee CRUD endpoints                  โ•‘
โ• โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ฌโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ฃ
โ•‘  routes/payroll.js           โ•‘  Generate, fetch, disburse endpoints      โ•‘
โ• โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ฌโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ฃ
โ•‘  routes/payrollRules.js      โ•‘  Rule CRUD + is_live toggle               โ•‘
โ• โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ฌโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ฃ
โ•‘  routes/leaves.js            โ•‘  Submit, approve, reject endpoints        โ•‘
โ• โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ฌโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ฃ
โ•‘  routes/analytics.js         โ•‘  Anomaly heatmap, dept summary, earners   โ•‘
โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ฉโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•

Frontend Component Tree

<App>  (main.tsx โ€” React 18 createRoot)
โ”‚
โ””โ”€โ”€ <AuthProvider>                     โ† Context API global state machine
    โ”‚                                    JWT storage, role hydration
    โ”‚
    โ”œโ”€โ”€ <PrivateRoute>                  โ† Route guard โ€” redirects to /login
    โ”‚                                    if context.user is null
    โ”‚
    โ”œโ”€โ”€ <AdminLayout>                   โ† role: ADMIN only
    โ”‚   โ”œโ”€โ”€ <Sidebar>                   โ† Active route highlight
    โ”‚   โ”œโ”€โ”€ <TopBar>                    โ† User info + logout trigger
    โ”‚   โ”œโ”€โ”€ <Dashboard>                 โ† KPI cards + Recharts analytics
    โ”‚   โ”œโ”€โ”€ <EmployeeTable>             โ† Full CRUD with inline modal edit
    โ”‚   โ”œโ”€โ”€ <DepartmentManager>         โ† Department CRUD + head assignment
    โ”‚   โ”œโ”€โ”€ <RuleManager>               โ† Live payroll rule configurator
    โ”‚   โ”œโ”€โ”€ <AnomalyPanel>              โ† Flagged payroll viewer + resolve
    โ”‚   โ””โ”€โ”€ <AuditViewer>              โ† Winston log stream display
    โ”‚
    โ”œโ”€โ”€ <OfficerLayout>                 โ† role: OFFICER and above
    โ”‚   โ”œโ”€โ”€ <PayrollGenerator>          โ† Preview net-pay before submit
    โ”‚   โ”œโ”€โ”€ <PayrollHistory>            โ† Paginated payroll ledger
    โ”‚   โ””โ”€โ”€ <LeaveManager>             โ† Approve/reject with overlap check
    โ”‚
    โ””โ”€โ”€ <EmployeeLayout>               โ† role: EMPLOYEE (self-service only)
        โ”œโ”€โ”€ <MyPayslips>               โ† Historical payroll breakdown
        โ””โ”€โ”€ <MyLeaves>                 โ† Submit + track leave requests

๐Ÿ—„ Database ERD & Schema Constraints

Entity Relationship Diagram

erDiagram
    EMPLOYEE ||--o{ PAYROLL : "receives_disbursement"
    EMPLOYEE ||--o{ LEAVES : "files_request"
    EMPLOYEE ||--o{ SERVICE_HISTORY : "tracks_career"
    EMPLOYEE ||--o{ REFRESH_TOKENS : "holds_active_sessions"
    DEPARTMENT ||--o{ EMPLOYEE : "assigns_headcount"
    PAYROLL_RULES ||--o{ PAYROLL : "dynamically_configures_net_pay"

    EMPLOYEE {
        INTEGER id PK
        TEXT full_name
        TEXT email "UNIQUE ยท NOT NULL"
        TEXT bcrypt_hash "cost_factor_12"
        TEXT access_role "ENUM ADMIN OFFICER EMPLOYEE"
        INTEGER department_id FK
        REAL base_salary "NOT NULL ยท > 0"
        TEXT phone
        TEXT designation
        TEXT date_of_joining "ISO 8601"
        TEXT created_at "ISO 8601"
        TEXT updated_at "ISO 8601"
    }

    DEPARTMENT {
        INTEGER id PK
        TEXT dept_name "UNIQUE"
        TEXT dept_code
        TEXT location
        INTEGER head_employee_id FK
        TEXT created_at "ISO 8601"
    }

    PAYROLL_RULES {
        INTEGER id PK
        TEXT identifier_name "e.g. Transport Allowance"
        TEXT logic_type "ENUM ALLOWANCE DEDUCTION"
        TEXT parse_type "ENUM PERCENTAGE FIXED"
        REAL scalar_value "CHECK > 0"
        BOOLEAN is_live
        TEXT effective_from "ISO 8601"
        TEXT created_by FK
        TEXT updated_at "ISO 8601"
    }

    PAYROLL {
        INTEGER id PK
        INTEGER employee_id FK
        TEXT fiscal_month
        TEXT fiscal_year
        REAL base_salary_snapshot
        REAL total_allowances
        REAL total_deductions
        REAL net_payout "CHECK >= 0"
        BOOLEAN is_anomaly "1 if NetPay > 1.5x Dept Avg"
        TEXT anomaly_reason
        TEXT status "ENUM PENDING DISBURSED REVERSED"
        TEXT generated_by FK
        TEXT generated_at "ISO 8601"
        TEXT disbursed_at "ISO 8601"
    }

    LEAVES {
        INTEGER id PK
        INTEGER employee_id FK
        TEXT leave_type "CASUAL SICK EARNED MATERNITY"
        TEXT request_start "YYYY-MM-DD"
        TEXT request_end "YYYY-MM-DD"
        INTEGER duration_days
        TEXT approval_status "PENDING APPROVED REJECTED"
        INTEGER approved_by FK
        TEXT remarks
        TEXT applied_at "ISO 8601"
        TEXT actioned_at "ISO 8601"
    }

    REFRESH_TOKENS {
        INTEGER id PK
        INTEGER employee_id FK
        TEXT token_hash "SHA-256 of raw token"
        TEXT expires_at "ISO 8601"
        BOOLEAN is_revoked
        TEXT user_agent
        TEXT ip_address
        TEXT created_at "ISO 8601"
    }

    SERVICE_HISTORY {
        INTEGER id PK
        INTEGER employee_id FK
        TEXT event_type "PROMOTION TRANSFER SALARY_REVISION"
        REAL old_salary
        REAL new_salary
        TEXT old_department
        TEXT new_department
        TEXT effective_date "ISO 8601"
        TEXT recorded_by FK
    }
Loading

Full Schema Constraints Reference

Table Constraint Column(s) Rule
employees UNIQUE INDEX email Prevents duplicate accounts
employees FOREIGN KEY department_id REFERENCES departments(id) ON DELETE SET NULL
employees CHECK access_role IN ('ADMIN', 'OFFICER', 'EMPLOYEE')
employees CHECK base_salary base_salary > 0
payroll FOREIGN KEY employee_id REFERENCES employees(id) ON DELETE CASCADE
payroll CHECK net_payout net_payout >= 0 โ€” no negative disbursements
payroll CHECK status IN ('PENDING', 'DISBURSED', 'REVERSED')
leaves FOREIGN KEY employee_id REFERENCES employees(id) ON DELETE CASCADE
leaves CHECK approval_status IN ('PENDING', 'APPROVED', 'REJECTED')
leaves CHECK duration_days duration_days > 0
refresh_tokens FOREIGN KEY employee_id REFERENCES employees(id) ON DELETE CASCADE
payroll_rules CHECK scalar_value scalar_value > 0
payroll_rules CHECK logic_type IN ('ALLOWANCE', 'DEDUCTION')
payroll_rules CHECK parse_type IN ('PERCENTAGE', 'FIXED')

Database Index Strategy

Index Name Table Column(s) Type Purpose
idx_emp_email employees email UNIQUE Fast login lookup
idx_emp_dept employees department_id NORMAL Dept join performance
idx_payroll_emp payroll employee_id NORMAL Employee payslip fetch
idx_payroll_fiscal payroll fiscal_month, fiscal_year COMPOSITE Monthly payroll queries
idx_payroll_anomaly payroll is_anomaly PARTIAL Anomaly dashboard filter
idx_leaves_emp leaves employee_id NORMAL Employee leave history
idx_leaves_status leaves approval_status NORMAL Pending queue filter
idx_tokens_emp refresh_tokens employee_id NORMAL Session lookup
idx_tokens_revoked refresh_tokens is_revoked NORMAL Valid session filter

โš™๏ธ Core Technical Workflows

1. Dual-Token Authentication Lifecycle

โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—
โ•‘                     DUAL-TOKEN LIFECYCLE STATE MACHINE                    โ•‘
โ• โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ฃ
โ•‘                                                                            โ•‘
โ•‘  LOGIN REQUEST                                                             โ•‘
โ•‘       โ”‚                                                                    โ•‘
โ•‘       โ–ผ                                                                    โ•‘
โ•‘  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ•‘
โ•‘  โ”‚  POST /api/auth/login  {email, password}                            โ”‚  โ•‘
โ•‘  โ”‚                                                                      โ”‚  โ•‘
โ•‘  โ”‚  1. Rate limit check โ€” 10 req/15min on /auth/* โ€” 429 if exceeded   โ”‚  โ•‘
โ•‘  โ”‚  2. Lookup employee by email โ†’ 401 if not found                     โ”‚  โ•‘
โ•‘  โ”‚  3. bcrypt.compare(plaintext, hash, cost=12)                        โ”‚  โ•‘
โ•‘  โ”‚     โ”œโ”€โ”€ FAIL  โ†’ 401 Unauthorized + increment rate counter          โ”‚  โ•‘
โ•‘  โ”‚     โ””โ”€โ”€ PASS  โ†’ issue tokens                                        โ”‚  โ•‘
โ•‘  โ”‚  4. Sign Access JWT  โ†’ { userId, role, exp: now+15m }              โ”‚  โ•‘
โ•‘  โ”‚  5. Sign Refresh JWT โ†’ { userId, exp: now+7d }                     โ”‚  โ•‘
โ•‘  โ”‚  6. Hash Refresh JWT (SHA-256) โ†’ store in refresh_tokens table      โ”‚  โ•‘
โ•‘  โ”‚  7. Set Refresh JWT in HttpOnly SameSite=Strict cookie              โ”‚  โ•‘
โ•‘  โ”‚  8. Return { access_token, user } in JSON body                      โ”‚  โ•‘
โ•‘  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ•‘
โ•‘                                                                            โ•‘
โ•‘  AUTHENTICATED SESSION (0 โ€“ 15 minutes)                                   โ•‘
โ•‘       โ”‚                                                                    โ•‘
โ•‘       โ–ผ                                                                    โ•‘
โ•‘  Axios attaches: Authorization: Bearer <access_token>                     โ•‘
โ•‘  Express verifyToken() โ€” validates signature + expiry                     โ•‘
โ•‘  Every request passes in under 1ms                                        โ•‘
โ•‘                                                                            โ•‘
โ•‘  โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ [15 minutes elapsed] โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ โ•‘
โ•‘                                                                            โ•‘
โ•‘  API call โ†’ Gateway โ†’ 401 JWT_EXPIRED                                     โ•‘
โ•‘       โ”‚                                                                    โ•‘
โ•‘       โ–ผ                                                                    โ•‘
โ•‘  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ•‘
โ•‘  โ”‚  AXIOS INTERCEPTOR โ€” SILENT REFRESH PROTOCOL                        โ”‚  โ•‘
โ•‘  โ”‚                                                                      โ”‚  โ•‘
โ•‘  โ”‚  Step 1: FREEZE โ€” queue all subsequent outgoing requests            โ”‚  โ•‘
โ•‘  โ”‚  Step 2: POST /api/auth/refresh-token (HttpOnly cookie auto-sent)  โ”‚  โ•‘
โ•‘  โ”‚                                                                      โ”‚  โ•‘
โ•‘  โ”‚  Gateway response:                                                   โ”‚  โ•‘
โ•‘  โ”‚    โ”œโ”€โ”€ Refresh Valid   โ†’ issue new Access JWT (15m)                 โ”‚  โ•‘
โ•‘  โ”‚    โ”‚   โ†’ RESUME: re-attach token, replay all queued requests        โ”‚  โ•‘
โ•‘  โ”‚    โ””โ”€โ”€ Refresh Expired โ†’ mark token revoked in DB                   โ”‚  โ•‘
โ•‘  โ”‚        โ†’ Force logout โ†’ clear state โ†’ redirect /login               โ”‚  โ•‘
โ•‘  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ•‘
โ•‘                                                                            โ•‘
โ•‘  User NEVER sees a loading state or forced login during silent refresh โœ“  โ•‘
โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
sequenceDiagram
    participant Browser as ๐ŸŒ React Browser
    participant Axios as โšก Axios Interceptor
    participant NGINX as ๐Ÿ”€ NGINX Proxy
    participant Gateway as ๐Ÿ›ก Express Gateway
    participant DB as ๐Ÿ—„ SQLite DB
    participant Log as ๐Ÿ“‹ Winston Log

    Browser->>Axios: Dispatch GET /api/analytics
    Axios->>NGINX: Bearer <access_token>
    NGINX->>Gateway: Forwarded Request

    alt โœ… Access Token Valid (<15 min)
        Gateway->>DB: Query Analytics Data
        DB-->>Gateway: Aggregated Result
        Gateway->>Log: INFO: analytics.fetch [userId]
        Gateway-->>Browser: 200 OK + Payload
    else โฐ Access Token Expired
        Gateway-->>Axios: 401 JWT_EXPIRED
        Note over Axios: โ„ FREEZE โ€” Queue pending requests
        Axios->>Gateway: POST /auth/refresh + HttpOnly Cookie
        Gateway->>DB: Verify token_hash + is_revoked + expiry
        DB-->>Gateway: Token Valid
        Gateway->>DB: Issue new access_token record
        Gateway->>Log: INFO: token.refreshed [userId]
        Gateway-->>Axios: 200 + new_access_token
        Note over Axios: โ™ป Update token โ€” Re-attach headers
        Axios->>Gateway: Replay GET /api/analytics
        Gateway-->>Browser: 200 OK + Payload
    else ๐Ÿšซ Refresh Token Expired
        Gateway->>DB: Mark token is_revoked = 1
        Gateway->>Log: WARN: session.expired [userId]
        Gateway-->>Axios: 403 REFRESH_EXPIRED
        Note over Browser: Force logout โ†’ /login redirect
    end
Loading

2. Dynamic Payroll Rule Engine + Anomaly Processor

flowchart TD
    A["๐Ÿ‘ค Officer: POST /api/payroll/generate\n{employeeId, month, year}"] --> B

    B["๐Ÿ”’ JWT Auth + RBAC Check\n(OFFICER or ADMIN required)"] --> C

    C{"Role Authorized?"} -->|โŒ No| Z1["403 Forbidden\nLog: WARN rbac.blocked"]
    C -->|โœ… Yes| D

    D["๐Ÿ“– Fetch Employee Record\n(base_salary, department_id, designation)"] --> E

    E["๐Ÿ“‹ Query PAYROLL_RULES\nWHERE is_live = 1\nORDER BY logic_type"] --> F

    F["๐Ÿ”„ Rule Evaluation Loop"]

    F --> G{"Rule: logic_type?"}
    G -->|"ALLOWANCE ยท PERCENTAGE"| H["allowance += base_salary ร— (scalar/100)"]
    G -->|"ALLOWANCE ยท FIXED"| I["allowance += scalar_value"]
    G -->|"DEDUCTION ยท PERCENTAGE"| J["deduction += base_salary ร— (scalar/100)"]
    G -->|"DEDUCTION ยท FIXED"| K["deduction += scalar_value"]

    H & I --> L["ฮฃ total_allowances"]
    J & K --> M["ฮฃ total_deductions"]

    L & M --> N["๐Ÿ’ฐ net_payout = base + allowances โˆ’ deductions\nCHECK: net_payout โ‰ฅ 0"]

    N --> O["๐Ÿ“Š Fetch Department Avg Net Pay\nSELECT AVG(net_payout) FROM payroll\nWHERE dept_id = X AND status != 'REVERSED'"]

    O --> P{"๐Ÿšจ net_payout > dept_avg ร— 1.5 ?"}

    P -->|"๐Ÿ”ด YES โ€” ANOMALY"| Q["is_anomaly = TRUE\nanomaly_reason = 'Exceeds 150% dept avg'\nstatus = PENDING"]
    P -->|"๐ŸŸข NO โ€” NORMAL"| R["is_anomaly = FALSE\nstatus = PENDING"]

    Q --> S["๐Ÿ’พ INSERT into payroll table\nWith rule_snapshot JSON"]
    R --> S

    S --> T["๐Ÿ“‹ Winston Log Event\ntype: payroll.generated\ninclude: is_anomaly, net_payout, dept_avg"]

    T --> U{"is_anomaly?"}
    U -->|YES| V["๐Ÿ”ด Visible in Admin Anomaly Dashboard\nBadge: REVIEW REQUIRED"]
    U -->|NO| W["๐ŸŸข Status: PENDING\nReady for ADMIN disbursal"]
Loading

3. Chronological Leave Boundary Validation

โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—
โ•‘               CHRONOLOGICAL BOUNDARY ENGINE โ€” MATH PROOF                  โ•‘
โ• โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ฃ
โ•‘                                                                            โ•‘
โ•‘  NEW REQUEST:    [โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• Jan 10 โ”€โ”€โ”€โ”€ Jan 20 โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•]           โ•‘
โ•‘                                                                            โ•‘
โ•‘  Existing A: [โ•โ• Jan 5 โ”€โ”€ Jan 12 โ•โ•]              โ† OVERLAP DETECTED     โ•‘
โ•‘               Max(10,5)=10  โ‰ค  Min(20,12)=12  โ†’  10 โ‰ค 12  TRUE โœ—        โ•‘
โ•‘                                                                            โ•‘
โ•‘  Existing B:              [โ•โ• Jan 18 โ”€โ”€ Jan 25 โ•โ•]  โ† OVERLAP DETECTED   โ•‘
โ•‘               Max(10,18)=18  โ‰ค  Min(20,25)=20  โ†’  18 โ‰ค 20  TRUE โœ—       โ•‘
โ•‘                                                                            โ•‘
โ•‘  Existing C: [โ• Jan 1 โ”€ Jan 8 โ•]                 โ† NO OVERLAP           โ•‘
โ•‘               Max(10,1)=10  โ‰ค  Min(20,8)=8   โ†’  10 โ‰ค 8   FALSE โœ“        โ•‘
โ•‘                                                                            โ•‘
โ•‘  Existing D:                      [โ•โ• Jan 22 โ”€โ”€ Jan 30 โ•โ•] โ† NO OVERLAP  โ•‘
โ•‘               Max(10,22)=22  โ‰ค  Min(20,30)=20  โ†’  22 โ‰ค 20  FALSE โœ“      โ•‘
โ•‘                                                                            โ•‘
โ• โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ฃ
โ•‘                                                                            โ•‘
โ•‘  ALGORITHM:                                                                โ•‘
โ•‘                                                                            โ•‘
โ•‘  overlap_exists(new, existing) =                                           โ•‘
โ•‘      Max(new.start, existing.start) โ‰ค Min(new.end, existing.end)          โ•‘
โ•‘                                                                            โ•‘
โ•‘  DECISION ENGINE:                                                          โ•‘
โ•‘  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ•‘
โ•‘  โ”‚  For each approved leave in employee's history:                      โ”‚ โ•‘
โ•‘  โ”‚    IF overlap_exists(newRequest, existingLeave) == TRUE              โ”‚ โ•‘
โ•‘  โ”‚      โ†’ REJECT immediately โ†’ 409 Conflict + dates disclosed           โ”‚ โ•‘
โ•‘  โ”‚  If ALL checks pass (no overlap found):                              โ”‚ โ•‘
โ•‘  โ”‚    โ†’ INSERT new leave record, status = PENDING                       โ”‚ โ•‘
โ•‘  โ”‚    โ†’ Log: INFO leave.submitted [employeeId, dates, type]            โ”‚ โ•‘
โ•‘  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ•‘
โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•

4. RBAC Role Enforcement Flow

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚              ROLE-BASED ACCESS CONTROL ยท ENFORCEMENT MAP            โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚  REQUEST ROLE  โ”‚  ACCESSIBLE RESOURCES                              โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚                โ”‚  โ€ข GET/POST/PUT/DELETE /employees                  โ”‚
โ”‚    ADMIN       โ”‚  โ€ข POST/PUT/DELETE /payroll-rules                  โ”‚
โ”‚   (Level 3)    โ”‚  โ€ข PATCH /payroll/:id/disburse                     โ”‚
โ”‚                โ”‚  โ€ข GET /analytics/anomalies                        โ”‚
โ”‚                โ”‚  โ€ข GET /analytics/dept-summary                     โ”‚
โ”‚                โ”‚  โ€ข All OFFICER permissions                         โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚                โ”‚  โ€ข POST /payroll/generate                          โ”‚
โ”‚   OFFICER      โ”‚  โ€ข GET /payroll (all records)                      โ”‚
โ”‚   (Level 2)    โ”‚  โ€ข PATCH /leaves/:id/approve                       โ”‚
โ”‚                โ”‚  โ€ข PATCH /leaves/:id/reject                        โ”‚
โ”‚                โ”‚  โ€ข GET /analytics/top-earners                      โ”‚
โ”‚                โ”‚  โ€ข All EMPLOYEE permissions                        โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚                โ”‚  โ€ข GET /payroll/my (own only)                      โ”‚
โ”‚   EMPLOYEE     โ”‚  โ€ข POST /leaves (own requests only)               โ”‚
โ”‚   (Level 1)    โ”‚  โ€ข GET /leaves/my (own history only)              โ”‚
โ”‚                โ”‚  โ€ข GET /auth/me (own profile)                      โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

  ESCALATION ATTEMPT:
  EMPLOYEE โ†’ POST /payroll/generate
       โ”‚
       โ–ผ
  roleMiddleware('OFFICER') fires
       โ”‚
       โ–ผ
  req.user.role = 'EMPLOYEE' โ†’ fails tier check
       โ”‚
       โ–ผ
  Winston WARN: rbac.escalation_attempt [userId, endpoint]
       โ”‚
       โ–ผ
  HTTP 403 Forbidden  {"error": "Insufficient role: OFFICER required"}

๐Ÿ” Zero-Trust Security Model

Warning

All security is enforced at middleware layer. No API endpoint exists without auth verification. Bypass attempts are logged, rate-limited, and rejected with zero information leakage.

Zero-Trust Principles Applied

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                  ZERO-TRUST PRINCIPLES IN GOVPAY                          โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚  PRINCIPLE                 โ”‚  GOVPAY IMPLEMENTATION                       โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚  "Never Trust,             โ”‚  JWT verified on every single request โ€”      โ”‚
โ”‚   Always Verify"           โ”‚  no session persistence assumed              โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚  "Assume Breach"           โ”‚  Rate limits, anomaly detection, and audit   โ”‚
โ”‚                            โ”‚  logs operate as if attacker is already in   โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚  "Least Privilege"         โ”‚  RBAC โ€” EMPLOYEE cannot touch payroll;       โ”‚
โ”‚                            โ”‚  OFFICER cannot modify rules or disburse     โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚  "Verify Explicitly"       โ”‚  Role read from DB on every auth, not token  โ”‚
โ”‚                            โ”‚  payload โ€” token cannot self-elevate role    โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚  "Limit Blast Radius"      โ”‚  Token expiry at 15m โ€” stolen tokens expire  โ”‚
โ”‚                            โ”‚  before attacker can pivot laterally         โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚  "Immutable Audit"         โ”‚  Every auth event, rule change, and anomaly  โ”‚
โ”‚                            โ”‚  flag is append-only in Winston logs         โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

OWASP Top 10 Coverage Matrix

# OWASP Category Threat Description GovPay Mitigation Coverage
A01 Broken Access Control Users accessing unauthorized resources roleMiddleware() on every protected route ยท RBAC 3-tier enforcement โœ… Full
A02 Cryptographic Failures Weak encryption exposing sensitive data bcrypt cost-12 ยท JWT HS256 ยท HTTPS-only via NGINX ยท HttpOnly cookies โœ… Full
A03 Injection SQL Injection via malicious inputs Parameterized queries everywhere โ€” zero string concatenation to DB โœ… Full
A04 Insecure Design No threat modeling in architecture Defense-in-depth 7-layer design ยท zero-trust defaults every layer โœ… Full
A05 Security Misconfiguration Default creds, open ports, missing headers Helmet.js global CSP ยท No defaults ยท .env enforced at startup โœ… Full
A06 Vulnerable Components Outdated dependencies with known CVEs Regular npm audit ยท locked package-lock.json ๐ŸŸก Ongoing
A07 Auth & Session Failures Credential stuffing, brute force, session fixation Dual JWT ยท Rate limit 10/15min ยท bcrypt constant-time compare โœ… Full
A08 Software Integrity Untrusted code injection in CI pipeline GitHub Actions linting ยท Docker multi-stage verified build ๐ŸŸก Ongoing
A09 Logging & Monitoring No audit trail for security events Winston rotating daily logs โ€” auth, anomaly, CRUD, RBAC all logged โœ… Full
A10 SSRF Server-side request forgery via redirect No external HTTP calls from backend ยท strict CORS origin whitelist โœ… Full

Comprehensive Threat Attack Matrix

Attack Vector Technique Used GovPay Defense Layer Residual Risk
XSS Token Theft document.cookie / localStorage scraper injection Access token in memory only ยท Refresh in HttpOnly cookie ๐ŸŸข None
CSRF Cross-site forged form submission hijacking admin action SameSite=Strict cookie ยท CORS origin whitelist ยท CSRF tokens ๐ŸŸข None
Brute Force Login Automated password dictionary attack Rate limit: 10 req/15min/IP ยท exponential 429 lockout ๐ŸŸข None
Credential Stuffing Leaked DB credentials replayed against GovPay bcrypt cost-12 ยท rate limiting ยท constant-time compare ๐ŸŸข Low
JWT Payload Tampering Modifying payload to claim ADMIN role HS256 signature verification โ€” invalid on any modification ๐ŸŸข None
JWT Replay Attack Reusing captured access token after logout 15m expiry ยท Refresh revocation table ยท logout invalidation ๐ŸŸข None
SQL Injection ' OR 1=1; DROP TABLE employees -- Parameterized queries โ€” inputs never concatenated to SQL ๐ŸŸข None
Privilege Escalation Horizontal/vertical resource access beyond role roleMiddleware() on every protected route ยท DB role lookup ๐ŸŸข None
Man-in-the-Middle HTTP traffic interception NGINX enforces HTTPS ยท HSTS preload via Helmet ยท TLS 1.3 ๐ŸŸข None
Over-Disbursement Fraud Manual payroll inflation by insider Anomaly Sentinel ยท 1.5ร— dept-avg threshold ยท Winston WARN ๐ŸŸข Detected
Clickjacking Embedding GovPay in <iframe> for click capture X-Frame-Options: DENY via Helmet.js at boot ๐ŸŸข None
MIME Sniffing Browser content-type override attacks X-Content-Type-Options: nosniff via Helmet ๐ŸŸข None
Session Fixation Forcing victim to use known session ID New token issued on every login ยท old tokens invalidated ๐ŸŸข None
Audit Trail Tampering Deleting log files to cover tracks Logs append-only at OS level ยท Rotate-not-delete ๐ŸŸก Low
Enumeration Attack Harvesting valid emails via error messages Uniform 401 Invalid credentials โ€” no field discrimination ๐ŸŸข None
Insecure Direct Object Reference /api/payroll/999 to access another employee's data Ownership check in all self-service endpoints โœ… Mitigated

๐Ÿ›ก Defense-in-Depth Architecture

โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—
โ•‘                  GOVPAY ยท 7-LAYER DEFENSE-IN-DEPTH MODEL                  โ•‘
โ• โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ฃ
โ•‘                                                                            โ•‘
โ•‘  LAYER 7 โ”€โ”€ NETWORK PERIMETER                                             โ•‘
โ•‘  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”   โ•‘
โ•‘  โ”‚  NGINX: TLS termination ยท SSL/HTTPS enforcement ยท port isolation   โ”‚   โ•‘
โ•‘  โ”‚  API structure hidden ยท Static assets served without Express       โ”‚   โ•‘
โ•‘  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜   โ•‘
โ•‘                            โ–ผ request enters                                โ•‘
โ•‘  LAYER 6 โ”€โ”€ TRANSPORT HARDENING                                           โ•‘
โ•‘  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”   โ•‘
โ•‘  โ”‚  Helmet.js:                                                        โ”‚   โ•‘
โ•‘  โ”‚  โ€ข Content-Security-Policy (CSP)  ยท X-Frame-Options: DENY         โ”‚   โ•‘
โ•‘  โ”‚  โ€ข Strict-Transport-Security (HSTS) ยท X-Content-Type-Options      โ”‚   โ•‘
โ•‘  โ”‚  โ€ข Referrer-Policy ยท Permissions-Policy ยท Cross-Origin headers     โ”‚   โ•‘
โ•‘  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜   โ•‘
โ•‘                            โ–ผ headers attached                              โ•‘
โ•‘  LAYER 5 โ”€โ”€ RATE CONTROL & ANTI-AUTOMATION                               โ•‘
โ•‘  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”   โ•‘
โ•‘  โ”‚  express-rate-limit:                                               โ”‚   โ•‘
โ•‘  โ”‚  โ€ข Auth routes: 10 req / 15 min / IP (sliding window)             โ”‚   โ•‘
โ•‘  โ”‚  โ€ข Standard routes: 200 req / 15 min / IP                         โ”‚   โ•‘
โ•‘  โ”‚  โ€ข 429 Too Many Requests on breach ยท lockout counter persisted     โ”‚   โ•‘
โ•‘  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜   โ•‘
โ•‘                            โ–ผ quota verified                                โ•‘
โ•‘  LAYER 4 โ”€โ”€ ORIGIN CONTROL                                                โ•‘
โ•‘  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”   โ•‘
โ•‘  โ”‚  CORS middleware:                                                   โ”‚   โ•‘
โ•‘  โ”‚  โ€ข Strict allowlist โ€” only whitelisted origins proceed            โ”‚   โ•‘
โ•‘  โ”‚  โ€ข Preflight OPTIONS handled automatically                         โ”‚   โ•‘
โ•‘  โ”‚  โ€ข No wildcard (*) โ€” every origin explicitly approved             โ”‚   โ•‘
โ•‘  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜   โ•‘
โ•‘                            โ–ผ origin cleared                                โ•‘
โ•‘  LAYER 3 โ”€โ”€ AUTHENTICATION                                                โ•‘
โ•‘  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”   โ•‘
โ•‘  โ”‚  JWT auth.js middleware:                                            โ”‚   โ•‘
โ•‘  โ”‚  โ€ข HS256 signature verification on every request                   โ”‚   โ•‘
โ•‘  โ”‚  โ€ข 15m access token ยท 7d HttpOnly refresh token                   โ”‚   โ•‘
โ•‘  โ”‚  โ€ข bcrypt cost-12 on login ยท constant-time compare (timing-safe)  โ”‚   โ•‘
โ•‘  โ”‚  โ€ข Refresh token hash stored in DB โ€” revocable on logout          โ”‚   โ•‘
โ•‘  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜   โ•‘
โ•‘                            โ–ผ identity confirmed                            โ•‘
โ•‘  LAYER 2 โ”€โ”€ AUTHORIZATION                                                 โ•‘
โ•‘  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”   โ•‘
โ•‘  โ”‚  roleMiddleware.js โ€” RBAC enforcement:                              โ”‚   โ•‘
โ•‘  โ”‚  โ€ข ADMIN > OFFICER > EMPLOYEE tier model                           โ”‚   โ•‘
โ•‘  โ”‚  โ€ข Role fetched from DB โ€” JWT payload cannot self-elevate          โ”‚   โ•‘
โ•‘  โ”‚  โ€ข Every protected route has explicit role() guard                 โ”‚   โ•‘
โ•‘  โ”‚  โ€ข Escalation attempts โ†’ Winston WARN + 403                        โ”‚   โ•‘
โ•‘  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜   โ•‘
โ•‘                            โ–ผ role authorized                               โ•‘
โ•‘  LAYER 1 โ”€โ”€ DATA INTEGRITY                                                โ•‘
โ•‘  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”   โ•‘
โ•‘  โ”‚  SQLite constraints:                                                โ”‚   โ•‘
โ•‘  โ”‚  โ€ข Parameterized queries only โ€” zero raw concatenation             โ”‚   โ•‘
โ•‘  โ”‚  โ€ข FOREIGN KEY constraints enforced (PRAGMA on)                    โ”‚   โ•‘
โ•‘  โ”‚  โ€ข CHECK constraints on all enum fields and numeric values         โ”‚   โ•‘
โ•‘  โ”‚  โ€ข CASCADE rules on deletion โ€” no orphaned records                 โ”‚   โ•‘
โ•‘  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜   โ•‘
โ•‘                            โ–ผ data validated                                โ•‘
โ•‘  LAYER 0 โ”€โ”€ AUDIT & FORENSICS                                             โ•‘
โ•‘  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”   โ•‘
โ•‘  โ”‚  Winston rotating file logger:                                      โ”‚   โ•‘
โ•‘  โ”‚  โ€ข Every auth event, rule change, anomaly flag, RBAC block logged  โ”‚   โ•‘
โ•‘  โ”‚  โ€ข Daily JSON files ยท 30-day retention ยท gzip compression          โ”‚   โ•‘
โ•‘  โ”‚  โ€ข Append-only at OS level โ€” rotation without deletion             โ”‚   โ•‘
โ•‘  โ”‚  โ€ข Structured JSON โ€” machine-parseable for SIEM integration        โ”‚   โ•‘
โ•‘  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜   โ•‘
โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
graph LR
    classDef attack fill:#ef4444,stroke:#b91c1c,color:#fff,stroke-width:2px
    classDef defense fill:#10b981,stroke:#047857,color:#fff,stroke-width:2px
    classDef layer fill:#1e293b,stroke:#334155,color:#94a3b8,stroke-width:1px

    subgraph ATTACKS ["โš ๏ธ Attack Vectors"]
        XSS[XSS Attack]:::attack
        BF[Brute Force]:::attack
        SQLi[SQL Injection]:::attack
        CSRF[CSRF]:::attack
        PE[Privilege Escalation]:::attack
        MITM[Man in the Middle]:::attack
        Fraud[Payroll Fraud]:::attack
        Tamper[Log Tampering]:::attack
        Click[Clickjacking]:::attack
        MIME[MIME Sniffing]:::attack
    end

    subgraph DEFENSES ["๐Ÿ›ก Defense Layers"]
        CSP[Helmet CSP Headers]:::defense
        RL[Rate Limiter 10/15m]:::defense
        PQ[Parameterized Queries]:::defense
        SS[SameSite + CORS]:::defense
        RBAC[RBAC roleMiddleware]:::defense
        TLS[NGINX TLS + HSTS]:::defense
        AS[Anomaly Sentinel 1.5ร—]:::defense
        WL[Winston Append Logs]:::defense
        XFO[X-Frame-Options DENY]:::defense
        XCT[X-Content-Type nosniff]:::defense
    end

    XSS -->|Blocked by| CSP
    BF -->|Throttled by| RL
    SQLi -->|Blocked by| PQ
    CSRF -->|Blocked by| SS
    PE -->|Blocked by| RBAC
    MITM -->|Blocked by| TLS
    Fraud -->|Detected by| AS
    Tamper -->|Blocked by| WL
    Click -->|Blocked by| XFO
    MIME -->|Blocked by| XCT
Loading

๐Ÿšจ Anomaly Sentinel Engine

Fraud Detection Architecture

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                    ANOMALY SENTINEL ยท DETECTION PIPELINE                   โ”‚
โ”‚                                                                             โ”‚
โ”‚  INPUT: Generated payroll record                                           โ”‚
โ”‚       โ”‚                                                                     โ”‚
โ”‚       โ–ผ                                                                     โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”   โ”‚
โ”‚  โ”‚  STAGE 1 โ€” DEPARTMENT BASELINE CALCULATION                          โ”‚   โ”‚
โ”‚  โ”‚                                                                      โ”‚   โ”‚
โ”‚  โ”‚  SELECT AVG(net_payout) as dept_avg                                  โ”‚   โ”‚
โ”‚  โ”‚  FROM payroll                                                        โ”‚   โ”‚
โ”‚  โ”‚  WHERE employee_id IN (                                              โ”‚   โ”‚
โ”‚  โ”‚    SELECT id FROM employees WHERE department_id = ?                 โ”‚   โ”‚
โ”‚  โ”‚  )                                                                   โ”‚   โ”‚
โ”‚  โ”‚  AND status != 'REVERSED'                                           โ”‚   โ”‚
โ”‚  โ”‚  AND fiscal_year = current_year                                      โ”‚   โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜   โ”‚
โ”‚       โ”‚                                                                     โ”‚
โ”‚       โ–ผ                                                                     โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”   โ”‚
โ”‚  โ”‚  STAGE 2 โ€” THRESHOLD EVALUATION                                      โ”‚   โ”‚
โ”‚  โ”‚                                                                      โ”‚   โ”‚
โ”‚  โ”‚  anomaly_threshold = dept_avg ร— 1.5                                  โ”‚   โ”‚
โ”‚  โ”‚                                                                      โ”‚   โ”‚
โ”‚  โ”‚  if net_payout > anomaly_threshold:                                  โ”‚   โ”‚
โ”‚  โ”‚    โ”œโ”€โ”€ Set is_anomaly = TRUE                                         โ”‚   โ”‚
โ”‚  โ”‚    โ”œโ”€โ”€ Set anomaly_reason = "Exceeds 150% of dept avg"              โ”‚   โ”‚
โ”‚  โ”‚    โ””โ”€โ”€ Append anomaly_delta = net_payout - anomaly_threshold        โ”‚   โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜   โ”‚
โ”‚       โ”‚                                                                     โ”‚
โ”‚       โ–ผ                                                                     โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”   โ”‚
โ”‚  โ”‚  STAGE 3 โ€” ALERT EMISSION                                            โ”‚   โ”‚
โ”‚  โ”‚                                                                      โ”‚   โ”‚
โ”‚  โ”‚  Winston.warn({                                                      โ”‚   โ”‚
โ”‚  โ”‚    event: 'anomaly.detected',                                        โ”‚   โ”‚
โ”‚  โ”‚    employeeId, fiscalMonth, fiscalYear,                              โ”‚   โ”‚
โ”‚  โ”‚    netPayout, deptAvg, threshold, delta,                             โ”‚   โ”‚
โ”‚  โ”‚    generatedBy, timestamp                                            โ”‚   โ”‚
โ”‚  โ”‚  })                                                                  โ”‚   โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜   โ”‚
โ”‚       โ”‚                                                                     โ”‚
โ”‚       โ–ผ                                                                     โ”‚
โ”‚  Admin Anomaly Dashboard โ€” flagged for manual review before disbursal      โ”‚
โ”‚  ADMIN must explicitly resolve or override before PATCH /disburse           โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

Anomaly Threshold Visualized

  NET PAY DISTRIBUTION โ€” DEPARTMENT ENGINEERING (Sample)
  
  โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
  Employee A     โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–‘โ–‘โ–‘  โ‚น 42,000
  Employee B     โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–‘  โ‚น 45,000
  Employee C     โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ  โ‚น 48,000    โ† Dept AVG โ‰ˆ โ‚น 43,000
  Employee D     โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–‘โ–‘โ–‘โ–‘โ–‘โ–‘  โ‚น 38,000
  Employee E     โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–‘โ–‘โ–‘  โ‚น 42,000
  โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
                          โ”‚
                          โ–ผ
  Dept AVG = (42+45+48+38+42) / 5 = โ‚น 43,000
  Anomaly Threshold = 43,000 ร— 1.5 = โ‚น 64,500
  โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
  Employee F     โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ  โ‚น 72,000  โ† ๐Ÿšจ ANOMALY
                 Exceeds threshold by โ‚น 7,500
  โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
                                     โ†‘
                              ANOMALY SENTINEL FIRES
                          is_anomaly = TRUE, WARN logged
                          Blocked from auto-disbursal

๐Ÿ”„ Data Flow & Request Lifecycle

Complete Request Tracing Map

sequenceDiagram
    participant U as ๐Ÿ‘ค User
    participant R as โš› React SPA
    participant A as โšก Axios
    participant N as ๐Ÿ”€ NGINX
    participant H as ๐Ÿช– Helmet
    participant L as ๐Ÿšฆ RateLimiter
    participant C as ๐ŸŒ CORS
    participant J as ๐Ÿ”‘ JWT Auth
    participant RB as ๐Ÿ”’ RBAC
    participant S as โš™๏ธ Service Layer
    participant DB as ๐Ÿ—„ SQLite
    participant W as ๐Ÿ“‹ Winston

    U->>R: Click "Generate Payroll"
    R->>A: axios.post('/api/payroll/generate', payload)
    A->>A: Attach Authorization: Bearer token
    A->>N: HTTPS POST /api/payroll/generate
    N->>H: Proxy forwarded request
    H->>H: Apply CSP, HSTS, X-Frame headers
    H->>L: Pass to rate limiter
    L->>L: Check: IP requests within 10/15min?
    L-->>A: 429 if exceeded
    L->>C: Pass to CORS
    C->>C: Origin in whitelist?
    C-->>A: 403 if blocked
    C->>J: Pass to JWT middleware
    J->>J: Verify HS256 signature + expiry
    J-->>A: 401 if invalid/expired
    J->>RB: Pass with decoded req.user
    RB->>RB: req.user.role >= 'OFFICER'?
    RB-->>A: 403 if EMPLOYEE role
    RB->>S: Authorized โ€” invoke PayrollService
    S->>DB: Fetch employee, rules, dept avg
    DB-->>S: Records returned
    S->>S: Rule engine loop + anomaly check
    S->>DB: INSERT payroll record
    DB-->>S: Record ID confirmed
    S->>W: Log: payroll.generated + is_anomaly
    W-->>S: Log written
    S-->>R: 201 + payroll payload
    R->>U: Render payslip preview or anomaly badge
Loading

๐Ÿ“ก Comprehensive API Reference

Authentication Endpoints

Method Endpoint Auth Request Body Response Error Codes
POST /api/auth/login Public {email, password} {access_token, user} + Set-Cookie 401, 429
POST /api/auth/refresh-token HttpOnly Cookie โ€” {access_token} 401, 403
POST /api/auth/logout Bearer Token โ€” {message} 401
GET /api/auth/me Bearer Token โ€” {user, role, department} 401

Employee Management Endpoints

Method Endpoint Auth Level Description Returns
GET /api/employees Admin/Officer All employees with dept join Employee[]
GET /api/employees/:id Admin/Officer Single employee + payroll history {Employee, Payroll[]}
POST /api/employees Admin Create + bcrypt hash password Employee
PUT /api/employees/:id Admin Update profile, salary, dept Employee
DELETE /api/employees/:id Admin Cascade-delete all related records {message}
GET /api/employees/:id/history Admin Service history and promotions ServiceHistory[]

Payroll Rule Engine Endpoints

Method Endpoint Auth Level Description Returns
GET /api/payroll-rules Admin/Officer All rules (live + inactive) Rule[]
GET /api/payroll-rules/active Admin/Officer is_live = true only Rule[]
POST /api/payroll-rules Admin Create new global rule Rule
PUT /api/payroll-rules/:id Admin Mutate scalar โ€” affects future payrolls Rule
PATCH /api/payroll-rules/:id/toggle Admin Toggle is_live without deletion Rule
DELETE /api/payroll-rules/:id Admin Permanently remove rule {message}

Payroll Generation & Analytics Endpoints

Method Endpoint Auth Level Description Returns
POST /api/payroll/generate Admin/Officer Full rule engine + anomaly check {Payroll, is_anomaly}
GET /api/payroll Admin/Officer Paginated history with filters {data[], total, page}
GET /api/payroll/my Employee Own payslip history Payroll[]
GET /api/payroll/:id Admin/Officer Single payroll with rule audit {Payroll, breakdown[]}
PATCH /api/payroll/:id/disburse Admin Mark as DISBURSED Payroll
PATCH /api/payroll/:id/reverse Admin Reverse disbursed payroll Payroll
GET /api/analytics/anomalies Admin All flagged payrolls Payroll[]
GET /api/analytics/top-earners Admin/Officer Top net_pay by dept EarnerStats[]
GET /api/analytics/dept-summary Admin Per-dept cost summary DeptSummary[]
GET /api/analytics/monthly-trends Admin Month-over-month payroll delta TrendData[]

Leave Management Endpoints

Method Endpoint Auth Level Description Returns
POST /api/leaves Employee Submit + overlap validation Leave or 409
GET /api/leaves/my Employee Own leave history Leave[]
GET /api/leaves Admin/Officer All employee leaves + filters Leave[]
PATCH /api/leaves/:id/approve Admin/Officer Approve pending leave Leave
PATCH /api/leaves/:id/reject Admin/Officer Reject with remarks Leave

HTTP Status Code Reference

Code Meaning GovPay Context Logged?
200 OK Successful GET, PATCH, login INFO
201 Created New employee, payroll, rule, leave INFO
400 Bad Request Missing fields, invalid date format WARN
401 Unauthorized Missing / expired / invalid JWT WARN
403 Forbidden Valid token, insufficient role WARN
404 Not Found Employee/payroll ID doesn't exist INFO
409 Conflict Leave overlap ยท Duplicate email INFO
429 Too Many Requests Rate limit breached on auth route WARN
500 Internal Server Error Unexpected DB error ERROR

Sample Request/Response Shapes

// POST /api/payroll/generate
// Request:
{
  "employeeId": 42,
  "fiscalMonth": "March",
  "fiscalYear": "2026"
}

// Response (Normal):
{
  "id": 387,
  "employeeId": 42,
  "fiscalMonth": "March",
  "fiscalYear": "2026",
  "baseSalarySnapshot": 50000,
  "totalAllowances": 12500,
  "totalDeductions": 6200,
  "netPayout": 56300,
  "isAnomaly": false,
  "status": "PENDING",
  "breakdown": [
    { "rule": "House Rent Allowance", "type": "ALLOWANCE", "amount": 7500 },
    { "rule": "Transport Allowance", "type": "ALLOWANCE", "amount": 2500 },
    { "rule": "Medical Allowance", "type": "ALLOWANCE", "amount": 2500 },
    { "rule": "Provident Fund",     "type": "DEDUCTION",  "amount": 6000 },
    { "rule": "Professional Tax",   "type": "DEDUCTION",  "amount": 200 }
  ],
  "generatedAt": "2026-03-29T14:32:00.000Z"
}

// Response (Anomaly Flagged):
{
  "netPayout": 89000,
  "isAnomaly": true,
  "anomalyReason": "Exceeds 150% of department average (โ‚น53,200)",
  "anomalyDelta": 9200,
  "status": "PENDING",
  "requiresReview": true
}

๐ŸŽจ UI Design System & Tokens

Design Token Reference

โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—
โ•‘              GOVPAY ยท CYBERPUNK ENTERPRISE DARK THEME                  โ•‘
โ• โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ฃ
โ•‘                                                                         โ•‘
โ•‘  BACKGROUNDS                                                            โ•‘
โ•‘  โ”œโ”€โ”€ --bg-base        #0a0a0e   โ–ˆโ–ˆ  Deep Void Canvas                  โ•‘
โ•‘  โ”œโ”€โ”€ --bg-surface     #111116   โ–ˆโ–ˆ  Card / Panel Surface               โ•‘
โ•‘  โ”œโ”€โ”€ --bg-elevated    #18181f   โ–ˆโ–ˆ  Modal / Dropdown Layer             โ•‘
โ•‘  โ””โ”€โ”€ --bg-glass       rgba(255,255,255,0.04)  Glassmorphism Layer      โ•‘
โ•‘                                                                         โ•‘
โ•‘  PRIMARY ACCENT PALETTE                                                 โ•‘
โ•‘  โ”œโ”€โ”€ --accent-blue    #3b82f6   โ–ˆโ–ˆ  Primary CTA / Neon Core            โ•‘
โ•‘  โ”œโ”€โ”€ --accent-violet  #8b5cf6   โ–ˆโ–ˆ  Secondary / Badges                 โ•‘
โ•‘  โ”œโ”€โ”€ --accent-cyan    #06b6d4   โ–ˆโ–ˆ  Info / Stats / Charts              โ•‘
โ•‘  โ””โ”€โ”€ --accent-amber   #f59e0b   โ–ˆโ–ˆ  Warning / Pending States           โ•‘
โ•‘                                                                         โ•‘
โ•‘  SEMANTIC STATUS COLORS                                                 โ•‘
โ•‘  โ”œโ”€โ”€ --emerald        #10b981   โ–ˆโ–ˆ  Success / Approved / Normal        โ•‘
โ•‘  โ”œโ”€โ”€ --rose           #f43f5e   โ–ˆโ–ˆ  Danger / Anomaly / Rejected        โ•‘
โ•‘  โ”œโ”€โ”€ --amber          #f59e0b   โ–ˆโ–ˆ  Warning / Pending / In Review      โ•‘
โ•‘  โ”œโ”€โ”€ --cyan           #06b6d4   โ–ˆโ–ˆ  Info / Neutral / Analytics         โ•‘
โ•‘  โ””โ”€โ”€ --slate          #94a3b8   โ–ˆโ–ˆ  Muted / Disabled / Placeholder     โ•‘
โ•‘                                                                         โ•‘
โ•‘  TYPOGRAPHY STACK                                                       โ•‘
โ•‘  โ”œโ”€โ”€ Display:    Outfit (Google Fonts)    โ€” Headings, KPI numbers       โ•‘
โ•‘  โ”œโ”€โ”€ Monospace:  JetBrains Mono           โ€” Data tables, token values   โ•‘
โ•‘  โ””โ”€โ”€ Body:       Inter                   โ€” Prose, UI labels, forms      โ•‘
โ•‘                                                                         โ•‘
โ•‘  GLASSMORPHISM EFFECTS                                                  โ•‘
โ•‘  โ”œโ”€โ”€ Card Blur:    backdrop-filter: blur(20px) saturate(180%)          โ•‘
โ•‘  โ”œโ”€โ”€ Neon Glow:    box-shadow: 0 0 30px rgba(59,130,246,0.15)         โ•‘
โ•‘  โ”œโ”€โ”€ Border:       1px solid rgba(255,255,255,0.08)                    โ•‘
โ•‘  โ”œโ”€โ”€ Radius-sm:    6px                                                  โ•‘
โ•‘  โ””โ”€โ”€ Radius-lg:    16px                                                 โ•‘
โ•‘                                                                         โ•‘
โ•‘  ANIMATION TOKENS                                                       โ•‘
โ•‘  โ”œโ”€โ”€ Transition:   all 200ms cubic-bezier(0.4, 0, 0.2, 1)             โ•‘
โ•‘  โ”œโ”€โ”€ Hover Scale:  transform: scale(1.02)                              โ•‘
โ•‘  โ””โ”€โ”€ Skeleton:     @keyframes shimmer โ€” loading states                 โ•‘
โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•

Component State Color Map

UI State Color Hex CSS Variable Used In
Success / Approved #10b981 --emerald Leave approved, payroll normal, login OK
Danger / Anomaly #f43f5e --rose Anomaly flagged, leave rejected, auth fail
Warning / Pending #f59e0b --amber Payroll pending, leave under review
Info / Neutral #06b6d4 --cyan Analytics stats, informational badges
Primary Action #3b82f6 --accent-blue Primary buttons, nav active states
Secondary #8b5cf6 --accent-violet Role badges, secondary CTAs
Muted #94a3b8 --slate Disabled states, secondary text
Background #0a0a0e --bg-base App canvas
Surface #111116 --bg-surface Cards, panels, tables

๐Ÿ“ Directory Structure (MVC)

Gov-Payroll-System/
โ”‚
โ”œโ”€โ”€ ๐Ÿ“‚ backend/                            # EXPRESS API GATEWAY
โ”‚   โ”œโ”€โ”€ ๐Ÿ“‚ config/
โ”‚   โ”‚   โ”œโ”€โ”€ db.js                         # SQLite WAL init + PRAGMA foreign_keys=ON
โ”‚   โ”‚   โ””โ”€โ”€ environment.js                # Validated .env loader (throws on missing keys)
โ”‚   โ”‚
โ”‚   โ”œโ”€โ”€ ๐Ÿ“‚ middleware/
โ”‚   โ”‚   โ”œโ”€โ”€ auth.js                       # JWT verifier โ†’ injects req.user + role
โ”‚   โ”‚   โ”œโ”€โ”€ roleMiddleware.js             # RBAC factory: role('ADMIN') guard
โ”‚   โ”‚   โ”œโ”€โ”€ rateLimiter.js                # express-rate-limit per route group
โ”‚   โ”‚   โ””โ”€โ”€ errorHandler.js              # Global Express error sink + Winston emit
โ”‚   โ”‚
โ”‚   โ”œโ”€โ”€ ๐Ÿ“‚ models/
โ”‚   โ”‚   โ”œโ”€โ”€ Employee.js                   # bcrypt, CRUD, department FK resolver
โ”‚   โ”‚   โ”œโ”€โ”€ Payroll.js                    # Rule application + net-pay computation
โ”‚   โ”‚   โ”œโ”€โ”€ Leave.js                      # Overlap bound check + status management
โ”‚   โ”‚   โ”œโ”€โ”€ Department.js                 # Dept aggregate queries + headcount
โ”‚   โ”‚   โ””โ”€โ”€ RefreshToken.js              # Token revocation CRUD
โ”‚   โ”‚
โ”‚   โ”œโ”€โ”€ ๐Ÿ“‚ services/
โ”‚   โ”‚   โ”œโ”€โ”€ payrollService.js             # Rule engine loop + anomaly threshold check
โ”‚   โ”‚   โ”œโ”€โ”€ analyticsService.js           # Aggregation queries, top-earner yields
โ”‚   โ”‚   โ”œโ”€โ”€ leaveService.js               # Chronological boundary validator
โ”‚   โ”‚   โ””โ”€โ”€ auditService.js              # Structured Winston event emitter
โ”‚   โ”‚
โ”‚   โ”œโ”€โ”€ ๐Ÿ“‚ routes/
โ”‚   โ”‚   โ”œโ”€โ”€ auth.js                       # Login, refresh, logout, /me
โ”‚   โ”‚   โ”œโ”€โ”€ employees.js                  # Employee CRUD + service history
โ”‚   โ”‚   โ”œโ”€โ”€ payroll.js                    # Generate, fetch, disburse, reverse
โ”‚   โ”‚   โ”œโ”€โ”€ payrollRules.js              # Rule CRUD + is_live toggle
โ”‚   โ”‚   โ”œโ”€โ”€ leaves.js                     # Submit, approve, reject
โ”‚   โ”‚   โ””โ”€โ”€ analytics.js                 # Anomaly, dept summary, top earners
โ”‚   โ”‚
โ”‚   โ”œโ”€โ”€ ๐Ÿ“‚ logs/                          # Winston rotating daily JSON audit files
โ”‚   โ”‚   โ””โ”€โ”€ govpay-YYYY-MM-DD.log        # Structured JSON โ€” one event per line
โ”‚   โ”‚
โ”‚   โ”œโ”€โ”€ .env.example                      # Key manifest (JWT_SECRET, etc.)
โ”‚   โ”œโ”€โ”€ seed.js                           # Schema init + demo data hydration
โ”‚   โ””โ”€โ”€ server.js                         # API boot: Helmet, CORS, Routes, Error sink
โ”‚
โ”œโ”€โ”€ ๐Ÿ“‚ src/                               # REACT 18 + VITE FRONTEND
โ”‚   โ”œโ”€โ”€ ๐Ÿ“‚ components/
โ”‚   โ”‚   โ”œโ”€โ”€ ๐Ÿ“‚ admin/
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ EmployeeTable.jsx         # Full CRUD with inline modal edit
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ RuleManager.jsx           # Live payroll rule configurator
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ AnomalyPanel.jsx         # Flagged payroll viewer + resolve
โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ AuditViewer.jsx          # Log stream display
โ”‚   โ”‚   โ”œโ”€โ”€ ๐Ÿ“‚ officer/
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ PayrollGenerator.jsx      # Preview net-pay before submit
โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ LeaveManager.jsx          # Approve/reject with overlap check
โ”‚   โ”‚   โ”œโ”€โ”€ ๐Ÿ“‚ employee/
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ MyPayslips.jsx            # Historical payroll ledger
โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ MyLeaves.jsx             # Submit + track leave requests
โ”‚   โ”‚   โ”œโ”€โ”€ ๐Ÿ“‚ dashboard/
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ StatsGrid.jsx            # KPI cards with delta indicators
โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ Charts.jsx               # Recharts analytics visualizations
โ”‚   โ”‚   โ””โ”€โ”€ ๐Ÿ“‚ ui/
โ”‚   โ”‚       โ”œโ”€โ”€ Button.jsx               # Variant system (primary/ghost/danger)
โ”‚   โ”‚       โ”œโ”€โ”€ Badge.jsx                # Status color-coded badge component
โ”‚   โ”‚       โ”œโ”€โ”€ Modal.jsx                # Portal-based overlay component
โ”‚   โ”‚       โ”œโ”€โ”€ Table.jsx                # Sortable + paginated data table
โ”‚   โ”‚       โ””โ”€โ”€ Skeleton.jsx             # Loading shimmer placeholder
โ”‚   โ”‚
โ”‚   โ”œโ”€โ”€ ๐Ÿ“‚ context/
โ”‚   โ”‚   โ””โ”€โ”€ AuthContext.jsx              # Global auth state + token management
โ”‚   โ”‚
โ”‚   โ”œโ”€โ”€ ๐Ÿ“‚ services/
โ”‚   โ”‚   โ””โ”€โ”€ api.ts                       # Axios singleton + interceptor chain
โ”‚   โ”‚
โ”‚   โ”œโ”€โ”€ ๐Ÿ“‚ hooks/
โ”‚   โ”‚   โ”œโ”€โ”€ useAuth.ts                   # Auth context consumer hook
โ”‚   โ”‚   โ”œโ”€โ”€ usePagination.ts             # Paginated fetch with loading states
โ”‚   โ”‚   โ””โ”€โ”€ useAnalytics.ts             # Analytics data fetch + refresh
โ”‚   โ”‚
โ”‚   โ”œโ”€โ”€ ๐Ÿ“‚ types/
โ”‚   โ”‚   โ””โ”€โ”€ index.ts                     # TypeScript interfaces: Employee, Payroll, etc.
โ”‚   โ”‚
โ”‚   โ””โ”€โ”€ main.tsx                         # Vite entry + React 18 createRoot
โ”‚
โ”œโ”€โ”€ ๐Ÿ“‚ docs/                             # GITHUB PAGES INTERACTIVE SIMULATION
โ”‚   โ”œโ”€โ”€ index.html                       # Landing portal wrapper
โ”‚   โ”œโ”€โ”€ styles.css                       # Full custom enterprise CSS (no frameworks)
โ”‚   โ””โ”€โ”€ script.js                        # Vanilla JS interactive simulations
โ”‚
โ”œโ”€โ”€ ๐Ÿ“‚ nginx/
โ”‚   โ””โ”€โ”€ nginx.conf                       # Upstream binding + static asset routing
โ”‚
โ”œโ”€โ”€ ๐Ÿ“‚ .github/
โ”‚   โ””โ”€โ”€ ๐Ÿ“‚ workflows/
โ”‚       โ””โ”€โ”€ ci.yml                       # ESLint + build check on every push
โ”‚
โ”œโ”€โ”€ Dockerfile.frontend                  # Multi-stage: node build โ†’ nginx serve
โ”œโ”€โ”€ Dockerfile.backend                   # Node.js Alpine production container
โ”œโ”€โ”€ docker-compose.yml                   # Full orchestration: frontend + backend + nginx
โ””โ”€โ”€ package.json                         # Root workspace manifest

๐Ÿณ Deployment Topology & Quick Start

Docker Compose Production Topology

โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—
โ•‘                      DOCKER COMPOSE ยท PRODUCTION TOPOLOGY                  โ•‘
โ• โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ฃ
โ•‘                                                                             โ•‘
โ•‘  External Traffic (Port 80 / 443)                                          โ•‘
โ•‘       โ”‚                                                                     โ•‘
โ•‘       โ–ผ                                                                     โ•‘
โ•‘  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”   โ•‘
โ•‘  โ”‚                     nginx:alpine  :80 / :443                         โ”‚   โ•‘
โ•‘  โ”‚                                                                      โ”‚   โ•‘
โ•‘  โ”‚  /              โ†’ /app/dist   (React static build)                  โ”‚   โ•‘
โ•‘  โ”‚  /api/*         โ†’ proxy_pass http://backend:5000                    โ”‚   โ•‘
โ•‘  โ”‚  /health        โ†’ 200 OK      (healthcheck probe)                   โ”‚   โ•‘
โ•‘  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜   โ•‘
โ•‘                               โ”‚ Internal Docker Network                    โ•‘
โ•‘          โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”                      โ•‘
โ•‘          โ”‚                                           โ”‚                      โ•‘
โ•‘  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”             โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ•‘
โ•‘  โ”‚  frontend:node:18    โ”‚             โ”‚  backend:node:alpine             โ”‚  โ•‘
โ•‘  โ”‚                      โ”‚             โ”‚                                  โ”‚  โ•‘
โ•‘  โ”‚  npm run build       โ”‚             โ”‚  node server.js :5000           โ”‚  โ•‘
โ•‘  โ”‚  โ†’ /app/dist         โ”‚             โ”‚                                  โ”‚  โ•‘
โ•‘  โ”‚  (served by nginx)   โ”‚             โ”‚  Volume: ./backend/logs:/logs   โ”‚  โ•‘
โ•‘  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜             โ”‚  Volume: ./database.sqlite      โ”‚  โ•‘
โ•‘                                       โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ•‘
โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•

Option A: Docker Compose (Recommended โ€” Production)

# 1. Clone repository
git clone https://github.com/RishvinReddy/Gov-Payroll-System.git
cd Gov-Payroll-System

# 2. Create and populate environment file
cp backend/.env.example backend/.env
# Edit backend/.env with your JWT secrets

# 3. Launch full production stack (NGINX + React + Express)
docker-compose up --build -d

# 4. Verify all containers are healthy
docker-compose ps

# 5. Seed the database on first run
docker-compose exec backend node seed.js

# 6. Tail logs for real-time validation
docker-compose logs -f backend

๐ŸŒ Application available at http://localhost โ€” fully routed through NGINX.

Option B: Native Node.js (Development)

Step 1 โ€” Provision environment variables

cd backend
cp .env.example .env
# backend/.env โ€” REQUIRED KEYS
JWT_SECRET=<minimum-64-character-cryptographically-random-string>
JWT_REFRESH_SECRET=<different-64-character-random-string>
PORT=5000
NODE_ENV=development
DB_PATH=./database.sqlite
LOG_LEVEL=debug
CORS_ORIGIN=http://localhost:3000
RATE_LIMIT_WINDOW_MS=900000
RATE_LIMIT_MAX=10

Step 2 โ€” Backend startup

cd backend
npm install
node seed.js        # First-run only: creates schema + seeds demo data
npm run dev         # Nodemon hot-reload on :5000

Step 3 โ€” Frontend startup

# New terminal at repo root
npm install
npm run dev         # Vite HMR on :3000 โ†’ proxies /api to :5000

Seed Data: Default Test Credentials

Caution

Change all seed credentials immediately before any production or internet-facing deployment.

Role Email Password Access Level
Administrator admin@govpay.gov Admin@1234 Full system access
Payroll Officer officer@govpay.gov Officer@1234 Payroll + leave ops
Employee emp@govpay.gov Employee@1234 Self-service only

Environment Variables Reference

Variable Required Default Description
JWT_SECRET โœ… Yes โ€” HS256 signing secret for access tokens
JWT_REFRESH_SECRET โœ… Yes โ€” HS256 signing secret for refresh tokens
PORT โœ… Yes 5000 Express server bind port
NODE_ENV โœ… Yes development Enables production error suppression
DB_PATH โœ… Yes ./database.sqlite SQLite file location
CORS_ORIGIN โœ… Yes โ€” Allowed frontend origin for CORS
LOG_LEVEL โšก Optional info Winston log verbosity
RATE_LIMIT_MAX โšก Optional 10 Max auth requests per window
RATE_LIMIT_WINDOW_MS โšก Optional 900000 Rate limit window in ms (15min)

๐Ÿ“Š Performance Benchmarks

Target Response Time SLAs

Operation P50 P95 P99 Notes
POST /auth/login <80ms <150ms <300ms bcrypt adds ~80ms intentionally
POST /payroll/generate <120ms <250ms <500ms Rule loop + anomaly threshold check
GET /analytics/dept-summary <50ms <100ms <200ms SQLite WAL aggregation
GET /employees (100 rows) <30ms <60ms <100ms Index scan on department_id
POST /leaves + overlap check <40ms <80ms <150ms Bound comparison query
GET /payroll (paginated) <35ms <70ms <130ms Composite fiscal index scan
Axios interceptor refresh <200ms <400ms <700ms Token renegotiation round-trip
Vite cold start (dev) <1s โ€” โ€” vs ~15s with CRA/Webpack
Docker compose up โ€“build <90s โ€” โ€” First build with cache miss
JWT verification <1ms <2ms <5ms HMAC-SHA256 cryptographic op

SQLite WAL Mode vs Journal Mode

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚              SQLITE WAL vs JOURNAL MODE ยท COMPARISON                โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚  WAL (Write-Ahead Log)    โ”‚  Default (Delete/Journal)              โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚  Concurrent reads during  โ”‚  All reads blocked during write lock   โ”‚
โ”‚  active write operations  โ”‚                                        โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚  Readers never block      โ”‚  Writers must wait for read lock to    โ”‚
โ”‚  active writers           โ”‚  fully release                         โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚  Ideal for admin panel     โ”‚  Unsuitable for concurrent admin +     โ”‚
โ”‚  + analytics read-heavy   โ”‚  officer session load                  โ”‚
โ”‚  concurrent workload      โ”‚                                        โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚  3โ€“5ร— better read         โ”‚  Degrades significantly under even     โ”‚
โ”‚  throughput under load    โ”‚  moderate concurrent access            โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚  Crash-safe โ€” WAL file    โ”‚  Journal recovery slower on crash      โ”‚
โ”‚  replays automatically    โ”‚                                        โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

๐Ÿงช Testing & CI/CD Strategy

Test Pyramid

                           โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
                           โ”‚  E2E Tests   โ”‚  (v3.0 โ€” Playwright)
                           โ”‚  Full admin  โ”‚
                           โ”‚  + officer   โ”‚
                           โ”‚  workflows   โ”‚
                          /โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜\
                         /                  \
                        /  Integration Tests  \  (v3.0 โ€” Supertest)
                       /  Auth routes, payroll \
                      /   generate, leave flow   \
                     /โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\
                    /                              \
                   /         Unit Tests             \  (v3.0 โ€” Jest)
                  /  Rule engine, anomaly logic,     \
                 /  boundary engine, bcrypt mocks     \
                /โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\
               /                                        \
              /     Static Analysis (โœ… Active Now)       \
             /  ESLint Airbnb ยท TypeScript Strict ยท npm audit \
            /โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\

GitHub Actions CI Pipeline

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                     GITHUB ACTIONS CI PIPELINE                        โ”‚
โ”‚                                                                        โ”‚
โ”‚  git push โ†’ main / PR โ†’ develop                                       โ”‚
โ”‚       โ”‚                                                                โ”‚
โ”‚       โ–ผ                                                                โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”    โ”‚
โ”‚  โ”‚  ubuntu-latest ยท actions/checkout@v4 ยท setup-node@v4 (18.x)  โ”‚    โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜    โ”‚
โ”‚       โ”‚                                                                โ”‚
โ”‚       โ”œโ”€โ”€โ–ถ [1] npm ci  (locked dependency install)                   โ”‚
โ”‚       โ”‚                                                                โ”‚
โ”‚       โ”œโ”€โ”€โ–ถ [2] eslint . --max-warnings 0                             โ”‚
โ”‚       โ”‚        โ””โ”€โ”€ Airbnb base rules ยท zero warnings allowed         โ”‚
โ”‚       โ”‚                                                                โ”‚
โ”‚       โ”œโ”€โ”€โ–ถ [3] npm run type-check                                    โ”‚
โ”‚       โ”‚        โ””โ”€โ”€ TypeScript strict mode โ€” no implicit any          โ”‚
โ”‚       โ”‚                                                                โ”‚
โ”‚       โ”œโ”€โ”€โ–ถ [4] npm audit --audit-level=high                          โ”‚
โ”‚       โ”‚        โ””โ”€โ”€ Blocks on high/critical CVEs in dependencies      โ”‚
โ”‚       โ”‚                                                                โ”‚
โ”‚       โ”œโ”€โ”€โ–ถ [5] npm test --coverage (Jest โ€” v3.0)                    โ”‚
โ”‚       โ”‚        โ””โ”€โ”€ Coverage gate: >80% lines, branches, functions    โ”‚
โ”‚       โ”‚                                                                โ”‚
โ”‚       โ””โ”€โ”€โ–ถ [6] npm run build                                         โ”‚
โ”‚                โ””โ”€โ”€ Vite production bundle validation โ€” no dead importsโ”‚
โ”‚                                                                        โ”‚
โ”‚  โœ… All gates pass โ†’ PR eligible for merge to develop                 โ”‚
โ”‚  โŒ Any gate fails โ†’ PR merge blocked + reviewer auto-notified        โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

Test Coverage Roadmap

Layer Framework Scope Priority Status
Static Analysis ESLint + TypeScript All source files ๐Ÿ”ด Critical โœ… Active
Dependency Audit npm audit All node_modules ๐Ÿ”ด Critical โœ… Active
Unit โ€” Rule Engine Jest payrollService.js isolated ๐Ÿ”ด High ๐Ÿ”„ v3.0
Unit โ€” Anomaly Logic Jest 1.5ร— threshold edge cases ๐Ÿ”ด High ๐Ÿ”„ v3.0
Unit โ€” Boundary Engine Jest Date overlap math proofs ๐Ÿ”ด High ๐Ÿ”„ v3.0
Unit โ€” bcrypt Jest Hash + compare mocks ๐ŸŸก Medium ๐Ÿ”„ v3.0
Integration โ€” Auth Supertest Login, refresh, logout ๐Ÿ”ด High ๐Ÿ”„ v3.0
Integration โ€” Payroll Supertest Generate + anomaly end-to-end ๐Ÿ”ด High ๐Ÿ”„ v3.0
Integration โ€” Leaves Supertest Submit + overlap conflict ๐ŸŸก Medium ๐Ÿ”„ v3.0
E2E โ€” Admin Workflow Playwright Full CRUD session ๐ŸŸก Medium ๐Ÿ”„ v3.0
E2E โ€” Officer Workflow Playwright Payroll + leave ops ๐ŸŸก Medium ๐Ÿ”„ v3.0
Security Scan OWASP ZAP Automated vulnerability scan ๐Ÿ”ด High ๐Ÿ”„ v3.0
Load Testing k6 100 concurrent sessions ๐ŸŸข Low ๐Ÿ”„ v4.0

๐Ÿšจ Troubleshooting Guide

Symptom Root Cause Approved Resolution
SQLITE_BUSY: database is locked Multiple Node processes competing for write Kill all backend processes ยท Delete .sqlite-journal if present ยท WAL auto-recovers on clean restart
401 Unauthorized on every request .env JWT keys missing or mismatched Validate .env has both JWT_SECRET and JWT_REFRESH_SECRET ยท Restart backend to flush process.env
Vite HMR Connection Failed Port conflict or Windows Ctrl+C hang Type Y in terminal ยท Kill port: npx kill-port 3000
Leave overlap accepted incorrectly Running v1.0 branch without boundary engine git pull origin main โ€” v2.0 ships full Max/Min bound validator
npm run build TypeScript errors Strict type errors in component props Run npm run type-check for full trace ยท Fix all any usages before merge
Docker build hangs at npm install Corporate proxy blocking npm registry Set npm config set proxy http://proxy:port in Dockerfile or use --network=host
Legitimate payroll flagged as anomaly Department avg skewed by small sample Check payroll table โ€” low sample distorts threshold ยท Seed more dept employee data
NGINX 502 Bad Gateway Backend container not healthy at proxy startup Add depends_on: backend: condition: service_healthy in docker-compose.yml
Cannot GET /api/... from browser CORS origin mismatch Verify CORS_ORIGIN in .env matches Vite dev server URL exactly
Winston logs not appearing logs/ directory missing write permission mkdir -p backend/logs && chmod 755 backend/logs
bcrypt module not found Native addon needs compilation npm rebuild bcrypt ยท or npm install bcrypt --build-from-source
Refresh token loop (infinite refresh) Refresh token revoked but not cleared POST /auth/logout ยท Clear HttpOnly cookie ยท Delete DB refresh record
Analytics showing zero records Empty payroll table (fresh install) Run seed: node seed.js ยท Generate at least one payroll per department

๐Ÿงพ Changelog & Migration (v1.0 โ†’ v2.0)

Feature Delta Table

Change Type Feature v1.0 v2.0
โœ… Added refresh_tokens table None Full 7d revocable token store
โœ… Added payroll_rules engine Hardcoded constants Live DB-driven rule evaluator
โœ… Added is_anomaly column None Boolean flag on every payroll record
โœ… Added Leave overlap validator Basic date comparison Mathematical Max/Min bound proof
โœ… Added Anomaly dashboard panel None Full admin anomaly viewer + resolve
โœ… Added Service history tracking None Promotion / transfer / salary revision
โœ… Added Refresh token revocation None DB-backed, logout invalidates tokens
โœ… Added docs/ GitHub Pages portal None Interactive simulation site
๐Ÿ”„ Migrated HTTP client Native fetch() Axios singleton + interceptor chain
๐Ÿ”„ Migrated Auth mechanism Single-token JWT Dual JWT (Access 15m + Refresh 7d)
๐Ÿ”„ Migrated Static payroll logic Hardcoded DA/HRA map Dynamic rule query loop
๐Ÿ”„ Migrated Error handling Inconsistent Global Express error sink + Winston
๐Ÿ—‘ Deprecated payrollService.js static map { DA: 0.15, HRA: 2500 } Fully removed โ†’ DB rules
๐Ÿ—‘ Deprecated Raw fetch() wrapper Custom fetch wrapper Replaced with Axios interceptors

Schema Migration Script (v1 โ†’ v2)

-- Run in ORDER on existing v1 database:

-- STEP 1: Add refresh token infrastructure
CREATE TABLE IF NOT EXISTS refresh_tokens (
    id            INTEGER PRIMARY KEY AUTOINCREMENT,
    employee_id   INTEGER NOT NULL REFERENCES employees(id) ON DELETE CASCADE,
    token_hash    TEXT    NOT NULL,
    expires_at    TEXT    NOT NULL,
    is_revoked    INTEGER DEFAULT 0,
    user_agent    TEXT,
    ip_address    TEXT,
    created_at    TEXT    DEFAULT (datetime('now'))
);
CREATE INDEX IF NOT EXISTS idx_tokens_employee ON refresh_tokens(employee_id);
CREATE INDEX IF NOT EXISTS idx_tokens_revoked  ON refresh_tokens(is_revoked);

-- STEP 2: Add dynamic rule engine table
CREATE TABLE IF NOT EXISTS payroll_rules (
    id              INTEGER PRIMARY KEY AUTOINCREMENT,
    identifier_name TEXT    NOT NULL,
    logic_type      TEXT    CHECK(logic_type IN ('ALLOWANCE','DEDUCTION')) NOT NULL,
    parse_type      TEXT    CHECK(parse_type IN ('PERCENTAGE','FIXED'))    NOT NULL,
    scalar_value    REAL    NOT NULL CHECK(scalar_value > 0),
    is_live         INTEGER DEFAULT 1,
    effective_from  TEXT,
    created_by      TEXT,
    updated_at      TEXT    DEFAULT (datetime('now'))
);

-- STEP 3: Add anomaly columns to existing payroll table
ALTER TABLE payroll ADD COLUMN is_anomaly        INTEGER DEFAULT 0;
ALTER TABLE payroll ADD COLUMN anomaly_reason     TEXT;
ALTER TABLE payroll ADD COLUMN total_allowances   REAL    DEFAULT 0;
ALTER TABLE payroll ADD COLUMN total_deductions   REAL    DEFAULT 0;
ALTER TABLE payroll ADD COLUMN base_salary_snapshot REAL  DEFAULT 0;
ALTER TABLE payroll ADD COLUMN disbursed_at       TEXT;

-- STEP 4: Add service history table (new in v2.0)
CREATE TABLE IF NOT EXISTS service_history (
    id             INTEGER PRIMARY KEY AUTOINCREMENT,
    employee_id    INTEGER NOT NULL REFERENCES employees(id) ON DELETE CASCADE,
    event_type     TEXT    CHECK(event_type IN ('PROMOTION','TRANSFER','SALARY_REVISION')) NOT NULL,
    old_salary     REAL,
    new_salary     REAL,
    old_department TEXT,
    new_department TEXT,
    effective_date TEXT,
    recorded_by    TEXT,
    created_at     TEXT    DEFAULT (datetime('now'))
);

-- STEP 5: Add missing indexes
CREATE INDEX IF NOT EXISTS idx_payroll_anomaly ON payroll(is_anomaly)
    WHERE is_anomaly = 1;
CREATE INDEX IF NOT EXISTS idx_payroll_fiscal  ON payroll(fiscal_month, fiscal_year);
CREATE INDEX IF NOT EXISTS idx_leaves_status   ON leaves(approval_status);

๐Ÿ”ฎ Future Roadmap (v3.0 Specifications)

โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—
โ•‘                      v3.0 / v4.0 DEVELOPMENT PIPELINE                    โ•‘
โ• โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ฃ
โ•‘                                                                            โ•‘
โ•‘  Q1 2026 โ”€โ”€ SECURITY & AUTH HARDENING                                    โ•‘
โ•‘  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ•‘
โ•‘  โ”‚  [ ] TOTP / MFA via Authenticator App (ADMIN-only routes)          โ”‚  โ•‘
โ•‘  โ”‚  [ ] IP allowlist for admin panel access                           โ”‚  โ•‘
โ•‘  โ”‚  [ ] Automated OWASP ZAP security scan in CI                       โ”‚  โ•‘
โ•‘  โ”‚  [ ] Argon2id migration from bcrypt for stronger hashing           โ”‚  โ•‘
โ•‘  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ•‘
โ•‘                                                                            โ•‘
โ•‘  Q2 2026 โ”€โ”€ SCALE & PERSISTENCE                                          โ•‘
โ•‘  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ•‘
โ•‘  โ”‚  [ ] PostgreSQL migration via Prisma ORM adapter                   โ”‚  โ•‘
โ•‘  โ”‚  [ ] Redis caching layer for analytics aggregations                โ”‚  โ•‘
โ•‘  โ”‚  [ ] Multi-tenancy: isolated org schemas                           โ”‚  โ•‘
โ•‘  โ”‚  [ ] Database encryption at rest (SQLCipher / PG encryption)       โ”‚  โ•‘
โ•‘  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ•‘
โ•‘                                                                            โ•‘
โ•‘  Q3 2026 โ”€โ”€ AUTOMATION & REPORTING                                       โ•‘
โ•‘  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ•‘
โ•‘  โ”‚  [ ] Puppeteer/Playwright PDF payslip generation                   โ”‚  โ•‘
โ•‘  โ”‚  [ ] SMTP/SendGrid automated payslip email dispatch                โ”‚  โ•‘
โ•‘  โ”‚  [ ] Scheduled cron-based payroll auto-generation                  โ”‚  โ•‘
โ•‘  โ”‚  [ ] Excel/CSV export for payroll records                          โ”‚  โ•‘
โ•‘  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ•‘
โ•‘                                                                            โ•‘
โ•‘  Q4 2026 โ”€โ”€ OBSERVABILITY & TESTING                                      โ•‘
โ•‘  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ•‘
โ•‘  โ”‚  [ ] Jest unit tests: payroll + anomaly + boundary engine          โ”‚  โ•‘
โ•‘  โ”‚  [ ] Supertest integration: full route coverage                    โ”‚  โ•‘
โ•‘  โ”‚  [ ] Prometheus metrics export + Grafana dashboard                 โ”‚  โ•‘
โ•‘  โ”‚  [ ] Playwright E2E: admin and officer full workflow suites        โ”‚  โ•‘
โ•‘  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ•‘
โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
Feature Priority Complexity Target
TOTP 2FA for ADMIN endpoints ๐Ÿ”ด High Medium v3.0
Automated OWASP ZAP in CI ๐Ÿ”ด High Low v3.0
Jest unit test coverage >80% ๐Ÿ”ด High Medium v3.0
Supertest integration full coverage ๐Ÿ”ด High Medium v3.0
PDF payslip generation ๐ŸŸก Medium High v3.0
PostgreSQL migration via Prisma ๐ŸŸก Medium Medium v3.0
Redis analytics caching ๐ŸŸก Medium Medium v3.0
SMTP payslip email dispatch ๐ŸŸก Medium Medium v3.0
Cron-based auto payroll ๐ŸŸก Medium Medium v3.0
Multi-tenancy org isolation ๐ŸŸข Low Very High v4.0
Prometheus + Grafana metrics ๐ŸŸข Low High v4.0
Playwright E2E full suite ๐ŸŸข Low High v4.0
k6 load test (100 concurrent) ๐ŸŸข Low Medium v4.0

๐Ÿค Contributing Guidelines

Git-Flow Branching Model

  main (protected โ€” production releases only)
   โ”‚
   โ”œโ”€โ”€ develop  (integration branch โ€” all PRs target here)
   โ”‚    โ”‚
   โ”‚    โ”œโ”€โ”€ feature/52-redis-analytics-cache
   โ”‚    โ”œโ”€โ”€ feature/61-mfa-totp-admin
   โ”‚    โ”œโ”€โ”€ feature/74-pdf-payslip-export
   โ”‚    โ”œโ”€โ”€ fix/38-leave-overlap-edge-case
   โ”‚    โ””โ”€โ”€ fix/91-anomaly-threshold-empty-dept
   โ”‚
   โ””โ”€โ”€ release/v3.0  (branched from develop when feature-complete)

Contribution Workflow:

  1. Open an Issue describing the feature or bug with reproduction steps
  2. Fork the repo โ†’ branch from develop as feature/<issue>-short-description
  3. Write code following the existing service-layer architecture patterns
  4. Run npm run lint && npm run type-check โ€” zero warnings allowed
  5. Open PR targeting develop with description linking the Issue number
  6. At least one maintainer review required before merge to develop

Code Quality Standards

Standard Tool Rule
Linting ESLint .eslintrc.cjs โ€” Airbnb base ยท zero warnings
Formatting Prettier printWidth: 100, singleQuote: true
Type Safety TypeScript Strict "strict": true โ€” no implicit any
Commit Format Conventional Commits feat:, fix:, chore:, docs:, security:
Branch Naming Git-Flow feature/, fix/, release/, hotfix/
PR Size Guideline <400 lines changed per PR โ€” split large features

Security Vulnerability Reporting

Important

Do NOT open public GitHub Issues for security vulnerabilities. Report security findings directly to the maintainer via GitHub private security advisory. Include: affected endpoint, reproduction steps, proof-of-concept if available, and severity assessment. Response target: 48 hours.


๐Ÿ“„ License & Authors

Primary Infrastructure Architect: Rishvin Reddy

GitHub Portfolio Live Demo

Released under the MIT License.


โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—
โ•‘                                                                              โ•‘
โ•‘   "Engineered to replace legacy government payroll infrastructure            โ•‘
โ•‘    with zero-trust, fraud-resistant, audit-complete modern systems           โ•‘
โ•‘    that respect both taxpayer funds and employee rights."                    โ•‘
โ•‘                                                                              โ•‘
โ•‘                                                      โ€” GovPay v2.0          โ•‘
โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•

OWASP Zero Trust Audit Trail Anomaly Detection SQLi Protection JWT bcrypt Rate Limited

About

A scalable Government Payroll Management System built with React, TypeScript, and Vite. Features include employee management, salary computation, deductions, payslip generation, and secure deployment using Docker and Nginx. Designed with enterprise-grade architecture and a modern UI.

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages