diff --git a/src/constants/store-mutations.js b/src/constants/store-mutations.js index 0b0338fef..2d4e0b4e7 100644 --- a/src/constants/store-mutations.js +++ b/src/constants/store-mutations.js @@ -49,6 +49,7 @@ const storeMutations = { UPDATE_BILL_TO_ACCT_NUMBER: "updateBillToAcctNumber", UPDATE_EON: "updateEON", UPDATE_IS_INSURANCE: "updateIsInsurance", + UPDATE_IS_VERIFIED_INSURANCE: "updateInsuranceVerifiedStatus", UPDATE_SAVED_SESSION_ID: "updateSavedSessionId", UPDATE_CRM_CUSTOMER_ID: "updateCrmCustomerId", UPDATE_IS_PIA: "updateIsPia", diff --git a/src/fmg-components/cart/cart.vue b/src/fmg-components/cart/cart.vue index d9d399921..ebbaf530b 100644 --- a/src/fmg-components/cart/cart.vue +++ b/src/fmg-components/cart/cart.vue @@ -33,9 +33,10 @@ :key="i" class="packaged-cart-item"> {{ cartItem.name - }} + >{{ + cartItem.name + }}
- Promo code {{ promoCode }} applied + Promo code {{ promoCode }} applied +
@@ -145,6 +149,7 @@ export default { damage: Object, servicePackageOptionsCmsName: String, availableVaps: Object, + pageName: String, allowItemRemoval: Boolean, recyclingModalCmsWidgetName: String, showAsPaid: Boolean, @@ -917,6 +922,9 @@ export default { &:last-child { justify-content: flex-end; } + &.promo { + text-transform: uppercase; + } } a { font-size: 0.875rem; @@ -1003,13 +1011,18 @@ export default { text-decoration: none; } } - .applied-promo { + .applied-promo-tag { span { color: $green-700; font-weight: 500; padding: 2px 8px; background-color: $green-100; border-radius: 12px; + + &.promo-code { + text-transform: uppercase; + padding: 0; + } } } } diff --git a/src/fmg-components/promo-modal-question/promo-modal-question.vue b/src/fmg-components/promo-modal-question/promo-modal-question.vue index dd64321bb..59e4fccf4 100644 --- a/src/fmg-components/promo-modal-question/promo-modal-question.vue +++ b/src/fmg-components/promo-modal-question/promo-modal-question.vue @@ -51,7 +51,9 @@ alertClass="alert-danger" v-bind:isDismissible="false" />
- Promo code "{{ promoCode }}" applied + Promo code {{ promoCode }} applied + vehicle-damage + // quote -> vin-lookup/estimate + // insurance-company -> vin-lookup/estimate + if (store.getters.payment.insuranceCoverage.isVerified) { + if (fmgPageValue === fmgPageValues.VEHICLE) { + return fmgPageValues.VEHICLE_DAMAGE; + } + + if ( + fmgPageValue === fmgPageValues.QUOTE || + fmgPageValue === fmgPageValues.INSURANCE_COMPANY + ) { + const skipVin = await skipVinLookup(); + + if (skipVin) { + return fmgPageValues.ESTIMATE; + } else { + return fmgPageValues.VIN_LOOKUP; + } } } - // If the user is coming in via the Safelite.Com CTA - if (toRoute.query[queryStrings.START_TYPE] === "fmg") { - const latestPageRoute = await getLatestPageForRedirection(); - return latestPageRoute; - } + // Otherwise, respect navigation from query string. + return fmgPageValue; +} - // If navigating to a specific page, and that page is not part of the vin pages. - // Return that page, so that it can navigate like normal. - if (toRoute.query[queryStrings.FMG_PAGE] !== undefined && !isVinRelatedPage(toRoute)) { - return overrideYmmsDirectionIfNeeded(toRoute); - } +/* + * Determine which page in the flow the user should be sent to, based on their current order. + * General strategy: run through pages in reverse order, and select first where prerequisites are valid. + * QUOTE is the latest page to send to. + */ +export async function getImplicitNavigation(toRoute) { + const vehicleDamageComponent = await getLazyLoadedComponent(fmgPageValues.VEHICLE_DAMAGE); + const estimateComponent = await getLazyLoadedComponent(fmgPageValues.ESTIMATE); + const vinLookupComponent = await getLazyLoadedComponent(fmgPageValues.VIN_LOOKUP); + const partQuestionsComponent = await getLazyLoadedComponent(fmgPageValues.PART_QUESTIONS); + const vehiclePartsComponent = await getLazyLoadedComponent(fmgPageValues.VEHICLE_PARTS); + const moldingQuestionsComponent = await getLazyLoadedComponent(fmgPageValues.MOLDING_QUESTIONS); + const capabilityQuestionsComponent = await getLazyLoadedComponent( + fmgPageValues.CAPABILITY_QUESTIONS + ); + const quoteComponent = await getLazyLoadedComponent(fmgPageValues.QUOTE); - // If this is not a direct link to a page using fmgPage, not from Safelite.com CTA or this is a vin related page. - // Get the latest page for redirection. - const latestPageRoute = await getLatestPageForRedirection(); - return latestPageRoute; + const skipVin = await skipVinLookup(); + + if (quoteComponent.methods.arePagePrerequisitesValid()) { + // Do not send to quote if verified insurance user. + if (store.getters.payment.insuranceCoverage.isVerified) { + return fmgPageValues.HERITAGE; + } else { + return fmgPageValues.QUOTE; + } + } else if (capabilityQuestionsComponent.methods.arePagePrerequisitesValid()) { + return fmgPageValues.CAPABILITY_QUESTIONS; + } else if (moldingQuestionsComponent.methods.arePagePrerequisitesValid()) { + return fmgPageValues.MOLDING_QUESTIONS; + } else if (vehiclePartsComponent.methods.arePagePrerequisitesValid()) { + return fmgPageValues.VEHICLE_PARTS; + } else if (partQuestionsComponent.methods.arePagePrerequisitesValid()) { + return fmgPageValues.PART_QUESTIONS; + } else if (vinLookupComponent.methods.arePagePrerequisitesValid() && !skipVin) { + return fmgPageValues.VIN_LOOKUP; + } else if (estimateComponent.methods.arePagePrerequisitesValid()) { + return fmgPageValues.ESTIMATE; + } else if (vehicleDamageComponent.methods.arePagePrerequisitesValid()) { + return fmgPageValues.VEHICLE_DAMAGE; + } else { + return fmgPageValues.VEHICLE; + } } /* @@ -114,96 +169,6 @@ export async function skipVinLookupNotRepair() { ); } -/* - Logic for getting the last "valid" page a user visited. -*/ -async function getLatestPageForRedirection() { - // If this is a non-CTA navigation, determine where to send the user based on page prerequisites. - // This also works if a user has a 'fmg' start_type query string but no current order. - // That shouldn't happen, but it's possible. - const vehicleDamageComponent = await getLazyLoadedComponent(fmgPageValues.VEHICLE_DAMAGE); - const estimateComponent = await getLazyLoadedComponent(fmgPageValues.ESTIMATE); - const vinLookupComponent = await getLazyLoadedComponent(fmgPageValues.VIN_LOOKUP); - const partQuestionsComponent = await getLazyLoadedComponent(fmgPageValues.PART_QUESTIONS); - const vehiclePartsComponent = await getLazyLoadedComponent(fmgPageValues.VEHICLE_PARTS); - const moldingQuestionsComponent = await getLazyLoadedComponent(fmgPageValues.MOLDING_QUESTIONS); - const capabilityQuestionsComponent = await getLazyLoadedComponent( - fmgPageValues.CAPABILITY_QUESTIONS - ); - const quoteComponent = await getLazyLoadedComponent(fmgPageValues.QUOTE); - const serviceLocationComponent = await getLazyLoadedComponent(fmgPageValues.SERVICE_LOCATION); - const scheduleComponent = await getLazyLoadedComponent(fmgPageValues.SCHEDULE); - - const skipVin = await skipVinLookup(); - - if (!vehicleDamageComponent.methods.arePagePrerequisitesValid()) { - return fmgPageValues.VEHICLE; - } else if (!estimateComponent.methods.arePagePrerequisitesValid()) { - return fmgPageValues.VEHICLE_DAMAGE; - } else { - if (quoteComponent.methods.arePagePrerequisitesValid()) { - return fmgPageValues.QUOTE; - } else if (capabilityQuestionsComponent.methods.arePagePrerequisitesValid()) { - return fmgPageValues.CAPABILITY_QUESTIONS; - } else if (moldingQuestionsComponent.methods.arePagePrerequisitesValid()) { - return fmgPageValues.MOLDING_QUESTIONS; - } else if (vehiclePartsComponent.methods.arePagePrerequisitesValid()) { - return fmgPageValues.VEHICLE_PARTS; - } else if (partQuestionsComponent.methods.arePagePrerequisitesValid()) { - return fmgPageValues.PART_QUESTIONS; - } else if ( - // capture vin - vinLookupComponent.methods.arePagePrerequisitesValid() && - !skipVin - ) { - return fmgPageValues.VIN_LOOKUP; - } else { - // do not capture vin - return fmgPageValues.ESTIMATE; - } - } -} - -/* - Overrides functionality to go to the YMMS pages in certain cases. - If this is not one of the cases, it returns the 'to' fmgPage value. -*/ - -/* istanbul ignore next */ -function overrideYmmsDirectionIfNeeded(toRoute) { - const fmgPageValue = toRoute.query[queryStrings.FMG_PAGE]; - - if (store.getters.payment.insuranceCoverage.isVerified) { - switch (fmgPageValue) { - case fmgPageValues.VEHICLE: { - return fmgPageValues.VEHICLE_DAMAGE; - } - default: { - return fmgPageValue; - } - } - } else { - return fmgPageValue; - } -} - -/* - Determine if the page is a vin related page. -*/ - -/* istanbul ignore next */ -function isVinRelatedPage(toRoute) { - const fmgPageValue = toRoute.query[queryStrings.FMG_PAGE]; - - return ( - fmgPageValue === fmgPageValues.VIN_LOOKUP || - fmgPageValue === fmgPageValues.LICENSE_PLATE_LOOKUP || - fmgPageValue === fmgPageValues.ADDRESS_LOOKUP || - fmgPageValue === fmgPageValues.ADDRESS_VEHICLES || - fmgPageValue === fmgPageValues.ESTIMATE - ); -} - async function getLazyLoadedComponent(pageName) { return (await lazyLoadComponent(pageName)()).default; } diff --git a/src/helpers/heritage-integration/navigation-helper.spec.js b/src/helpers/heritage-integration/navigation-helper.spec.js index e0bd51b95..eedf8edf1 100644 --- a/src/helpers/heritage-integration/navigation-helper.spec.js +++ b/src/helpers/heritage-integration/navigation-helper.spec.js @@ -1,7 +1,4 @@ -import { - getPageToRouteExistingOrderTo, - navigateToHeritageFunnel, -} from "@/helpers/heritage-integration/navigation-helper"; +import * as navigationHelper from "@/helpers/heritage-integration/navigation-helper"; import * as orderHelper from "@/helpers/heritage-integration/order-helper"; import { lazyLoadComponent } from "@/router/dynamic-routing/component-loader.js"; import { storeActions } from "@/constants/store-actions"; @@ -11,236 +8,516 @@ import { externalUrls } from "@/router/router-constants/externalUrl-values"; import { queryStrings } from "@/constants/query-strings"; import { fmgPageValues } from "@/router/router-constants/fmgPage-values"; +import { damageLocationsSelected as glassLocations } from "@/constants/damage-locations-selected"; + import store from "@/store"; import router from "@/router"; +const getPageToRouteExistingOrderTo = navigationHelper.getPageToRouteExistingOrderTo; +const navigateToHeritageFunnel = navigationHelper.navigateToHeritageFunnel; + // Mock Lazy Load jest.mock("@/router/dynamic-routing/component-loader.js", () => ({ lazyLoadComponent: jest.fn(), })); describe("getPageToRouteExistingOrderTo", () => { - test("should return vehicle", async () => { - // Arrange - const toRoute = { - query: {}, - }; - - store.commit(storeMutations.UPDATE_IS_REPAIR, false); - store.commit(storeMutations.UPDATE_MAKE, "acura"); - - // Mock out the lazy load calls for all components. - mockLazyLoadComponentReturnValues({ - [fmgPageValues.VEHICLE]: true, - [fmgPageValues.VEHICLE_DAMAGE]: false, - }); - - // Act - const result = await getPageToRouteExistingOrderTo(toRoute); - - //Assert - expect(result).toBe(fmgPageValues.VEHICLE); - }); - - test("should return vehicle-damage", async () => { - // Arrange - const toRoute = { - query: {}, - }; - - store.commit(storeMutations.UPDATE_IS_REPAIR, false); - store.commit(storeMutations.UPDATE_MAKE, "acura"); - - // Mock out the lazy load calls for all components. - mockLazyLoadComponentReturnValues({ - [fmgPageValues.VEHICLE]: true, - [fmgPageValues.VEHICLE_DAMAGE]: true, - [fmgPageValues.ESTIMATE]: false, - }); - - // Act - const result = await getPageToRouteExistingOrderTo(toRoute); - - //Assert - expect(result).toBe(fmgPageValues.VEHICLE_DAMAGE); - }); - - test("user has YMMS and no vehicle questions > should return estimate", async () => { - // Arrange - const toRoute = { - query: {}, - }; - - store.commit(storeMutations.UPDATE_IS_REPAIR, false); - store.commit(storeMutations.UPDATE_MAKE, "acura"); - - const mockExperimentsList = [ - { - universeName: "ConceptFunnel", - settings: { - SuppressVinCapture: false, + describe("Explicit vs. Implicit Routing", () => { + test("Should call explicit routing if `fmgPage` parameter is present in query", async () => { + // Arrange + const toRoute = { + query: { + fmgPage: "schedule", }, - }, - ]; - store.commit(storeMutations.UPDATE_EXPERIMENTS, mockExperimentsList); + }; - // Mock out the lazy load calls for all components. - mockLazyLoadComponentReturnValues({ - [fmgPageValues.VEHICLE]: true, - [fmgPageValues.VEHICLE_DAMAGE]: true, - [fmgPageValues.ESTIMATE]: true, - [fmgPageValues.CAPABILITY_QUESTIONS]: false, - [fmgPageValues.MOLDING_QUESTIONS]: false, - [fmgPageValues.VEHICLE_PARTS]: false, - [fmgPageValues.PART_QUESTIONS]: false, - [fmgPageValues.VIN_LOOKUP]: true, + mockLazyLoadComponentReturnValues(); + + // Act + const result = await getPageToRouteExistingOrderTo(toRoute); + + // Assert + // If direct, should be "schedule". + // Otherwise, not. + expect(result).toBe("schedule"); }); - // Act - const result = await getPageToRouteExistingOrderTo(toRoute); + test("Should call implicit routing if `fmgPage` parameter is NOT present in query", async () => { + // Arrange + const toRoute = { + query: {}, + }; - //Assert - expect(result).toBe(fmgPageValues.ESTIMATE); + mockLazyLoadComponentReturnValues(); + + // Act + const result = await getPageToRouteExistingOrderTo(toRoute); + + // Assert + // If direct, should be "schedule". + // Otherwise, not. + expect(result).not.toBe("schedule"); + }); }); - test("user has YMMS but no questions or carId > should return estimate", async () => { - // Arrange - const toRoute = { - query: {}, - }; + describe("Implicit Routing", () => { + test("should return vehicle", async () => { + // Arrange + const toRoute = { + query: {}, + }; - store.commit(storeMutations.UPDATE_IS_REPAIR, false); - store.commit(storeMutations.UPDATE_MAKE, "acura"); + store.commit(storeMutations.UPDATE_IS_REPAIR, false); + store.commit(storeMutations.UPDATE_MAKE, "acura"); - // Mock out the lazy load calls for all components. - mockLazyLoadComponentReturnValues({ - [fmgPageValues.VEHICLE]: true, - [fmgPageValues.VEHICLE_DAMAGE]: true, - [fmgPageValues.ESTIMATE]: true, - [fmgPageValues.CAPABILITY_QUESTIONS]: false, - [fmgPageValues.MOLDING_QUESTIONS]: false, - [fmgPageValues.VEHICLE_PARTS]: false, - [fmgPageValues.PART_QUESTIONS]: false, - [fmgPageValues.VIN_LOOKUP]: false, + // Mock out the lazy load calls for all components. + mockLazyLoadComponentReturnValues({ + [fmgPageValues.VEHICLE]: true, + [fmgPageValues.VEHICLE_DAMAGE]: false, + }); + + // Act + const result = await getPageToRouteExistingOrderTo(toRoute); + + //Assert + expect(result).toBe(fmgPageValues.VEHICLE); }); - // Act - const result = await getPageToRouteExistingOrderTo(toRoute); + test("should return vehicle-damage", async () => { + // Arrange + const toRoute = { + query: {}, + }; - //Assert - expect(result).toBe(fmgPageValues.ESTIMATE); + store.commit(storeMutations.UPDATE_IS_REPAIR, false); + store.commit(storeMutations.UPDATE_MAKE, "acura"); + + // Mock out the lazy load calls for all components. + mockLazyLoadComponentReturnValues({ + [fmgPageValues.VEHICLE]: true, + [fmgPageValues.VEHICLE_DAMAGE]: true, + [fmgPageValues.ESTIMATE]: false, + }); + + // Act + const result = await getPageToRouteExistingOrderTo(toRoute); + + //Assert + expect(result).toBe(fmgPageValues.VEHICLE_DAMAGE); + }); + + test("user has YMMS and no vehicle questions > should return estimate", async () => { + // Arrange + const toRoute = { + query: {}, + }; + + store.commit(storeMutations.UPDATE_IS_REPAIR, false); + store.commit(storeMutations.UPDATE_MAKE, "acura"); + + const mockExperimentsList = [ + { + universeName: "ConceptFunnel", + settings: { + SuppressVinCapture: false, + }, + }, + ]; + store.commit(storeMutations.UPDATE_EXPERIMENTS, mockExperimentsList); + + // Mock out the lazy load calls for all components. + mockLazyLoadComponentReturnValues({ + [fmgPageValues.VEHICLE]: true, + [fmgPageValues.VEHICLE_DAMAGE]: true, + [fmgPageValues.ESTIMATE]: true, + [fmgPageValues.CAPABILITY_QUESTIONS]: false, + [fmgPageValues.MOLDING_QUESTIONS]: false, + [fmgPageValues.VEHICLE_PARTS]: false, + [fmgPageValues.PART_QUESTIONS]: false, + [fmgPageValues.VIN_LOOKUP]: true, + }); + + // Act + const result = await getPageToRouteExistingOrderTo(toRoute); + + //Assert + expect(result).toBe(fmgPageValues.ESTIMATE); + }); + + test("user has YMMS but no questions or carId > should return estimate", async () => { + // Arrange + const toRoute = { + query: {}, + }; + + store.commit(storeMutations.UPDATE_IS_REPAIR, false); + store.commit(storeMutations.UPDATE_MAKE, "acura"); + + // Mock out the lazy load calls for all components. + mockLazyLoadComponentReturnValues({ + [fmgPageValues.VEHICLE]: true, + [fmgPageValues.VEHICLE_DAMAGE]: true, + [fmgPageValues.ESTIMATE]: true, + [fmgPageValues.CAPABILITY_QUESTIONS]: false, + [fmgPageValues.MOLDING_QUESTIONS]: false, + [fmgPageValues.VEHICLE_PARTS]: false, + [fmgPageValues.PART_QUESTIONS]: false, + [fmgPageValues.VIN_LOOKUP]: false, + }); + + // Act + const result = await getPageToRouteExistingOrderTo(toRoute); + + //Assert + expect(result).toBe(fmgPageValues.ESTIMATE); + }); + + test("user has capability questions and molding questions > should return capability questions", async () => { + // Arrange + const toRoute = { + query: {}, + }; + + store.commit(storeMutations.UPDATE_IS_REPAIR, false); + store.commit(storeMutations.UPDATE_MAKE, "acura"); + + // Mock out the lazy load calls for all components. + mockLazyLoadComponentReturnValues({ + [fmgPageValues.VEHICLE]: true, + [fmgPageValues.VEHICLE_DAMAGE]: true, + [fmgPageValues.ESTIMATE]: true, + [fmgPageValues.CAPABILITY_QUESTIONS]: true, + [fmgPageValues.MOLDING_QUESTIONS]: true, + [fmgPageValues.VEHICLE_PARTS]: false, + [fmgPageValues.PART_QUESTIONS]: false, + [fmgPageValues.VIN_LOOKUP]: false, + }); + + // Act + const result = await getPageToRouteExistingOrderTo(toRoute); + + //Assert + expect(result).toBe(fmgPageValues.CAPABILITY_QUESTIONS); + }); + + test("user has molding questions and part questions > should return molding questions", async () => { + // Arrange + const toRoute = { + query: {}, + }; + + store.commit(storeMutations.UPDATE_IS_REPAIR, false); + store.commit(storeMutations.UPDATE_MAKE, "acura"); + + // Mock out the lazy load calls for all components. + mockLazyLoadComponentReturnValues({ + [fmgPageValues.VEHICLE]: true, + [fmgPageValues.VEHICLE_DAMAGE]: true, + [fmgPageValues.ESTIMATE]: true, + [fmgPageValues.CAPABILITY_QUESTIONS]: false, + [fmgPageValues.MOLDING_QUESTIONS]: true, + [fmgPageValues.VEHICLE_PARTS]: false, + [fmgPageValues.PART_QUESTIONS]: true, + [fmgPageValues.VIN_LOOKUP]: false, + }); + + // Act + const result = await getPageToRouteExistingOrderTo(toRoute); + + //Assert + expect(result).toBe(fmgPageValues.MOLDING_QUESTIONS); + }); + + test("user has vehicle parts questions > should return vehicle-parts", async () => { + // Arrange + const toRoute = { + query: {}, + }; + + store.commit(storeMutations.UPDATE_IS_REPAIR, false); + store.commit(storeMutations.UPDATE_MAKE, "acura"); + + // Mock out the lazy load calls for all components. + mockLazyLoadComponentReturnValues({ + [fmgPageValues.VEHICLE]: true, + [fmgPageValues.VEHICLE_DAMAGE]: true, + [fmgPageValues.ESTIMATE]: true, + [fmgPageValues.CAPABILITY_QUESTIONS]: false, + [fmgPageValues.MOLDING_QUESTIONS]: false, + [fmgPageValues.VEHICLE_PARTS]: true, + [fmgPageValues.PART_QUESTIONS]: true, + [fmgPageValues.VIN_LOOKUP]: false, + }); + + // Act + const result = await getPageToRouteExistingOrderTo(toRoute); + + //Assert + expect(result).toBe(fmgPageValues.VEHICLE_PARTS); + }); + + test("user has part questions > should return part-questions", async () => { + // Arrange + const toRoute = { + query: {}, + }; + + store.commit(storeMutations.UPDATE_IS_REPAIR, false); + store.commit(storeMutations.UPDATE_MAKE, "acura"); + + // Mock out the lazy load calls for all components. + mockLazyLoadComponentReturnValues({ + [fmgPageValues.VEHICLE]: true, + [fmgPageValues.VEHICLE_DAMAGE]: true, + [fmgPageValues.ESTIMATE]: true, + [fmgPageValues.CAPABILITY_QUESTIONS]: false, + [fmgPageValues.MOLDING_QUESTIONS]: false, + [fmgPageValues.VEHICLE_PARTS]: false, + [fmgPageValues.PART_QUESTIONS]: true, + [fmgPageValues.VIN_LOOKUP]: false, + }); + + // Act + const result = await getPageToRouteExistingOrderTo(toRoute); + + //Assert + expect(result).toBe(fmgPageValues.PART_QUESTIONS); + }); + + test("should return quote, if not verified insurance", async () => { + // Arrange + const toRoute = { + query: {}, + }; + + store.commit(storeMutations.UPDATE_IS_REPAIR, false); + store.commit(storeMutations.UPDATE_MAKE, "acura"); + + // Mock out the lazy load calls for all components. + mockLazyLoadComponentReturnValues({ + [fmgPageValues.VEHICLE]: true, + [fmgPageValues.VEHICLE_DAMAGE]: true, + [fmgPageValues.ESTIMATE]: true, + [fmgPageValues.CAPABILITY_QUESTIONS]: false, + [fmgPageValues.MOLDING_QUESTIONS]: false, + [fmgPageValues.VEHICLE_PARTS]: false, + [fmgPageValues.PART_QUESTIONS]: true, + [fmgPageValues.VIN_LOOKUP]: false, + [fmgPageValues.QUOTE]: true, + }); + + // Act + const result = await getPageToRouteExistingOrderTo(toRoute); + + //Assert + expect(result).toBe(fmgPageValues.QUOTE); + }); + + test("should not return pages beyond quote even if prerequisites are met", async () => { + // Arrange + const toRoute = { + query: {}, + }; + + store.commit(storeMutations.UPDATE_IS_REPAIR, false); + store.commit(storeMutations.UPDATE_MAKE, "acura"); + + // Mock out the lazy load calls for all components. + mockLazyLoadComponentReturnValues({ + [fmgPageValues.VEHICLE]: true, + [fmgPageValues.VEHICLE_DAMAGE]: true, + [fmgPageValues.ESTIMATE]: true, + [fmgPageValues.CAPABILITY_QUESTIONS]: false, + [fmgPageValues.MOLDING_QUESTIONS]: false, + [fmgPageValues.VEHICLE_PARTS]: false, + [fmgPageValues.PART_QUESTIONS]: true, + [fmgPageValues.VIN_LOOKUP]: false, + [fmgPageValues.QUOTE]: true, + [fmgPageValues.SERVICE_LOCATION]: true, + [fmgPageValues.SCHEDULE]: true, + }); + + // Act + const result = await getPageToRouteExistingOrderTo(toRoute); + + //Assert + expect(result).toBe(fmgPageValues.QUOTE); + }); }); - test("user has capability questions and molding questions > should return capability questions", async () => { - // Arrange - const toRoute = { - query: {}, - }; + describe("Explicit Routing", () => { + test("Returns the value passed in in nominal case", async () => { + // Arrange + const toRoute = { + query: { + fmgPage: "testValue", + }, + }; - store.commit(storeMutations.UPDATE_IS_REPAIR, false); - store.commit(storeMutations.UPDATE_MAKE, "acura"); + // Act + const result = await getPageToRouteExistingOrderTo(toRoute); - // Mock out the lazy load calls for all components. - mockLazyLoadComponentReturnValues({ - [fmgPageValues.VEHICLE]: true, - [fmgPageValues.VEHICLE_DAMAGE]: true, - [fmgPageValues.ESTIMATE]: true, - [fmgPageValues.CAPABILITY_QUESTIONS]: true, - [fmgPageValues.MOLDING_QUESTIONS]: true, - [fmgPageValues.VEHICLE_PARTS]: false, - [fmgPageValues.PART_QUESTIONS]: false, - [fmgPageValues.VIN_LOOKUP]: false, + // Assert + expect(result).toBe("testValue"); }); - // Act - const result = await getPageToRouteExistingOrderTo(toRoute); + describe("Verified users", () => { + test("Replace navigation to `vehicle` with `vehicle-damage`", async () => { + // Arrange + const toRoute = { + query: { + fmgPage: fmgPageValues.VEHICLE, + }, + }; - //Assert - expect(result).toBe(fmgPageValues.CAPABILITY_QUESTIONS); - }); + store.commit(storeMutations.UPDATE_IS_VERIFIED_INSURANCE, true); - test("user has molding questions and part questions > should return molding questions", async () => { - // Arrange - const toRoute = { - query: {}, - }; + // Act + const result = await getPageToRouteExistingOrderTo(toRoute); - store.commit(storeMutations.UPDATE_IS_REPAIR, false); - store.commit(storeMutations.UPDATE_MAKE, "acura"); + // Assert + expect(result).toBe(fmgPageValues.VEHICLE_DAMAGE); + }); - // Mock out the lazy load calls for all components. - mockLazyLoadComponentReturnValues({ - [fmgPageValues.VEHICLE]: true, - [fmgPageValues.VEHICLE_DAMAGE]: true, - [fmgPageValues.ESTIMATE]: true, - [fmgPageValues.CAPABILITY_QUESTIONS]: false, - [fmgPageValues.MOLDING_QUESTIONS]: true, - [fmgPageValues.VEHICLE_PARTS]: false, - [fmgPageValues.PART_QUESTIONS]: true, - [fmgPageValues.VIN_LOOKUP]: false, + describe("Vin-Exempt", () => { + test("Replace navigation to `quote` with `estimate`", async () => { + // Arrange + const toRoute = { + query: { + fmgPage: fmgPageValues.QUOTE, + }, + }; + + store.commit(storeMutations.UPDATE_IS_VERIFIED_INSURANCE, true); + store.commit(storeMutations.UPDATE_IS_REPAIR, true); + store.commit(storeMutations.UPDATE_MAKE, "acura"); + + // Act + const result = await getPageToRouteExistingOrderTo(toRoute); + + // Assert + expect(result).toBe(fmgPageValues.ESTIMATE); + }); + + test("Replace navigation to `insurance-company` with `estimate`", async () => { + // Arrange + const toRoute = { + query: { + fmgPage: fmgPageValues.INSURANCE_COMPANY, + }, + }; + + store.commit(storeMutations.UPDATE_IS_VERIFIED_INSURANCE, true); + store.commit(storeMutations.UPDATE_IS_REPAIR, true); + store.commit(storeMutations.UPDATE_MAKE, "acura"); + + // Act + const result = await getPageToRouteExistingOrderTo(toRoute); + + // Assert + expect(result).toBe(fmgPageValues.ESTIMATE); + }); + }); + + describe("Vin-Required", () => { + test("Replace navigation to `quote` with `vin-lookup`", async () => { + // Arrange + const toRoute = { + query: { + fmgPage: fmgPageValues.QUOTE, + }, + }; + + store.commit(storeMutations.UPDATE_IS_VERIFIED_INSURANCE, true); + store.commit(storeMutations.UPDATE_IS_REPAIR, false); + store.commit(storeMutations.UPDATE_MAKE, "acura"); + store.commit(storeMutations.UPDATE_GLASS_TO_REPLACE, [ + { glassLocation: glassLocations.WINDSHIELD }, + ]); + + // Act + const result = await getPageToRouteExistingOrderTo(toRoute); + + // Assert + expect(result).toBe(fmgPageValues.VIN_LOOKUP); + }); + + test("Replace navigation to `insurance-company` with `vin-lookup`", async () => { + // Arrange + const toRoute = { + query: { + fmgPage: fmgPageValues.INSURANCE_COMPANY, + }, + }; + + store.commit(storeMutations.UPDATE_IS_VERIFIED_INSURANCE, true); + store.commit(storeMutations.UPDATE_IS_REPAIR, false); + store.commit(storeMutations.UPDATE_MAKE, "acura"); + store.commit(storeMutations.UPDATE_GLASS_TO_REPLACE, [ + { glassLocation: glassLocations.WINDSHIELD }, + ]); + + // Act + const result = await getPageToRouteExistingOrderTo(toRoute); + + // Assert + expect(result).toBe(fmgPageValues.VIN_LOOKUP); + }); + }); }); - // Act - const result = await getPageToRouteExistingOrderTo(toRoute); + describe("Non-verified users", () => { + test("Don't replace navigation to `vehicle` with `vehicle-damage`", async () => { + // Arrange + const toRoute = { + query: { + fmgPage: fmgPageValues.VEHICLE, + }, + }; - //Assert - expect(result).toBe(fmgPageValues.MOLDING_QUESTIONS); - }); + store.commit(storeMutations.UPDATE_IS_VERIFIED_INSURANCE, false); - test("user has vehicle parts questions > should return vehicle-parts", async () => { - // Arrange - const toRoute = { - query: {}, - }; + // Act + const result = await getPageToRouteExistingOrderTo(toRoute); - store.commit(storeMutations.UPDATE_IS_REPAIR, false); - store.commit(storeMutations.UPDATE_MAKE, "acura"); + // Assert + expect(result).toBe(fmgPageValues.VEHICLE); + }); - // Mock out the lazy load calls for all components. - mockLazyLoadComponentReturnValues({ - [fmgPageValues.VEHICLE]: true, - [fmgPageValues.VEHICLE_DAMAGE]: true, - [fmgPageValues.ESTIMATE]: true, - [fmgPageValues.CAPABILITY_QUESTIONS]: false, - [fmgPageValues.MOLDING_QUESTIONS]: false, - [fmgPageValues.VEHICLE_PARTS]: true, - [fmgPageValues.PART_QUESTIONS]: true, - [fmgPageValues.VIN_LOOKUP]: false, + test("Don't replace navigation to `quote` with `estimate` or `vin-lookup`", async () => { + // Arrange + const toRoute = { + query: { + fmgPage: fmgPageValues.QUOTE, + }, + }; + + store.commit(storeMutations.UPDATE_IS_VERIFIED_INSURANCE, false); + + // Act + const result = await getPageToRouteExistingOrderTo(toRoute); + + // Assert + expect(result).toBe(fmgPageValues.QUOTE); + }); + + test("Don't replace navigation to `insurance-company` with `estimate` or `vin-lookup`", async () => { + // Arrange + const toRoute = { + query: { + fmgPage: fmgPageValues.INSURANCE_COMPANY, + }, + }; + + store.commit(storeMutations.UPDATE_IS_VERIFIED_INSURANCE, false); + + // Act + const result = await getPageToRouteExistingOrderTo(toRoute); + + // Assert + expect(result).toBe(fmgPageValues.INSURANCE_COMPANY); + }); }); - - // Act - const result = await getPageToRouteExistingOrderTo(toRoute); - - //Assert - expect(result).toBe(fmgPageValues.VEHICLE_PARTS); - }); - - test("user has part questions > should return part-questions", async () => { - // Arrange - const toRoute = { - query: {}, - }; - - store.commit(storeMutations.UPDATE_IS_REPAIR, false); - store.commit(storeMutations.UPDATE_MAKE, "acura"); - - // Mock out the lazy load calls for all components. - mockLazyLoadComponentReturnValues({ - [fmgPageValues.VEHICLE]: true, - [fmgPageValues.VEHICLE_DAMAGE]: true, - [fmgPageValues.ESTIMATE]: true, - [fmgPageValues.CAPABILITY_QUESTIONS]: false, - [fmgPageValues.MOLDING_QUESTIONS]: false, - [fmgPageValues.VEHICLE_PARTS]: false, - [fmgPageValues.PART_QUESTIONS]: true, - [fmgPageValues.VIN_LOOKUP]: false, - }); - - // Act - const result = await getPageToRouteExistingOrderTo(toRoute); - - //Assert - expect(result).toBe(fmgPageValues.PART_QUESTIONS); }); }); diff --git a/src/helpers/heritage-integration/order-helper.js b/src/helpers/heritage-integration/order-helper.js index 38f4161b9..07c469ae8 100644 --- a/src/helpers/heritage-integration/order-helper.js +++ b/src/helpers/heritage-integration/order-helper.js @@ -166,6 +166,7 @@ async function saveSessionHelper( customerPortalLoginToken: savedSessionInfo.data.customerPortalLoginToken, lockToken: savedSessionInfo.data.lockToken, settledTenderAmount: savedSessionInfo.data.settledTenderAmount, + billToAccountNumber: savedSessionInfo.data.billToAccountNumber, }, false ); diff --git a/src/layouts/insurance-company/insurance-company.vue b/src/layouts/insurance-company/insurance-company.vue index 91eb8365e..0e9e61b01 100644 --- a/src/layouts/insurance-company/insurance-company.vue +++ b/src/layouts/insurance-company/insurance-company.vue @@ -80,7 +80,6 @@ export default { return { parentAccountNumber: this.parentAccountNumberFromStore(), originalList: [], - } }, methods: { parentAccountNumberFromStore() { @@ -93,8 +92,11 @@ export default { // Go back to Quote page this.$router.navigateWithoutSaving(this.navigationScenarios.CLICKED_BACK, this.$route); }, - forwardButtonAction() { - this.dispatchStoreAction( + async forwardButtonAction() { + // await any pending save-sessions. if you don't, we will save the new parent account into vuex and then a pending async save-session response overwrites it + await store.getters.applicationUser.saveSessionPromise; + + await this.dispatchStoreAction( this.storeActions.SAVE_PARENT_ACCOUNT_NUMBER, this.parentAccountNumber, false diff --git a/src/layouts/payment-method/payment-method.vue b/src/layouts/payment-method/payment-method.vue index 6d233a797..207b7f041 100644 --- a/src/layouts/payment-method/payment-method.vue +++ b/src/layouts/payment-method/payment-method.vue @@ -26,6 +26,7 @@ :availableVaps="availableVaps" :allowItemRemoval="true" v-model="lineItems" + pageName="payment-method" servicePackageOptionsCmsName="ServicePackageTitle" recyclingModalCmsWidgetName="RecycleModal" /> diff --git a/src/layouts/quote/afterpay-modal-banner/afterpay-modal-banner.vue b/src/layouts/quote/afterpay-modal-banner/afterpay-modal-banner.vue index 6eb8a5a87..09d9ddc15 100644 --- a/src/layouts/quote/afterpay-modal-banner/afterpay-modal-banner.vue +++ b/src/layouts/quote/afterpay-modal-banner/afterpay-modal-banner.vue @@ -29,6 +29,8 @@