Too many steps
Registering a basic event should not require logging in, typing an identifier or completing forms.
A complete time and attendance system combining a tablet terminal, RFID reader, Symfony backend, administration panel and reporting.

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.
The terminal must be fast and unambiguous for employees while remaining resilient to network issues and invalid event sequences.
Registering a basic event should not require logging in, typing an identifier or completing forms.
A temporary Wi-Fi or server outage must not prevent an employee from registering the start of work.
The system has to detect repeated starts, endings without a start, and incorrectly closed breaks.
Data should be available both as a clear daily summary and as a monthly report ready for further processing.
Each layer was designed for a different task: the terminal for speed, the API for consistency, and the administration panel for control and reporting.
An employee registers a work start, end or break using an RFID card and a single tap.
The backend validates event order and reduces the possibility of storing an invalid sequence.
Losing server connectivity does not block registration. Events are stored locally and synchronized later.
Administrators receive daily and monthly summaries of working time, breaks and absences.
The application runs in landscape mode and is designed for a fixed tablet station operated from a short distance.
The USB OTG reader works as a HID keyboard, so the card number is captured without manual input.
After reading a card, the employee chooses work start, work end or break start.
The displayed time is tied to the moment the action is selected and does not change while communicating with the API.
After completing an operation or after inactivity, the interface returns to the card waiting screen.
Unsent entries are stored in SQLite and retried after connectivity returns.
After successful registration the system displays the employee name and the stored event type.
The terminal can retrieve and present the current working-time balance for an employee.
The interface distinguishes connectivity errors, unknown cards, invalid event order and synchronization problems.
A tablet or any other terminal uses the same server-side business logic. The device layer can evolve independently from the backend.
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.
Card, event type and timestamp are written to terminal storage.
The application retries sending data when the server becomes available.
After the API confirms the event, the local copy is removed.
The panel manages events, employees, absences and reports without requiring changes to the terminal application.
An administrator can review the full event history, filter it by employee and date, correct invalid entries and generate summaries used for time settlement.

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

First start, last end, working time and total break duration.
A monthly summary ready for further analysis or payroll processing.
Work, breaks, paid and unpaid leave, childcare, doctor visits and other absences.
A React Native application for a landscape tablet with an external RFID reader connected through USB OTG.
Operational versionSymfony stores and validates events, manages employees and generates working-time reports.
Central managementAn alternative reader based on ESP32-PoE, a touch display, RFID and local RTC, designed as a standalone device.
Hardware development