Rancon HRIS
One HR platform for 42+ companies
The question
Can attendance trapped in two vendors' databases on a site server become one truth for forty-two companies, so losing the agent's state file costs nothing?
A 21-module enterprise HRIS in production for the Rancon Group, serving 42+ companies and 4,000+ employees, with a Windows middleware that pulls attendance from 100+ biometric devices.
- When
- Nov 2025 – Present
- Where
- Ranks ITT
- Role
- Architect and engineering lead
- Whose idea
- Built for a client or employer
- Status
- Ongoing
Sits between
This work crosses HR systems, biometrics, reconciliation, multi-tenancy, edge computing.
- 42+
- Companies
- 4,000+
- Employees
- 21
- Modules
- 100+
- Attendance devices
Problem
Dozens of group companies ran HR on spreadsheets and disconnected vendor tools. Attendance lived inside two different biometric vendors' databases on a site server that only their Windows software could read.
Architecture
- A modular Laravel platform, 21 modules from organisation structure and the employee lifecycle through attendance, leave, and reporting, with role-based access scoped per company and a shared group-level view.
- A C#/.NET 8 Windows tray application on the site server that reads ZKTeco and Fingertec databases on SQL Server, groups punches by employee and work-day, de-duplicates double scans, detects changed days with a per-day fingerprint, and pushes complete day sets to the HRIS API on a 15-minute interval, a nightly seven-day reconciliation, and on demand.
- Credentials and connection strings DPAPI-encrypted at rest; retries with Polly; daily rolling logs; a settings UI for operations staff.
What I built
System architecture, development standards, and engineering guidelines for the team; the attendance middleware end to end; the API contract between middleware and HRIS.
Outcome
Live across the group with 42+ companies and 4,000+ employees. Losing the middleware's state file is safe by design: everything simply re-sends once.
Around the same time
See 2025 on the timeline →Shares its fields with