Seeded user emails were using example.com domains which don't match
the LDAP mail attributes (travel.local). When users log in via LDAP,
LdapRecord syncs by email — a mismatch caused new DB records to be
created without roles, preventing admin access to the Filament panel.
- SyncTownsTest: covers API syncing, pagination, upsert, retired towns, error logging, and success logging
- TownSearchTest: covers auth requirement, min query length, prefix matching, state filtering, retired town exclusion, result limit, response shape, and ordering
- Update TownFactory with retired() and inState() states
- Add towns table with town_pid, town_name, state, population, town_class, date_retired
- Add AustralianState enum with label and abbreviation helpers
- Add Town model with active() and search() scopes
- Add SyncTowns job that paginates ArcGIS API and upserts all 1977 towns
- Schedule SyncTowns to run nightly at 02:00
- Add /towns/search endpoint returning JSON suggestions filtered by name and state
- Add Alpine-powered autocomplete on origin/destination fields in create form
- Add state filter dropdown in journeys card header to narrow autocomplete results
The approval_steps migration references approval_workflows via a
foreign key, but both had the same timestamp (020959), causing
steps to run first alphabetically and fail. Moved workflows to
020958 so it runs first.