๐ 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
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ 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
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 โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโฉโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
<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')
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
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
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ 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
โโโโโโโโโโโโโโโโ
โ 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 โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
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)
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
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:
Open an Issue describing the feature or bug with reproduction steps
Fork the repo โ branch from develop as feature/<issue>-short-description
Write code following the existing service-layer architecture patterns
Run npm run lint && npm run type-check โ zero warnings allowed
Open PR targeting develop with description linking the Issue number
At least one maintainer review required before merge to develop
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 .