- Replace customer_lookup "Search/display field" single dropdown with a
free-text "Match field name(s)" input supporting multiple fields (semicolon-separated),
matching the api_lookup UX pattern
- When customer_lookup type is selected in the job type editor, any existing
api_lookup attributes are automatically removed (customer_lookup supersedes api_lookup)
- In the job create/edit form, api_lookup attributes are suppressed when the
job type includes a customer_lookup (customer_lookup takes the place of api_lookup)
- Backend /customers/lookup endpoint already handled multi-field match_field;
no PHP changes required for that path
Mirrors the Campaign/CampaignType pattern: Customer has a customer_type_id
plus a JSON attribute_values blob, with the same attribute builder used by
Job Types (text/number/date/boolean/api_lookup with alias and auto-fill).
- Migrations: customer_type, customer_type_audit, customer, customer_audit
(SQL Server, audit tables use I/U/D/R action codes)
- Models, ViewModels, and Repositories for Customer and CustomerType
- CustomerController and CustomerTypeController with full CRUD and audit
logging on insert, update, and delete
- Views for index/create/edit on both entities, using the existing
attribute builder, skeleton loaders, and sticky save bar patterns
- Routes registered under /customers and /customer-types
- Navigation: new fourth group (Customers, Customer Types) with icons
and a separator after Jobs/Job Types
- Dashboard: two new stat cards plus a second row of panels for
Recent Customers and Customers by Type
- JS: customerTypeTable, customerTypeForm, customerTable, customerForm,
and delete helpers added to public/js/app.js
- add API Lookup attribute type with alias, URL, format, match fields, and auto-fill config
- update job type create/edit forms to configure API lookup attributes
- add authenticated /api/proxy route for external lookup requests
- enhance job create/edit flow to load and select API lookup values
- rebuild jobs table columns dynamically from job type attributes
- add unsaved-changes guard for ct-form forms
- include related UI/style updates across job and job-type views