From e0672a91d70fb3e9dc8dcc6c2d883b8e47808dea Mon Sep 17 00:00:00 2001 From: credelinghuys Date: Fri, 1 May 2026 15:50:29 -0400 Subject: [PATCH 01/26] 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 8671d74913b2dfe6de252a396fef5951ac6c3477 Mon Sep 17 00:00:00 2001 From: credelinghuys Date: Tue, 12 May 2026 11:00:45 -0400 Subject: [PATCH 02/26] CASH-2563: Add bailout to more pages. Only show zip input if we don't have one. --- src/layouts/bailout/bailout.vue | 2 ++ src/router/constants/routing-table.js | 8 ++++++++ 2 files changed, 10 insertions(+) diff --git a/src/layouts/bailout/bailout.vue b/src/layouts/bailout/bailout.vue index ae5600e08..79299b713 100644 --- a/src/layouts/bailout/bailout.vue +++ b/src/layouts/bailout/bailout.vue @@ -43,6 +43,8 @@ validationRules="phone-number-required" /> Date: Tue, 12 May 2026 15:19:25 -0400 Subject: [PATCH 03/26] Fix insurance big truck test --- playwright-tests/tests/0000__M.test.ts | 2 +- playwright-tests/tests/InsuranceBigTruckVerified.ts | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/playwright-tests/tests/0000__M.test.ts b/playwright-tests/tests/0000__M.test.ts index 79cfc89f8..987bd542a 100644 --- a/playwright-tests/tests/0000__M.test.ts +++ b/playwright-tests/tests/0000__M.test.ts @@ -95,7 +95,7 @@ const allStandardTests = [ // { name: "InsuranceUSAAMsr", tests: insuranceUSAAMsrTests }, { name: "InsuranceITAC21stCentury", tests: insuranceITAC21stCenturyTests }, { name: "InsuranceNoCompProgressive", tests: insuranceNoCompProgressiveTests }, - // {name: "InsuranceBigTruckVerified", tests: insuranceBigTruckVerifiedTests}, + {name: "InsuranceBigTruckVerified", tests: insuranceBigTruckVerifiedTests}, { name: "InsuranceOEMAllstate", tests: insuranceOEMAllstateTests }, { name: "InsuranceUnverified", tests: insuranceUnverifiedTests }, // {name: "InsuranceGeico", tests: insuranceGeicoTests}, diff --git a/playwright-tests/tests/InsuranceBigTruckVerified.ts b/playwright-tests/tests/InsuranceBigTruckVerified.ts index 3e616230e..232111b64 100644 --- a/playwright-tests/tests/InsuranceBigTruckVerified.ts +++ b/playwright-tests/tests/InsuranceBigTruckVerified.ts @@ -1,6 +1,6 @@ //Imports here import { ITestData, getDefaultExperimentsData } from 'framework/TestData' -import { ServiceLocation, DamageType, PaymentType, PartQuestionType } from 'safelite-playwright-core'; +import { ServiceLocation, DamageType, Flow} from 'safelite-playwright-core'; import { ITestCase } from '../framework/Typedefs' import { PaymentMethod } from "framework/localTypes/Enums"; import { VehicleLookupType } from 'safelite-playwright-core'; @@ -19,6 +19,8 @@ const insuranceBigTruckVerifiedData: Partial = { // Insurance claim flags isDuplicateClaim: true, isPolicyFound: true, + flow: Flow.Managed, + isCanNotRecal: true, isUseVehicleOnPolicy: true, isHeavyTruck: true, @@ -62,7 +64,7 @@ const insuranceBigTruckVerifiedData: Partial = { // Override for in-shop appointment appointmentDetails: { serviceLocation: ServiceLocation.InShop, - shopAddress: '5719 Brandt Pike, Dayton, OH 45424', + shopAddress: '3455 Centerpoint Dr, Urbancrest, OH 43123', appointmentDate: getDefaultTestData().appointmentDetails?.appointmentDate }, From 7ef067f1d3ac2954b1a55388565b4dee0313abc7 Mon Sep 17 00:00:00 2001 From: JennyNou Date: Tue, 12 May 2026 15:57:58 -0400 Subject: [PATCH 04/26] Add bailout page test for parts not found scenario --- playwright-tests/framework/TestPages.ts | 3 ++ playwright-tests/pages/BailoutPage.ts | 51 ++++++++++++++++++ playwright-tests/tests/0000__M.test.ts | 8 +++ .../tests/PartsNotFoundBailout.ts | 52 +++++++++++++++++++ 4 files changed, 114 insertions(+) create mode 100644 playwright-tests/pages/BailoutPage.ts create mode 100644 playwright-tests/tests/PartsNotFoundBailout.ts diff --git a/playwright-tests/framework/TestPages.ts b/playwright-tests/framework/TestPages.ts index bc98e44b5..7ec1b5da7 100644 --- a/playwright-tests/framework/TestPages.ts +++ b/playwright-tests/framework/TestPages.ts @@ -33,8 +33,10 @@ import { EndorsementsPage } from "../pages/EndorsementsPage" import { PolicyDriverPage } from "../pages/PolicyDriverPage" import { ServiceZipPage } from "../pages/ServiceZipPage" import { MobileDetailsPage } from "pages/MobileDetailsPage"; +import { BailoutPage } from '../pages/BailoutPage'; export interface ITestPages { + bailoutPage: BailoutPage, capabilityQuestionsPage: CapabilityQuestionsPage, ccPolicyInfoPage: CCPolicyInfoPage, contactDetailsPage: ContactDetailsPage, @@ -72,6 +74,7 @@ export interface ITestPages { export const createTestPages: TestPagesFactory = (page: Page) => { const pages: ITestPages = { + bailoutPage: new BailoutPage(page), capabilityQuestionsPage: new CapabilityQuestionsPage(page), ccPolicyInfoPage: new CCPolicyInfoPage(page), contactDetailsPage: new ContactDetailsPage(page), diff --git a/playwright-tests/pages/BailoutPage.ts b/playwright-tests/pages/BailoutPage.ts new file mode 100644 index 000000000..002464e9b --- /dev/null +++ b/playwright-tests/pages/BailoutPage.ts @@ -0,0 +1,51 @@ +import { type Locator, type Page, expect } from '@playwright/test'; +import { BasePage } from './BasePage'; +import { step } from 'framework/localTypes/Step'; +import { ICustomerDetails } from 'safelite-playwright-core'; +import { ITestData } from 'framework/TestData'; + +export class BailoutPage extends BasePage { + readonly page: Page; + readonly firstNameTextBox: Locator; + readonly lastNameTextBox: Locator; + readonly emailAddressTextBox: Locator; + readonly phoneNumberTextBox: Locator; + readonly textOptInBox: Locator; + + constructor(page: Page) { + super(page); + this.page = page; + + this.firstNameTextBox = this.page.getByRole('textbox', { name: 'First name' }); + this.lastNameTextBox = this.page.getByRole('textbox', { name: 'Last name' }); + this.emailAddressTextBox = this.page.getByRole('textbox', { name: 'Email address' }); + this.phoneNumberTextBox = this.page.getByRole('textbox', { name: 'Phone number' }); + this.textOptInBox = this.page.getByRole('checkbox', { name: 'Opt in to SMS' }); + } + + async fillOutBailoutForm(customerDetails: ICustomerDetails) { + await this.firstNameTextBox.fill(customerDetails!.firstName!); + await this.lastNameTextBox.fill(customerDetails!.lastName!); + await this.emailAddressTextBox.fill(customerDetails!.email!); + await this.phoneNumberTextBox.fill(customerDetails!.phoneNumber!); + } + + async checkTextMeUpdates(customerDetails: ICustomerDetails) { + await this.textOptInBox.check(); + } + + @step("BailoutPage >> Fill out bailout form: ") + async handleBailoutPage(testData: Partial) { + + const { customerDetails } = testData; + + await expect(this.page).toHaveURL(/bailout/); + await this.fillOutBailoutForm(customerDetails!); + + if (testData.isOptedInForTextMessages) { + await this.checkTextMeUpdates(customerDetails!); + } + + await this.nextPage(); + } +} diff --git a/playwright-tests/tests/0000__M.test.ts b/playwright-tests/tests/0000__M.test.ts index 987bd542a..ec6ad718d 100644 --- a/playwright-tests/tests/0000__M.test.ts +++ b/playwright-tests/tests/0000__M.test.ts @@ -41,6 +41,7 @@ import { getTestObject, TestCase, prepareTest, RuleEngine, TestInfo } from 'fram import { createTestPages } from "framework/TestPages"; import cashReplaceSwitchToInsuranceProgressiveNoCompTests from "./CashReplaceSwitchToInsuranceProgressiveNoComp"; import insuranceBigTruckVerifiedTests from "./InsuranceBigTruckVerified"; +import partsNotFoundBailoutTests from "./PartsNotFoundBailout"; import insuranceUnverifiedTests from "./InsuranceUnverified"; import CashReplaceSplitWindshieldTests from "./CashReplaceSplitWindshield"; import insuranceMeemicNearSchoolVerifiedTests from "./InsuranceMeemicNearSchoolVerified"; @@ -101,6 +102,7 @@ const allStandardTests = [ // {name: "InsuranceGeico", tests: insuranceGeicoTests}, // {name: "InsuranceITACOptimizedPriceValidationAllState", tests: insuranceITACOptimizedPriceValidationAllStateTests} { name: "InsuranceMeemicNearSchoolVerified", tests: insuranceMeemicNearSchoolVerifiedTests }, + { name: "PartsNotFoundBailout", tests: partsNotFoundBailoutTests }, ]; @@ -275,6 +277,12 @@ async function runWorkflow(page: Page, testCase: TestCase) { await serviceZipPage.handleServiceZipPage(testCase.testData); } + // Handle bailout page if parts bailout scenario + if (testCase.testData.bailoutFlags?.isVehicleLookupBailout) { + let bailoutPage = testCase.pages.bailoutPage; + await bailoutPage.handleBailoutPage(testCase.testData); + } + // Handle part questions if applicable if (partQuestions && partQuestions.length > 0) { let partQuestionsPage = testCase.pages.partQuestionsPage; diff --git a/playwright-tests/tests/PartsNotFoundBailout.ts b/playwright-tests/tests/PartsNotFoundBailout.ts new file mode 100644 index 000000000..1ec10c36c --- /dev/null +++ b/playwright-tests/tests/PartsNotFoundBailout.ts @@ -0,0 +1,52 @@ +import { ITestData, getDefaultExperimentsData } from 'framework/TestData'; +import { VehicleDamage, VehicleLookupType } from 'safelite-playwright-core'; +import { ITestCase } from '../framework/Typedefs'; +import { getDefaultTestData, setFakerSeedFromTestName } from 'safelite-playwright-core'; + +setFakerSeedFromTestName("CashDiamondReoBailout"); + +const partsNotFoundBailoutTestData: Partial = { + ...getDefaultTestData(), + + isHeavyTruck: true, + + customerDetails: { + ...getDefaultTestData().customerDetails!, + address: { + ...getDefaultTestData().customerDetails!.address, + postalCode: '43085' + } + }, + + vehicleDetails: { + ...getDefaultTestData().vehicleDetails!, + year: '1974', + make: 'Diamond Reo', + model: 'CF65', + style: 'cabover', + vehicleLookupType: VehicleLookupType.Zip, + }, + + vehicleDamage: [ + VehicleDamage.WindshieldCrack + ], + + bailoutFlags: { + isVehicleLookupBailout: true + }, + + experiments: { + ...getDefaultExperimentsData() + } +}; + +const partsNotFoundBailoutTests: ITestCase[] = []; + +const tc = { + name: `PartsNotFoundBailout`, + tags: ['@E2E', '@PartsNotFoundBailout', '@test_report', '@Bailout'], + testData: partsNotFoundBailoutTestData +}; +partsNotFoundBailoutTests.push(tc); + +export default partsNotFoundBailoutTests; From d73ce9ff85604833f9316f49803f8b3e60603210 Mon Sep 17 00:00:00 2001 From: JennyNou Date: Tue, 12 May 2026 18:22:23 -0400 Subject: [PATCH 05/26] Add bailout success page --- playwright-tests/framework/TestPages.ts | 3 ++ playwright-tests/pages/BailoutSuccessPage.ts | 34 ++++++++++++++++++++ 2 files changed, 37 insertions(+) create mode 100644 playwright-tests/pages/BailoutSuccessPage.ts diff --git a/playwright-tests/framework/TestPages.ts b/playwright-tests/framework/TestPages.ts index 7ec1b5da7..39c2832f9 100644 --- a/playwright-tests/framework/TestPages.ts +++ b/playwright-tests/framework/TestPages.ts @@ -34,9 +34,11 @@ import { PolicyDriverPage } from "../pages/PolicyDriverPage" import { ServiceZipPage } from "../pages/ServiceZipPage" import { MobileDetailsPage } from "pages/MobileDetailsPage"; import { BailoutPage } from '../pages/BailoutPage'; +import { BailoutSuccessPage } from '../pages/BailoutSuccessPage'; export interface ITestPages { bailoutPage: BailoutPage, + bailoutSuccessPage: BailoutSuccessPage, capabilityQuestionsPage: CapabilityQuestionsPage, ccPolicyInfoPage: CCPolicyInfoPage, contactDetailsPage: ContactDetailsPage, @@ -75,6 +77,7 @@ export interface ITestPages { export const createTestPages: TestPagesFactory = (page: Page) => { const pages: ITestPages = { bailoutPage: new BailoutPage(page), + bailoutSuccessPage: new BailoutSuccessPage(page), capabilityQuestionsPage: new CapabilityQuestionsPage(page), ccPolicyInfoPage: new CCPolicyInfoPage(page), contactDetailsPage: new ContactDetailsPage(page), diff --git a/playwright-tests/pages/BailoutSuccessPage.ts b/playwright-tests/pages/BailoutSuccessPage.ts new file mode 100644 index 000000000..6a82d9da6 --- /dev/null +++ b/playwright-tests/pages/BailoutSuccessPage.ts @@ -0,0 +1,34 @@ +import { type Locator, type Page, expect } from '@playwright/test'; +import { BasePage } from './BasePage'; +import { TestSuccessAlert } from 'safelite-playwright-core'; +import { step } from 'framework/localTypes/Step'; + +export class BailoutSuccessPage extends BasePage { + readonly thankYouHeading: Locator; + readonly bodyText: Locator; + readonly returnToHomepageButton: Locator; + + constructor(page: Page) { + super(page); + this.thankYouHeading = page.getByText("Thanks! We'll get back to you soon"); + this.bodyText = page.getByText(/We've got it from here!/); + this.returnToHomepageButton = page.locator('#btn-vehicle-not-listed'); + } + + async validateBailoutSuccessPage() { + await expect(this.page).toHaveURL(/bailout-success/); + await expect(this.thankYouHeading).toBeVisible(); + await expect(this.bodyText).toBeVisible(); + await expect(this.bodyText).toHaveText( + /We've got it from here! One of our experts will be in touch to schedule your appointment\. If you have any questions, please contact 1-888-238-4527/ + ); + await expect(this.returnToHomepageButton).toBeVisible(); + } + + @step("BailoutSuccessPage >> Validate bailout success page and return to vehicle page") + async handleBailoutSuccessPage() { + await this.validateBailoutSuccessPage(); + await this.returnToHomepageButton.click(); + await expect(this.page).toHaveURL(/vehicle/); + } +} From 22e6c2623302bac22d555ecf0fb2cf32b8f7aee0 Mon Sep 17 00:00:00 2001 From: JennyNou Date: Tue, 12 May 2026 18:22:58 -0400 Subject: [PATCH 06/26] Update bailout test step to include bailout success page --- playwright-tests/tests/0000__M.test.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/playwright-tests/tests/0000__M.test.ts b/playwright-tests/tests/0000__M.test.ts index ec6ad718d..bf9add83c 100644 --- a/playwright-tests/tests/0000__M.test.ts +++ b/playwright-tests/tests/0000__M.test.ts @@ -281,6 +281,9 @@ async function runWorkflow(page: Page, testCase: TestCase) { if (testCase.testData.bailoutFlags?.isVehicleLookupBailout) { let bailoutPage = testCase.pages.bailoutPage; await bailoutPage.handleBailoutPage(testCase.testData); + let bailoutSuccessPage = testCase.pages.bailoutSuccessPage; + await bailoutSuccessPage.handleBailoutSuccessPage(); + return; } // Handle part questions if applicable From 0b2c293f421840778b469357c98c352f05d378a2 Mon Sep 17 00:00:00 2001 From: kpatel8hs4io <31411746+kpatel8hs4io@users.noreply.github.com> Date: Tue, 12 May 2026 21:52:52 -0400 Subject: [PATCH 07/26] Minor changes --- playwright-tests/pages/BailoutSuccessPage.ts | 1 + playwright-tests/tests/0000__M.test.ts | 8 +++----- ...kVerified.ts => InsuranceUSAABigTruckVerified.ts} | 12 ++++++------ 3 files changed, 10 insertions(+), 11 deletions(-) rename playwright-tests/tests/{InsuranceBigTruckVerified.ts => InsuranceUSAABigTruckVerified.ts} (89%) diff --git a/playwright-tests/pages/BailoutSuccessPage.ts b/playwright-tests/pages/BailoutSuccessPage.ts index 6a82d9da6..603172bd3 100644 --- a/playwright-tests/pages/BailoutSuccessPage.ts +++ b/playwright-tests/pages/BailoutSuccessPage.ts @@ -30,5 +30,6 @@ export class BailoutSuccessPage extends BasePage { await this.validateBailoutSuccessPage(); await this.returnToHomepageButton.click(); await expect(this.page).toHaveURL(/vehicle/); + throw new TestSuccessAlert('Parts not found bailout validated successfully.'); } } diff --git a/playwright-tests/tests/0000__M.test.ts b/playwright-tests/tests/0000__M.test.ts index bf9add83c..fbeccd97d 100644 --- a/playwright-tests/tests/0000__M.test.ts +++ b/playwright-tests/tests/0000__M.test.ts @@ -40,7 +40,7 @@ import cashReplaceMultiGlassMobileTests from "./CashReplaceMultiGlassMobile"; import { getTestObject, TestCase, prepareTest, RuleEngine, TestInfo } from 'framework/Typedefs'; import { createTestPages } from "framework/TestPages"; import cashReplaceSwitchToInsuranceProgressiveNoCompTests from "./CashReplaceSwitchToInsuranceProgressiveNoComp"; -import insuranceBigTruckVerifiedTests from "./InsuranceBigTruckVerified"; +import insuranceUSAABigTruckVerifiedTests from "./InsuranceUSAABigTruckVerified"; import partsNotFoundBailoutTests from "./PartsNotFoundBailout"; import insuranceUnverifiedTests from "./InsuranceUnverified"; import CashReplaceSplitWindshieldTests from "./CashReplaceSplitWindshield"; @@ -96,14 +96,13 @@ const allStandardTests = [ // { name: "InsuranceUSAAMsr", tests: insuranceUSAAMsrTests }, { name: "InsuranceITAC21stCentury", tests: insuranceITAC21stCenturyTests }, { name: "InsuranceNoCompProgressive", tests: insuranceNoCompProgressiveTests }, - {name: "InsuranceBigTruckVerified", tests: insuranceBigTruckVerifiedTests}, + {name: "InsuranceUSAABigTruckVerified", tests: insuranceUSAABigTruckVerifiedTests}, { name: "InsuranceOEMAllstate", tests: insuranceOEMAllstateTests }, { name: "InsuranceUnverified", tests: insuranceUnverifiedTests }, // {name: "InsuranceGeico", tests: insuranceGeicoTests}, // {name: "InsuranceITACOptimizedPriceValidationAllState", tests: insuranceITACOptimizedPriceValidationAllStateTests} { name: "InsuranceMeemicNearSchoolVerified", tests: insuranceMeemicNearSchoolVerifiedTests }, - { name: "PartsNotFoundBailout", tests: partsNotFoundBailoutTests }, - + // { name: "PartsNotFoundBailout", tests: partsNotFoundBailoutTests }, // code is not available in QA ]; // Alert validation scenarios @@ -283,7 +282,6 @@ async function runWorkflow(page: Page, testCase: TestCase) { await bailoutPage.handleBailoutPage(testCase.testData); let bailoutSuccessPage = testCase.pages.bailoutSuccessPage; await bailoutSuccessPage.handleBailoutSuccessPage(); - return; } // Handle part questions if applicable diff --git a/playwright-tests/tests/InsuranceBigTruckVerified.ts b/playwright-tests/tests/InsuranceUSAABigTruckVerified.ts similarity index 89% rename from playwright-tests/tests/InsuranceBigTruckVerified.ts rename to playwright-tests/tests/InsuranceUSAABigTruckVerified.ts index 232111b64..f27035cbe 100644 --- a/playwright-tests/tests/InsuranceBigTruckVerified.ts +++ b/playwright-tests/tests/InsuranceUSAABigTruckVerified.ts @@ -7,10 +7,10 @@ import { VehicleLookupType } from 'safelite-playwright-core'; import { getDefaultTestData, setFakerSeedFromTestName } from 'safelite-playwright-core'; // Set the seed based on test name for consistent but unique data -setFakerSeedFromTestName("InsuranceBigTruckVerified"); +setFakerSeedFromTestName("InsuranceUSAABigTruckVerified"); // Now get the test data with the seeded faker -const insuranceBigTruckVerifiedData: Partial = { +const insuranceUSAABigTruckVerifiedData: Partial = { ...getDefaultTestData(), // Get default data with current seed // Key feature: Insurance flow with GEICO @@ -77,13 +77,13 @@ const insuranceBigTruckVerifiedData: Partial = { } } -const insuranceBigTruckVerifiedTests: ITestCase[] = []; +const insuranceUSAABigTruckVerifiedTests: ITestCase[] = []; const tc = { name: `InsuranceBigTruckVerified`, tags: ['@E2E','@InsuranceBigTruckVerified', '@test_report', '@Insurance'], - testData: insuranceBigTruckVerifiedData + testData: insuranceUSAABigTruckVerifiedData }; -insuranceBigTruckVerifiedTests.push(tc); +insuranceUSAABigTruckVerifiedTests.push(tc); -export default insuranceBigTruckVerifiedTests; \ No newline at end of file +export default insuranceUSAABigTruckVerifiedTests; \ No newline at end of file From 6826dcf4caebbca41d90cd8ec4fa4ee62434f11b Mon Sep 17 00:00:00 2001 From: JennyNou Date: Tue, 12 May 2026 22:02:52 -0400 Subject: [PATCH 08/26] Update name for sms opt in checkbox --- playwright-tests/pages/BailoutPage.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/playwright-tests/pages/BailoutPage.ts b/playwright-tests/pages/BailoutPage.ts index 002464e9b..5d8c54428 100644 --- a/playwright-tests/pages/BailoutPage.ts +++ b/playwright-tests/pages/BailoutPage.ts @@ -10,7 +10,7 @@ export class BailoutPage extends BasePage { readonly lastNameTextBox: Locator; readonly emailAddressTextBox: Locator; readonly phoneNumberTextBox: Locator; - readonly textOptInBox: Locator; + readonly optInToSMSBox: Locator; constructor(page: Page) { super(page); @@ -20,7 +20,7 @@ export class BailoutPage extends BasePage { this.lastNameTextBox = this.page.getByRole('textbox', { name: 'Last name' }); this.emailAddressTextBox = this.page.getByRole('textbox', { name: 'Email address' }); this.phoneNumberTextBox = this.page.getByRole('textbox', { name: 'Phone number' }); - this.textOptInBox = this.page.getByRole('checkbox', { name: 'Opt in to SMS' }); + this.optInToSMSBox = this.page.getByRole('checkbox', { name: 'Opt in to SMS' }); } async fillOutBailoutForm(customerDetails: ICustomerDetails) { @@ -30,8 +30,8 @@ export class BailoutPage extends BasePage { await this.phoneNumberTextBox.fill(customerDetails!.phoneNumber!); } - async checkTextMeUpdates(customerDetails: ICustomerDetails) { - await this.textOptInBox.check(); + async checkOptInToSMSBox() { + await this.optInToSMSBox.check(); } @step("BailoutPage >> Fill out bailout form: ") @@ -43,7 +43,7 @@ export class BailoutPage extends BasePage { await this.fillOutBailoutForm(customerDetails!); if (testData.isOptedInForTextMessages) { - await this.checkTextMeUpdates(customerDetails!); + await this.checkOptInToSMSBox(); } await this.nextPage(); From f9639b2d7a59f1fdf596a97f1ab7011772994329 Mon Sep 17 00:00:00 2001 From: kpatel8hs4io <31411746+kpatel8hs4io@users.noreply.github.com> Date: Tue, 12 May 2026 22:26:41 -0400 Subject: [PATCH 09/26] more changes --- playwright-tests/pages/SchedulePage.ts | 6 ++++++ playwright-tests/tests/InsuranceUSAABigTruckVerified.ts | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/playwright-tests/pages/SchedulePage.ts b/playwright-tests/pages/SchedulePage.ts index 088049693..8d863e94f 100644 --- a/playwright-tests/pages/SchedulePage.ts +++ b/playwright-tests/pages/SchedulePage.ts @@ -261,6 +261,12 @@ export class SchedulePage extends BasePage { await this.waitForPageOrComponentload(); await this.validateProgressBar(ProgressBarPercentages.SchedulePage); + //Looks like an issue with the insurance flow - remove comments once fixed + /*if (testData.isHeavyTruck) { + const vuexState = JSON.parse(await this.page.evaluate('localStorage.getItem(\'vuex\')')); + expect(vuexState.order.lineItems.supportingItems.find((item: any) => item && item.partNumber == "labor2")).toBeTruthy(); + }*/ + if (handleMobileFirstModal) { return await this.handleMobileFirstPopUp(testData); } diff --git a/playwright-tests/tests/InsuranceUSAABigTruckVerified.ts b/playwright-tests/tests/InsuranceUSAABigTruckVerified.ts index f27035cbe..74566a535 100644 --- a/playwright-tests/tests/InsuranceUSAABigTruckVerified.ts +++ b/playwright-tests/tests/InsuranceUSAABigTruckVerified.ts @@ -80,7 +80,7 @@ const insuranceUSAABigTruckVerifiedData: Partial = { const insuranceUSAABigTruckVerifiedTests: ITestCase[] = []; const tc = { - name: `InsuranceBigTruckVerified`, + name: `InsuranceUSAABigTruckVerified`, tags: ['@E2E','@InsuranceBigTruckVerified', '@test_report', '@Insurance'], testData: insuranceUSAABigTruckVerifiedData }; From c63fc7eff5169ed86f68a4ad6ed0bad9c039a86c Mon Sep 17 00:00:00 2001 From: credelinghuys Date: Wed, 13 May 2026 15:05:25 -0400 Subject: [PATCH 10/26] CASH-2563: Create submittedState and UI updates --- src/layouts/bailout-success/bailout-success.vue | 8 +++++++- src/router/methods/before-each.js | 6 +++++- src/router/methods/navigate.js | 12 ++++++++++-- 3 files changed, 22 insertions(+), 4 deletions(-) diff --git a/src/layouts/bailout-success/bailout-success.vue b/src/layouts/bailout-success/bailout-success.vue index 97f186ca6..57da702a0 100644 --- a/src/layouts/bailout-success/bailout-success.vue +++ b/src/layouts/bailout-success/bailout-success.vue @@ -13,7 +13,8 @@ id="btn-vehicle-not-listed" :isPrimary="true" :buttonText="ReturnToHomeButtonText" - class="mb-3" + loaderColor="white" + class="w-100 mb-3" @click-event="forwardButtonAction" /> @@ -27,6 +28,8 @@ import funnelHeader from "@/fmg-components/funnel-header/funnel-header"; import funnelSubHeader from "@/fmg-components/funnel-sub-header/funnel-sub-header"; import buttonMain from "@/ux-components/button-main/button-main"; import store from "@/store"; +import baseMixin from "@/mixins/base-mixin.js"; +import { storeActions } from "@/constants/store-actions"; import { fetchCmsContentForPage } from "@/helpers/cms-content-helper"; import { settleAllPromises } from "@/helpers/layout-helper"; @@ -39,6 +42,9 @@ export default { }, async beforeRouteEnter(to, from, next) { + // Clear order + await baseMixin.methods.dispatchStoreAction(storeActions.CREATE_SUBMITTED_STATE); + // Call APIs const cmsContentPromise = fetchCmsContentForPage(to.name); diff --git a/src/router/methods/before-each.js b/src/router/methods/before-each.js index 237014ee6..39cb2df47 100644 --- a/src/router/methods/before-each.js +++ b/src/router/methods/before-each.js @@ -77,7 +77,11 @@ export async function beforeEach(to, from) { // Block navigation if an order has been submitted. if (window.sessionStorage.getItem(sessionStorageKeyConstants.SUBMITTED_STATE) !== null) { - const exceptionPages = [FUNNEL_START_PAGE.name, routeData.CONFIRMATION.name]; + const exceptionPages = [ + FUNNEL_START_PAGE.name, + routeData.CONFIRMATION.name, + routeData.BAILOUT_SUCCESS.name, + ]; if (!exceptionPages.some((name) => to.name === name) && !isVirtualRoute(to.name)) { router.push({ diff --git a/src/router/methods/navigate.js b/src/router/methods/navigate.js index 1cdd87aac..63e20d96c 100644 --- a/src/router/methods/navigate.js +++ b/src/router/methods/navigate.js @@ -1,7 +1,8 @@ -import { saveSession } from "@/helpers/heritage-integration/order-helper"; +import { saveSession, submitBailout } from "@/helpers/heritage-integration/order-helper"; import { buildManualUrl } from "@/router/methods/helpers/build-manual-url"; import { getDestination } from "@/router/methods/helpers/get-destination"; import { savePageData } from "@/router/methods/helpers/save-page-data"; +import { navigationScenarios } from "@/router/constants/navigation-scenarios"; import router from "@/router"; import store from "@/store"; @@ -39,7 +40,14 @@ async function navigate(scenario, currentPageName, withSaving = false, forceTopL store.getters?.applicationUser?.savedSessionId || store.getters?.order?.customer?.emailAddress ) { - await saveSession({ pageNameToLog: nextPage.name }); + if ( + scenario.toUpperCase() === navigationScenarios.CLICKED_FORWARD && + currentPageName.toUpperCase() === navigationScenarios.BAILOUT + ) { + await submitBailout({ pageNameToLog: nextPage.name }); + } else { + await saveSession({ pageNameToLog: nextPage.name }); + } } } From 602591d65899dd7d8652099ff3d8a52ffabcb3ec Mon Sep 17 00:00:00 2001 From: credelinghuys Date: Thu, 14 May 2026 11:14:10 -0400 Subject: [PATCH 11/26] CASH-2563: Bailout page routing updates --- src/layouts/bailout/bailout.spec.js | 12 ++++++++++++ src/layouts/bailout/bailout.vue | 2 +- src/router/constants/routing-table.js | 3 ++- src/router/methods/before-each.js | 1 + 4 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/layouts/bailout/bailout.spec.js b/src/layouts/bailout/bailout.spec.js index 905f9e5a0..f71899e49 100644 --- a/src/layouts/bailout/bailout.spec.js +++ b/src/layouts/bailout/bailout.spec.js @@ -36,9 +36,21 @@ describe("bailout.vue", () => { expect(wrapper.findComponent({ name: "navbar" }).exists()).toBe(true); }); + test("arePagePrerequisitesValid should be false ", async () => { + //Arrange + const { wrapper } = setupMocks(); + + //Act + let arePagePrerequisitesValid = wrapper.vm.arePagePrerequisitesValid(); + + //Assert + expect(arePagePrerequisitesValid).toBe(false); + }); + test("arePagePrerequisitesValid should be true ", async () => { //Arrange const { wrapper } = setupMocks(); + wrapper.vm.getBailoutCodeFromStore = jest.fn().mockReturnValue("BAILOUT_CODE"); //Act let arePagePrerequisitesValid = wrapper.vm.arePagePrerequisitesValid(); diff --git a/src/layouts/bailout/bailout.vue b/src/layouts/bailout/bailout.vue index 79299b713..7c5edf07c 100644 --- a/src/layouts/bailout/bailout.vue +++ b/src/layouts/bailout/bailout.vue @@ -244,7 +244,7 @@ export default { } }, arePagePrerequisitesValid() { - return true; + return this.getBailoutCodeFromStore() !== null; }, }, diff --git a/src/router/constants/routing-table.js b/src/router/constants/routing-table.js index 3c1326610..af8cd41d7 100644 --- a/src/router/constants/routing-table.js +++ b/src/router/constants/routing-table.js @@ -1,5 +1,6 @@ import { routeData } from "@/router/constants/routes"; import { navigationScenarios } from "@/router/constants/navigation-scenarios"; +import { FUNNEL_START_PAGE } from "@/router/constants/routes"; import store from "@/store"; import { paymentMethods } from "@/constants/payment-method-constants"; @@ -828,7 +829,7 @@ const routingTable = function () { maps: [ { scenario: navigationScenarios.CLICKED_BACK_TO_HOMEPAGE, - destinationPageData: routeData.RESTART, + destinationPageData: FUNNEL_START_PAGE, }, ], }, diff --git a/src/router/methods/before-each.js b/src/router/methods/before-each.js index 39cb2df47..0c5fb17ae 100644 --- a/src/router/methods/before-each.js +++ b/src/router/methods/before-each.js @@ -80,6 +80,7 @@ export async function beforeEach(to, from) { const exceptionPages = [ FUNNEL_START_PAGE.name, routeData.CONFIRMATION.name, + routeData.BAILOUT.name, routeData.BAILOUT_SUCCESS.name, ]; From f9d39f5d197057c7abcce5c9d533357b9ebd466d Mon Sep 17 00:00:00 2001 From: credelinghuys Date: Thu, 14 May 2026 13:23:08 -0400 Subject: [PATCH 12/26] CASH-2563: Back navigation on bailout submit logic --- src/layouts/bailout-success/bailout-success.vue | 9 +++++---- src/router/methods/before-each.js | 16 +++++++++++----- 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/src/layouts/bailout-success/bailout-success.vue b/src/layouts/bailout-success/bailout-success.vue index 57da702a0..5def1ae22 100644 --- a/src/layouts/bailout-success/bailout-success.vue +++ b/src/layouts/bailout-success/bailout-success.vue @@ -73,10 +73,11 @@ export default { }, arePagePrerequisitesValid() { return ( - store.getters.order.customer.firstName && - store.getters.order.customer.lastName && - store.getters.order.customer.emailAddress && - store.getters.order.customer.phoneNumber + (store.getters.order.customer.firstName && + store.getters.order.customer.lastName && + store.getters.order.customer.emailAddress && + store.getters.order.customer.phoneNumber) || + baseMixin.methods.hasSubmittedOrder() ); }, }, diff --git a/src/router/methods/before-each.js b/src/router/methods/before-each.js index 0c5fb17ae..9388a0865 100644 --- a/src/router/methods/before-each.js +++ b/src/router/methods/before-each.js @@ -80,15 +80,21 @@ export async function beforeEach(to, from) { const exceptionPages = [ FUNNEL_START_PAGE.name, routeData.CONFIRMATION.name, - routeData.BAILOUT.name, routeData.BAILOUT_SUCCESS.name, ]; if (!exceptionPages.some((name) => to.name === name) && !isVirtualRoute(to.name)) { - router.push({ - name: routeData.CONFIRMATION.name, - }); - return false; + if (to.name === routeData.BAILOUT.name) { + router.push({ + name: routeData.BAILOUT_SUCCESS.name, + }); + return false; + } else { + router.push({ + name: routeData.CONFIRMATION.name, + }); + return false; + } } } From ddcd8e5cf4f2a793ad5ef5402f1643b5217a7778 Mon Sep 17 00:00:00 2001 From: credelinghuys Date: Fri, 15 May 2026 10:18:00 -0400 Subject: [PATCH 13/26] CASH-2563: Update bailout navigation blocking --- src/router/methods/before-each.js | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/src/router/methods/before-each.js b/src/router/methods/before-each.js index 9388a0865..568cf312c 100644 --- a/src/router/methods/before-each.js +++ b/src/router/methods/before-each.js @@ -76,15 +76,17 @@ export async function beforeEach(to, from) { } // Block navigation if an order has been submitted. - if (window.sessionStorage.getItem(sessionStorageKeyConstants.SUBMITTED_STATE) !== null) { - const exceptionPages = [ - FUNNEL_START_PAGE.name, - routeData.CONFIRMATION.name, - routeData.BAILOUT_SUCCESS.name, - ]; + const submittedState = window.sessionStorage.getItem( + sessionStorageKeyConstants.SUBMITTED_STATE + ); + if (submittedState !== null) { + const isBailout = getIsBailout(submittedState); + const exceptionPages = isBailout + ? [FUNNEL_START_PAGE.name, routeData.BAILOUT_SUCCESS.name] + : [FUNNEL_START_PAGE.name, routeData.CONFIRMATION.name]; if (!exceptionPages.some((name) => to.name === name) && !isVirtualRoute(to.name)) { - if (to.name === routeData.BAILOUT.name) { + if (isBailout) { router.push({ name: routeData.BAILOUT_SUCCESS.name, }); @@ -153,3 +155,8 @@ export async function beforeEach(to, from) { return; } } + +function getIsBailout(submittedState) { + const submittedStateObj = JSON.parse(submittedState); + return !!submittedStateObj?.applicationUser?.bailoutCode; +} From 9df05e80a1ead85c290fa79236fbb2dbd1232b9a Mon Sep 17 00:00:00 2001 From: Chloe Herd Date: Mon, 18 May 2026 10:52:17 -0400 Subject: [PATCH 14/26] Visual build of coverage-statement --- .../coverage-statement/coverage-statement.vue | 83 ++++++++++++++++++- .../customer-instructions.vue | 82 ++++++++++++++++++ .../price-display/price-display.vue | 53 ++++++++++++ 3 files changed, 214 insertions(+), 4 deletions(-) create mode 100644 src/layouts/coverage-statement/customer-instructions/customer-instructions.vue create mode 100644 src/layouts/coverage-statement/price-display/price-display.vue diff --git a/src/layouts/coverage-statement/coverage-statement.vue b/src/layouts/coverage-statement/coverage-statement.vue index 4e4dd4cc0..b295273f4 100644 --- a/src/layouts/coverage-statement/coverage-statement.vue +++ b/src/layouts/coverage-statement/coverage-statement.vue @@ -4,10 +4,42 @@
- - + +
+ + +
+
+ + + + + +
+
+ +
+ + +
+
+ + + 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 15/26] 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 16/26] 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 17/26] 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 18/26] 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 19/26] 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 20/26] 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 21/26] 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 22/26] 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 23/26] 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( From 87614ce1968c29dac83d0fd8a215940f54550c6f Mon Sep 17 00:00:00 2001 From: Carl Nation Date: Wed, 27 May 2026 08:36:36 -0400 Subject: [PATCH 24/26] prettier --- src/constants/insurance.js | 2 +- src/layouts/policy-info/policy-info.vue | 30 +++++++++++++++++-------- 2 files changed, 22 insertions(+), 10 deletions(-) diff --git a/src/constants/insurance.js b/src/constants/insurance.js index 13a0fa932..1439fafcb 100644 --- a/src/constants/insurance.js +++ b/src/constants/insurance.js @@ -89,4 +89,4 @@ export const NON_MANAGED_SHOW_CLAIM_NUMBER_PARENTS = [ export const PARENT_ACCOUNT_NUMBERS = { STATE_FARM: "711310", USAA: "900040", -}; \ No newline at end of file +}; diff --git a/src/layouts/policy-info/policy-info.vue b/src/layouts/policy-info/policy-info.vue index 952af03e4..0918a7536 100644 --- a/src/layouts/policy-info/policy-info.vue +++ b/src/layouts/policy-info/policy-info.vue @@ -8,7 +8,7 @@
- + - + - + + groupName="MorePolicyQuestionsQuestion" /> - +
@@ -284,10 +290,16 @@ export default { return this.clientConfig?.ClientLogoWidget?.Image || ""; }, pageTitleText() { - return this.clientConfig?.PageTitleOverrideWidget?.Text || this.getCmsContent("PageTitleWidget", "Text"); + return ( + this.clientConfig?.PageTitleOverrideWidget?.Text || + this.getCmsContent("PageTitleWidget", "Text") + ); }, pageInstructionsText() { - return this.clientConfig?.PageInstructionsOverrideWidget?.Text || this.getCmsContent("PageInstructionsWidget", "Text"); + return ( + this.clientConfig?.PageInstructionsOverrideWidget?.Text || + this.getCmsContent("PageInstructionsWidget", "Text") + ); }, isUSAA() { return ( @@ -341,7 +353,7 @@ export default { for (const answer of answers) { options[answer.Name] = answer.Text; } - + return options; }, parsedClientConfig() { @@ -539,4 +551,4 @@ export default { color: $gray-600; line-height: 1.625; } - \ No newline at end of file + From 53091433d228eb3487fa672d242f8fec93748d6a Mon Sep 17 00:00:00 2001 From: Minojhini Valaiyapathi Date: Wed, 27 May 2026 08:39:37 -0400 Subject: [PATCH 25/26] CASH-2755 - Add referralSequenceNumber to the datalayer --- src/mixins/analytics-mixin.js | 7 +++++++ src/mixins/analytics-mixin.spec.js | 9 +++++++++ 2 files changed, 16 insertions(+) diff --git a/src/mixins/analytics-mixin.js b/src/mixins/analytics-mixin.js index 1ea812c49..433288266 100644 --- a/src/mixins/analytics-mixin.js +++ b/src/mixins/analytics-mixin.js @@ -398,6 +398,13 @@ export default { payload.orderNumber = ""; } + // Referral Sequence Number + if (order.referralSequenceNumber) { + payload.referralSequenceNumber = order.referralSequenceNumber; + } else { + payload.referralSequenceNumber = ""; + } + // Pricing // Only fire for completed orders? diff --git a/src/mixins/analytics-mixin.spec.js b/src/mixins/analytics-mixin.spec.js index 650403935..ee7c39e3c 100644 --- a/src/mixins/analytics-mixin.spec.js +++ b/src/mixins/analytics-mixin.spec.js @@ -423,6 +423,7 @@ describe("analyticsMixin.js", () => { }, workOrderNumber: "01820-111111", workOrderId: "222222222222", + referralSequenceNumber: "1234567", }; store.getters.isRecalibrationOnOrder = true; store.getters.isRecalibrationOnSubmittedState = false; @@ -667,6 +668,14 @@ describe("analyticsMixin.js", () => { expect(glassString).toMatch(/(\w+\/\w+)?(,\w+\/\w+)*/); expect(promoString).toMatch(/(\w+)?(,\w+)*/); }); + + test("Pushes referralSequenceNumber when present on order", () => { + window.dataLayer = []; + + analyticsMixin.methods.pushOrderToDataLayer(); + + expect(window.dataLayer[0].referralSequenceNumber).toBe("1234567"); + }); }); test("Obj is not null after action prepended", () => { From fa21469c32a4858ff8ef8f19455361444d4b8bc7 Mon Sep 17 00:00:00 2001 From: Carl Nation Date: Wed, 27 May 2026 09:09:23 -0400 Subject: [PATCH 26/26] CASH-2468 broken text fix CASH-2468 broken text fix --- src/layouts/policy-info/policy-info.spec.js | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/layouts/policy-info/policy-info.spec.js b/src/layouts/policy-info/policy-info.spec.js index b3251154a..74649d20b 100644 --- a/src/layouts/policy-info/policy-info.spec.js +++ b/src/layouts/policy-info/policy-info.spec.js @@ -55,6 +55,15 @@ function setupMocks() { fetchCmsContentForPage.mockResolvedValue(mockCmsContent); settleAllPromises.mockResolvedValue({ cmsContent: mockCmsContent }); + const mockMixin = { + methods: { + getCmsContent: jest.fn((widgetName, fieldName) => { + return mockCmsContent?.[widgetName]?.[fieldName] ?? ""; + }), + setCmsContent: jest.fn(), + }, + }; + const mountOptions = getMountOptions({ route: { name: "policy-info", query: {}, params: {} }, router: { @@ -62,6 +71,7 @@ function setupMocks() { navigateWithSaving: jest.fn(), navigateWithoutSaving: jest.fn(), }, + mixins: [mockMixin], }); const wrapper = shallowMount(policyInfo, mountOptions);