Site attendance — the record also holds who stayed at which point
A site is temporary: no turnstile goes up, and workers move between them. Entry and exit are written with a QR code and a location: the code says who scanned, the location which site, and no name is picked by hand. Duration comes from a matched pair; an entry left open stays incomplete until its exit is scanned. Earned time is not held in a spreadsheet; it comes from those pairs, and one person's hours at different sites total apart. The app runs on the phone with React Native (Expo); Laravel receives records, MySQL keeps them; nothing is left to unbolt when a site closes.
Read the case study →