Skip to content
All projects
In development

Staff Attendance System

A multi-branch attendance system: employees check in from an Android app, the server validates location and device, managers get sessions and reports, and closed sessions sync to Odoo HR.

Organization
Luxera GYO
Status
In development
Role
Server logic, database, Android app, offline mode and Odoo integration, with AI-assisted development
Stack
  • Android (Java)
  • Capacitor
  • React
  • TanStack Start
  • PostgreSQL (Supabase)
  • Odoo
  • GitHub Actions

Overview

A staff attendance system for Luxera GYO's branches. Employees check in and out from an Android app; the server decides whether each check-in is valid; managers see sessions, shifts and reports; and closed sessions are sent to Odoo HR without retyping.

Screenshots

Attendance overview: who is in, absent, late or on leave today, a 14-day trend and a live activity feed
Attendance overview: who is in, absent, late or on leave today, a 14-day trend and a live activity feed
Employee view: current status and a single check-in button; location is checked by the server
Employee view: current status and a single check-in button; location is checked by the server
Employee management with department, branch, shift, access and status, plus PIN reset and CSV export
Employee management with department, branch, shift, access and status, plus PIN reset and CSV export
Attendance reports with date, employee, department, branch, role and status filters, exported to CSV, Excel or PDF
Attendance reports with date, employee, department, branch, role and status filters, exported to CSV, Excel or PDF
Sign-in with staff number and PIN; accounts are created by an administrator
Sign-in with staff number and PIN; accounts are created by an administrator

Screenshots taken during internal testing; figures are test data. Employee names, email addresses and staff numbers are hidden.

Business problem

Attendance records need to be trustworthy across several branches: check-ins from the wrong place, from someone else's phone or with a fake location must be rejected, attendance must still be recorded without internet, and approved records must reach Odoo HR automatically.

Solution and main features

  • GPS check-in validated on the server: distance to the branch, location accuracy, approved device and duplicates
  • Rules against tampering: fake-location flag, stale records, clocks set in the future, low accuracy, too far from the branch
  • Native Android app in Java: encrypted session storage, per-device ID and location capture with a fake-location flag
  • Offline outbox on the phone (SQLite) with ordered uploads, retries and a warning before a check-in the server is likely to reject
  • Shifts, sessions and reports, with auto-close of forgotten sessions and PDF and Excel export
  • Odoo HR attendance sync with a dry-run mode, plus employee import from Odoo
  • 6-digit PIN sign-in, roles (super admin, company admin, manager, employee) and one approved phone per employee
  • English, Arabic (right-to-left) and Turkish interface

My role and contributions

  • Built the server-side attendance rules, pages and database migrations
  • Built the native Android layer and the offline milestones (outbox, upload engine, device checks)
  • Set up CI: type checks, tests, web build and a signed Android debug build with permission and signing-key checks
  • Integrated Odoo for employee import and attendance sync

AI tools and how they were used

Most of the web app was built with Lovable's AI editor under my direction, and the native Android and offline milestones with Claude. Work was split into small numbered milestones, one pull request each, gated by tests and CI before merging.

Read the AI disclosure

Architecture and technology stack

Android app
Capacitor with custom Java plugins: location evidence, encrypted storage, offline SQLite outbox
Upload engine
TypeScript on the phone: ordered uploads, retries, sign-in token handling
Web app
React and TanStack Start: admin pages, reports, employee screen
Server logic
TanStack Start server functions: attendance rules, device checks, offline decisions
Data
PostgreSQL on Supabase with per-user access rules
Integration
Odoo sync worker: only closed sessions are sent to Odoo HR
CI
GitHub Actions: type check, tests, web build, signed Android debug build

Simplified view. Hostnames, internal addresses and configuration are intentionally left out.

Security, testing and validation

  • Roles are enforced on the server, not only hidden in the interface
  • One approved phone per employee, with an admin reset
  • Location is kept on the phone only until the server answers, then cleared; reports and logs never contain coordinates
  • Check-ins are validated against the approved device, location accuracy, distance to the branch and clock checks; the server, not the phone, makes the decision
  • About 520 TypeScript test cases in 27 files and 182 Android JUnit tests, run in CI

Current status

In development

In development at Luxera GYO, currently in internal testing before a pilot.

In progress and planned

  • Turn on offline check-in after the next test stage and a pilot
  • Bluetooth beacon check-in: built for Android and iOS but switched off, and not yet tested on physical beacons
  • iOS build (only Android is built in CI today)
  • Leave requests once Odoo Time Off sync is in place
  • PIN change from the employee app

Lessons learned

  • Indoor GPS accuracy (around 100 m) can exceed a strict 50 m branch limit, so tolerance has to be tuned per site rather than fixed
  • A phone can report anything; the server must make the final decision using device binding, accuracy, distance and time checks
  • Designing for no internet from the start (outbox, ordered uploads, server-side verdict) is simpler than adding it later
  • Small AI-assisted milestones behind tests and CI kept a fast pace without losing control of quality