From faf5878bdf36188cca57594dc816f6e3e50af18b Mon Sep 17 00:00:00 2001 From: Patrick Fic Date: Wed, 4 Mar 2026 17:41:10 +0000 Subject: [PATCH] Revert "Revert "Release/2026 02 27 (pull request #3070)" (pull request #3080)" --- .gitignore | 20 + bodyshop_translations.babel | 731 +++++- client/.env.development.imex | 1 + client/.env.development.rome | 1 + client/package-lock.json | 890 +++---- client/package.json | 50 +- client/src/App/App.container.jsx | 52 +- client/src/App/App.styles.scss | 34 + client/src/App/themeProvider.js | 2 +- .../accounting-payables-table.component.jsx | 6 +- .../accounting-payments-table.component.jsx | 6 +- ...accounting-receivables-table.component.jsx | 6 +- .../allocations-assignment.component.jsx | 17 +- .../allocations-bulk-assignment.component.jsx | 16 +- .../audit-trail-list.component.jsx | 5 +- .../email-audit-trail-list.component.jsx | 5 +- .../bill-detail-edit-return.component.jsx | 37 +- .../bill-detail-edit.container.jsx | 15 +- .../bill-enter-ai-scan.component.jsx | 203 ++ .../bill-enter-modal.container.jsx | 85 +- .../bill-form-lines-extended.component.jsx | 12 +- ...form-lines.extended.formitem.component.jsx | 46 +- .../bill-form/bill-form.component.jsx | 51 +- .../bill-form/bill-form.container.jsx | 3 +- .../bill-form/bill-form.lines.component.jsx | 91 +- .../bill-form.lines.confidence.component.jsx | 87 + .../bills-list-table.component.jsx | 6 +- .../bills-vendors-list.component.jsx | 6 +- .../chat-tag-ro/chat-tag-ro.component.jsx | 13 +- .../contract-cars/contract-cars.component.jsx | 6 +- .../contract-convert-to-ro.component.jsx | 28 +- .../contract-jobs/contract-jobs.component.jsx | 6 +- .../contract-status-select.component.jsx | 18 +- .../contracts-find-modal.container.jsx | 6 +- .../contracts-list.component.jsx | 6 +- .../courtesy-car-contract-list.component.jsx | 6 +- ...ourtesy-car-readiness-select.component.jsx | 11 +- .../courtesy-car-status-select.component.jsx | 19 +- .../courtesy-cars-list.component.jsx | 6 +- .../csi-response-list-paginated.component.jsx | 6 +- .../job-lifecycle-dashboard.component.jsx | 6 +- .../monthly-job-costing.component.jsx | 35 +- .../scheduled-delivery-today.component.jsx | 1 + .../scheduled-in-today.component.jsx | 1 + .../scheduled-out-today.component.jsx | 1 + .../dms-allocations-summary-ap.component.jsx | 10 +- .../dms-allocations-summary.component.jsx | 24 +- .../rr-dms-allocations-summary.component.jsx | 37 +- .../dms-cdk-makes/dms-cdk-makes.component.jsx | 6 +- .../cdk-customer-selector.jsx | 6 +- .../fortellis-customer-selector.jsx | 6 +- .../pbs-customer-selector.jsx | 6 +- .../rr-customer-selector.jsx | 22 +- .../dms-log-events.component.jsx | 298 ++- .../dms-post-form/cdklike-dms-post-form.jsx | 18 +- .../dms-post-form/rr-early-ro-form.jsx | 12 +- .../email-overlay/email-overlay.component.jsx | 12 +- .../email-overlay/email-overlay.container.jsx | 2 +- ...employee-search-select-email.component.jsx | 31 +- .../employee-search-select.component.jsx | 40 +- .../form-fields-changed-alert.component.jsx | 4 +- .../global-search-os.component.jsx | 13 +- .../global-search/global-search.component.jsx | 5 +- .../inventory-list.component.jsx | 6 +- .../job-3rd-party-modal.component.jsx | 37 +- .../job-audit-trail.component.jsx | 19 +- .../job-close-ro-guard.ppd.jsx | 13 +- .../job-close-ro-guard.sublet.jsx | 13 +- .../job-costing-parts-table.component.jsx | 22 +- .../job-detail-cards.component.jsx | 15 +- .../job-detail-cards.parts.component.jsx | 9 +- .../job-detail-lines/job-lines.component.jsx | 1 + .../job-lifecycle/job-lifecycle.component.jsx | 6 +- .../job-line-bulk-assign.component.jsx | 16 +- .../job-line-convert-to-labor.component.jsx | 36 +- .../job-line-dispatch-button.component.jsx | 19 +- .../job-line-status-popup.component.jsx | 13 +- .../job-line-team-assignmnent.component.jsx | 13 +- .../job-lines-upsert-modal.component.jsx | 54 +- .../job-payments/job-payments.component.jsx | 26 +- ...b-reconciliation-bills-table.component.jsx | 6 +- ...b-reconciliation-parts-table.component.jsx | 6 +- .../job-search-select.component.jsx | 38 +- .../job-totals.table.labor.component.jsx | 108 +- .../job-totals.table.other.component.jsx | 29 +- .../job-totals.table.parts.component.jsx | 43 +- .../job-totals.table.totals.component.jsx | 5 +- .../jobs-admin-class.component.jsx | 13 +- .../jobs-available-scan.component.jsx | 6 +- .../jobs-available-table.component.jsx | 12 +- .../jobs-close-lines.component.jsx | 24 +- .../jobs-convert-button.component.jsx | 198 +- .../jobs-create-jobs-info.component.jsx | 38 +- ...obs-create-owner-info.search.component.jsx | 6 +- ...eate-vehicle-info.predefined.component.jsx | 8 +- ...s-create-vehicle-info.search.component.jsx | 6 +- .../jobs-detail-general.component.jsx | 61 +- .../jobs-detail-header-actions.component.jsx | 15 +- .../jobs-detail-rates.component.jsx | 18 +- .../jobs-find-modal.component.jsx | 6 +- .../jobs-list-paginated.component.jsx | 6 +- .../jobs-list/jobs-list.component.jsx | 28 +- .../jobs-notes/jobs.notes.component.jsx | 12 +- .../jobs-ready-list.component.jsx | 21 +- ...-allocations-adjustment-edit.component.jsx | 36 +- .../labor-allocations-table.component.jsx | 33 +- ...or-allocations-table.payroll.component.jsx | 25 +- .../layout-form-row.component.jsx | 202 +- .../layout-form-row.styles.scss | 85 +- .../loading-spinner.component.jsx | 3 +- .../notification-settings-form.component.jsx | 12 +- .../owner-detail-jobs.component.jsx | 6 +- .../owner-find-modal.component.jsx | 6 +- .../owner-search-select.component.jsx | 17 +- .../owners-list/owners-list.component.jsx | 6 +- .../parts-dispatch-expander.component.jsx | 10 +- .../parts-dispatch-table.component.jsx | 6 +- ...arts-order-list-table-drawer.component.jsx | 20 +- .../parts-order-list-table.component.jsx | 7 +- .../parts-order-modal.component.jsx | 28 +- .../parts-queue-card.component.jsx | 15 +- .../parts-queue-job-lines.component.jsx | 6 +- .../parts-queue.list.component.jsx | 6 +- .../parts-receive-modal.component.jsx | 28 +- ...arts-shop-info-email-presets.component.jsx | 10 +- .../payment-form/payment-form.component.jsx | 47 +- .../payment-list-paginated.component.jsx | 6 +- .../phone-number-consent.component.jsx | 6 +- ...oduction-list-config-manager.component.jsx | 2 +- .../profile-shops/profile-shops.component.jsx | 12 +- .../responsive-table.component.jsx | 99 + .../responsive-table.styles.scss | 27 + .../schedule-job-modal.component.jsx | 32 +- .../schedule-job-modal.container.jsx | 2 +- .../schedule-manual-event.component.jsx | 13 +- .../scoreboard-jobs-list.component.jsx | 6 +- ...scoreboard-timetickets.stats.component.jsx | 6 +- .../shop-employees-form.component.jsx | 36 +- .../shop-employees-list.component.jsx | 6 +- .../shop-info/shop-info.general.component.jsx | 60 +- .../shop-info/shop-info.intake.component.jsx | 44 +- ...p-info.responsibilitycenters.component.jsx | 980 ++------ .../shop-info.rostatus.component.jsx | 120 +- .../shop-info.speedprint.component.jsx | 14 +- .../shop-intellipay-config.component.jsx | 56 +- .../shop-teams/shop-employee-teams.list.jsx | 6 +- .../shop-users/shop-users.component.jsx | 6 +- .../simplified-parts-jobs-list.component.jsx | 6 +- .../task-list/task-list.component.jsx | 11 +- .../tech-job-clock-in-form.component.jsx | 20 +- .../tech-job-clock-out-button.component.jsx | 43 +- .../tech-lookup-jobs-list.component.jsx | 6 +- .../time-ticket-list-team-pay.component.jsx | 19 +- .../time-ticket-list.component.jsx | 30 +- .../time-ticket-modal.component.jsx | 70 +- .../time-ticket-shift-form.component.jsx | 16 +- ...me-tickets-summary-employees.component.jsx | 9 +- .../tt-approvals-list.component.jsx | 6 +- .../vehicle-detail-jobs.component.jsx | 6 +- .../vehicle-search-select.component.jsx | 17 +- .../vehicles-list/vehicles-list.component.jsx | 6 +- .../vendor-search-select.component.jsx | 136 +- .../vendors-list/vendors-list.component.jsx | 6 +- .../src/contexts/SocketIO/socketProvider.jsx | 90 +- client/src/graphql/bills.queries.js | 1 + .../src/pages/bills/bills.page.component.jsx | 6 +- .../dms-payables/dms-payables.container.jsx | 13 +- client/src/pages/dms/dms.container.jsx | 194 +- .../export-logs.page.component.jsx | 6 +- .../pages/jobs-close/jobs-close.component.jsx | 16 +- .../jobs-detail.page.component.jsx | 8 +- .../phonebook/phonebook.page.component.jsx | 6 +- .../phonebook/phonebook.page.container.jsx | 16 +- .../shop-vendor.page.component.jsx | 15 +- .../tech-assigned-prod-jobs.component.jsx | 6 +- .../tech-dispatched-parts.page.jsx | 6 +- client/src/translations/en_us/common.json | 68 +- client/src/translations/es/common.json | 68 +- client/src/translations/fr/common.json | 68 +- client/src/utils/Ciecaselect.jsx | 75 +- package-lock.json | 2154 ++++++++--------- package.json | 46 +- server.js | 9 + server/ai/bill-ocr/bill-ocr-generator.js | 792 ++++++ server/ai/bill-ocr/bill-ocr-helpers.js | 159 ++ server/ai/bill-ocr/bill-ocr-normalize.js | 202 ++ server/ai/bill-ocr/bill-ocr-readme.md | 8 + server/ai/bill-ocr/bill-ocr.js | 465 ++++ server/data/data.js | 1 - server/data/kaizen.js | 2 + server/data/vehicletype/cargovans.json | 126 - server/data/vehicletype/passengervans.json | 33 - server/data/vehicletype/suvs.json | 485 ---- server/data/vehicletype/trucks.json | 567 ----- server/data/vehicletype/vehicletype.js | 39 - server/fortellis/fortellis-helpers.js | 10 +- server/fortellis/fortellis.js | 70 +- server/graphql-client/queries.js | 2 + server/routes/aiRoutes.js | 17 + server/routes/miscellaneousRoutes.js | 15 - server/rr/rr-register-socket-events.js | 257 +- server/utils/redisHelpers.js | 60 +- server/web-sockets/createLogEvent.js | 183 +- server/web-sockets/redisSocketEvents.js | 42 +- 204 files changed, 7713 insertions(+), 5495 deletions(-) create mode 100644 client/src/components/bill-enter-ai-scan/bill-enter-ai-scan.component.jsx create mode 100644 client/src/components/bill-form/bill-form.lines.confidence.component.jsx create mode 100644 client/src/components/responsive-table/responsive-table.component.jsx create mode 100644 client/src/components/responsive-table/responsive-table.styles.scss create mode 100644 server/ai/bill-ocr/bill-ocr-generator.js create mode 100644 server/ai/bill-ocr/bill-ocr-helpers.js create mode 100644 server/ai/bill-ocr/bill-ocr-normalize.js create mode 100644 server/ai/bill-ocr/bill-ocr-readme.md create mode 100644 server/ai/bill-ocr/bill-ocr.js delete mode 100644 server/data/vehicletype/cargovans.json delete mode 100644 server/data/vehicletype/passengervans.json delete mode 100644 server/data/vehicletype/suvs.json delete mode 100644 server/data/vehicletype/trucks.json delete mode 100644 server/data/vehicletype/vehicletype.js create mode 100644 server/routes/aiRoutes.js diff --git a/.gitignore b/.gitignore index 590787f08..4b0d51183 100644 --- a/.gitignore +++ b/.gitignore @@ -129,6 +129,26 @@ vitest-coverage/ test-output.txt server/job/test/fixtures +# Keep .github ignored by default, but track Copilot instructions .github +!.github/ +.github/* +!.github/copilot-instructions.md _reference/ragmate/.ragmate.env docker_data +/.cursorrules +/AGENTS.md +/AI_CONTEXT.md +/CLAUDE.md +/COPILOT.md +/GEMINI.md +/_reference/select-component-test-plan.md + +/.cursorrules +/AGENTS.md +/AI_CONTEXT.md +/CLAUDE.md +/COPILOT.md +/.github/copilot-instructions.md +/GEMINI.md +/_reference/select-component-test-plan.md diff --git a/bodyshop_translations.babel b/bodyshop_translations.babel index 503000cd2..cfb312ab1 100644 --- a/bodyshop_translations.babel +++ b/bodyshop_translations.babel @@ -1,4 +1,4 @@ - +