From c49228220dc049dc789a1edaadcf3248999f74e9 Mon Sep 17 00:00:00 2001 From: maguire-arman Date: Tue, 20 May 2025 10:42:49 -0400 Subject: [PATCH 01/63] Adds support for heavy truck insurance flow Adds a new test case for a big truck insurance flow. This includes updating the test data to include a flag for heavy trucks and the zip code. Renames `isHeavyTruckVehicle` to `isHeavyTruckVehicleAlert` for clarity. --- .../business-logic/types/IAlertFlags.ts | 2 +- .../business-logic/types/ITestData.ts | 1 + .../pages/VehicleSelectionPage.ts | 12 ++- playwright-tests/tests/0000__M.test.ts | 2 + .../tests/BigTruckInsuranceVerifiedFlow.ts | 80 +++++++++++++++++++ .../alert-validation/alert0001_HeavyTruck.ts | 2 +- 6 files changed, 94 insertions(+), 5 deletions(-) create mode 100644 playwright-tests/tests/BigTruckInsuranceVerifiedFlow.ts diff --git a/playwright-tests/business-logic/types/IAlertFlags.ts b/playwright-tests/business-logic/types/IAlertFlags.ts index b13f30bbc..7943ed6be 100644 --- a/playwright-tests/business-logic/types/IAlertFlags.ts +++ b/playwright-tests/business-logic/types/IAlertFlags.ts @@ -1,5 +1,5 @@ export default interface IAlertFlags { - isHeavyTruckVehicle?: boolean, + isHeavyTruckVehicleAlert?: boolean, isRepairReplace?: boolean, isSplitWindshield?: boolean, isRepairOnly?: boolean, diff --git a/playwright-tests/business-logic/types/ITestData.ts b/playwright-tests/business-logic/types/ITestData.ts index 76d0e4534..dab74efcf 100644 --- a/playwright-tests/business-logic/types/ITestData.ts +++ b/playwright-tests/business-logic/types/ITestData.ts @@ -29,6 +29,7 @@ export interface ITestData { endorsements: IEndorsementDetails[], hasOemEndorsement: boolean, // OEM Endorsement does not appear on endorsements page, so it has a separate flag.s skipEstimatePage: boolean, + isHeavyTruck: boolean, isRecalVehicle: boolean, canNotRecal: boolean, dynamicRecal: boolean, diff --git a/playwright-tests/pages/VehicleSelectionPage.ts b/playwright-tests/pages/VehicleSelectionPage.ts index f554639a5..6e78cfe6d 100644 --- a/playwright-tests/pages/VehicleSelectionPage.ts +++ b/playwright-tests/pages/VehicleSelectionPage.ts @@ -11,6 +11,7 @@ export class VehicleSelectionPage extends BasePage { readonly makeDropdown: Locator; readonly modelDropdown: Locator; readonly styleDropdown: Locator; + readonly zipCodeTextBox: Locator; readonly discontinuedServiceAlert: Locator; url = process.env['BASE_URL']! + '/fmg/?fmgPage=vehicle'; @@ -22,6 +23,7 @@ export class VehicleSelectionPage extends BasePage { this.makeDropdown = this.page.locator('#makeQuestionField'); this.modelDropdown = this.page.locator('#modelQuestionField'); this.styleDropdown = this.page.locator('#styleQuestionField'); + this.zipCodeTextBox = this.page.getByRole('textbox', { name: 'Zip code' }); this.discontinuedServiceAlert = this.page.locator('.alert-danger.widget-name-AlertNoServiceWidget'); // this.validateURL(this.url); } @@ -48,13 +50,17 @@ export class VehicleSelectionPage extends BasePage { @step("VehicleSelectionPage >> Select Vehicle: ") async handleVehicleSelectionPage(testData: Partial) { await this.validateProgressBar("4"); - const { vehicleDetails } = testData; - const { isHeavyTruckVehicle, isSplitWindshield } = testData.alertFlags || {}; + const { vehicleDetails, isHeavyTruck, customerDetails } = testData; + const { isHeavyTruckVehicleAlert, isSplitWindshield } = testData.alertFlags || {}; await this.selectVehicle(vehicleDetails!); + + if (isHeavyTruck) { + await this.zipCodeTextBox.fill(customerDetails?.address.postalCode!); + } // Handle alert conditions for vehicle selection - if (isHeavyTruckVehicle || isSplitWindshield) { + if (isHeavyTruckVehicleAlert || isSplitWindshield) { await this.checkForAlertMessages(); throw new TestSuccessAlert('Both assertions are met successfully.'); } diff --git a/playwright-tests/tests/0000__M.test.ts b/playwright-tests/tests/0000__M.test.ts index b51c8dd5e..d504bf24e 100644 --- a/playwright-tests/tests/0000__M.test.ts +++ b/playwright-tests/tests/0000__M.test.ts @@ -31,6 +31,7 @@ import cashRepairInShopAfterPayTests from "./CashRepairInShopAfterPay"; import cashRepairInShopPayPalTests from "./CashRepairInShopPayPal"; import cashReplaceMultiSlidingGlassDropoffTests from "./CashReplaceMultiSlidingGlassDropoff"; import cashReplaceMultiGlassMobileTests from "./CashReplaceMultiGlassMobile"; +import insuranceBigTruckVerifiedTests from "./BigTruckInsuranceVerifiedFlow"; /** * Master Test Runner @@ -67,6 +68,7 @@ const allStandardTests = [ {name: "CashReplaceWiperPromoInshop", tests: cashReplaceWiperPromoInShopTests}, {name: "InsuranceAcuityPaypal", tests: insuranceAcuityPaypalTests}, {name: "InsuranceITAC21stCentury", tests: insuranceITAC21stCenturyTests}, + {name: "BigTruckInsuranceVerifiedFlow", tests: insuranceBigTruckVerifiedTests}, // {name: "InsuranceGeico", tests: insuranceGeicoTests}, // {name: "InsuranceITACOptimizedPriceValidationAllState", tests: insuranceITACOptimizedPriceValidationAllStateTests} diff --git a/playwright-tests/tests/BigTruckInsuranceVerifiedFlow.ts b/playwright-tests/tests/BigTruckInsuranceVerifiedFlow.ts new file mode 100644 index 000000000..a97e64912 --- /dev/null +++ b/playwright-tests/tests/BigTruckInsuranceVerifiedFlow.ts @@ -0,0 +1,80 @@ +//Imports here +import { ITestData } from "@business-logic/types/ITestData" +import { PaymentMethod, AppointmentType, DamageType, PaymentType } from "@business-logic/types/Enums"; +import TestCase from "@business-logic/types/TestCase"; +import { VehicleLookupType } from "@business-logic/types/Enums"; +import { getDefaultTestData, setFakerSeedFromTestName } from "@business-logic/constants/DefaultTestData"; + +// Set the seed based on test name for consistent but unique data +setFakerSeedFromTestName("InsuranceBigTruckVerified"); + +// Now get the test data with the seeded faker +const insuranceBigTruckVerifiedData: Partial = { + ...getDefaultTestData(), // Get default data with current seed + + // Key feature: Insurance flow with GEICO + paymentMethod: PaymentMethod.Insurance, + + // Insurance claim flags + isDuplicateClaim: true, + isPolicyFound: true, + isUseVehicleOnPolicy: true, + isHeavyTruck: true, + + // Override customer details with specific name and California location + customerDetails: { + ...getDefaultTestData().customerDetails!, + firstName: 'Big', + lastName: 'Truck', + address: { + ...getDefaultTestData().customerDetails!.address, + city: 'Ontario', + state: 'California', + postalCode: '55414' + } + }, + + + // Insurance claim details + claimDetails: { + client: 'USAA', + policyNumber: 'Mock900040BigTruck', + policyDeductible: 2000.00, + damageDate: new Date(new Date().setDate(new Date().getDate() - 1)).toLocaleDateString('en-US', {month: '2-digit', day: '2-digit', year: 'numeric'}), + damageCause: DamageType.Rock + }, + + // Hyundai vehicle details with VIN lookup + vehicleDetails: { + ...getDefaultTestData().vehicleDetails!, + year: '2025', + make: 'Peterbilt', + model: '579', + style: 'conventional cab', + vin: '1XPBDP9X6SD693446', + vehicleLookupType: VehicleLookupType.Vin, + }, + + // No need to override vehicleDamage as it already defaults to WindshieldCrack + + // Override for in-shop appointment + appointmentDetails: { + serviceLocation: AppointmentType.InShop, + shopAddress: '504 Malcolm Ave SE, Minneapolis, MN 55414', + appointmentDate: getDefaultTestData().appointmentDetails?.appointmentDate + }, + + // Override payment details (empty because we skip payment method page in insurance flow) + paymentDetails: {} +} + +const insuranceBigTruckVerifiedTests: TestCase[] = []; + +const tc = new TestCase({ + name: `InsuranceBigTruckVerified`, + tags: ['@E2E','@InsuranceBigTruckVerified', '@test_report', '@Insurance'], + testData: insuranceBigTruckVerifiedData +}, undefined, 'InsuranceBigTruckVerified'); +insuranceBigTruckVerifiedTests.push(tc); + +export default insuranceBigTruckVerifiedTests; \ No newline at end of file diff --git a/playwright-tests/tests/alert-validation/alert0001_HeavyTruck.ts b/playwright-tests/tests/alert-validation/alert0001_HeavyTruck.ts index dad46ecd5..9a881d4e5 100644 --- a/playwright-tests/tests/alert-validation/alert0001_HeavyTruck.ts +++ b/playwright-tests/tests/alert-validation/alert0001_HeavyTruck.ts @@ -18,7 +18,7 @@ const heavyTruckData: Partial = { style: 'conventional cab' }, alertFlags: { - isHeavyTruckVehicle: true + isHeavyTruckVehicleAlert: true }, vehicleDamage: [ VehicleDamage.WindshieldOneChip, From 5925f0765317d4e7b74deeeda1a11d71622c3cc3 Mon Sep 17 00:00:00 2001 From: maguire-arman Date: Tue, 20 May 2025 11:27:08 -0400 Subject: [PATCH 02/63] fixed address for big truck location --- playwright-tests/tests/BigTruckInsuranceVerifiedFlow.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/playwright-tests/tests/BigTruckInsuranceVerifiedFlow.ts b/playwright-tests/tests/BigTruckInsuranceVerifiedFlow.ts index a97e64912..78832afd5 100644 --- a/playwright-tests/tests/BigTruckInsuranceVerifiedFlow.ts +++ b/playwright-tests/tests/BigTruckInsuranceVerifiedFlow.ts @@ -60,7 +60,7 @@ const insuranceBigTruckVerifiedData: Partial = { // Override for in-shop appointment appointmentDetails: { serviceLocation: AppointmentType.InShop, - shopAddress: '504 Malcolm Ave SE, Minneapolis, MN 55414', + shopAddress: '504 Malcolm Ave Se, Minneapolis, MN 55414', appointmentDate: getDefaultTestData().appointmentDetails?.appointmentDate }, From 2b16a6b2fdf01c362c64afb975c53a59b9f7d0ed Mon Sep 17 00:00:00 2001 From: maguire-arman Date: Tue, 20 May 2025 11:28:09 -0400 Subject: [PATCH 03/63] Corrects deductible validation on order confirmation Ensures the order confirmation page accurately displays the policy deductible amount for insurance users. Previously, it incorrectly validated the service package amount against a hardcoded value instead of the policy deductible. --- playwright-tests/pages/OrderConfirmationPage.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/playwright-tests/pages/OrderConfirmationPage.ts b/playwright-tests/pages/OrderConfirmationPage.ts index 6e513d7d2..c66f95497 100644 --- a/playwright-tests/pages/OrderConfirmationPage.ts +++ b/playwright-tests/pages/OrderConfirmationPage.ts @@ -102,7 +102,7 @@ export class OrderConfirmationPage extends BasePage { } else { // Price validations for insurance users if (servicePackage === ServicePackage.GlassOnly) { - expect.soft(servicePackageAmt).toEqual(0); + expect.soft(servicePackageAmt).toEqual(claimDetails?.policyDeductible); } else { expect.soft(servicePackageAmt).toBeGreaterThan(0); } From 9c13fec5a2448c496c7b43bf6f673eedf6658583 Mon Sep 17 00:00:00 2001 From: Jenny Nou Date: Tue, 20 May 2025 15:56:58 -0400 Subject: [PATCH 04/63] Added policy zip to test data --- playwright-tests/business-logic/types/ITestData.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/playwright-tests/business-logic/types/ITestData.ts b/playwright-tests/business-logic/types/ITestData.ts index dab74efcf..ec616fb83 100644 --- a/playwright-tests/business-logic/types/ITestData.ts +++ b/playwright-tests/business-logic/types/ITestData.ts @@ -33,5 +33,6 @@ export interface ITestData { isRecalVehicle: boolean, canNotRecal: boolean, dynamicRecal: boolean, - promoCode: string + promoCode: string, + policyZip: string } \ No newline at end of file From 152043dfd94e0f378812204161ea0cf25c85ad1d Mon Sep 17 00:00:00 2001 From: Jenny Nou Date: Tue, 20 May 2025 15:57:56 -0400 Subject: [PATCH 05/63] Renamed big truck insurance test file --- playwright-tests/tests/0000__M.test.ts | 4 ++-- ...InsuranceVerifiedFlow.ts => InsuranceBigTruckVerified.ts} | 5 +++-- 2 files changed, 5 insertions(+), 4 deletions(-) rename playwright-tests/tests/{BigTruckInsuranceVerifiedFlow.ts => InsuranceBigTruckVerified.ts} (95%) diff --git a/playwright-tests/tests/0000__M.test.ts b/playwright-tests/tests/0000__M.test.ts index d504bf24e..e09acec35 100644 --- a/playwright-tests/tests/0000__M.test.ts +++ b/playwright-tests/tests/0000__M.test.ts @@ -31,7 +31,7 @@ import cashRepairInShopAfterPayTests from "./CashRepairInShopAfterPay"; import cashRepairInShopPayPalTests from "./CashRepairInShopPayPal"; import cashReplaceMultiSlidingGlassDropoffTests from "./CashReplaceMultiSlidingGlassDropoff"; import cashReplaceMultiGlassMobileTests from "./CashReplaceMultiGlassMobile"; -import insuranceBigTruckVerifiedTests from "./BigTruckInsuranceVerifiedFlow"; +import insuranceBigTruckVerifiedTests from "./InsuranceBigTruckVerified"; /** * Master Test Runner @@ -68,7 +68,7 @@ const allStandardTests = [ {name: "CashReplaceWiperPromoInshop", tests: cashReplaceWiperPromoInShopTests}, {name: "InsuranceAcuityPaypal", tests: insuranceAcuityPaypalTests}, {name: "InsuranceITAC21stCentury", tests: insuranceITAC21stCenturyTests}, - {name: "BigTruckInsuranceVerifiedFlow", tests: insuranceBigTruckVerifiedTests}, + {name: "InsuranceBigTruckVerified", tests: insuranceBigTruckVerifiedTests}, // {name: "InsuranceGeico", tests: insuranceGeicoTests}, // {name: "InsuranceITACOptimizedPriceValidationAllState", tests: insuranceITACOptimizedPriceValidationAllStateTests} diff --git a/playwright-tests/tests/BigTruckInsuranceVerifiedFlow.ts b/playwright-tests/tests/InsuranceBigTruckVerified.ts similarity index 95% rename from playwright-tests/tests/BigTruckInsuranceVerifiedFlow.ts rename to playwright-tests/tests/InsuranceBigTruckVerified.ts index 78832afd5..f06e9171d 100644 --- a/playwright-tests/tests/BigTruckInsuranceVerifiedFlow.ts +++ b/playwright-tests/tests/InsuranceBigTruckVerified.ts @@ -30,7 +30,7 @@ const insuranceBigTruckVerifiedData: Partial = { ...getDefaultTestData().customerDetails!.address, city: 'Ontario', state: 'California', - postalCode: '55414' + postalCode: '43085' } }, @@ -40,6 +40,7 @@ const insuranceBigTruckVerifiedData: Partial = { client: 'USAA', policyNumber: 'Mock900040BigTruck', policyDeductible: 2000.00, + policyZip: '55414', damageDate: new Date(new Date().setDate(new Date().getDate() - 1)).toLocaleDateString('en-US', {month: '2-digit', day: '2-digit', year: 'numeric'}), damageCause: DamageType.Rock }, @@ -60,7 +61,7 @@ const insuranceBigTruckVerifiedData: Partial = { // Override for in-shop appointment appointmentDetails: { serviceLocation: AppointmentType.InShop, - shopAddress: '504 Malcolm Ave Se, Minneapolis, MN 55414', + shopAddress: '5719 Brandt Pike, Dayton, OH 45424', appointmentDate: getDefaultTestData().appointmentDetails?.appointmentDate }, From 42025313b5a18f56fd726e07a0977625f636cc55 Mon Sep 17 00:00:00 2001 From: Chloe Herd Date: Thu, 22 May 2025 09:57:09 -0400 Subject: [PATCH 06/63] Explicitly redirect to confirmation rather than cancelling nav. --- src/router/methods/before-each.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/router/methods/before-each.js b/src/router/methods/before-each.js index cae308ccb..dde2a45ac 100644 --- a/src/router/methods/before-each.js +++ b/src/router/methods/before-each.js @@ -49,7 +49,9 @@ export async function beforeEach(to, from) { const exceptionPages = [FUNNEL_START_PAGE.name, routeData.CONFIRMATION.name]; if (!exceptionPages.some((name) => to.name === name) && !isVirtualRoute(to.name)) { - return false; + return { + name: routeData.CONFIRMATION.name, + }; } } From 922b57d51c4607c897f7eb788e3456256b0071cc Mon Sep 17 00:00:00 2001 From: Chloe Herd Date: Thu, 22 May 2025 10:27:22 -0400 Subject: [PATCH 07/63] Stop some weird back behavior from iframe --- src/router/methods/before-each.js | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/router/methods/before-each.js b/src/router/methods/before-each.js index dde2a45ac..fb1ed2256 100644 --- a/src/router/methods/before-each.js +++ b/src/router/methods/before-each.js @@ -14,6 +14,7 @@ import { checkLogParam } from "@/helpers/debug-log-helper"; import { debugLog } from "@/helpers/debug-log-helper"; import { handleHeritageReturn } from "@/router/methods/helpers/handle-heritage-return"; import { isVirtualRoute } from "@/router/methods/helpers/is-virtual-route"; +import router from "@/router"; export async function beforeEach(to, from) { try { @@ -49,9 +50,13 @@ export async function beforeEach(to, from) { const exceptionPages = [FUNNEL_START_PAGE.name, routeData.CONFIRMATION.name]; if (!exceptionPages.some((name) => to.name === name) && !isVirtualRoute(to.name)) { - return { + router.push({ name: routeData.CONFIRMATION.name, - }; + }); + return false; + // return { + // name: routeData.CONFIRMATION.name, + // }; } } From 599e28294708560003d0a04679d17e10bfc78459 Mon Sep 17 00:00:00 2001 From: Chloe Herd Date: Thu, 22 May 2025 10:29:08 -0400 Subject: [PATCH 08/63] Remove commented code --- src/router/methods/before-each.js | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/router/methods/before-each.js b/src/router/methods/before-each.js index fb1ed2256..e742f89ff 100644 --- a/src/router/methods/before-each.js +++ b/src/router/methods/before-each.js @@ -54,9 +54,6 @@ export async function beforeEach(to, from) { name: routeData.CONFIRMATION.name, }); return false; - // return { - // name: routeData.CONFIRMATION.name, - // }; } } From c52c1844343046e51bf6299c41c0be37699b6c5f Mon Sep 17 00:00:00 2001 From: Johnny shultz Date: Thu, 22 May 2025 11:32:58 -0400 Subject: [PATCH 09/63] CASH-692 CASH-692 updated scripts to use new cashapp tool tip design --- .../payment-method/afterpay-breakout/afterpay-breakout.vue | 7 +++++-- .../quote/afterpay-modal-banner/afterpay-modal-banner.vue | 7 +++++-- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/layouts/payment-method/afterpay-breakout/afterpay-breakout.vue b/src/layouts/payment-method/afterpay-breakout/afterpay-breakout.vue index abe6221ba..9e98eb9c3 100644 --- a/src/layouts/payment-method/afterpay-breakout/afterpay-breakout.vue +++ b/src/layouts/payment-method/afterpay-breakout/afterpay-breakout.vue @@ -1,6 +1,9 @@ + + From bd67b89942dc6dd0018dcd938a27f8305a9f8ec2 Mon Sep 17 00:00:00 2001 From: Chloe Herd Date: Wed, 28 May 2025 16:50:34 -0400 Subject: [PATCH 31/63] More iframe fixes... --- src/router/methods/route-logic/payment-method.js | 9 +++++++++ src/router/methods/routes.js | 3 ++- 2 files changed, 11 insertions(+), 1 deletion(-) create mode 100644 src/router/methods/route-logic/payment-method.js diff --git a/src/router/methods/route-logic/payment-method.js b/src/router/methods/route-logic/payment-method.js new file mode 100644 index 000000000..635f1306a --- /dev/null +++ b/src/router/methods/route-logic/payment-method.js @@ -0,0 +1,9 @@ +import { routeData } from "@/router/constants/routes"; +import router from "@/router"; + +export async function paymentMethodBeforeEnter(to, from) { + // Refresh page when navigating back from payment to avoid iframe issues. + if (from.name === routeData.PAYMENT.name) { + router.go(0); + } +} diff --git a/src/router/methods/routes.js b/src/router/methods/routes.js index 0911b78dd..19c802aae 100644 --- a/src/router/methods/routes.js +++ b/src/router/methods/routes.js @@ -10,6 +10,7 @@ import { loadSessionBeforeEnter } from "@/router/methods/route-logic/load-sessio import { autoRouteBeforeEnter } from "@/router/methods/route-logic/auto-route"; import { errorBeforeEnter } from "@/router/methods/route-logic/error"; import { restartBeforeEnter } from "@/router/methods/route-logic/restart"; +import { paymentMethodBeforeEnter } from "@/router/methods/route-logic/payment-method"; export const routes = [ // Non-virtual pages. @@ -30,7 +31,7 @@ export const routes = [ createRoute(routeData.SERVICE_LOCATION), createRoute(routeData.SCHEDULE), createRoute(routeData.CUSTOMER_DETAILS), - createRoute(routeData.PAYMENT_METHOD), + createRoute(routeData.PAYMENT_METHOD, paymentMethodBeforeEnter), createRoute(routeData.PAYMENT), createRoute(routeData.PAYMENT_PIA_RETURN), createRoute(routeData.CONFIRMATION), From 1bb100e883a939a4b6529b8c92cb6677d077d7da Mon Sep 17 00:00:00 2001 From: hiteshkumar87 Date: Thu, 29 May 2025 21:10:45 +0530 Subject: [PATCH 32/63] CASH-833 reset alerts --- src/layouts/service-location/service-location.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/layouts/service-location/service-location.vue b/src/layouts/service-location/service-location.vue index 3945d5e48..6893ad9b4 100644 --- a/src/layouts/service-location/service-location.vue +++ b/src/layouts/service-location/service-location.vue @@ -793,10 +793,10 @@ export default { this.apartmentNumberOrBusinessName = this.getServiceAddress2FromStore(); this.city = this.getServiceCityFromStore(); this.isVehicleProtected = this.getIsVehicleProtectedFromStore(); - this.$refs.mobileLocationQuestions.resetAlerts(); } else { this.resetMobileLocation(); } + this.$refs.mobileLocationQuestions.resetAlerts(); } else { this.selectedProvider = new Provider(); } From a92706c87eb2a1029a7a5c92a68dc734aac5654c Mon Sep 17 00:00:00 2001 From: hiteshkumar87 Date: Thu, 29 May 2025 21:25:23 +0530 Subject: [PATCH 33/63] CASH-834 move error message below heading --- .../mobile-location-modal-questions.vue | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/layouts/service-location/mobile-location-modal-questions/mobile-location-modal-questions.vue b/src/layouts/service-location/mobile-location-modal-questions/mobile-location-modal-questions.vue index b8b254be7..94d2be40b 100644 --- a/src/layouts/service-location/mobile-location-modal-questions/mobile-location-modal-questions.vue +++ b/src/layouts/service-location/mobile-location-modal-questions/mobile-location-modal-questions.vue @@ -2,14 +2,6 @@
-
- - {{ errorMessage }} - -
+
+ + {{ errorMessage }} + +
Date: Thu, 29 May 2025 12:12:03 -0400 Subject: [PATCH 34/63] Changed pool back to AmazonLinuxPool --- azure-pipelines-automated-testing.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure-pipelines-automated-testing.yml b/azure-pipelines-automated-testing.yml index 746906a04..7aae87ef5 100644 --- a/azure-pipelines-automated-testing.yml +++ b/azure-pipelines-automated-testing.yml @@ -6,7 +6,7 @@ schedules: branches: include: - develop -pool: "Default" +pool: "AmazonLinuxPool" variables: # - group: Digital-Infrastructure From f794285f35f9c34cc1983dbec3fd6e605101dfcb Mon Sep 17 00:00:00 2001 From: maguire-arman Date: Thu, 29 May 2025 13:58:04 -0400 Subject: [PATCH 35/63] Updates agent pool to default Changes the agent pool from a custom "AmazonLinuxPool" to the default Azure Pipelines agent pool. This simplifies pipeline configuration and reduces reliance on specialized agent pools, leveraging the standard Azure-managed infrastructure. --- azure-pipelines-automated-testing.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure-pipelines-automated-testing.yml b/azure-pipelines-automated-testing.yml index 7aae87ef5..746906a04 100644 --- a/azure-pipelines-automated-testing.yml +++ b/azure-pipelines-automated-testing.yml @@ -6,7 +6,7 @@ schedules: branches: include: - develop -pool: "AmazonLinuxPool" +pool: "Default" variables: # - group: Digital-Infrastructure From 05e5060a5a65ed7c76d4f552e0551f9c624ec31e Mon Sep 17 00:00:00 2001 From: maguire-arman Date: Thu, 29 May 2025 14:22:15 -0400 Subject: [PATCH 36/63] remove jq --- Dockerfile.playwright | 3 --- 1 file changed, 3 deletions(-) diff --git a/Dockerfile.playwright b/Dockerfile.playwright index 46a2114a2..bd66363f0 100644 --- a/Dockerfile.playwright +++ b/Dockerfile.playwright @@ -14,8 +14,5 @@ RUN npm install # Install Playwright browsers RUN npx playwright install chromium --with-deps -# Install jq -RUN apt-get install -y jq - # Copy the rest of the application code COPY . . From 4e8c24d08b5b259ee32d679cc27266bcbe2e7d8b Mon Sep 17 00:00:00 2001 From: maguire-arman Date: Thu, 29 May 2025 15:02:26 -0400 Subject: [PATCH 37/63] Handle new paypal payment flow --- playwright-tests/pages/PaypalPage.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/playwright-tests/pages/PaypalPage.ts b/playwright-tests/pages/PaypalPage.ts index 7afda3d5b..4d957eb33 100644 --- a/playwright-tests/pages/PaypalPage.ts +++ b/playwright-tests/pages/PaypalPage.ts @@ -11,6 +11,7 @@ export class PaypalPage extends BasePage { readonly passwordTextBox: Locator; readonly paypalLoginButton: Locator; readonly completePurchaseButton: Locator; + readonly payWithRadioButton: Locator; readonly payButton: Locator; constructor(page: Page) { @@ -23,6 +24,7 @@ export class PaypalPage extends BasePage { this.passwordTextBox = page.getByPlaceholder('Password'); this.paypalLoginButton = page.getByRole('button', { name: 'Log In', exact: true }); this.completePurchaseButton = page.getByTestId('submit-button-initial') + this.payWithRadioButton = page.locator('.py-4').first(); this.payButton = page.getByRole('button', { name: 'Pay $' }); } @@ -42,6 +44,7 @@ export class PaypalPage extends BasePage { await this.usePasswordInsteadButton.click(); await this.passwordTextBox.fill(paymentDetails.password!); await this.paypalLoginButton.click(); + await this.payWithRadioButton.click(); await this.payButton.click(); } } From 8961e9e3b9b729995748de165f8b78f307a0e1ff Mon Sep 17 00:00:00 2001 From: hiteshkumar87 Date: Fri, 30 May 2025 13:28:10 +0530 Subject: [PATCH 38/63] CASH-834 removing error message no longer required. --- .../mobile-location-modal-questions.vue | 8 -------- 1 file changed, 8 deletions(-) diff --git a/src/layouts/service-location/mobile-location-modal-questions/mobile-location-modal-questions.vue b/src/layouts/service-location/mobile-location-modal-questions/mobile-location-modal-questions.vue index 94d2be40b..ccd4b1aca 100644 --- a/src/layouts/service-location/mobile-location-modal-questions/mobile-location-modal-questions.vue +++ b/src/layouts/service-location/mobile-location-modal-questions/mobile-location-modal-questions.vue @@ -11,14 +11,6 @@
-
- - {{ errorMessage }} - -
Date: Sat, 31 May 2025 15:52:51 -0400 Subject: [PATCH 39/63] CASH-843 CASH-843 prevent nav to return-user when loading a save quote --- src/router/methods/route-logic/landing.js | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/router/methods/route-logic/landing.js b/src/router/methods/route-logic/landing.js index b50f321c1..6c8d5d4d6 100644 --- a/src/router/methods/route-logic/landing.js +++ b/src/router/methods/route-logic/landing.js @@ -3,6 +3,7 @@ import { routeData } from "@/router/constants/routes"; import { consumeReferralQuerystrings } from "@/router/methods/helpers/consume-referral-info"; import { initializeFromQueryStrings } from "@/router/methods/helpers/initialize-from-querystrings"; import { stashAllQueries } from "@/router/methods/helpers/querystring-stash"; +import { queryStrings } from "@/constants/query-strings"; import store from "@/store"; export async function landingBeforeEnter(to, from) { @@ -21,9 +22,10 @@ export async function landingBeforeEnter(to, from) { }; } - // If a session is still in memory, go to return-user. - if (store.getters.vehicle?.year > 0) { - console.log(`trying to redirect!`); + const fromHeritage = to.query[queryStrings.FROM_HERITAGE] + + // If a session is still in memory and not loading a save quote, go to return-user. + if (store.getters.vehicle?.year > 0 && !fromHeritage) { return { name: routeData.RETURN_USER.name, replace: true, From 04d6d66e3edd232773914ce549faabe539d46bd5 Mon Sep 17 00:00:00 2001 From: CarlNation Date: Sat, 31 May 2025 15:57:58 -0400 Subject: [PATCH 40/63] prettier --- src/router/methods/route-logic/landing.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/router/methods/route-logic/landing.js b/src/router/methods/route-logic/landing.js index 6c8d5d4d6..fc0166172 100644 --- a/src/router/methods/route-logic/landing.js +++ b/src/router/methods/route-logic/landing.js @@ -22,7 +22,7 @@ export async function landingBeforeEnter(to, from) { }; } - const fromHeritage = to.query[queryStrings.FROM_HERITAGE] + const fromHeritage = to.query[queryStrings.FROM_HERITAGE]; // If a session is still in memory and not loading a save quote, go to return-user. if (store.getters.vehicle?.year > 0 && !fromHeritage) { From 8f83f4184d4671a1797472ad1c8a91324fe561b0 Mon Sep 17 00:00:00 2001 From: Minojhini Valaiyapathi Date: Tue, 3 Jun 2025 10:05:25 -0400 Subject: [PATCH 41/63] CASH-697 - Passing AI-Generated Summary to SSR when Transferring from Scarlett to Salesforce Chat --- .../sierra-webchat/sierra-webchat.vue | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/digital-components/sierra-webchat/sierra-webchat.vue b/src/digital-components/sierra-webchat/sierra-webchat.vue index 2a114616a..8210e9075 100644 --- a/src/digital-components/sierra-webchat/sierra-webchat.vue +++ b/src/digital-components/sierra-webchat/sierra-webchat.vue @@ -94,8 +94,16 @@ export default { FirstName: transfer.data.first_name, LastName: transfer.data.last_name, Email: transfer.data.email, - Subject: transfer.data.chat_summary, // for now passing in chat_summery in Subject. But this will be changed in future. + Subject: transfer.data.chat_summary, }; + window.embedded_svc.settings.extraPrechatFormDetails = [ + { + label: "Scarlett AI Summary", + value: transfer.data.chat_summary, + transcriptFields: ["Scarlett_AI_Summary__c"], + displayToAgent: true, + }, + ]; if ( window.embedded_svc.liveAgentAPI && typeof window.embedded_svc.liveAgentAPI.startChat === "function" From b10ec1f60828b9e9f0c4f05c197ca984bb9db230 Mon Sep 17 00:00:00 2001 From: kpatel8hs4io <31411746+kpatel8hs4io@users.noreply.github.com> Date: Tue, 3 Jun 2025 11:00:51 -0400 Subject: [PATCH 42/63] adding a change to handle addresslookup page --- playwright-tests/pages/forms/AddressForm.ts | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/playwright-tests/pages/forms/AddressForm.ts b/playwright-tests/pages/forms/AddressForm.ts index 7080fea48..892a56c9b 100644 --- a/playwright-tests/pages/forms/AddressForm.ts +++ b/playwright-tests/pages/forms/AddressForm.ts @@ -43,9 +43,8 @@ export class AddressForm extends BasePage { // await this.forceAddressFormToAppear(); await this.streetAddressTextBox.click(); await this.streetAddressTextBox.pressSequentially(`${customerDetails.address.street}, ${customerDetails.address.city}, ${customerDetails.address.state} ${customerDetails.address.postalCode}`).then( async() => { - await new Promise(resolve => setTimeout(resolve, 1000)); - await this.streetAddressTextBox.dispatchEvent('keydown', { key: 'ArrowDown' }); - await this.streetAddressTextBox.dispatchEvent('keyup', { key: 'ArrowDown' }); + await this.streetAddressTextBox.dispatchEvent('keydown', { key: 'ArrowLeft' } ); + await this.streetAddressTextBox.dispatchEvent('keyup', { key: 'ArrowLeft' }); }); await waitUntil(async () => { @@ -57,10 +56,20 @@ export class AddressForm extends BasePage { text.includes(customerDetails.address!.state) ); }); - await this.addressSuggestionList.dispatchEvent('mouseover'); - await this.addressSuggestionList.click(); + + await this.page.hover(".pac-container .pac-item"); + await new Promise(resolve => setTimeout(resolve, 1000)); + await this.addressSuggestionList.click(); // Select the first suggestion + //await this.streetAddressTextBox.press('Tab'); // Move focus to ZIP code field // Fill address + await this.stateDrpDwn.waitFor({ state: 'visible', timeout: 5000 }).then(async () => { + const selectedState = await this.stateDrpDwn.inputValue(); + if (selectedState !== customerDetails.address!.state) { + await this.stateDrpDwn.selectOption(customerDetails.address!.state); + } + }) + await this.fillAndValidate(this.streetAddressTextBox, customerDetails.address.street); await this.fillAndValidate(this.zipCodeTextBox, customerDetails.address.postalCode) await this.fillAndValidate(this.cityTextBox, customerDetails.address.city); From d7a32b582a9c0e5054db95de987bedcdccc4bdd9 Mon Sep 17 00:00:00 2001 From: Chloe Herd Date: Tue, 3 Jun 2025 14:59:52 -0400 Subject: [PATCH 43/63] Switch away from paypal when navigating back to payment --- src/router/methods/route-logic/payment.js | 14 ++++++++++++++ src/router/methods/routes.js | 3 ++- 2 files changed, 16 insertions(+), 1 deletion(-) create mode 100644 src/router/methods/route-logic/payment.js diff --git a/src/router/methods/route-logic/payment.js b/src/router/methods/route-logic/payment.js new file mode 100644 index 000000000..73f2b5cac --- /dev/null +++ b/src/router/methods/route-logic/payment.js @@ -0,0 +1,14 @@ +import store from "@/store"; +import { storeActions } from "@/constants/store-actions"; +import { paymentMethods } from "@/constants/payment-method-constants"; +import { debugLog } from "@/helpers/debug-log-helper"; + +export async function paymentBeforeEnter(to, from) { + const piaType = store.getters.order?.payment?.piaType; + debugLog(`Entering payment with type =`, piaType); + + if (piaType === paymentMethods.PAYPAL) { + debugLog(`Changing to payment type =`, paymentMethods.CREDIT_CARD); + await store.dispatch(storeActions.SAVE_PAYMENT_METHOD_CHOICE, paymentMethods.CREDIT_CARD); + } +} diff --git a/src/router/methods/routes.js b/src/router/methods/routes.js index 19c802aae..c029ce2cb 100644 --- a/src/router/methods/routes.js +++ b/src/router/methods/routes.js @@ -11,6 +11,7 @@ import { autoRouteBeforeEnter } from "@/router/methods/route-logic/auto-route"; import { errorBeforeEnter } from "@/router/methods/route-logic/error"; import { restartBeforeEnter } from "@/router/methods/route-logic/restart"; import { paymentMethodBeforeEnter } from "@/router/methods/route-logic/payment-method"; +import { paymentBeforeEnter } from "@/router/methods/route-logic/payment"; export const routes = [ // Non-virtual pages. @@ -32,7 +33,7 @@ export const routes = [ createRoute(routeData.SCHEDULE), createRoute(routeData.CUSTOMER_DETAILS), createRoute(routeData.PAYMENT_METHOD, paymentMethodBeforeEnter), - createRoute(routeData.PAYMENT), + createRoute(routeData.PAYMENT, paymentBeforeEnter), createRoute(routeData.PAYMENT_PIA_RETURN), createRoute(routeData.CONFIRMATION), createRoute(routeData.RETURN_USER), From f5ecb1148a91c9bf4243f732926cd994f08c13b6 Mon Sep 17 00:00:00 2001 From: JennyNou <167806377+JennyNou@users.noreply.github.com> Date: Wed, 4 Jun 2025 11:29:34 -0400 Subject: [PATCH 44/63] Added condition for validation --- playwright-tests/pages/PaymentMethodPage.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/playwright-tests/pages/PaymentMethodPage.ts b/playwright-tests/pages/PaymentMethodPage.ts index 240d0e03e..c57caaeef 100644 --- a/playwright-tests/pages/PaymentMethodPage.ts +++ b/playwright-tests/pages/PaymentMethodPage.ts @@ -357,10 +357,12 @@ l } let isCaliforniaState = localStorage.order.serviceLocation.state as string == 'CA' ? true : false; let hasRecalPart: boolean = false; + let canSafeliteRecalibrate: boolean = false; if (!isRepair) { hasRecalPart = localStorage.order.lineItems.glassParts.find((item: any) => item.requiresRecalibration === true) ? true : false; + canSafeliteRecalibrate = localStorage.order.lineItems.glassParts.find((item: any) => item.canSafeliteRecalibrate === true) ? true : false; } - let recalRequired = !isRepair && (isInsurance || isCaliforniaState) && hasRecalPart + let recalRequired = !isRepair && (isInsurance || isCaliforniaState) && hasRecalPart && canSafeliteRecalibrate let stringForRepair: string[] = ["Expert windshield repair", "Exclusive resin sealant", "Nationwide lifetime guarantee"]; let stringIfRecal = isRepair ? "" From c2abf5d7aaaa7b9ee4e05d484bb02cc35f7cd88c Mon Sep 17 00:00:00 2001 From: JennyNou <167806377+JennyNou@users.noreply.github.com> Date: Wed, 4 Jun 2025 11:30:00 -0400 Subject: [PATCH 45/63] Updated heavy truck naming --- playwright-tests/pages/VehicleSelectionPage.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/playwright-tests/pages/VehicleSelectionPage.ts b/playwright-tests/pages/VehicleSelectionPage.ts index 21be579d3..c2d638d12 100644 --- a/playwright-tests/pages/VehicleSelectionPage.ts +++ b/playwright-tests/pages/VehicleSelectionPage.ts @@ -51,8 +51,8 @@ export class VehicleSelectionPage extends BasePage { @step("VehicleSelectionPage >> Select Vehicle: ") async handleVehicleSelectionPage(testData: Partial) { await this.validateProgressBar(ProgressBarPercentages.VehicleSelectionPage); - const { vehicleDetails } = testData; - const { isHeavyTruckVehicle, isSplitWindshield } = testData.alertFlags || {}; + const { vehicleDetails, isHeavyTruck, customerDetails } = testData; + const { isHeavyTruckVehicleAlert, isSplitWindshield } = testData.alertFlags || {}; await this.selectVehicle(vehicleDetails!); From 8c167a4d479125c397ccf693451d7366a9b90561 Mon Sep 17 00:00:00 2001 From: Minojhini Valaiyapathi Date: Wed, 4 Jun 2025 12:47:21 -0400 Subject: [PATCH 46/63] CASH-804 - prevent First Available Appointment Date from Resetting --- src/store/index.js | 43 +++++++++++++++++++++++++++++++++++-------- 1 file changed, 35 insertions(+), 8 deletions(-) diff --git a/src/store/index.js b/src/store/index.js index c3ad4996e..efeec700c 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -1072,6 +1072,11 @@ export const getters = { }, }; +const timeSlotCallFlags = { + shop: false, + mobile: false, +}; + function getNonFalseValuesOfPropertyInArrayOfObjects(array, propertyName) { return (array ?? []).map((x) => x[propertyName]).filter((x) => x); } @@ -2059,20 +2064,31 @@ export const actions = { }, }; - return globalMethods.callHttpClient({ + let hasCalled = timeSlotCallFlags.shop; + if (!hasCalled) { + timeSlotCallFlags.shop = true; + } + + const options = { method: endpoints.GetShopTimeSlots.method, endpoint: endpoints.GetShopTimeSlots.url, payload: payload, logApiCall: true, pageNameToLog: pageNameToLog, - additionalSuccessEventDataHandler: (response) => + }; + + // Only set handler if this is the very first call in this session + if (!hasCalled) { + options.additionalSuccessEventDataHandler = (response) => getTimeSlotsAdditionalEventData( response.data.provisionalTriggers, order.serviceLocation.zipCode, response.data.days?.[0]?.date, shopAppointmentType - ), - }); + ); + } + + return globalMethods.callHttpClient(options); }, getMobileTimeSlots(context, { payload: { startDate, endDate }, pageNameToLog }) { @@ -2116,19 +2132,30 @@ export const actions = { zipCode: order.serviceLocation.zipCode, }; - return globalMethods.callHttpClient({ + let hasCalled = timeSlotCallFlags.mobile; + if (!hasCalled) { + timeSlotCallFlags.mobile = true; + } + + const options = { method: endpoints.GetMobileTimeSlots.method, endpoint: endpoints.GetMobileTimeSlots.url, payload: payload, logApiCall: true, pageNameToLog: pageNameToLog, - additionalSuccessEventDataHandler: (response) => + }; + + // Only set handler if this is the very first call in this session + if (!hasCalled) { + options.additionalSuccessEventDataHandler = (response) => getTimeSlotsAdditionalEventData( response.data.provisionalTriggers, order.serviceLocation.zipCode, response.data.days?.[0]?.date - ), - }); + ); + } + + return globalMethods.callHttpClient(options); }, getMobilePremiumFee(context, { pageNameToLog }) { From 50a900afeb87bf7a66e97b14c3a6dae851bcced7 Mon Sep 17 00:00:00 2001 From: Minojhini Valaiyapathi Date: Wed, 4 Jun 2025 14:08:13 -0400 Subject: [PATCH 47/63] CASH-804 - Re arranged the order of export and private functions --- src/store/index.js | 252 ++++++++++++++++++++++----------------------- 1 file changed, 126 insertions(+), 126 deletions(-) diff --git a/src/store/index.js b/src/store/index.js index efeec700c..073a50e23 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -1072,38 +1072,6 @@ export const getters = { }, }; -const timeSlotCallFlags = { - shop: false, - mobile: false, -}; - -function getNonFalseValuesOfPropertyInArrayOfObjects(array, propertyName) { - return (array ?? []).map((x) => x[propertyName]).filter((x) => x); -} - -function getTimeSlotsAdditionalEventData( - provisionalTriggers, - zipCode, - firstAvailableAppointmentDateString, - shopAppointmentType -) { - var numberOfDays = null; - if (firstAvailableAppointmentDateString) - numberOfDays = getDateDifferenceInDays( - new Date().toISOString().split("T")[0], - firstAvailableAppointmentDateString - ); - - if (shopAppointmentType) - return `FirstAvailableAppointment:${numberOfDays},Zip:${zipCode},ShopAppointmentType:${shopAppointmentType},ProvisionalTriggers:${provisionalTriggers.join( - "," - )}`; - else - return `FirstAvailableAppointment:${numberOfDays},Zip:${zipCode},ProvisionalTriggers:${provisionalTriggers.join( - "," - )}`; -} - // Export Actions export const actions = { // Vehicle API Actions @@ -3484,100 +3452,6 @@ export default createStore({ actions, }); -// Private Functions - -function getHasRecalibrationPart(state) { - return containsRecalParts(state.order.lineItems); -} - -function sortArrayOfObjectsByPropertyValue(arrayOfObjects, propertyName) { - if (!arrayOfObjects) return null; - - return arrayOfObjects.sort((a, b) => { - if (a[propertyName] < b[propertyName]) return -1; - else if (a[propertyName] > b[propertyName]) return 1; - else return 0; - }); -} - -function convertGlassPieceNamingForApi(glassArray) { - if (!glassArray || glassArray.length === 0) return []; - - // check if array already converted. (likely when a session has been saved previously and then reloaded) - if (glassArray[0].location !== undefined) { - return glassArray; - } - - const converted = []; - glassArray.forEach((glass) => { - converted.push({ - location: glass.glassLocation, - name: glass.glassName, - }); - }); - return converted; -} - -function convertResultsForApi(resultsArray) { - if (!resultsArray) return []; - const converted = []; - resultsArray.forEach((answer) => { - converted.push({ - location: answer.glassLocation, - name: answer.glassName, - result: answer.result, - }); - }); - return converted; -} - -function convertGlassPieceNamingFromApi(glassArray) { - glassArray.forEach((glass) => { - glass.glassLocation = glass.glassPiece.location; - glass.glassName = glass.glassPiece.name; - delete glass.glassPiece; - return glass; - }); - return glassArray; -} - -function addPricesToLineItems(lineItems, pricingLineItems) { - lineItems.forEach((lineItem) => { - const lineItemIndex = pricingLineItems.findIndex( - (pricingLineItem) => pricingLineItem.partNumber === lineItem.partNumber - ); - - if (lineItem.childParts) { - addPricesToLineItems(lineItem.childParts, pricingLineItems); - } - - const pricedLineItem = pricingLineItems.splice(lineItemIndex, 1)[0]; - lineItem.laborAmount = pricedLineItem.laborAmount; - lineItem.sellingPrice = pricedLineItem.sellingPrice; - lineItem.kitPrice = pricedLineItem.kitPrice; - lineItem.salesTax = pricedLineItem.salesTax; - }); - - return lineItems; -} - -function addTaxesToPricedLineItems(pricedLineItems, taxingLineItems = []) { - pricedLineItems.forEach((pricedLineItem) => { - const lineItemIndex = taxingLineItems.findIndex( - (taxingLineItem) => taxingLineItem.partNumber === pricedLineItem.partNumber - ); - - if (pricedLineItem.childParts) { - addTaxesToPricedLineItems(pricedLineItem.childParts, taxingLineItems); - } - - const taxedLineItem = taxingLineItems.splice(lineItemIndex, 1)[0]; - pricedLineItem.salesTax = taxedLineItem?.salesTax ?? 0; - }); - - return pricedLineItems; -} - export function mapTaxedLineItemsToStoreFormat(availableLineItems, storeLineItems) { // clone the lineItems array because what we're passing in is referencing the store directly const lineItems = deepClone(storeLineItems); @@ -3685,6 +3559,127 @@ export function getArrayOfAllLineItemsAndChildParts(lineItems) { return consolidatedLineItemsArray; } +// Private Functions + +function getNonFalseValuesOfPropertyInArrayOfObjects(array, propertyName) { + return (array ?? []).map((x) => x[propertyName]).filter((x) => x); +} + +function getTimeSlotsAdditionalEventData( + provisionalTriggers, + zipCode, + firstAvailableAppointmentDateString, + shopAppointmentType +) { + var numberOfDays = null; + if (firstAvailableAppointmentDateString) + numberOfDays = getDateDifferenceInDays( + new Date().toISOString().split("T")[0], + firstAvailableAppointmentDateString + ); + + if (shopAppointmentType) + return `FirstAvailableAppointment:${numberOfDays},Zip:${zipCode},ShopAppointmentType:${shopAppointmentType},ProvisionalTriggers:${provisionalTriggers.join( + "," + )}`; + else + return `FirstAvailableAppointment:${numberOfDays},Zip:${zipCode},ProvisionalTriggers:${provisionalTriggers.join( + "," + )}`; +} + +function getHasRecalibrationPart(state) { + return containsRecalParts(state.order.lineItems); +} + +function sortArrayOfObjectsByPropertyValue(arrayOfObjects, propertyName) { + if (!arrayOfObjects) return null; + + return arrayOfObjects.sort((a, b) => { + if (a[propertyName] < b[propertyName]) return -1; + else if (a[propertyName] > b[propertyName]) return 1; + else return 0; + }); +} + +function convertGlassPieceNamingForApi(glassArray) { + if (!glassArray || glassArray.length === 0) return []; + + // check if array already converted. (likely when a session has been saved previously and then reloaded) + if (glassArray[0].location !== undefined) { + return glassArray; + } + + const converted = []; + glassArray.forEach((glass) => { + converted.push({ + location: glass.glassLocation, + name: glass.glassName, + }); + }); + return converted; +} + +function convertResultsForApi(resultsArray) { + if (!resultsArray) return []; + const converted = []; + resultsArray.forEach((answer) => { + converted.push({ + location: answer.glassLocation, + name: answer.glassName, + result: answer.result, + }); + }); + return converted; +} + +function convertGlassPieceNamingFromApi(glassArray) { + glassArray.forEach((glass) => { + glass.glassLocation = glass.glassPiece.location; + glass.glassName = glass.glassPiece.name; + delete glass.glassPiece; + return glass; + }); + return glassArray; +} + +function addPricesToLineItems(lineItems, pricingLineItems) { + lineItems.forEach((lineItem) => { + const lineItemIndex = pricingLineItems.findIndex( + (pricingLineItem) => pricingLineItem.partNumber === lineItem.partNumber + ); + + if (lineItem.childParts) { + addPricesToLineItems(lineItem.childParts, pricingLineItems); + } + + const pricedLineItem = pricingLineItems.splice(lineItemIndex, 1)[0]; + lineItem.laborAmount = pricedLineItem.laborAmount; + lineItem.sellingPrice = pricedLineItem.sellingPrice; + lineItem.kitPrice = pricedLineItem.kitPrice; + lineItem.salesTax = pricedLineItem.salesTax; + }); + + return lineItems; +} + +function addTaxesToPricedLineItems(pricedLineItems, taxingLineItems = []) { + pricedLineItems.forEach((pricedLineItem) => { + const lineItemIndex = taxingLineItems.findIndex( + (taxingLineItem) => taxingLineItem.partNumber === pricedLineItem.partNumber + ); + + if (pricedLineItem.childParts) { + addTaxesToPricedLineItems(pricedLineItem.childParts, taxingLineItems); + } + + const taxedLineItem = taxingLineItems.splice(lineItemIndex, 1)[0]; + pricedLineItem.salesTax = taxedLineItem?.salesTax ?? 0; + }); + + return pricedLineItems; +} + function getFlattenedArrayOfLineItemsWithChildParts(lineItems, childPartRecursiveCall = false) { let flattenedArray = []; lineItems?.forEach((lineItem) => { @@ -3993,3 +3988,8 @@ function getExternalParameterDefaultState() { function saveExternalParameterState(externalParameterState) { window.sessionStorage.setItem("externalParameterState", JSON.stringify(externalParameterState)); } + +const timeSlotCallFlags = { + shop: false, + mobile: false, +}; From 636ad2bbd02fc30ed19732a3c6e4a8c3f835e1b6 Mon Sep 17 00:00:00 2001 From: maguire-arman Date: Thu, 5 Jun 2025 09:23:45 -0400 Subject: [PATCH 48/63] Adds Docker cleanup step to pipeline Adds a Docker cleanup script to the pipeline to remove stopped containers, dangling images, unused networks, and unused volumes. This helps to free up disk space and prevent potential resource exhaustion during automated testing. --- azure-pipelines-automated-testing.yml | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/azure-pipelines-automated-testing.yml b/azure-pipelines-automated-testing.yml index 746906a04..4699892e1 100644 --- a/azure-pipelines-automated-testing.yml +++ b/azure-pipelines-automated-testing.yml @@ -44,6 +44,32 @@ stages: shardNumber: 4 steps: + - script: | + echo "Starting Docker cleanup to free space..." + + # Remove all stopped containers + echo "Removing stopped containers..." + docker container prune -f + + # Remove dangling images (untagged) + echo "Removing dangling images..." + docker image prune -f + + # Remove unused networks + echo "Removing unused networks..." + docker network prune -f + + # Remove unused volumes + echo "Removing unused volumes..." + docker volume prune -f + + # Show disk usage after cleanup + echo "Docker system usage after cleanup:" + docker system df + + echo "Docker cleanup completed!" + displayName: "Docker Cleanup" + - task: Docker@2 displayName: "Build Docker Image" inputs: From fa93335cc6fc7ad2aa080d312b35a945b0f80adb Mon Sep 17 00:00:00 2001 From: maguire-arman Date: Thu, 5 Jun 2025 09:34:45 -0400 Subject: [PATCH 49/63] Removes unused network cleanup step Removes the network pruning step from the automated testing pipeline. This step is deemed unnecessary and removing it simplifies the process. --- azure-pipelines-automated-testing.yml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/azure-pipelines-automated-testing.yml b/azure-pipelines-automated-testing.yml index 4699892e1..2d9c19d74 100644 --- a/azure-pipelines-automated-testing.yml +++ b/azure-pipelines-automated-testing.yml @@ -55,10 +55,6 @@ stages: echo "Removing dangling images..." docker image prune -f - # Remove unused networks - echo "Removing unused networks..." - docker network prune -f - # Remove unused volumes echo "Removing unused volumes..." docker volume prune -f From b3fd46350fb1a6f5cfdca59ba858c61228fa7fae Mon Sep 17 00:00:00 2001 From: Chloe Herd Date: Thu, 5 Jun 2025 14:04:44 -0400 Subject: [PATCH 50/63] Remove premature consumption of zip query --- src/layouts/estimate/estimate.vue | 4 ++-- src/router/methods/helpers/querystring-stash.js | 9 +++++++++ 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/layouts/estimate/estimate.vue b/src/layouts/estimate/estimate.vue index 811cd1a86..2818d2ecb 100644 --- a/src/layouts/estimate/estimate.vue +++ b/src/layouts/estimate/estimate.vue @@ -62,7 +62,7 @@ import { saveSession } from "@/helpers/heritage-integration/order-helper.js"; import baseMixin from "@/mixins/base-mixin.js"; import { queryStrings } from "@/constants/query-strings"; import { nextTick } from "vue"; -import { consumeQueryFromStash } from "@/router/methods/helpers/querystring-stash"; +import { peekQueryFromStash } from "@/router/methods/helpers/querystring-stash"; // Define Validation Rules defineRule("zip-required", required(errorMessages.SERVICE_ZIP_REQUIRED)); @@ -100,7 +100,7 @@ export default { } const zip = - consumeQueryFromStash(queryStrings.ZIP_CODE) ?? + peekQueryFromStash(queryStrings.ZIP_CODE) ?? store.getters.order.serviceLocation.zipCode; var vinByAddressPromise; diff --git a/src/router/methods/helpers/querystring-stash.js b/src/router/methods/helpers/querystring-stash.js index 96b206572..b000f8feb 100644 --- a/src/router/methods/helpers/querystring-stash.js +++ b/src/router/methods/helpers/querystring-stash.js @@ -1,4 +1,5 @@ import { reactive } from "vue"; +import { debugLog } from "@/helpers/debug-log-helper"; const queryStash = reactive({ queries: [], @@ -27,10 +28,18 @@ export function stashAllQueries(toRoute) { } function getStashedQuery(key) { + debugLog(`Fetching querystring with key:`, key); const match = queryStash.queries.find( (entry) => entry?.key?.toLowerCase() === key?.toLowerCase() ); + if (match) { + debugLog(`Found result:`, match.value); + debugLog(`Already consumed:`, match.used); + } else { + debugLog(`Found no result`); + } + return match; } From 3e7d251244b1f4c757bb68d7d8b451c33236f311 Mon Sep 17 00:00:00 2001 From: JennyNou <167806377+JennyNou@users.noreply.github.com> Date: Mon, 9 Jun 2025 15:23:54 -0400 Subject: [PATCH 51/63] Added new test to cover unverified insurance flow --- playwright-tests/tests/InsuranceUnverified.ts | 86 +++++++++++++++++++ 1 file changed, 86 insertions(+) create mode 100644 playwright-tests/tests/InsuranceUnverified.ts diff --git a/playwright-tests/tests/InsuranceUnverified.ts b/playwright-tests/tests/InsuranceUnverified.ts new file mode 100644 index 000000000..f0fcf293a --- /dev/null +++ b/playwright-tests/tests/InsuranceUnverified.ts @@ -0,0 +1,86 @@ +//Imports here +import { ITestData } from "@business-logic/types/ITestData" +import { PaymentMethod, AppointmentType, DamageType, PartQuestionType } from "@business-logic/types/Enums"; +import TestCase from "@business-logic/types/TestCase"; +import { VehicleLookupType } from "@business-logic/types/Enums"; +import { getDefaultTestData, setFakerSeedFromTestName } from "@business-logic/constants/DefaultTestData"; + +// Set the seed based on test name for consistent but unique data +setFakerSeedFromTestName("InsuranceUnverified"); + +// Now get the test data with the seeded faker +const insuranceUnverifiedData: Partial = { + ...getDefaultTestData(), // Get default data with current seed + + // Key feature: Insurance flow with GEICO + paymentMethod: PaymentMethod.Insurance, + + // Insurance claim flags + isPolicyFound: false, + isPolicyUnverified: true, + isRecalNotification: true, + + // Override customer details with specific name and California location + customerDetails: { + ...getDefaultTestData().customerDetails!, + firstName: 'Jane', + lastName: 'Unverified', + address: { + ...getDefaultTestData().customerDetails!.address, + city: 'Richmond', + state: 'Virginia', + postalCode: '23219' + } + }, + + + // Insurance claim details + claimDetails: { + client: '21st Century', + policyNumber: 'UnverifiedMock', + policyDeductible: "Unverified", + policyZip: '43123', + damageDate: new Date(new Date().setDate(new Date().getDate() - 1)).toLocaleDateString('en-US', {month: '2-digit', day: '2-digit', year: 'numeric'}), + damageCause: DamageType.Rock + }, + + // Hyundai vehicle details with VIN lookup + vehicleDetails: { + ...getDefaultTestData().vehicleDetails!, + year: '2014', + make: 'Honda', + model: 'Accord', + style: '4 door sedan', + vehicleLookupType: VehicleLookupType.Zip, + }, + + // Part questions related to recalibration + partQuestions: [ + { + partQuestionType: PartQuestionType.GeneralQuestion1, + isOnPage: true, + optionToSelect: 'Yes' + }, + ], + + // Override for in-shop appointment + appointmentDetails: { + serviceLocation: AppointmentType.InShop, + shopAddress: '5719 Brandt Pike, Dayton, OH 45424', + appointmentDate: getDefaultTestData().appointmentDetails?.appointmentDate + }, + + // Override payment details (empty because we skip payment method page in insurance flow) + paymentDetails: {} +} + +const insuranceUnverifiedTests: TestCase[] = []; + +const tc = new TestCase({ + name: `InsuranceUnverified`, + tags: ['@E2E','@InsuranceUnverified', '@test_report', '@Insurance'], + testData: insuranceUnverifiedData +}, undefined, 'InsuranceUnverified'); +insuranceUnverifiedTests.push(tc); + +export default insuranceUnverifiedTests; \ No newline at end of file From 896174056046757b03f7243ee6fab97532939745 Mon Sep 17 00:00:00 2001 From: JennyNou <167806377+JennyNou@users.noreply.github.com> Date: Mon, 9 Jun 2025 15:24:58 -0400 Subject: [PATCH 52/63] Changed policy deductible type to cover unverified coverage text --- playwright-tests/business-logic/types/CustomerDetails.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/playwright-tests/business-logic/types/CustomerDetails.ts b/playwright-tests/business-logic/types/CustomerDetails.ts index 3ac2747a0..3c1f9841d 100644 --- a/playwright-tests/business-logic/types/CustomerDetails.ts +++ b/playwright-tests/business-logic/types/CustomerDetails.ts @@ -61,7 +61,7 @@ export interface IPaymentDetails { export interface IClaimDetails { client: string, policyNumber: string, - policyDeductible: number, + policyDeductible: any, policyZip?: string damageDate: string, damageCause: DamageCause From ca41375b3c257d489373c3c85392a17f44f70d68 Mon Sep 17 00:00:00 2001 From: JennyNou <167806377+JennyNou@users.noreply.github.com> Date: Mon, 9 Jun 2025 15:25:23 -0400 Subject: [PATCH 53/63] Added unverified policy flag --- playwright-tests/business-logic/types/ITestData.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/playwright-tests/business-logic/types/ITestData.ts b/playwright-tests/business-logic/types/ITestData.ts index ec616fb83..f9d776224 100644 --- a/playwright-tests/business-logic/types/ITestData.ts +++ b/playwright-tests/business-logic/types/ITestData.ts @@ -34,5 +34,6 @@ export interface ITestData { canNotRecal: boolean, dynamicRecal: boolean, promoCode: string, - policyZip: string + policyZip: string, + isPolicyUnverified: boolean } \ No newline at end of file From 514fdca340116908c8e8e8a7d6b8cadbf7871f1b Mon Sep 17 00:00:00 2001 From: JennyNou <167806377+JennyNou@users.noreply.github.com> Date: Mon, 9 Jun 2025 15:26:20 -0400 Subject: [PATCH 54/63] Updated locator and logic for unverified policy flow --- playwright-tests/pages/CoverageStatementPage.ts | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/playwright-tests/pages/CoverageStatementPage.ts b/playwright-tests/pages/CoverageStatementPage.ts index 7085c6794..b529f21f1 100644 --- a/playwright-tests/pages/CoverageStatementPage.ts +++ b/playwright-tests/pages/CoverageStatementPage.ts @@ -9,7 +9,7 @@ export class CoverageStatementPage extends InsuranceBasePage { readonly scheduleOnlineButton: Locator; readonly cancelMyClaimButton: Locator; readonly deductibleAmount: Locator; - readonly verfiyingCoverageText: Locator; + readonly verifyingCoverageText: Locator; readonly continueButton: Locator; // For ITAC/NoComp url = process.env['BASE_URL']! + '/FixMyGlass/CoverageStatement.aspx'; @@ -19,7 +19,7 @@ export class CoverageStatementPage extends InsuranceBasePage { this.scheduleOnlineButton = this.page.getByText('Continue to schedule online'); this.cancelMyClaimButton = this.page.getByText('Cancel my claim'); this.deductibleAmount = this.page.getByRole('heading', { name: '$' }).locator('span'); - this.verfiyingCoverageText = this.page.getByRole('heading', { name: 'We’re verifying your coverage' }); + this.verifyingCoverageText = this.page.getByRole('heading', { name: 'We\'re verifying your coverage' }); this.continueButton = page.getByRole('button', { name: 'Continue' }); // this.validateURL(this.url); } @@ -46,16 +46,20 @@ export class CoverageStatementPage extends InsuranceBasePage { "span.deductible-text-black[data-bind='text: deductibleFormatted']" ); + const unverifiedDeductibleElement = this.verifyingCoverageText; + // Check if the locator is visible before running the expectation if (await deductibleElement.isVisible()) { // Check if the page contains the properly formatted deductible amount await expect(deductibleElement).toContainText(`$${expectedDeductibleRegex}`); } - } - async validateUnverifiedText(){ - await expect(this.verfiyingCoverageText).toBeEnabled(); + if (await unverifiedDeductibleElement.isVisible()) { + // Click on continue button if unverified header is visible + await this.continueButton.click(); + } } + @step("CoverageStatementPage >> Next page: ") async handleCoverageStatementPage(testData: Partial) { From bc591b07bd9ffaaf263472d415d82c8a15c6da86 Mon Sep 17 00:00:00 2001 From: JennyNou <167806377+JennyNou@users.noreply.github.com> Date: Mon, 9 Jun 2025 15:28:00 -0400 Subject: [PATCH 55/63] Added logic for validating unverified flow --- .../pages/OrderConfirmationPage.ts | 34 +++++-------------- 1 file changed, 8 insertions(+), 26 deletions(-) diff --git a/playwright-tests/pages/OrderConfirmationPage.ts b/playwright-tests/pages/OrderConfirmationPage.ts index 588ecb196..489ed1678 100644 --- a/playwright-tests/pages/OrderConfirmationPage.ts +++ b/playwright-tests/pages/OrderConfirmationPage.ts @@ -33,7 +33,7 @@ export class OrderConfirmationPage extends BasePage { this.apptDateText = this.page.locator('[class="scheduleText"]'); this.amountDueText = this.page.getByLabel('expand cart'); this.viewCartButton = this.page.locator('#cart-dropdown-head'); - this.deductibleText = this.page.locator('#deductible-value'); + this.deductibleText = this.page.locator('.deductible'); this.subtotalText = this.page.locator('.sub-total'); this.finalAmountDue = this.page.locator('div.amount-due'); this.cartServicePackageText = this.cartServicePackageText = this.page.locator('.cart-panel'); @@ -44,7 +44,7 @@ export class OrderConfirmationPage extends BasePage { async validateOrderConfirmationPage(testData: Partial) { // Destructure data we use const { vehicleDetails, customerDetails, servicePackage, promoCode, - isPolicyFound, claimDetails, paymentDetails, isUseVehicleOnPolicy, paymentMethod } = testData; + isPolicyFound, claimDetails, paymentDetails, isUseVehicleOnPolicy, paymentMethod, isPolicyUnverified } = testData; await this.serviceText.waitFor({ state: "visible" }); expect.soft((await this.getActualAppointmentSummary()).map(item => item.toLowerCase())).toEqual((await this.getExpectedAppointmentSummary(testData)).map(item => item.toLowerCase())); @@ -87,6 +87,7 @@ export class OrderConfirmationPage extends BasePage { const finalAmountDueAmt = Number.parseFloat(finalAmountDueValue!.split('$')[1].replaceAll(',', '')); + expect.soft(subtotalAmt).toBeGreaterThan(0); // expect.soft(deductibleAmt).toEqual(0); @@ -94,36 +95,17 @@ export class OrderConfirmationPage extends BasePage { // Verify amount due > 0 expect.soft(amountDueAmt).toBeGreaterThan(0); expect.soft(finalAmountDueAmt).toBeGreaterThan(0); + + if (isPolicyUnverified && PaymentType.PayWithInsurance){ + expect.soft(finalAmountDueAmt).toContain('Verifying coverage') + } } else { // Verify amount due 0 expect.soft(amountDueAmt).toEqual(0); expect.soft(finalAmountDueAmt).toEqual(0); } - } else { - // Price validations for insurance users - if (servicePackage === ServicePackage.GlassOnly) { - expect.soft(servicePackageAmt).toEqual(claimDetails?.policyDeductible); - } else { - expect.soft(servicePackageAmt).toBeGreaterThan(0); - } - - // Check for either "Verifying coverage" or "0.00" in price fields - expect.soft( - amountDueValue?.includes('Verifying coverage') || - amountDueValue?.includes('0.00') - ).toBeTruthy(); - - expect.soft( - subtotalTextValue?.includes('Verifying coverage') || - subtotalTextValue?.includes('0.00') - ).toBeTruthy(); - - expect.soft( - finalAmountDueValue?.includes('Verifying coverage') || - finalAmountDueValue?.includes('0.00') - ).toBeTruthy(); - } } +} async getFormattedAppointmentDate(appointmentDate: string) { From c95772052acbea0fa4c00c3eee51964848522980 Mon Sep 17 00:00:00 2001 From: JennyNou <167806377+JennyNou@users.noreply.github.com> Date: Mon, 9 Jun 2025 15:29:06 -0400 Subject: [PATCH 56/63] Added unverified insurance test to master file --- playwright-tests/tests/0000__M.test.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/playwright-tests/tests/0000__M.test.ts b/playwright-tests/tests/0000__M.test.ts index e09acec35..709e288ff 100644 --- a/playwright-tests/tests/0000__M.test.ts +++ b/playwright-tests/tests/0000__M.test.ts @@ -32,6 +32,7 @@ import cashRepairInShopPayPalTests from "./CashRepairInShopPayPal"; import cashReplaceMultiSlidingGlassDropoffTests from "./CashReplaceMultiSlidingGlassDropoff"; import cashReplaceMultiGlassMobileTests from "./CashReplaceMultiGlassMobile"; import insuranceBigTruckVerifiedTests from "./InsuranceBigTruckVerified"; +import insuranceUnverifiedTests from "./InsuranceUnverified"; /** * Master Test Runner @@ -69,6 +70,7 @@ const allStandardTests = [ {name: "InsuranceAcuityPaypal", tests: insuranceAcuityPaypalTests}, {name: "InsuranceITAC21stCentury", tests: insuranceITAC21stCenturyTests}, {name: "InsuranceBigTruckVerified", tests: insuranceBigTruckVerifiedTests}, + {name: "InsuranceUnverified", tests: insuranceUnverifiedTests}, // {name: "InsuranceGeico", tests: insuranceGeicoTests}, // {name: "InsuranceITACOptimizedPriceValidationAllState", tests: insuranceITACOptimizedPriceValidationAllStateTests} From 2da134bbb119e131bca7fc31e2ebe4baaa440d55 Mon Sep 17 00:00:00 2001 From: maguire-arman Date: Tue, 10 Jun 2025 12:48:44 -0400 Subject: [PATCH 57/63] removes recalinfo boolean and uses isRecalVehicle for handling page in ins Updates the `isRecalNotification` flag to `isRecalVehicle` for better clarity and consistency across the codebase. This change ensures that the flag's name accurately reflects its purpose: to indicate whether recalibration information for a vehicle is required. --- playwright-tests/business-logic/types/ITestData.ts | 1 - playwright-tests/tests/0000__M.test.ts | 4 ++-- playwright-tests/tests/InsuranceITAC21stCentury.ts | 2 +- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/playwright-tests/business-logic/types/ITestData.ts b/playwright-tests/business-logic/types/ITestData.ts index 76d0e4534..7ae8090df 100644 --- a/playwright-tests/business-logic/types/ITestData.ts +++ b/playwright-tests/business-logic/types/ITestData.ts @@ -25,7 +25,6 @@ export interface ITestData { isPolicyFound: boolean, otherVehiclesOnPolicy: IVehicleDetails[], // IF defined, we validate that the vehicles are present. isUseVehicleOnPolicy: boolean, // Should we use the vehicle on the policy? - isRecalNotification: boolean, // Does Recalibration Information page show up? endorsements: IEndorsementDetails[], hasOemEndorsement: boolean, // OEM Endorsement does not appear on endorsements page, so it has a separate flag.s skipEstimatePage: boolean, diff --git a/playwright-tests/tests/0000__M.test.ts b/playwright-tests/tests/0000__M.test.ts index b51c8dd5e..51594cd19 100644 --- a/playwright-tests/tests/0000__M.test.ts +++ b/playwright-tests/tests/0000__M.test.ts @@ -296,7 +296,7 @@ async function runWorkflow(page: Page, testCase: TestCase) { } export async function handleInsuranceFlow(testCase: TestCase) { - const { isPolicyFound, isPolicyDriver, endorsements, isRecalNotification } = testCase.testData; + const { isPolicyFound, isPolicyDriver, endorsements, isRecalVehicle } = testCase.testData; // Check if the insurance policy has endorsements const hasEndorsements = endorsements && endorsements.length > 0; @@ -340,7 +340,7 @@ export async function handleInsuranceFlow(testCase: TestCase) { let policyInfoSubmittedPage = testCase.pages.policyInfoSubmittedPage; await policyInfoSubmittedPage.handlePolicyInfoSubmittedPage(); - if(isRecalNotification) + if(isRecalVehicle) { let recalibrationInfoPage = testCase.pages.recalibrationInfoPage; await recalibrationInfoPage.handleRecalibrationInfoPage(); diff --git a/playwright-tests/tests/InsuranceITAC21stCentury.ts b/playwright-tests/tests/InsuranceITAC21stCentury.ts index 70ce6b528..b97efd31c 100644 --- a/playwright-tests/tests/InsuranceITAC21stCentury.ts +++ b/playwright-tests/tests/InsuranceITAC21stCentury.ts @@ -19,7 +19,7 @@ const insuranceITAC21stCenturyData: Partial = { isDuplicateClaim: true, isPolicyFound: true, isUseVehicleOnPolicy: true, - isRecalNotification: true, // Special flag for recalibration notification + isRecalVehicle: true, // Special flag for recalibration notification // Override customer details for California location customerDetails: { From 31976f132b6a4b6741817f4aaf0b6ee063af982a Mon Sep 17 00:00:00 2001 From: Bryan Mauger Date: Tue, 10 Jun 2025 13:41:18 -0400 Subject: [PATCH 58/63] CASH-926 move FL donation to other location in cart. --- src/fmg-components/cart/cart.vue | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/fmg-components/cart/cart.vue b/src/fmg-components/cart/cart.vue index 2a715bc93..590fd0857 100644 --- a/src/fmg-components/cart/cart.vue +++ b/src/fmg-components/cart/cart.vue @@ -117,6 +117,10 @@ {{ amountPaidText }} {{ getLineItemAmount(amountPaid) }}
+
+ {{ donationCartItemName }} + {{ getLineItemAmount(donationCartItem.subTotal) }} +
{{ amountDueText }} {{ getLineItemAmount(amountDue, showCoverageAsPending) }} @@ -472,10 +476,6 @@ export default { }); } - if (this.donationCartItem) { - cartItems.push(this.donationCartItem); - } - return cartItems; }, }, From 380994e0766c7f0abf0214dde62e8df9457a5a99 Mon Sep 17 00:00:00 2001 From: maguire-arman Date: Tue, 10 Jun 2025 14:34:00 -0400 Subject: [PATCH 59/63] Removes unused isRecalNotification flag Removes the `isRecalNotification` flag from the default test data, as it's no longer used in the application's logic or tests. This simplifies the test data and avoids potential confusion. --- playwright-tests/business-logic/constants/DefaultTestData.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/playwright-tests/business-logic/constants/DefaultTestData.ts b/playwright-tests/business-logic/constants/DefaultTestData.ts index 197297b4b..a5929ce76 100644 --- a/playwright-tests/business-logic/constants/DefaultTestData.ts +++ b/playwright-tests/business-logic/constants/DefaultTestData.ts @@ -97,7 +97,6 @@ export function getDefaultTestData(): Partial { isPolicyDriver: false, isPolicyFound: false, isUseVehicleOnPolicy: true, - isRecalNotification: false, hasOemEndorsement: false, skipEstimatePage: false, isRecalVehicle: false, From 552119a04b7a8b3e7fa1701354350b4c16956739 Mon Sep 17 00:00:00 2001 From: Bryan Mauger Date: Fri, 13 Jun 2025 10:22:12 -0400 Subject: [PATCH 60/63] CASH-926 update donation cart styles. --- src/fmg-components/cart/cart.vue | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/fmg-components/cart/cart.vue b/src/fmg-components/cart/cart.vue index 590fd0857..299941c29 100644 --- a/src/fmg-components/cart/cart.vue +++ b/src/fmg-components/cart/cart.vue @@ -1309,12 +1309,14 @@ export default { .sub-total, .sales-tax, .amount-due, - .amount-paid { - font-weight: 500; + .amount-paid, + .donation-amount { + font-family: UrbanistSemibold, AvertaSemibold;//Okay to remove AvertaSemibold after 2025.06.19 release color: $black; } .sub-total { border-top: 1px solid $green; + background-color: $green-100; } .service-type, .deductible { From cad23ad9eb438bf5fc3cf1db7ae84d255bdc7c8a Mon Sep 17 00:00:00 2001 From: Bryan Mauger Date: Fri, 13 Jun 2025 10:37:35 -0400 Subject: [PATCH 61/63] Formate code. --- src/fmg-components/cart/cart.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/fmg-components/cart/cart.vue b/src/fmg-components/cart/cart.vue index 299941c29..dacfb4c34 100644 --- a/src/fmg-components/cart/cart.vue +++ b/src/fmg-components/cart/cart.vue @@ -1311,7 +1311,7 @@ export default { .amount-due, .amount-paid, .donation-amount { - font-family: UrbanistSemibold, AvertaSemibold;//Okay to remove AvertaSemibold after 2025.06.19 release + font-family: UrbanistSemibold, AvertaSemibold; //Okay to remove AvertaSemibold after 2025.06.19 release color: $black; } .sub-total { From ca4b3e5cd31fcaf8473474f968424a285c1a29d3 Mon Sep 17 00:00:00 2001 From: Bryan Mauger Date: Fri, 13 Jun 2025 10:54:26 -0400 Subject: [PATCH 62/63] Small change to trigger build. --- src/fmg-components/cart/cart.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/fmg-components/cart/cart.vue b/src/fmg-components/cart/cart.vue index dacfb4c34..643bc7ed4 100644 --- a/src/fmg-components/cart/cart.vue +++ b/src/fmg-components/cart/cart.vue @@ -1311,7 +1311,7 @@ export default { .amount-due, .amount-paid, .donation-amount { - font-family: UrbanistSemibold, AvertaSemibold; //Okay to remove AvertaSemibold after 2025.06.19 release + font-family: UrbanistSemibold, AvertaSemibold; //Okay to remove AvertaSemibold after 2025.06.19 merge/release color: $black; } .sub-total { From 58df1d5b75ba605fd2acea0a013d318a67feb4ac Mon Sep 17 00:00:00 2001 From: Scott Kiener Date: Fri, 13 Jun 2025 11:04:00 -0400 Subject: [PATCH 63/63] CASH-926 | Prettier fix --- src/fmg-components/cart/cart.vue | 3 ++- src/styles/ux-variables.scss | 7 +++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/fmg-components/cart/cart.vue b/src/fmg-components/cart/cart.vue index 643bc7ed4..ef3e0300c 100644 --- a/src/fmg-components/cart/cart.vue +++ b/src/fmg-components/cart/cart.vue @@ -1311,7 +1311,8 @@ export default { .amount-due, .amount-paid, .donation-amount { - font-family: UrbanistSemibold, AvertaSemibold; //Okay to remove AvertaSemibold after 2025.06.19 merge/release + font-family: + UrbanistSemibold, AvertaSemibold; //Okay to remove AvertaSemibold after 2025.06.19 merge/release color: $black; } .sub-total { diff --git a/src/styles/ux-variables.scss b/src/styles/ux-variables.scss index 1f17a6cf1..9acab9499 100644 --- a/src/styles/ux-variables.scss +++ b/src/styles/ux-variables.scss @@ -121,8 +121,8 @@ $body-color: $gray-600; //Fonts $font-family-sans-serif: AvertaRegular, Arial, Helvetica, sans-serif; -$font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", - monospace; +$font-family-monospace: + SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; // stylelint-enable value-keyword-case $font-family-base: $font-family-sans-serif; $font-family-code: $font-family-monospace; @@ -170,8 +170,7 @@ $spacers: ( /* 16px */ 5: $spacer * 1.5, /* 24px */ 6: $spacer * 2, /* 32px */ 7: $spacer * 2.5, - /* 40px */ 8: $spacer * 3, - /* 48px */ + /* 40px */ 8: $spacer * 3 /* 48px */, ); //Enable negative spacing (does NOT work on padding)