Week of Apr 21 – 25, 2026
Full timesheet and payroll pipeline, inspection checklist items, company names in the account selector, and a kanban that actually drags.
A big delivery week. The timesheet system grew a full admin-facing and payroll-facing half, inspections got their actual checklist items, work orders got real drag-and-drop on the board view, and a pile of long-standing UX papercuts got swept away.
Timesheets & Payroll
Clock in / out stays personal
The employee Time Tracking page in General is now strictly personal — clock in, clock out, see your own hours. No more confusing manager widgets mixed in.
New Time & Payroll section for admins
A dedicated sidebar group visible only to admins and fleet managers, with three surfaces:
- Review Entries — every user's entries with filters (employee, approval state, status, date range, flagged-only), aggregate cards that follow the filter, a row-level detail drawer with a Leaflet map showing clock-in / clock-out pins and site geofence circles, inline edit and manual-entry dialogs, bulk approve / reject, CSV export of the filtered set.
- Pay Periods — name date ranges, lock them to sweep approved entries into payroll (entries freeze inside the period), reopen if you need to amend, mark paid when it's been run, and download a provider-ready CSV.
- Pay Profiles — per-employee hourly rate, overtime threshold and multiplier, optional double-time bracket, break defaults, auto-deduct toggle, employee code for payroll export matching.
Geofenced clock-in
Sites & Locations now carries an optional geofence radius in metres. When an employee clocks in, the service finds the nearest geofenced site and stamps it onto the entry. Clocks that land outside the radius get flagged outside_geofence. Low-accuracy GPS fixes flag low_accuracy / low_accuracy_out. Shifts longer than 16 hours flag long_shift. Admin-created entries flag manual_entry.
Approval lifecycle
Every entry now carries an approval status: pending → approved or rejected. Only approved entries are eligible to be swept into a pay period, and once a period locks, its contained entries are frozen. Reopening a period unfreezes them.
Weekly overtime math
The payroll engine splits each pay period by ISO week and runs the pay-profile thresholds against each week independently, so a two-week period correctly counts overtime in the week it was earned instead of against the period total.
Read the full write-ups:
Inspections
Templates actually attach now
The template picker on an inspection was a dead field end-to-end: no DB column, no API, no hydrate. Fixed all layers. Selecting a template on an inspection now persists and, on first save, copies every template item into the inspection's checklist. Switching templates after the inspection already has items is intentionally a no-op so inspector progress isn't clobbered.
Real Checklist Results tab
The empty state that pointed at the edit form is gone. The Checklist Results tab on an inspection is now a live editor: pass/fail/N/A toggles per item, inline name editing, expandable notes, delete with confirmation, a status-count badge at the top, and an "add item" row at the bottom. Works whether the items came from a template or were added manually.
Work Orders
Kanban is now draggable
The board view always looked like a kanban but didn't actually let you drag. It does now. Cards are draggable between columns on desktop (pointer) and mobile (long-press), with a drag overlay for a smooth follow-cursor feel. Dropping on a column fires an optimistic status update and persists through the existing mutation. The overflow menu on each card still works — clicking it doesn't accidentally start a drag.
Tenant / Account Selector
Primary label is now the linked company name instead of the URL slug. The slug appears underneath as a muted subtitle. Both are searchable, so typing either still finds the account. Applies to the sidebar switcher and the /select-tenant landing page.
Performance
15 s assets list → under 1 s
The /api/{tenant}/assets endpoint was firing roughly 225 queries per 25-row page — two per-asset pivot queries, plus up to seven per-asset joins for the VIN / make / model / licence-plate / colour / fuel-type fallbacks. Now one bulk pivot fetch and one bulk vehicle join serve the whole page.
Docs
Every broken "Learn more" link across the mobility app was pointing at flat /mobility/<slug> URLs that don't exist; they now resolve to the real categorised paths (/mobility/features/*, /mobility/management/*, /mobility/getting-started/*). Added 14 missing entries to the central docs map, plus wired up the dead buttons on the plan detail, general settings, and maintenance-error pages.
Migrations to run
Four new migrations land with this release — they require php artisan migrate on the core container after deploy:
2026_04_24_000001_add_inspection_template_id_to_inspections2026_04_24_000002_make_inspection_items_result_nullable2026_04_24_100001_extend_time_entries_for_payroll2026_04_24_100002_create_user_pay_profiles_table2026_04_24_100003_create_pay_periods_table2026_04_24_100004_add_geofence_radius_to_site_locations
All are additive — rolling back rolls back cleanly.