Back to projects
Time and attendance

The RCP system

A complete time and attendance system combining a tablet terminal, RFID reader, Symfony backend, administration panel and reporting.

Role
Architecture, UX/UI, backend, embedded
Technologies
React Native, Symfony, ESP32
Devices
Tablet, RFID, embedded terminal
Status
Developed iteratively
Terminal active
A complete time and attendance system combining a tablet terminal, RFID reader, Symfony backend, administration panel and reporting.
Tablet terminal waiting for the employee to select an action.
RFID via USB OTGCard input as a HID device
Offline modeLocal storage and later synchronization
Context

Time registration without complex and expensive hardware

The system was created as an alternative to closed time-attendance terminals whose functionality, appearance and integrations are difficult to adapt to real business processes.

The project includes both a simple interface used daily by employees and an administration layer for reviewing events, corrections and reporting.

Problem

What should a good time and attendance system solve?

The terminal must be fast and unambiguous for employees while remaining resilient to network issues and invalid event sequences.

01

Too many steps

Registering a basic event should not require logging in, typing an identifier or completing forms.

02

No network

A temporary Wi-Fi or server outage must not prevent an employee from registering the start of work.

03

Inconsistent events

The system has to detect repeated starts, endings without a start, and incorrectly closed breaks.

04

Difficult reporting

Data should be available both as a clear daily summary and as a monthly report ready for further processing.

Solution

One coherent ecosystem from employee card to monthly report

Each layer was designed for a different task: the terminal for speed, the API for consistency, and the administration panel for control and reporting.

Fast registration

An employee registers a work start, end or break using an RFID card and a single tap.

Data consistency

The backend validates event order and reduces the possibility of storing an invalid sequence.

Offline operation

Losing server connectivity does not block registration. Events are stored locally and synchronized later.

Clear reporting

Administrators receive daily and monthly summaries of working time, breaks and absences.

Employee terminal

An interface limited to essential decisions

The application runs in landscape mode and is designed for a fixed tablet station operated from a short distance.

01

RFID card reading

The USB OTG reader works as a HID keyboard, so the card number is captured without manual input.

02

Three primary actions

After reading a card, the employee chooses work start, work end or break start.

03

Frozen event time

The displayed time is tied to the moment the action is selected and does not change while communicating with the API.

04

Automatic reset

After completing an operation or after inactivity, the interface returns to the card waiting screen.

05

Local event queue

Unsent entries are stored in SQLite and retried after connectivity returns.

06

Employee confirmation

After successful registration the system displays the employee name and the stored event type.

07

Hour balance

The terminal can retrieve and present the current working-time balance for an employee.

08

Error handling

The interface distinguishes connectivity errors, unknown cards, invalid event order and synchronization problems.

Architecture

A modular design that allows the terminal to be replaced

A tablet or any other terminal uses the same server-side business logic. The device layer can evolve independently from the backend.

IdentificationRFID cardA unique number assigned to the employee
Device layerTabletAction selection and event timestamp capture
Application layerSymfony APIValidation, persistence and employee handling
Data and reportsAdministration panelAnalysis, corrections and monthly export
Failure resilience

Losing connectivity does not stop registration

The terminal stores unsent events in a local SQLite database. Once connectivity is restored, the queue is processed again and confirmed entries are removed from device storage.

01
Local registration

Card, event type and timestamp are written to terminal storage.

02
Synchronization attempt

The application retries sending data when the server becomes available.

03
Write confirmation

After the API confirms the event, the local copy is removed.

TerminalSQLite
Synchronization
Symfony APICentral database
Central management

Administration panel based on Symfony and EasyAdmin

The panel manages events, employees, absences and reports without requiring changes to the terminal application.

Symfony + EasyAdmin

One place to control the entire system

An administrator can review the full event history, filter it by employee and date, correct invalid entries and generate summaries used for time settlement.

  • Event registration through a REST API
  • Validation of starts, endings and breaks
  • Leave, absence and administrative events
  • Filtering by employee, date and event type
  • Daily start/end and break summaries
  • Monthly XLSX reports
RCP panel
A complete time and attendance system combining a tablet terminal, RFID reader, Symfony backend, administration panel and reporting.
Administration view for working-time events and employee data.
Reporting

From a single event to a monthly settlement

Data is aggregated into daily summaries and monthly reports including working time, breaks and absence events.

Monthly report
A complete time and attendance system combining a tablet terminal, RFID reader, Symfony backend, administration panel and reporting.
Monthly summary of employee working hours.

Daily summary

First start, last end, working time and total break duration.

XLSX export

A monthly summary ready for further analysis or payroll processing.

Multiple event types

Work, breaks, paid and unpaid leave, childcare, doctor visits and other absences.

Project layers

One system developed as a coherent ecosystem

1
Layer 1

Tablet terminal

A React Native application for a landscape tablet with an external RFID reader connected through USB OTG.

Operational version
2
Layer 2

Backend and admin panel

Symfony stores and validates events, manages employees and generates working-time reports.

Central management
3
Layer 3

Embedded terminal

An alternative reader based on ESP32-PoE, a touch display, RFID and local RTC, designed as a standalone device.

Hardware development
Result

A custom time and attendance system without lock-in to a closed platform

The modular architecture lets the terminal UI, embedded devices, business rules and reporting evolve independently while sharing one central source of data.

Let's talk about your project