From e0672a91d70fb3e9dc8dcc6c2d883b8e47808dea Mon Sep 17 00:00:00 2001 From: credelinghuys Date: Fri, 1 May 2026 15:50:29 -0400 Subject: [PATCH 01/28] CASH-612: Policy vehicle page Co-authored-by: Copilot --- src/constants/insurance.js | 4 ++ .../policy-vehicle/policy-vehicle.spec.js | 15 ++++- src/layouts/policy-vehicle/policy-vehicle.vue | 64 +++++++++++++++++-- src/router/constants/navigation-scenarios.js | 1 + src/router/constants/routing-table.js | 4 ++ 5 files changed, 83 insertions(+), 5 deletions(-) diff --git a/src/constants/insurance.js b/src/constants/insurance.js index f7550513b..5987eb11f 100644 --- a/src/constants/insurance.js +++ b/src/constants/insurance.js @@ -78,3 +78,7 @@ export function coverageTypeEnum(strCoverageType) { return null; } } + +export const parentAccountNumbers = { + CONNECT: "560636", +}; diff --git a/src/layouts/policy-vehicle/policy-vehicle.spec.js b/src/layouts/policy-vehicle/policy-vehicle.spec.js index 1fe1a5559..d11777667 100644 --- a/src/layouts/policy-vehicle/policy-vehicle.spec.js +++ b/src/layouts/policy-vehicle/policy-vehicle.spec.js @@ -50,11 +50,18 @@ function setupMocks() { FunnelHeaderWidget: { Text: "Header" }, FunnelSubHeaderWidget: { Text: "Subheader" }, FunnelFooterWidget: { Text: "Footer" }, + VehicleNotListedWidget: { Text: "Vehicle Not Listed" }, + CancelVerificationWidget: { Text: "Cancel Verification" }, + AmFamDisclaimerWidget: { Text: "Disclaimer" }, }; fetchCmsContentForPage.mockResolvedValue(mockCmsContent); settleAllPromises.mockResolvedValue({ cmsContent: mockCmsContent }); + const getCmsContentMock = jest.fn().mockImplementation((widgetName, cmsFieldName) => { + return mockCmsContent[widgetName][cmsFieldName]; + }); + const mountOptions = getMountOptions({ route: { name: "policy-vehicle", query: {}, params: {} }, router: { @@ -64,7 +71,13 @@ function setupMocks() { }, }); + mountOptions.global = mountOptions.global || {}; + mountOptions.global.mocks = { + ...(mountOptions.global.mocks || {}), + getCmsContent: getCmsContentMock, + }; + const wrapper = shallowMount(policyVehicle, mountOptions); - return { wrapper }; + return { wrapper, getCmsContentMock }; } diff --git a/src/layouts/policy-vehicle/policy-vehicle.vue b/src/layouts/policy-vehicle/policy-vehicle.vue index 954b04bc3..2b87e6692 100644 --- a/src/layouts/policy-vehicle/policy-vehicle.vue +++ b/src/layouts/policy-vehicle/policy-vehicle.vue @@ -4,16 +4,31 @@
- - + + + + + + + +
@@ -24,6 +39,11 @@ import funnelHeader from "@/fmg-components/funnel-header/funnel-header"; import navbar from "@/fmg-components/nav-bar/nav-bar"; import funnelSubHeader from "@/fmg-components/funnel-sub-header/funnel-sub-header"; +import store from "@/store"; +import buttonMain from "@/ux-components/button-main/button-main"; +import textLink from "@/ux-components/text-link/text-link.vue"; +import { parentAccountNumbers } from "@/constants/insurance"; + import { Form } from "vee-validate"; import { fetchCmsContentForPage } from "@/helpers/cms-content-helper"; @@ -40,6 +60,8 @@ export default { funnelHeader, navbar, funnelSubHeader, + textLink, + buttonMain, }, // Ensure CMS content is fetched during route navigation without depending on `to`/`from` async beforeRouteEnter(to, from, next) { @@ -57,7 +79,34 @@ export default { }); }, + computed: { + vehicleNotListedQuestionText() { + return this.getCmsContent("VehicleNotListedWidget", "Text"); + }, + cancelVerificationCopy() { + return this.getCmsContent("CancelVerificationWidget", "Text"); + }, + amFamDisclaimerWidget() { + return this.getCmsContent("AmFamDisclaimerWidget", "Text"); + }, + showAmFamDisclaimer() { + return this.parentAccountNumberFromStore() === this.parentAccountNumbers.CONNECT; + }, + parentAccountNumbers() { + return parentAccountNumbers; + }, + }, + methods: { + parentAccountNumberFromStore() { + return store.getters.order?.payment?.parentAccountNumber; + }, + cancelVerificationAction() { + this.$router.navigateWithoutSaving( + this.navigationScenarios.CLICKED_CANCEL_VERIFICATION, + this.pageName + ); + }, backButtonAction() { this.$router.navigateWithoutSaving( this.navigationScenarios.CLICKED_BACK, @@ -76,3 +125,10 @@ export default { }, }; + + diff --git a/src/router/constants/navigation-scenarios.js b/src/router/constants/navigation-scenarios.js index fef66ddbb..984204e3c 100644 --- a/src/router/constants/navigation-scenarios.js +++ b/src/router/constants/navigation-scenarios.js @@ -12,6 +12,7 @@ const navigationScenarios = { CLICKED_FORWARD: "CLICKED_FORWARD", CLICKED_FORWARD_WITH_CASH: "CLICKED_FORWARD_WITH_CASH", CLICKED_FORWARD_WITH_INSURANCE: "CLICKED_FORWARD_WITH_INSURANCE", + CLICKED_CANCEL_VERIFICATION: "CLICKED_CANCEL_VERIFICATION", // TODO: use virtual page? // Vin selection diff --git a/src/router/constants/routing-table.js b/src/router/constants/routing-table.js index 77876a096..7decd143e 100644 --- a/src/router/constants/routing-table.js +++ b/src/router/constants/routing-table.js @@ -479,6 +479,10 @@ const routingTable = function () { scenario: navigationScenarios.CLICKED_FORWARD, destinationPageData: routeData.POLICY_DRIVER, }, + { + scenario: navigationScenarios.CLICKED_CANCEL_VERIFICATION, + destinationPageData: routeData.INSURANCE_COMPANY, + }, ], }, { From b55451ec9dbda5a225411383d17433e2e2872f76 Mon Sep 17 00:00:00 2001 From: Chris Redelinghuys Date: Wed, 6 May 2026 09:21:08 -0400 Subject: [PATCH 02/28] CASH-2563 --- src/constants/bailout-codes.js | 5 + .../heritage-integration/order-helper.js | 17 +- .../bailout-success/bailout-success.vue | 91 +++++++++ src/layouts/bailout/bailout.vue | 177 +++++++++++++++--- src/router/constants/navigation-scenarios.js | 5 + src/router/constants/routes.js | 8 + src/router/constants/routing-table.js | 18 ++ src/router/methods/navigate.js | 20 +- src/router/methods/routes.js | 2 + 9 files changed, 312 insertions(+), 31 deletions(-) create mode 100644 src/constants/bailout-codes.js create mode 100644 src/layouts/bailout-success/bailout-success.vue diff --git a/src/constants/bailout-codes.js b/src/constants/bailout-codes.js new file mode 100644 index 000000000..caf265292 --- /dev/null +++ b/src/constants/bailout-codes.js @@ -0,0 +1,5 @@ +const bailoutCodes = { + PARTS_NOT_FOUND: "PartsNotFound", +}; + +export { bailoutCodes }; diff --git a/src/helpers/heritage-integration/order-helper.js b/src/helpers/heritage-integration/order-helper.js index a3dc363f5..b15a0a6e3 100644 --- a/src/helpers/heritage-integration/order-helper.js +++ b/src/helpers/heritage-integration/order-helper.js @@ -57,13 +57,15 @@ export async function saveSession({ shouldAwaitSaveSessionQueue = false, submitAfterSave = false, createUnscheduledStatusWorkOrderForPIA = false, + bailoutCode = null, }) { // Add next save session to end of queue const saveSessionPromise = flushSaveSessionQueue().then(() => { return saveSessionHelper( pageNameToLog, submitAfterSave, - createUnscheduledStatusWorkOrderForPIA + createUnscheduledStatusWorkOrderForPIA, + bailoutCode ); }); @@ -106,6 +108,15 @@ export async function saveQuote({ pageNameToLog }) { return; } +export async function submitBailout({ pageNameToLog, bailoutCode }) { + await saveSession({ + pageNameToLog: pageNameToLog, + shouldAwaitSaveSessionQueue: true, + submitAfterSave: false, + bailoutCode: bailoutCode, + }); +} + // PRIVATE FUNCTIONS // /* @@ -147,13 +158,15 @@ async function loadSession( async function saveSessionHelper( pageNameToLog, submitAfterSave = false, - createUnscheduledStatusWorkOrderForPIA = false + createUnscheduledStatusWorkOrderForPIA = false, + bailoutCode = null ) { const savedSessionInfo = await baseMixin.methods.dispatchStoreActionWithLogging( storeActions.SAVE_SESSION, { submitAfterSave: submitAfterSave, createUnscheduledStatusWorkOrderForPIA: createUnscheduledStatusWorkOrderForPIA, + bailoutCode: bailoutCode, }, pageNameToLog ); diff --git a/src/layouts/bailout-success/bailout-success.vue b/src/layouts/bailout-success/bailout-success.vue new file mode 100644 index 000000000..73bbadfbb --- /dev/null +++ b/src/layouts/bailout-success/bailout-success.vue @@ -0,0 +1,91 @@ + + + diff --git a/src/layouts/bailout/bailout.vue b/src/layouts/bailout/bailout.vue index a64f7a416..754409794 100644 --- a/src/layouts/bailout/bailout.vue +++ b/src/layouts/bailout/bailout.vue @@ -1,21 +1,63 @@ diff --git a/src/router/constants/navigation-scenarios.js b/src/router/constants/navigation-scenarios.js index fef66ddbb..e4aac41c1 100644 --- a/src/router/constants/navigation-scenarios.js +++ b/src/router/constants/navigation-scenarios.js @@ -13,6 +13,11 @@ const navigationScenarios = { CLICKED_FORWARD_WITH_CASH: "CLICKED_FORWARD_WITH_CASH", CLICKED_FORWARD_WITH_INSURANCE: "CLICKED_FORWARD_WITH_INSURANCE", + // Bailout + BAILOUT: "BAILOUT", + BAILOUT_SUCCESS: "BAILOUT_SUCCESS", + CLICKED_BACK_TO_HOMEPAGE: "CLICKED_BACK_TO_HOMEPAGE", + // TODO: use virtual page? // Vin selection CLICKED_BACK_WITH_VIN: "CLICKED_BACK_WITH_VIN", diff --git a/src/router/constants/routes.js b/src/router/constants/routes.js index fc54025ef..479d0899d 100644 --- a/src/router/constants/routes.js +++ b/src/router/constants/routes.js @@ -171,6 +171,14 @@ export const routeData = { path: "/virtual/restart", virtual: true, }, + BAILOUT: { + name: "bailout", + path: "/bailout", + }, + BAILOUT_SUCCESS: { + name: "bailout-success", + path: "/bailout-success", + }, }; export const FUNNEL_START_PAGE = routeData.VEHICLE; diff --git a/src/router/constants/routing-table.js b/src/router/constants/routing-table.js index 77876a096..b85320973 100644 --- a/src/router/constants/routing-table.js +++ b/src/router/constants/routing-table.js @@ -802,6 +802,24 @@ const routingTable = function () { }, ], }, + { + pageName: routeData.BAILOUT.name, + maps: [ + { + scenario: navigationScenarios.CLICKED_FORWARD, + destinationPageData: routeData.BAILOUT_SUCCESS, + }, + ], + }, + { + pageName: routeData.BAILOUT_SUCCESS.name, + maps: [ + { + scenario: navigationScenarios.CLICKED_BACK_TO_HOMEPAGE, + destinationPageData: routeData.VEHICLE, + }, + ], + }, ]; }; diff --git a/src/router/methods/navigate.js b/src/router/methods/navigate.js index b80d31769..a6d3148f0 100644 --- a/src/router/methods/navigate.js +++ b/src/router/methods/navigate.js @@ -7,7 +7,13 @@ import store from "@/store"; import { handleSoftError } from "@/router/methods/error"; -async function navigate(scenario, currentPageName, withSaving = false, forceTopLevelNav = false) { +async function navigate( + scenario, + currentPageName, + withSaving = false, + forceTopLevelNav = false, + bailoutCode = null +) { // Check to see if calling page is same as current page. // If not, cancel navigation before it begins. const callingRoute = currentPageName; @@ -39,7 +45,7 @@ async function navigate(scenario, currentPageName, withSaving = false, forceTopL store.getters?.applicationUser?.savedSessionId || store.getters?.order?.customer?.emailAddress ) { - await saveSession({ pageNameToLog: nextPage.name }); + await saveSession({ pageNameToLog: nextPage.name, bailoutCode: bailoutCode }); } } @@ -70,9 +76,13 @@ export async function navigateWithSaving(scenario, currentPageName) { export async function navigateWithPageData(scenario, currentPageName, pageData = {}) { const nextPage = getDestination(currentPageName, scenario); - await savePageData(nextPage.name, pageData); - - return await navigate(scenario, currentPageName, true); + if (pageData && pageData.bailoutCode) { + await savePageData(currentPageName, pageData); + return await navigate(scenario, currentPageName, true, false, pageData.bailoutCode); + } else { + await savePageData(nextPage.name, pageData); + return await navigate(scenario, currentPageName, true); + } } export async function navigateAndForceTopLevelNavigation( diff --git a/src/router/methods/routes.js b/src/router/methods/routes.js index 88cc17f94..34056ba76 100644 --- a/src/router/methods/routes.js +++ b/src/router/methods/routes.js @@ -51,6 +51,8 @@ export const routes = [ createRoute(routeData.RECALIBRATION_INFO), createRoute(routeData.COVERAGE_STATEMENT), createRoute(routeData.VERIFY_DETAILS), + createRoute(routeData.BAILOUT), + createRoute(routeData.BAILOUT_SUCCESS), // Virtual pages (resolve to a non-virtual page.) createVirtualRoute(routeData.LANDING, landingBeforeEnter), createVirtualRoute(routeData.HERITAGE, heritageBeforeEnter), From dd291a980c5f7b930b6d728cf80adbde72516592 Mon Sep 17 00:00:00 2001 From: credelinghuys Date: Thu, 7 May 2026 12:52:02 -0400 Subject: [PATCH 03/28] CASH-2563 --- src/constants/bailout-codes.js | 2 +- .../heritage-integration/order-helper.js | 11 +-- .../bailout-success/bailout-success.spec.js | 56 ++++++++++++ .../bailout-success/bailout-success.vue | 4 +- src/layouts/bailout/bailout.spec.js | 20 +++++ src/layouts/bailout/bailout.vue | 87 +++++++++++++++++-- src/router/constants/routing-table.js | 2 +- src/router/methods/navigate.js | 16 ++-- src/store/index.js | 8 +- 9 files changed, 172 insertions(+), 34 deletions(-) create mode 100644 src/layouts/bailout-success/bailout-success.spec.js diff --git a/src/constants/bailout-codes.js b/src/constants/bailout-codes.js index caf265292..af6290363 100644 --- a/src/constants/bailout-codes.js +++ b/src/constants/bailout-codes.js @@ -1,5 +1,5 @@ const bailoutCodes = { - PARTS_NOT_FOUND: "PartsNotFound", + PARTS_NOT_FOUND: 10, }; export { bailoutCodes }; diff --git a/src/helpers/heritage-integration/order-helper.js b/src/helpers/heritage-integration/order-helper.js index b15a0a6e3..613f239f2 100644 --- a/src/helpers/heritage-integration/order-helper.js +++ b/src/helpers/heritage-integration/order-helper.js @@ -57,15 +57,13 @@ export async function saveSession({ shouldAwaitSaveSessionQueue = false, submitAfterSave = false, createUnscheduledStatusWorkOrderForPIA = false, - bailoutCode = null, }) { // Add next save session to end of queue const saveSessionPromise = flushSaveSessionQueue().then(() => { return saveSessionHelper( pageNameToLog, submitAfterSave, - createUnscheduledStatusWorkOrderForPIA, - bailoutCode + createUnscheduledStatusWorkOrderForPIA ); }); @@ -108,12 +106,11 @@ export async function saveQuote({ pageNameToLog }) { return; } -export async function submitBailout({ pageNameToLog, bailoutCode }) { +export async function submitBailout({ pageNameToLog }) { await saveSession({ pageNameToLog: pageNameToLog, shouldAwaitSaveSessionQueue: true, submitAfterSave: false, - bailoutCode: bailoutCode, }); } @@ -158,15 +155,13 @@ async function loadSession( async function saveSessionHelper( pageNameToLog, submitAfterSave = false, - createUnscheduledStatusWorkOrderForPIA = false, - bailoutCode = null + createUnscheduledStatusWorkOrderForPIA = false ) { const savedSessionInfo = await baseMixin.methods.dispatchStoreActionWithLogging( storeActions.SAVE_SESSION, { submitAfterSave: submitAfterSave, createUnscheduledStatusWorkOrderForPIA: createUnscheduledStatusWorkOrderForPIA, - bailoutCode: bailoutCode, }, pageNameToLog ); diff --git a/src/layouts/bailout-success/bailout-success.spec.js b/src/layouts/bailout-success/bailout-success.spec.js new file mode 100644 index 000000000..5d5f73f14 --- /dev/null +++ b/src/layouts/bailout-success/bailout-success.spec.js @@ -0,0 +1,56 @@ +// Components +import bailoutSuccess from "@/layouts/bailout-success/bailout-success.vue"; + +// Supporting Files +import { shallowMount } from "@vue/test-utils"; +import { getMountOptions } from "@/helpers/unit-test-helper.js"; + +// Mock our module for promises. +jest.mock("@/helpers/layout-helper.js", () => ({ + settleAllPromises: jest.fn(), +})); + +// Mock fetchCmsContentForPage +jest.mock("@/helpers/cms-content-helper", () => ({ + fetchCmsContentForPage: jest.fn(), +})); + +describe("bailout-success.vue", () => { + test("renders funnelHeader component", () => { + const { wrapper } = setupMocks(); + expect(wrapper.findComponent({ name: "funnelHeader" }).exists()).toBe(true); + }); + + test("renders funnelSubHeader component", () => { + const { wrapper } = setupMocks(); + expect(wrapper.findComponent({ name: "funnelSubHeader" }).exists()).toBe(true); + }); + + test("renders Form component", () => { + const { wrapper } = setupMocks(); + expect(wrapper.findComponent({ name: "Form" }).exists()).toBe(true); + }); + + test("renders buttonMain component", () => { + const { wrapper } = setupMocks(); + expect(wrapper.findComponent({ name: "buttonMain" }).exists()).toBe(true); + }); +}); + +function setupMocks() { + const mountOptions = getMountOptions({}); + + //Mock props + const mockMixin = { + methods: { + getCmsContent: jest.fn(), + }, + }; + + mountOptions.mixins = [mockMixin]; + const wrapper = shallowMount(bailoutSuccess, mountOptions); + + wrapper.vm.setCmsContent = jest.fn(); + + return { wrapper }; +} diff --git a/src/layouts/bailout-success/bailout-success.vue b/src/layouts/bailout-success/bailout-success.vue index 73bbadfbb..97f186ca6 100644 --- a/src/layouts/bailout-success/bailout-success.vue +++ b/src/layouts/bailout-success/bailout-success.vue @@ -22,7 +22,7 @@ + + diff --git a/src/layouts/coverage-statement/customer-instructions/customer-instructions.vue b/src/layouts/coverage-statement/customer-instructions/customer-instructions.vue new file mode 100644 index 000000000..d036e2ead --- /dev/null +++ b/src/layouts/coverage-statement/customer-instructions/customer-instructions.vue @@ -0,0 +1,82 @@ + + + + + diff --git a/src/layouts/coverage-statement/price-display/price-display.vue b/src/layouts/coverage-statement/price-display/price-display.vue new file mode 100644 index 000000000..23d0ca3f2 --- /dev/null +++ b/src/layouts/coverage-statement/price-display/price-display.vue @@ -0,0 +1,53 @@ + + + + + From f72ca0de31156c35a6c0245e280a4d886e61fc43 Mon Sep 17 00:00:00 2001 From: Chloe Herd Date: Mon, 18 May 2026 11:02:17 -0400 Subject: [PATCH 20/28] Remove comment --- src/layouts/coverage-statement/coverage-statement.vue | 1 - 1 file changed, 1 deletion(-) diff --git a/src/layouts/coverage-statement/coverage-statement.vue b/src/layouts/coverage-statement/coverage-statement.vue index b295273f4..8d12cf264 100644 --- a/src/layouts/coverage-statement/coverage-statement.vue +++ b/src/layouts/coverage-statement/coverage-statement.vue @@ -4,7 +4,6 @@
-
Date: Tue, 19 May 2026 09:32:14 -0400 Subject: [PATCH 21/28] Test fix --- .../coverage-statement.spec.js | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/src/layouts/coverage-statement/coverage-statement.spec.js b/src/layouts/coverage-statement/coverage-statement.spec.js index 2d4fd3f8d..a54591f34 100644 --- a/src/layouts/coverage-statement/coverage-statement.spec.js +++ b/src/layouts/coverage-statement/coverage-statement.spec.js @@ -62,6 +62,28 @@ function setupMocks() { navigateWithSaving: jest.fn(), navigateWithoutSaving: jest.fn(), }, + store: { + getters: { + order: { + policy: { + currentDeductible: 1000, + }, + lineItems: { + glassParts: [], + promos: [], + supportingItems: [], + vaps: [], + }, + }, + }, + }, + mixins: [ + { + methods: { + getTotalPriceOfAllLineItemsAndChildParts: jest.fn().mockReturnValue(250), + }, + }, + ], }); const wrapper = shallowMount(coverageStatement, mountOptions); From 68de0ecbda85cbaeeb5039f44e2e3b07a172e856 Mon Sep 17 00:00:00 2001 From: credelinghuys Date: Tue, 19 May 2026 12:59:42 -0400 Subject: [PATCH 22/28] CASH-2563: Discconnect bailout logic for release --- src/store/index.js | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/store/index.js b/src/store/index.js index 5b7449c4b..9fe220fcc 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -1949,21 +1949,21 @@ export const actions = { pageNameToLog: pageNameToLog, }) .catch((error) => { - if (error.status == 500) { - return { PartsNotFound: true }; - } + // if (error.status == 500) { + // return { PartsNotFound: true }; + // } }); // Triggers bailout - if (response.PartsNotFound) { - return response; - } + // if (response.PartsNotFound) { + // return response; + // } // Check if we only have MISC parts to trigger bailout - const miscPartsResponse = checkIfMiscParts(response.data.partsOrQuestions); - if (miscPartsResponse.PartsNotFound) { - return miscPartsResponse; - } + // const miscPartsResponse = checkIfMiscParts(response.data.partsOrQuestions); + // if (miscPartsResponse.PartsNotFound) { + // return miscPartsResponse; + // } // Flatten location and name properties response.data.partsOrQuestions = convertGlassPieceNamingFromApi( From 5fdaa18fc5aafeac35f62f3942df0771405fa3ca Mon Sep 17 00:00:00 2001 From: credelinghuys Date: Tue, 19 May 2026 13:35:09 -0400 Subject: [PATCH 23/28] CASH-2563: Reapply bailout --- src/store/index.js | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/store/index.js b/src/store/index.js index 9fe220fcc..5b7449c4b 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -1949,21 +1949,21 @@ export const actions = { pageNameToLog: pageNameToLog, }) .catch((error) => { - // if (error.status == 500) { - // return { PartsNotFound: true }; - // } + if (error.status == 500) { + return { PartsNotFound: true }; + } }); // Triggers bailout - // if (response.PartsNotFound) { - // return response; - // } + if (response.PartsNotFound) { + return response; + } // Check if we only have MISC parts to trigger bailout - // const miscPartsResponse = checkIfMiscParts(response.data.partsOrQuestions); - // if (miscPartsResponse.PartsNotFound) { - // return miscPartsResponse; - // } + const miscPartsResponse = checkIfMiscParts(response.data.partsOrQuestions); + if (miscPartsResponse.PartsNotFound) { + return miscPartsResponse; + } // Flatten location and name properties response.data.partsOrQuestions = convertGlassPieceNamingFromApi( From be4d675d2ec278cf589af161e5834aedc19247ac Mon Sep 17 00:00:00 2001 From: credelinghuys Date: Thu, 21 May 2026 08:31:49 -0400 Subject: [PATCH 24/28] CASH-2737: Dynamic copyright year --- src/fmg-components/funnel-footer/funnel-footer.vue | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/fmg-components/funnel-footer/funnel-footer.vue b/src/fmg-components/funnel-footer/funnel-footer.vue index 5d8d0cd80..45cac1bbd 100644 --- a/src/fmg-components/funnel-footer/funnel-footer.vue +++ b/src/fmg-components/funnel-footer/funnel-footer.vue @@ -28,7 +28,7 @@ href="https://www.safelite.com/ccpa-privacy-policy" target="_blank" />
-

© 2025 Safelite Group

+

© {{ currentYear }} Safelite Group

@@ -40,6 +40,11 @@ export default { components: { textLink, }, + computed: { + currentYear() { + return new Date().getFullYear(); + }, + }, }; From 4aaafd5bde9aae54addaa54febde4f31ccb7a764 Mon Sep 17 00:00:00 2001 From: Chloe Herd Date: Thu, 21 May 2026 11:50:14 -0400 Subject: [PATCH 25/28] Fix null content bug --- .../customer-instructions/customer-instructions.vue | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/layouts/coverage-statement/customer-instructions/customer-instructions.vue b/src/layouts/coverage-statement/customer-instructions/customer-instructions.vue index d036e2ead..c584c0c19 100644 --- a/src/layouts/coverage-statement/customer-instructions/customer-instructions.vue +++ b/src/layouts/coverage-statement/customer-instructions/customer-instructions.vue @@ -60,6 +60,10 @@ export default { instructionBlocks() { const answers = this.getCmsContent(this.cmsWidgetName, "Answers"); + if (!answers) { + return []; + } + const instructionBlocksRaw = answers.map((ans) => ans.Text); const instructionBlocksAsTokens = instructionBlocksRaw.map((raw) => From 88ea25b815548a166e2da852832fcc1e4526e7ff Mon Sep 17 00:00:00 2001 From: Chloe Herd Date: Thu, 21 May 2026 11:50:28 -0400 Subject: [PATCH 26/28] Add nocomp scenario --- .../coverage-statement/coverage-statement.vue | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/layouts/coverage-statement/coverage-statement.vue b/src/layouts/coverage-statement/coverage-statement.vue index 8d12cf264..4cee926f1 100644 --- a/src/layouts/coverage-statement/coverage-statement.vue +++ b/src/layouts/coverage-statement/coverage-statement.vue @@ -35,6 +35,18 @@
+
+ + + + + +
Date: Thu, 21 May 2026 12:43:03 -0400 Subject: [PATCH 27/28] formatting --- src/layouts/coverage-statement/coverage-statement.vue | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/layouts/coverage-statement/coverage-statement.vue b/src/layouts/coverage-statement/coverage-statement.vue index 4cee926f1..81e2657bc 100644 --- a/src/layouts/coverage-statement/coverage-statement.vue +++ b/src/layouts/coverage-statement/coverage-statement.vue @@ -42,7 +42,10 @@ alignLeft /> - + From 4de0ce5d6269a002417dc7006b7d3e45bc6e8227 Mon Sep 17 00:00:00 2001 From: credelinghuys Date: Fri, 22 May 2026 11:56:50 -0400 Subject: [PATCH 28/28] CASH-2747: New bailout code for part not found --- src/constants/bailout-codes.js | 2 +- src/layouts/bailout/bailout.vue | 2 +- src/mixins/bailout-mixin.spec.js | 8 ++++---- src/mixins/vin-pages-mixin.js | 4 ++-- src/store/index.js | 20 ++++++++++---------- 5 files changed, 18 insertions(+), 18 deletions(-) diff --git a/src/constants/bailout-codes.js b/src/constants/bailout-codes.js index af6290363..e74791a5f 100644 --- a/src/constants/bailout-codes.js +++ b/src/constants/bailout-codes.js @@ -1,5 +1,5 @@ const bailoutCodes = { - PARTS_NOT_FOUND: 10, + PART_NOT_FOUND: 18, }; export { bailoutCodes }; diff --git a/src/layouts/bailout/bailout.vue b/src/layouts/bailout/bailout.vue index 7c5edf07c..12cca1b92 100644 --- a/src/layouts/bailout/bailout.vue +++ b/src/layouts/bailout/bailout.vue @@ -251,7 +251,7 @@ export default { computed: { getSubHeaderWidget() { switch (this.bailoutCode) { - case bailoutCodes.PARTS_NOT_FOUND: + case bailoutCodes.PART_NOT_FOUND: return "PartsNotFoundSubHeaderWidget"; default: return "FunnelSubHeaderWidget"; diff --git a/src/mixins/bailout-mixin.spec.js b/src/mixins/bailout-mixin.spec.js index c213de767..9571c6f26 100644 --- a/src/mixins/bailout-mixin.spec.js +++ b/src/mixins/bailout-mixin.spec.js @@ -7,7 +7,7 @@ describe("bailout-mixin.js", () => { test("navigateToBailoutPage: dispatches SAVE_BAILOUT_CODE action with bailout code", async () => { // Arrange const mockVm = createMockVm(); - const bailoutCode = bailoutCodes.PARTS_NOT_FOUND; + const bailoutCode = bailoutCodes.PART_NOT_FOUND; // Act await bailoutMixin.methods.navigateToBailoutPage(mockVm, bailoutCode); @@ -22,7 +22,7 @@ describe("bailout-mixin.js", () => { test("navigateToBailoutPage: navigates to bailout page after saving bailout code", async () => { // Arrange const mockVm = createMockVm(); - const bailoutCode = bailoutCodes.PARTS_NOT_FOUND; + const bailoutCode = bailoutCodes.PART_NOT_FOUND; // Act await bailoutMixin.methods.navigateToBailoutPage(mockVm, bailoutCode); @@ -46,7 +46,7 @@ describe("bailout-mixin.js", () => { pageName: "test-page", }; - const bailoutCode = bailoutCodes.PARTS_NOT_FOUND; + const bailoutCode = bailoutCodes.PART_NOT_FOUND; // Act await bailoutMixin.methods.navigateToBailoutPage.call(mockThis, undefined, bailoutCode); @@ -78,7 +78,7 @@ describe("bailout-mixin.js", () => { const mockVm = createMockVm(); const mockPageName = "vehicle-damage"; mockVm.pageName = mockPageName; - const bailoutCode = bailoutCodes.PARTS_NOT_FOUND; + const bailoutCode = bailoutCodes.PART_NOT_FOUND; // Act await bailoutMixin.methods.navigateToBailoutPage(mockVm, bailoutCode); diff --git a/src/mixins/vin-pages-mixin.js b/src/mixins/vin-pages-mixin.js index 2309cbde5..c593d88b4 100644 --- a/src/mixins/vin-pages-mixin.js +++ b/src/mixins/vin-pages-mixin.js @@ -37,8 +37,8 @@ export default { pageNameToLog: pageName, }); - if (result.PartsNotFound) { - bailoutMixin.methods.navigateToBailoutPage(this, bailoutCodes.PARTS_NOT_FOUND); + if (result.PartNotFound) { + bailoutMixin.methods.navigateToBailoutPage(this, bailoutCodes.PART_NOT_FOUND); } const partsOrQuestions = result.data.partsOrQuestions; diff --git a/src/store/index.js b/src/store/index.js index 5b7449c4b..63c759051 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -1949,21 +1949,21 @@ export const actions = { pageNameToLog: pageNameToLog, }) .catch((error) => { - if (error.status == 500) { - return { PartsNotFound: true }; - } + // if (error.status == 500) { + // return { PartNotFound: true }; + // } }); // Triggers bailout - if (response.PartsNotFound) { - return response; - } + // if (response.PartNotFound) { + // return response; + // } // Check if we only have MISC parts to trigger bailout - const miscPartsResponse = checkIfMiscParts(response.data.partsOrQuestions); - if (miscPartsResponse.PartsNotFound) { - return miscPartsResponse; - } + // const miscPartsResponse = checkIfMiscParts(response.data.partsOrQuestions); + // if (miscPartsResponse.PartNotFound) { + // return miscPartsResponse; + // } // Flatten location and name properties response.data.partsOrQuestions = convertGlassPieceNamingFromApi(