UtopiaOps is the field app for technicians, drivers, and warehouse staff. They use it to see their jobs for the day, record the work done on site, collect payment, and get the customer's sign-off.
One app serves several business units (BUs). Each BU keeps its own backend, and the app reaches all of them through Utopia OE. Today only Encik Beku is live. The code is in the utopiaspace-ops repository.
The worker signs in with Google on the UtopiaSpace (Hub) Supabase project.
The app sends the Hub token to Utopia OE at GET /oe/auth/resolve.
OE works out which BUs the person may enter from their unit scope in User Access, and creates their user in each BU on first sign-in.
The app keeps only the BUs it is built and switched on for. With one BU, it opens that BU straight away. With more than one, it shows a picker and remembers the choice.
If no BU is left, the worker is signed out and sees "Email not exist."
Jobs, payments, photos, vehicles, helpers: the BU's Laravel backend, through OE at /api/v1/ops/*. Each request carries the worker's Hub token, and the backend checks the job is theirs.
Profile name, phone, department, and photo: the Hub profiles table.
Inbox: the Hub ops_notifications table, read directly. Row-level security limits it to the worker's own rows.
Clock-in and clock-out: not done here. The app opens UtopiaSpace Mobile on its attendance screen.
Today's progress, cash still to bank in, a button to clock in through UtopiaSpace Mobile, and Today's Assignment (vehicle and helpers).
Job Log
The technician's own jobs. Start, record, and finish each job here. See Encik Beku Job Log.
Inbox
Job notifications, with an unread badge. Tapping a job notification opens the job.
Profile
Name, today's and this month's job counts, vehicle and helper history, and settings.
The attendance card on Home always shows "not clocked in". The check that reads attendance is switched off in the code.Jobs, Schedule, Map, and a step-by-step job flow exist in the code as prototypes with sample data. They are hidden from the bar.Background location is set up in the Android app but never switched on, so no location is tracked or sent.The Android back button and swipe-back are turned off. Workers move between screens with the app's own buttons.