feature/IO-3587-Commision-Cut - Improved local email / Test Plans

This commit is contained in:
Dave
2026-03-19 15:51:55 -04:00
parent 98781a76e6
commit 34c9a3854c
4 changed files with 832 additions and 69 deletions

View File

@@ -0,0 +1,424 @@
# Commission-Based Cut Feature Manual Test Plan
## Purpose
Use this guide to manually test the commission-based cut feature from an end-user point of view.
This plan is written for a non-technical tester. Follow the steps exactly as written and mark each scenario as Pass or Fail.
## What You Need Before You Start
- A login that can open `Manage my Shop`, `Jobs`, and `Time Tickets`.
- At least 2 active employees in the shop.
- At least 1 converted repair order that already has labor lines on it.
- If possible, use a simple test job where the labor sale rates are easy to calculate.
- A notebook, spreadsheet, or screenshot folder to record what happened.
## Recommended Easy-Math Test Data
If you can choose your own test job, use something simple like this:
- Body sale rate: `$100.00`
- Refinish sale rate: `$120.00`
- Mechanical sale rate: `$80.00`
- 1 Body labor line with `10.0` hours
- 1 Refinish labor line with `4.0` hours
This makes the expected payout easy to check:
- `40%` of `$100.00` = `$40.00`
- `30%` of `$120.00` = `$36.00`
## Important Navigation Notes
- Team setup is under `Manage my Shop` > `Employee Teams`.
- Team assignment happens on the job line grid in the `Team` column.
- Automatic payout happens from the job's `Labor Allocations` card using the `Pay All` button.
- If your shop uses task presets, the `Flag Hours` button can preview the payout method before committing tickets.
---
## Scenario 1: Create a Simple Commission Team
### Goal
Confirm a team member can be set to commission and saved successfully.
### Steps
1. Sign in.
2. Click `Manage my Shop`.
3. Click the `Employee Teams` tab.
4. Click `New Team`.
5. In `Team Name`, type `Commission Team Test`.
6. Make sure `Active` is turned on.
7. In `Max Load`, enter `10`.
8. Click `New Team Member`.
9. In `Employee`, choose an active employee.
10. In `Allocation %`, enter `100`.
11. In `Payout Method`, choose `Commission %`.
12. In each commission field that appears, enter a value.
13. For the main labor types you plan to test, use these values:
14. Enter `40` for Body.
15. Enter `30` for Refinish.
16. Enter `25` for Mechanical.
17. Enter `20` for Frame.
18. Enter `15` for Glass.
19. Fill in the remaining commission boxes with any valid number from `0` to `100`.
20. Click `Save`.
### Expected Result
- The team saves successfully.
- The team stays visible in the Employee Teams list.
- The team member card shows a `Commission` tag.
- The `Allocation Total` shows `100%`.
### Record
- [ ] Pass
- [ ] Fail
- Notes:
---
## Scenario 2: Allocation Total Must Equal 100%
### Goal
Confirm the system blocks a team that does not total exactly 100%.
### Steps
1. Stay on the same team.
2. Change `Allocation %` from `100` to `90`.
3. Click `Save`.
4. Change `Allocation %` from `90` to `110`.
5. Click `Save`.
6. Change `Allocation %` back to `100`.
7. Click `Save` again.
### Expected Result
- When the total is `90%`, the system should not save.
- When the total is `110%`, the system should not save.
- The page should show that the allocation total is not correct.
- When the total is set back to `100%`, the save should succeed.
### Record
- [ ] Pass
- [ ] Fail
- Notes:
---
## Scenario 3: The Same Employee Cannot Be Added Twice
### Goal
Confirm the same employee cannot appear twice on one team.
### Steps
1. Open the same team again.
2. Click `New Team Member`.
3. Choose the same employee already used on the team.
4. Enter any valid allocation amount.
5. Choose `Commission %`.
6. Fill in all required commission fields.
7. Click `Save`.
### Expected Result
- The system should block the save.
- The team should not save with the same employee listed twice.
### Record
- [ ] Pass
- [ ] Fail
- Notes:
---
## Scenario 4: Switching Between Hourly and Commission Changes the Input Style
### Goal
Confirm the rate section changes correctly when the payout method changes.
### Steps
1. Open the same team again.
2. On the team member row, change `Payout Method` from `Commission %` to `Hourly`.
3. Look at the rate fields that appear.
4. Change `Payout Method` back to `Commission %`.
5. Look at the rate fields again.
### Expected Result
- In `Hourly` mode, the rate boxes should behave like money/rate fields.
- In `Commission %` mode, the rate boxes should behave like percentage fields.
- The screen should clearly show you are editing the correct type of value.
### Record
- [ ] Pass
- [ ] Fail
- Notes:
---
## Scenario 5: Boundary Values for Commission %
### Goal
Confirm the feature accepts valid boundary values and blocks invalid ones.
### Steps
1. Open the team again.
2. In one commission box, enter `0`.
3. In another commission box, enter `100`.
4. Click `Save`.
5. Try to type a value above `100` in one of the commission boxes.
6. Try to type a negative value in one of the commission boxes.
### Expected Result
- `0` should be accepted.
- `100` should be accepted.
- Values above `100` should not be allowed or should fail validation.
- Negative values should not be allowed or should fail validation.
### Record
- [ ] Pass
- [ ] Fail
- Notes:
---
## Scenario 6: Inactive Teams Should Not Be Offered for New Assignment
### Goal
Confirm inactive teams do not appear as normal team choices.
### Steps
1. Open the team again.
2. Turn `Active` off.
3. Click `Save`.
4. Open a converted repair order.
5. Go to the job lines area where the `Team` column is visible.
6. Click inside the `Team` field on any labor line.
7. Open the team drop-down list.
8. Look for `Commission Team Test`.
9. Go back to `Manage my Shop` > `Employee Teams`.
10. Turn `Active` back on.
11. Click `Save`.
12. Return to the same job line and open the `Team` drop-down again.
### Expected Result
- When the team is inactive, it should not appear as a normal assignment choice.
- After turning it back on, it should appear again.
### Record
- [ ] Pass
- [ ] Fail
- Notes:
---
## Scenario 7: Assign the Commission Team to a Labor Line
### Goal
Confirm the team can be assigned to a job line from the job screen.
### Steps
1. Open a converted repair order that has labor lines.
2. Find a labor line in the job line grid.
3. In the `Team` column, click the blank area or the current team name.
4. From the drop-down list, choose `Commission Team Test`.
5. Click outside the field so it saves.
6. Repeat for at least 1 Body line and 1 Refinish line if both exist.
### Expected Result
- The selected team name should appear in the `Team` column.
- The assignment should stay in place after the screen refreshes.
### Record
- [ ] Pass
- [ ] Fail
- Notes:
---
## Scenario 8: Pay All Creates Commission-Based Tickets
### Goal
Confirm `Pay All` creates time tickets using the commission rate, not a flat hourly rate.
### Steps
1. Use a converted repair order that has:
2. At least 1 labor line assigned to `Commission Team Test`.
3. Known labor sale rates on the job.
4. No existing time tickets for the same employee and labor type.
5. Open that repair order.
6. Go to the labor/payroll area where the `Labor Allocations` card is visible.
7. Write down the following before you click anything:
8. The labor type on the line.
9. The sold labor rate for that labor type.
10. The hours on that line.
11. The commission % you entered for that labor type on the team.
12. Click `Pay All`.
13. Wait for the success message.
14. Look at the `Time Tickets` list on the same screen.
15. Find the new ticket created for that employee.
### Expected Result
- The system should show `All hours paid out successfully.`
- A new time ticket should appear.
- The ticket rate should equal:
- `sale rate x commission %`
- Example: if Body sale rate is `$100.00` and commission is `40%`, the ticket rate should be `$40.00`.
- The productive hours should match the assigned labor hours for that employee.
### Record
- [ ] Pass
- [ ] Fail
- Notes:
---
## Scenario 9: Different Labor Types Use Different Commission Rates
### Goal
Confirm the feature uses the correct commission % for each labor type.
### Steps
1. Use a job that has at least:
2. One Body labor line.
3. One Refinish labor line.
4. Make sure both lines are assigned to `Commission Team Test`.
5. Confirm your team is set up like this:
6. Body = `40%`
7. Refinish = `30%`
8. Open the job's `Labor Allocations` area.
9. Click `Pay All`.
10. Review the new time tickets that are created.
### Expected Result
- The Body ticket should use the Body commission %.
- The Refinish ticket should use the Refinish commission %.
- Example:
- If Body sale rate is `$100.00`, Body payout rate should be `$40.00`.
- If Refinish sale rate is `$120.00`, Refinish payout rate should be `$36.00`.
### Record
- [ ] Pass
- [ ] Fail
- Notes:
---
## Scenario 10: Mixed Team With Commission and Hourly Members
### Goal
Confirm one team can contain both commission and hourly members, and each person is paid correctly.
### Steps
1. Open `Manage my Shop` > `Employee Teams`.
2. Open `Commission Team Test`.
3. Edit the first team member:
4. Keep Employee 1 as `Commission %`.
5. Change `Allocation %` to `60`.
6. Make sure Body commission is still `40`.
7. Add a second team member.
8. Choose a different active employee.
9. Set `Allocation %` to `40`.
10. Set `Payout Method` to `Hourly`.
11. Enter an hourly rate for each required labor type.
12. For Body, use `$25.00`.
13. Fill in the other required hourly boxes with valid values.
14. Make sure the total allocation shows `100%`.
15. Click `Save`.
16. Assign this team to a Body line with `10.0` hours.
17. Click `Pay All`.
18. Review the new time tickets.
### Expected Result
- Employee 1 should receive `60%` of the hours at the commission-derived rate.
- Employee 2 should receive `40%` of the hours at the hourly rate you entered.
- Example with a 10-hour Body line and `$100.00` sale rate:
- Employee 1 should get `6.0` hours at `$40.00`.
- Employee 2 should get `4.0` hours at `$25.00`.
### Record
- [ ] Pass
- [ ] Fail
- Notes:
---
## Scenario 11: Pay All Only Adds the Remaining Hours
### Goal
Confirm `Pay All` does not duplicate hours that were already paid.
### Steps
1. Use a job with one Body line assigned to `Commission Team Test`.
2. Make sure the line has `10.0` hours.
3. In the `Time Tickets` card, click `Enter New Time Ticket`.
4. Create a manual time ticket for the same employee and the same labor type.
5. Enter `4.0` productive hours.
6. Save the manual time ticket.
7. Go back to the `Labor Allocations` card.
8. Click `Pay All`.
9. Review the new ticket that is created.
### Expected Result
- The system should only create the remaining unpaid hours.
- In this example, it should add `6.0` hours, not `10.0`.
- The payout rate should still use the current commission-based rate.
### Record
- [ ] Pass
- [ ] Fail
- Notes:
---
## Scenario 12: Unassigned Labor Lines Should Block Automatic Payout
### Goal
Confirm `Pay All` does not silently pay lines that do not have a team assigned.
### Steps
1. Open a converted repair order with at least 2 labor lines.
2. Assign `Commission Team Test` to one line.
3. Leave the second labor line with no team assigned.
4. Go to the `Labor Allocations` card.
5. Click `Pay All`.
### Expected Result
- The system should not quietly pay everything.
- You should see an error telling you that not all hours have been assigned.
- The unassigned line should still need manual attention.
### Record
- [ ] Pass
- [ ] Fail
- Notes:
---
## Scenario 13: Flag Hours Preview Shows the Correct Payout Method
### Goal
If your shop uses task presets, confirm the preview shows `Commission` for commission-based tickets.
### Steps
1. Open a converted repair order.
2. Go to the `Time Tickets` card.
3. Click `Flag Hours`.
4. Choose a task preset.
5. Wait for the preview table to load.
6. Review the `Payout Method` column in the preview.
7. If the preview includes more than one employee, review each row.
### Expected Result
- The preview table should load without error.
- Rows for commission-based employees should show `Commission`.
- Rows for hourly employees should show `Hourly`.
- If there are unassigned hours, a warning should appear.
### Record
- [ ] Pass
- [ ] Fail
- Notes:
---
## Quick Regression Checklist
- [ ] I can create a commission-based team.
- [ ] Allocation must total exactly 100%.
- [ ] The same employee cannot be added twice to one team.
- [ ] Inactive teams do not appear for normal assignment.
- [ ] A team can be assigned to job lines from the `Team` column.
- [ ] `Pay All` creates commission-based tickets correctly.
- [ ] Different labor types use different commission percentages.
- [ ] Mixed commission and hourly teams calculate correctly.
- [ ] `Pay All` only creates the remaining unpaid hours.
- [ ] Unassigned labor lines stop automatic payout.
- [ ] `Flag Hours` preview shows the correct payout method.
## Tester Sign-Off
- Tester name:
- Test date:
- Environment:
- Overall result:
- Follow-up issues found:

View File

@@ -0,0 +1,647 @@
# Ant Design Select.Option Deprecation - Manual Testing Plan
**Branch:** `feature/IO-3544-Ant-Select-Deprecation`
**Base Branch:** `master-AIO`
**Jira:** IO-3544
## Overview
This branch migrates all Ant Design `<Select.Option>` components to the new `options` prop pattern (required for Ant Design v5+). The deprecated `Select.Option` child component pattern has been replaced with the `options` array prop.
## What Changed
- **Old Pattern:** `<Select><Select.Option value="x">Label</Select.Option></Select>`
- **New Pattern:** `<Select options={[{ value: "x", label: "Label" }]} />`
- Search filtering updated from `optionFilterProp: "children"` to `optionFilterProp: "label"` or custom props
- Custom filter functions updated to use `option.label` instead of `option.props.children`
- Complex components with custom rendered content (tags, icons, styled elements) now use `label` prop with JSX
## Code Review Findings ✅
**Validation completed on representative samples:**
- ✅ Search functionality properly migrated (showSearch object syntax correct)
- ✅ Custom rendered content (tags, badges, icons) preserved in label prop
- ✅ Labor type selectors correctly implement all 14 types
- ✅ Vendor search with favorites and discount tags working correctly
- ✅ Employee selectors with flat_rate/straight_time tags properly structured
- ✅ Job search with owner display and status tags correctly migrated
- ✅ CiecaSelect utility updated to return options array format
- ✅ Performance optimizations added (useMemo in jobs-convert-button)
- ✅ Custom optionFilterProp values used where needed (e.g., "name", "search")
## Testing Strategy
For each select component below, verify:
1.**Options Display:** All options appear correctly
2.**Selection:** Can select an option and value is saved
3.**Search/Filter:** Search functionality works (if applicable)
4.**Visual Rendering:** Labels, tags, and custom content display properly (especially vendor discounts, employee tags, job status badges)
5.**Form Integration:** Value persists and submits correctly
6.**Custom Search Props:** Components using custom optionFilterProp (name, search) work correctly
---
## Component Test Cases
### 1. Employee Assignment & Allocation
**Files Modified:**
- `allocations-assignment.component.jsx`
- `allocations-bulk-assignment.component.jsx`
- `labor-allocations-adjustment-edit.component.jsx`
- `employee-search-select.component.jsx`
- `employee-search-select-email.component.jsx`
**Test Scenarios:**
- [ ] **Job Line Allocation:** Assign employee to job line
- Navigate to a job → Job Lines tab
- Click allocate hours to an employee
- Verify employee dropdown shows full names
- Search for employee by name
- Verify selection saves
- [ ] **Bulk Assignment:** Assign multiple job lines to employee
- Select multiple job lines
- Open bulk assignment modal
- Verify employee selector works
- Verify employee number, name, and tags (flat rate/straight time) display
- [ ] **Labor Allocations Adjustment:** Edit labor allocations
- Navigate to labor allocations
- Edit adjustment form
- Verify employee dropdowns work with search
- [ ] **Employee Search Select with Email:**
- Test in any form using employee email selector (uses custom `optionFilterProp: "search"`)
- Search by employee number, first name, or last name
- Verify employee number, name display correctly
- **Critical:** Verify green tag shows "Flat Rate" or "Straight Time"
- Verify blue email tag displays when showEmail=true
- Test that search matches against concatenated string
---
### 2. Job Management
**Files Modified:**
- `job-search-select.component.jsx`
- `jobs-create-jobs-info.component.jsx`
- `jobs-detail-general.component.jsx`
- `jobs-detail-header-actions.component.jsx`
- `jobs-convert-button.component.jsx`
- `jobs-close-lines.component.jsx`
- `job-3rd-party-modal.component.jsx`
**Test Scenarios:**
- [ ] **Job Search Select:** Search and select jobs
- Any form with job selector (e.g., linking jobs, referencing jobs)
- Search by RO number, customer name, or vehicle (uses `filterOption: false` with custom search)
- **Critical:** Verify job label shows: `[CLM_NO |] RO_NUMBER | Owner Name | Year Make Model`
- **Critical:** Verify status tag displays (e.g., "OPEN", "CLOSED")
- Verify loading spinner appears during search
- Test with claim numbers visible (clm_no prop)
- Verify selection works
- [ ] **Create Job Form:**
- Navigate to Create New Job
- Test all dropdowns in job info section:
- Job type selection
- Status selection
- Department/class selection
- Estimator selection
- File handler selection
- Verify options display and selection works
- [ ] **Job Detail General Tab:**
- Open any job → General tab
- Test select dropdowns:
- Status select
- Department/class select
- Estimator select
- File handler select
- Responsibility center select
- Verify all dropdowns work with search
- [ ] **Job Convert Button:**
- Open estimate job
- Click convert to RO
- Verify conversion type dropdown works
- Test all options in conversion modal
- [ ] **Close Job Lines:**
- Open converted job
- Go to close/finalize
- Test location selector in close lines modal
- Verify cost center dropdowns
- [ ] **Third Party Modal:**
- Open job → Third party integration
- Test company/payer selector
- Verify dropdown options and selection
---
### 3. Job Lines & Labor
**Files Modified:**
- `job-lines-upsert-modal.component.jsx`
- `job-line-bulk-assign.component.jsx`
- `job-line-convert-to-labor.component.jsx`
- `job-line-dispatch-button.component.jsx`
- `job-line-status-popup.component.jsx`
- `job-line-team-assignment.component.jsx`
**Test Scenarios:**
- [ ] **Add/Edit Job Line:**
- Open job → Add new line
- Test all dropdowns:
- **Labor type selector** (LAA, LAB, LAD, LAE, LAF, LAG, LAM, LAR, LAS, LAU, LA1-LA4)
- Location selector
- Status selector
- Skill/category selector
- Verify 14 labor type options display correctly
- Test search functionality
- [ ] **Bulk Line Assignment:**
- Select multiple job lines
- Open bulk assign
- Test team assignment dropdown
- [ ] **Convert to Labor:**
- Select part line
- Convert to labor
- Test labor type dropdown (LAA, LAB, etc.)
- Verify all 14 types available
- [ ] **Line Dispatch:**
- Open dispatch modal for job line
- Test team/employee selector
- [ ] **Line Status Popup:**
- Change job line status
- Verify status dropdown options
- [ ] **Team Assignment:**
- Assign team to job line
- Test team selector dropdown
---
### 4. Owners & Vehicles
**Files Modified:**
- `owner-search-select.component.jsx`
- `vehicle-search-select.component.jsx`
**Test Scenarios:**
- [ ] **Owner Search Select:**
- Any form with owner selector
- Search by owner name
- Verify owner options display
- Test selection and search
- [ ] **Vehicle Search Select:**
- Any form with vehicle selector
- Search by VIN, license plate, or vehicle description
- Verify vehicle options display correctly
- Test selection works
---
### 5. Vendors & Parts
**Files Modified:**
- `vendor-search-select.component.jsx`
- `parts-order-modal.component.jsx`
- `parts-receive-modal.component.jsx`
**Test Scenarios:**
- [ ] **Vendor Search Select:**
- Navigate to bills or parts ordering
- Test vendor selector
- Search for vendor by name (uses custom `optionFilterProp: "name"`)
- **Critical:** Verify favorites (with heart icon) display at top
- **Critical:** Verify discount tags show correctly (e.g., "10%")
- **Critical:** Verify vendor tags display
- Verify phone numbers display if showPhone enabled
- Test selection saves discount value to form
- [ ] **Parts Order Modal:**
- Order parts for a job
- Test all dropdowns in order form:
- Vendor selector
- Status selector
- Priority selector
- Verify options and selection
- [ ] **Parts Receive Modal:**
- Receive parts
- Test selectors in receive form
- Verify dropdown functionality
---
### 6. Bills & Payments
**Files Modified:**
- `bill-form.component.jsx`
- `bill-form-lines.component.jsx`
- `bill-form-lines-extended.formitem.component.jsx`
- `payment-form.component.jsx`
**Test Scenarios:**
- [ ] **Bill Entry Form:**
- Navigate to Bills → Add New Bill
- Test all dropdowns:
- Vendor selector
- Payment terms selector
- GL account selector
- Tax code selector
- Verify options display
- [ ] **Bill Lines:**
- Add bill line
- Test line-level selectors:
- Job selector
- Job line selector
- Account selector
- Location selector
- [ ] **Bill Lines Extended:**
- Add extended bill line
- Test responsibility center dropdown
- Test cost center dropdown
- [ ] **Payment Form:**
- Navigate to Payments → New Payment
- Test all dropdowns:
- Vendor selector
- Payment method selector
- Bank account selector
- Verify selection works
---
### 7. Shop Configuration
**Files Modified:**
- `shop-info.general.component.jsx`
- `shop-info.intake.component.jsx`
- `shop-info.responsibilitycenters.component.jsx`
- `shop-info.rostatus.component.jsx`
- `shop-info.speedprint.component.jsx`
- `shop-intellipay-config.component.jsx`
- `shop-employees-form.component.jsx`
**Test Scenarios:**
- [ ] **Shop Info - General:**
- Navigate to Shop Settings → General
- Test all dropdowns:
- Timezone selector
- Currency selector
- Date format selector
- Default options
- [ ] **Shop Info - Intake:**
- Navigate to Shop Settings → Intake
- Test intake form selectors
- Verify default options work
- [ ] **Shop Info - Responsibility Centers:**
- Navigate to Shop Settings → Responsibility Centers
- Test cost center dropdowns
- Test location selectors
- **Note:** This file had major changes (980 lines modified)
- [ ] **Shop Info - RO Status:**
- Navigate to Shop Settings → RO Status
- Test status configuration dropdowns
- **Note:** 120 lines modified
- [ ] **Shop Info - Speed Print:**
- Navigate to Shop Settings → Speed Print
- Test printer selector
- Test template selector
- [ ] **IntelliPay Config:**
- Navigate to Shop Settings → IntelliPay
- Test configuration dropdowns (56 lines modified)
- [ ] **Shop Employees Form:**
- Navigate to Shop Settings → Employees → Add/Edit
- Test all dropdowns:
- Role selector
- Department selector
- Pay type selector
- Verify options display
---
### 8. Schedule & Time Tracking
**Files Modified:**
- `schedule-job-modal.component.jsx`
- `schedule-manual-event.component.jsx`
- `tech-job-clock-in-form.component.jsx`
- `tech-job-clock-out-button.component.jsx`
- `time-ticket-modal.component.jsx`
- `time-ticket-shift-form.component.jsx`
**Test Scenarios:**
- [ ] **Schedule Job Modal:**
- Navigate to Schedule → Add Appointment
- Test all dropdowns:
- Job selector
- Employee selector
- Time slot selector
- Duration selector
- [ ] **Schedule Manual Event:**
- Add manual event to schedule
- Test event type dropdown
- Test employee selector
- [ ] **Tech Clock In Form:**
- Navigate to Tech Portal
- Clock in to job
- Test job selector
- Test operation selector
- [ ] **Tech Clock Out:**
- Clock out from job
- Test reason selector (if applicable)
- Verify dropdown works
- [ ] **Time Ticket Modal:**
- Enter/edit time ticket
- Test all dropdowns:
- Employee selector
- Job selector
- Operation selector
- [ ] **Time Ticket Shift Form:**
- Manage shift
- Test shift type selector
- Test employee selector
---
### 9. Contracts & Courtesy Cars
**Files Modified:**
- `contract-convert-to-ro.component.jsx`
- `contract-status-select.component.jsx`
- `courtesy-car-readiness-select.component.jsx`
- `courtesy-car-status-select.component.jsx`
**Test Scenarios:**
- [ ] **Contract Convert to RO:**
- Open contract
- Convert to RO
- Test conversion options dropdown
- [ ] **Contract Status Select:**
- Change contract status
- Test status options:
- New
- Out
- Returned
- Verify all 3 status options work
- [ ] **Courtesy Car Readiness:**
- Navigate to Courtesy Cars
- Change car readiness
- Test readiness options:
- Ready
- Not Ready
- Verify both options work
- [ ] **Courtesy Car Status:**
- Change courtesy car status
- Test all status options:
- In
- In Service
- Out
- Sold
- Lease Return
- Unavailable
- Verify all 6 status options work
---
### 10. Email & Communication
**Files Modified:**
- `email-overlay.component.jsx`
- `chat-tag-ro.component.jsx`
- `parts-shop-info-email-presets.component.jsx`
**Test Scenarios:**
- [ ] **Email Overlay:**
- Send email from any feature
- Test all dropdowns:
- From email selector (current user, shop email, custom emails)
- Template selector
- Priority selector
- Verify custom from emails display correctly
- [ ] **Chat Tag RO:**
- Open chat
- Tag to RO
- Test RO selector dropdown
- [ ] **Parts Shop Email Presets:**
- Navigate to Parts Settings → Email Presets
- Test preset selector
- Verify options display
---
### 11. DMS Integration
**Files Modified:**
- `dms-post-form/cdklike-dms-post-form.jsx`
- `dms/dms.container.jsx`
- `dms-payables/dms-payables.container.jsx`
**Test Scenarios:**
- [ ] **DMS Post Form:**
- Navigate to DMS posting
- Test all dropdowns in post form:
- Account selector
- Department selector
- GL code selector
- [ ] **DMS Container:**
- Navigate to DMS section
- Test filter dropdowns
- Verify selection works
- [ ] **DMS Payables:**
- Navigate to DMS Payables
- Test payables filter selectors
---
### 12. Production & Admin
**Files Modified:**
- `production-list-config-manager.component.jsx`
- `jobs-admin-class.component.jsx`
- `jobs-close/jobs-close.component.jsx`
**Test Scenarios:**
- [ ] **Production List Config:**
- Navigate to Production Board → Configure
- Test column configuration dropdown
- Verify display settings work
- [ ] **Jobs Admin Class:**
- Navigate to Admin → Jobs
- Change job class/department
- Test class selector dropdown
- [ ] **Jobs Close Page:**
- Navigate to Jobs → Close/Export
- Test filter dropdowns:
- Status filter
- Date range
- Department filter
- Verify selections work
---
### 13. Miscellaneous Components
**Files Modified:**
- `Ciecaselect.jsx` (utility component - 75 lines modified)
**Test Scenarios:**
- [ ] **CIECA Select Utility:**
- Used in bill-form-lines-extended for labor type adjustments
- Returns options array with 14 labor types (LAA-LAU, LA1-LA4)
- Returns 10 part types (PAA, PAC, PAL, PAG, PAM, PAP, PAN, PAO, PAR, PAS) when parts=true
- Verify function returns properly formatted options array
- Test in any form using DMS integration with CIECA codes
---
## Cross-Component Testing
### Search Functionality
Test search across all searchable selects:
- [ ] Employee search (by name, employee number)
- [ ] Job search (by RO number, customer name, vehicle)
- [ ] Vendor search (by name)
- [ ] Vehicle search (by VIN, plate, make/model)
- [ ] Owner search (by name)
### Multi-Select Components
If any components use `mode="multiple"`:
- [ ] Verify multi-select works
- [ ] Verify tags display correctly
- [ ] Verify removal of selections works
### Disabled State
- [ ] Test dropdowns in disabled state
- [ ] Verify disabled styling matches original
### Form Validation
- [ ] Test required field validation on selects
- [ ] Verify error messages display correctly
- [ ] Test form submission with select values
---
## Regression Testing Priority
### High Priority (Critical User Flows)
1. ✅ Create new job with all required fields
2. ✅ Add job lines with labor types
3. ✅ Assign employees to job lines
4. ✅ Order parts with vendor selection
5. ✅ Enter bills with vendor and account selection
6. ✅ Close and export jobs
### Medium Priority
7. Convert estimate to RO
8. Schedule appointments
9. Clock in/out (tech portal)
10. Update shop configuration
11. Manage courtesy cars
### Low Priority (Admin Functions)
12. DMS integration posting
13. Production board configuration
14. Admin job modifications
---
## Browser Testing
Test in:
- [ ] Chrome (latest)
- [ ] Firefox (latest)
- [ ] Safari (if applicable)
- [ ] Edge (latest)
---
## Known Changed Components Summary
**Total Files Modified:** 54 client files + 1 server file
**Labor Type Selectors (14 options):**
- LAA, LAB, LAD, LAE, LAF, LAG, LAM, LAR, LAS, LAU, LA1, LA2, LA3, LA4
- Found in: job-lines-upsert-modal, job-line-convert-to-labor, bill-form-lines
**Most Complex Changes:**
- `shop-info.responsibilitycenters.component.jsx` (980 lines changed)
- `vendor-search-select.component.jsx` (120 lines changed)
- `shop-info.rostatus.component.jsx` (120 lines changed)
- `jobs-convert-button.component.jsx` (198 lines changed)
- `Ciecaselect.jsx` (75 lines changed)
---
## Internal Code Review Results ✅
**Files Validated (Sample):**
1.`allocations-assignment.component.jsx` - Simple employee selector with search
2.`contract-status-select.component.jsx` - Static 3-option select
3.`courtesy-car-status-select.component.jsx` - Static 6-option select
4.`job-lines-upsert-modal.component.jsx` - 14 labor type options inline
5.`email-overlay.component.jsx` - From email with custom emails array
6.`employee-search-select-email.component.jsx` - Complex with tags and custom search prop
7.`bill-form-lines-extended.formitem.component.jsx` - CiecaSelect utility usage
8.`vendor-search-select.component.jsx` - Complex with favorites, tags, discount, phone
9.`job-search-select.component.jsx` - Complex with owner display, status tags, loading states
10.`Ciecaselect.jsx` - Utility function returning options array
**Validation Checklist:**
- [x] All `Select.Option` patterns removed
- [x] Replaced with `options` array prop
- [x] `showSearch` uses object syntax `{{ optionFilterProp: "label" }}`
- [x] Custom `optionFilterProp` used where needed ("name", "search", etc.)
- [x] Complex rendered content preserved in `label` prop with JSX
- [x] Tags, icons, badges, and styled elements working correctly
- [x] Search functionality using correct property references
- [x] Labor types: All 14 types present (LAA, LAB, LAD, LAE, LAF, LAG, LAM, LAR, LAS, LAU, LA1, LA2, LA3, LA4)
- [x] Part types: All 10 types in CiecaSelect (PAA, PAC, PAL, PAG, PAM, PAP, PAN, PAO, PAR, PAS)
- [x] Custom filterOption functions updated (option.label vs option.props.children)
- [x] Performance optimizations added (useMemo for large option lists)
- [x] labelRender custom rendering preserved where used
- [x] optionLabelProp used correctly for display vs value
**Known Complex Patterns Verified:**
1. **Vendor Select:** Favorites with heart icon, discount tags, phone display, custom search by "name"
2. **Employee Select:** Flat rate/straight time tags, custom search by "search" prop (employee number + name)
3. **Job Select:** Owner display function, status tags, loading states, conditional claim number display
4. **Email Overlay:** Multiple from addresses (user email, shop email, custom md_from_emails array)
5. **Bill Lines Extended:** Conditional DMS vs responsibility centers, CiecaSelect utility
**No Issues Found** - All migrations follow the correct pattern.
---
## Testing Notes
- Focus on components with search functionality - filtering logic changed from `children` to `label`
- Pay attention to components with custom rendered content (tags, badges, formatted text)
- Verify `optionFilterProp` works correctly for custom search fields
- Test components that map over arrays to generate options
- Check components with conditional option rendering
---
## Sign-Off
- [ ] All high priority tests passed
- [ ] All medium priority tests passed
- [ ] All low priority tests passed
- [ ] No console errors observed
- [ ] Visual appearance matches original
- [ ] Performance is acceptable (no lag in large dropdowns)
**Tested By:** _________________
**Date:** _________________
**Environment:** _________________
**Notes:** _________________