From 0411e3cd1f9306f07d7189e4f1dcfd87a9deff49 Mon Sep 17 00:00:00 2001 From: CarlNation Date: Fri, 28 Jul 2023 13:26:20 -0400 Subject: [PATCH 01/16] CSR-1582 concept save quote links do not load --- .../heritage-integration/navigation-helper.js | 2 +- src/router/index.js | 16 +++++++++++++++- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/helpers/heritage-integration/navigation-helper.js b/src/helpers/heritage-integration/navigation-helper.js index 913fbcb1b..d90562791 100644 --- a/src/helpers/heritage-integration/navigation-helper.js +++ b/src/helpers/heritage-integration/navigation-helper.js @@ -98,7 +98,7 @@ export async function skipVinLookupNotRepair() { /* Logic for getting the last "valid" page a user visited. */ -async function getLatestPageForRedirection() { +export 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. diff --git a/src/router/index.js b/src/router/index.js index 11efa6080..2f28e06d5 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -19,6 +19,7 @@ import { loadSessionIfPresent, saveSession } from "@/helpers/heritage-integratio import { getPageToRouteExistingOrderTo, navigateToHeritageFunnel, + getLatestPageForRedirection, } from "@/helpers/heritage-integration/navigation-helper"; import baseMixin from "@/mixins/base-mixin"; @@ -124,8 +125,21 @@ const routes = [ .filter((x) => x.name === routeData[0].name)[0] .components.default(); + // The save quote link via heritage default.aspx... will land here. + // Heritage will attempt to send the customer to the lastest page in NextGen possible. + // If the link was created prior to reaching the end of NextGen, the save quote link + // was going to GoToFunnelStartOn404. This will send as deep into NextGen as possible. if (!arePagePrerequisitesValid(nextComponent)) { - await GoToFunnelStartOn404(next); + var pageToRedirectTo = await getLatestPageForRedirection(); + if (pageToRedirectTo) { + return next({ + path: "/", + query: { fmgPage: pageToRedirectTo }, + params: to.params, + }); + } else { + await GoToFunnelStartOn404(next); + } } // Assign current query string parameters, as well as our fmgPage one. From 22cee7a5e929f70effb94806d6c680365a38831b Mon Sep 17 00:00:00 2001 From: hiteshkumar87 Date: Tue, 1 Aug 2023 16:18:21 +0530 Subject: [PATCH 02/16] zip code GA event zip code GA event at get damage-options --- src/constants/analytics.js | 6 ++---- src/layouts/vehicle-damage/vehicle-damage.vue | 19 +++---------------- 2 files changed, 5 insertions(+), 20 deletions(-) diff --git a/src/constants/analytics.js b/src/constants/analytics.js index 2b0fc1a8f..9d35ba6b5 100644 --- a/src/constants/analytics.js +++ b/src/constants/analytics.js @@ -11,8 +11,7 @@ const GaEvents = { const GaCategories = { API_RESPONSE: "Api_Response", - EVOX: "Evox", - FUNNEL_ENTRY: "funnel_entry", + EVOX: "Evox", }; const GaActions = { @@ -20,8 +19,7 @@ const GaActions = { CLICKED: "Clicked", VIF: "vif", SUBMITTED: "Submitted", - DISPLAYED: "Displayed", - ZIP_CODE_PROVIDED: "zip_code_provided", + DISPLAYED: "Displayed", }; const GaLabels = { diff --git a/src/layouts/vehicle-damage/vehicle-damage.vue b/src/layouts/vehicle-damage/vehicle-damage.vue index 6ea4fe81d..134038348 100644 --- a/src/layouts/vehicle-damage/vehicle-damage.vue +++ b/src/layouts/vehicle-damage/vehicle-damage.vue @@ -145,8 +145,7 @@ export default { selectedPassengerSideReplaceOptions: this.getPassengerSideReplaceOptionsFromStore(), }, selectedWindshieldOptions: this.getWindshieldOptionsFromStore(), - selectedRearReplaceOptions: this.getRearReplaceOptionsFromStore(), - serviceZipCode: this.getZipFromStore() ?? this.$route.query.zipcode, + selectedRearReplaceOptions: this.getRearReplaceOptionsFromStore(), }; }, mounted() { @@ -168,21 +167,9 @@ export default { this.$store.getters.vehicle.carId, true ); - } - if (this.serviceZipCode) { - this.pushEventToGA( - this.GaCategories.FUNNEL_ENTRY, - this.GaActions.ZIP_CODE_PROVIDED, - this.serviceZipCode, - true - ); - } + } }, - - getZipFromStore() { - return this.$store.getters.order.serviceLocation.zipCode; - }, - + backButtonAction() { // route to move backwards this.$router.navigateWithoutSaving(this.navigationScenarios.CLICKED_BACK, this.$route); From ccfa927be5021fd6908dccc35a8953730e656ed9 Mon Sep 17 00:00:00 2001 From: hiteshkumar87 Date: Tue, 1 Aug 2023 16:22:30 +0530 Subject: [PATCH 03/16] Update vehicle-damage.vue --- src/layouts/vehicle-damage/vehicle-damage.vue | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/layouts/vehicle-damage/vehicle-damage.vue b/src/layouts/vehicle-damage/vehicle-damage.vue index 134038348..1b714c5c9 100644 --- a/src/layouts/vehicle-damage/vehicle-damage.vue +++ b/src/layouts/vehicle-damage/vehicle-damage.vue @@ -145,7 +145,7 @@ export default { selectedPassengerSideReplaceOptions: this.getPassengerSideReplaceOptionsFromStore(), }, selectedWindshieldOptions: this.getWindshieldOptionsFromStore(), - selectedRearReplaceOptions: this.getRearReplaceOptionsFromStore(), + selectedRearReplaceOptions: this.getRearReplaceOptionsFromStore(), }; }, mounted() { @@ -167,9 +167,9 @@ export default { this.$store.getters.vehicle.carId, true ); - } + } }, - + backButtonAction() { // route to move backwards this.$router.navigateWithoutSaving(this.navigationScenarios.CLICKED_BACK, this.$route); From 0621af33ad8c4749131cae79db99c7c8894a3deb Mon Sep 17 00:00:00 2001 From: hiteshkumar87 Date: Tue, 1 Aug 2023 16:24:04 +0530 Subject: [PATCH 04/16] Update analytics.js --- src/constants/analytics.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/constants/analytics.js b/src/constants/analytics.js index 9d35ba6b5..b5b24660d 100644 --- a/src/constants/analytics.js +++ b/src/constants/analytics.js @@ -11,7 +11,7 @@ const GaEvents = { const GaCategories = { API_RESPONSE: "Api_Response", - EVOX: "Evox", + EVOX: "Evox", }; const GaActions = { @@ -19,7 +19,7 @@ const GaActions = { CLICKED: "Clicked", VIF: "vif", SUBMITTED: "Submitted", - DISPLAYED: "Displayed", + DISPLAYED: "Displayed", }; const GaLabels = { From eb6d6a4140a5b4e1fc471fcdcf8965bfbb21b6b1 Mon Sep 17 00:00:00 2001 From: hiteshkumar87 Date: Wed, 2 Aug 2023 13:35:53 +0530 Subject: [PATCH 05/16] zip code GA event optimized code optimized --- src/helpers/querystring-helper.js | 10 ++++++++++ src/layouts/vehicle-damage/vehicle-damage.spec.js | 14 ++------------ src/layouts/vehicle-damage/vehicle-damage.vue | 13 +------------ src/store/index.js | 8 +++++--- 4 files changed, 18 insertions(+), 27 deletions(-) create mode 100644 src/helpers/querystring-helper.js diff --git a/src/helpers/querystring-helper.js b/src/helpers/querystring-helper.js new file mode 100644 index 000000000..38583b1ae --- /dev/null +++ b/src/helpers/querystring-helper.js @@ -0,0 +1,10 @@ +export function getQuerystringParameter(key) { + const queryString = window.location.search; + const urlParams = new URLSearchParams(queryString); + const lowerCaseParams = new URLSearchParams(); + for (const [name, value] of urlParams) { + lowerCaseParams.append(name.toLowerCase(), value); + } + + return lowerCaseParams.get(key) ? lowerCaseParams.get(key) : null; +} diff --git a/src/layouts/vehicle-damage/vehicle-damage.spec.js b/src/layouts/vehicle-damage/vehicle-damage.spec.js index 30e144310..b26b5e31c 100644 --- a/src/layouts/vehicle-damage/vehicle-damage.spec.js +++ b/src/layouts/vehicle-damage/vehicle-damage.spec.js @@ -52,7 +52,6 @@ jest.mock("@/store", () => ({ damage: { glassToReplace: [], }, - order: { serviceLocation: { zipCode: "11111" } }, }, })); @@ -134,7 +133,6 @@ describe("vehicle-damage.vue", () => { getters: { vehicle: {}, payment: { insuranceCoverage: { isVerified: false } }, - order: { serviceLocation: { zipCode: "11111" } }, }, }, }, @@ -177,7 +175,7 @@ describe("vehicle-damage.vue", () => { expect(wrapper.vm.selectedGlassToReplace()).toEqual(expectedGlassToReplace); expect(baseMixin.methods.dispatchStoreAction).toBeCalledWith( storeActions.GET_DAMAGE_OPTIONS, - { carId: "C00000000", zipCode: "11111" } + { carId: "C00000000" } ); }); @@ -243,7 +241,6 @@ describe("vehicle-damage.vue", () => { getters: { vehicle: {}, payment: { insuranceCoverage: { isVerified: false } }, - order: { serviceLocation: { zipCode: "11111" } }, }, }, }, @@ -273,7 +270,7 @@ describe("vehicle-damage.vue", () => { expect(wrapper.vm.selectedGlassToReplace()).toEqual(expectedGlassToReplace); expect(baseMixin.methods.dispatchStoreAction).toBeCalledWith( storeActions.GET_DAMAGE_OPTIONS, - { carId: "C00000000", zipCode: "11111" } + { carId: "C00000000" } ); }); }); @@ -526,7 +523,6 @@ describe("vehicle-damage.vue", () => { eventBusItem: jest.fn(), damage: { glassToReplace: [{ glassLocation: damageLocation }] }, isRepair: true, - order: { serviceLocation: { zipCode: "11111" } }, }; var glassSelections = wrapper.vm.getDamageLocationsFromStore(); @@ -604,7 +600,6 @@ describe("vehicle-damage.vue", () => { isRepair: isRepair, numberOfChips: 2, }, - order: { serviceLocation: { zipCode: "11111" } }, }; var windshieldSelections = wrapper.vm.getWindshieldOptionsFromStore(); @@ -641,7 +636,6 @@ describe("vehicle-damage.vue", () => { glassToReplace: [{ glassLocation: damageLocation, glassName: damageName }], }, isRepair: true, - order: { serviceLocation: { zipCode: "11111" } }, }; var glassSelections = wrapper.vm.getDriverSideReplaceOptionsFromStore(); @@ -678,7 +672,6 @@ describe("vehicle-damage.vue", () => { glassToReplace: [{ glassLocation: damageLocation, glassName: damageName }], }, isRepair: true, - order: { serviceLocation: { zipCode: "11111" } }, }; var glassSelections = wrapper.vm.getPassengerSideReplaceOptionsFromStore(); @@ -713,7 +706,6 @@ describe("vehicle-damage.vue", () => { glassToReplace: [{ glassLocation: damageLocation, glassName: damageName }], }, isRepair: true, - order: { serviceLocation: { zipCode: "11111" } }, }; var glassSelections = wrapper.vm.getRearReplaceOptionsFromStore(); @@ -746,7 +738,6 @@ describe("vehicle-damage.vue", () => { getters: { vehicle: {}, payment: { insuranceCoverage: { isVerified: true } }, - order: { serviceLocation: { zipCode: "11111" } }, }, }, }, @@ -787,7 +778,6 @@ function setupMocks({ pageHeaderWidgetHeaderText, mountOptionsMockData, funnelCo isVerified: false, }, }, - order: { serviceLocation: { zipCode: "11111" } }, }, }, }; diff --git a/src/layouts/vehicle-damage/vehicle-damage.vue b/src/layouts/vehicle-damage/vehicle-damage.vue index 1b714c5c9..c03fabda1 100644 --- a/src/layouts/vehicle-damage/vehicle-damage.vue +++ b/src/layouts/vehicle-damage/vehicle-damage.vue @@ -81,7 +81,6 @@ import { getFunnelCookie } from "@/helpers/heritage-integration/cookie-helper"; import store from "@/store"; import baseMixin from "@/mixins/base-mixin"; -import { queryStrings } from "@/constants/query-strings"; // DEFINE VALIDATION RULES defineRule("replace-options-required", required(errorMessages.REPLACE_OPTIONS_REQUIRED)); @@ -90,20 +89,10 @@ export default { async beforeRouteEnter(to, from, next) { // Call APIs const cmsContentPromise = fetchCmsContentForPage(to.query.fmgPage); - const queryString = window.location.search; - const urlParams = new URLSearchParams(queryString); - const lowerCaseParams = new URLSearchParams(); - for (const [name, value] of urlParams) { - lowerCaseParams.append(name.toLowerCase(), value); - } - - const zip = lowerCaseParams.get(queryStrings.ZIP_CODE) - ? lowerCaseParams.get(queryStrings.ZIP_CODE) - : store.getters.order.serviceLocation.zipCode; const damageOptionsPromise = baseMixin.methods.dispatchStoreAction( storeActions.GET_DAMAGE_OPTIONS, - { carId: store.getters.vehicle.carId, zipCode: zip } + { carId: store.getters.vehicle.carId } ); // Settle promises and get results diff --git a/src/store/index.js b/src/store/index.js index abefc2b5d..0ee76d098 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -13,7 +13,8 @@ import { fmgPageValues } from "@/router/router-constants/fmgPage-values"; import { deleteFunnelCookie } from "@/helpers/heritage-integration/cookie-helper.js"; import { deepEqual } from "@/helpers/object-helper"; import { AppointmentTypeStrings, PREMIUM_FEE_PART_TYPE } from "@/constants/schedule-constants"; - +import { getQuerystringParameter } from "@/helpers/querystring-helper"; +import { queryStrings } from "@/constants/query-strings"; // Export State const getDefaultState = () => { return { @@ -740,12 +741,13 @@ export const actions = { }); }, - getDamageOptions(context, { carId, zipCode }) { + getDamageOptions(context, { carId }) { return globalMethods.callHttpClient({ methods: endpoints.GetDamageOptions.method, endpoint: `${endpoints.GetDamageOptions.url}/${carId}`, payload: {}, - additionalSuccessEventDataHandler: (response) => "QueryStringZip: " + zipCode, + additionalSuccessEventDataHandler: (response) => + "QueryStringZip: " + getQuerystringParameter(queryStrings.ZIP_CODE), }); }, From dd3bebd9a668c43e087b747a328b9ed647c25813 Mon Sep 17 00:00:00 2001 From: Sneha Date: Thu, 3 Aug 2023 11:37:14 +0530 Subject: [PATCH 06/16] CSR-1586 Removing isvinoptional for ford 2018 or above --- src/store/index.js | 6 ------ src/store/store.spec.js | 2 -- 2 files changed, 8 deletions(-) diff --git a/src/store/index.js b/src/store/index.js index 0ee76d098..4d4093a61 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -2012,12 +2012,6 @@ export const actions = { return true; default: } - if ( - context.state.order.vehicle.make.toLowerCase() === "ford" && - context.state.order.vehicle.year >= 2018 - ) { - return true; - } if ( context.state.order.vehicle.make.toLowerCase() === "bmw" && context.state.order.vehicle.year <= 2017 diff --git a/src/store/store.spec.js b/src/store/store.spec.js index 4a6788433..f56a7ca49 100644 --- a/src/store/store.spec.js +++ b/src/store/store.spec.js @@ -3238,8 +3238,6 @@ describe("Getters", () => { describe("isVinOptionalVehicle", () => { const testVehicles = [ ["2017", "acura", false], - ["2017", "ford", false], - ["2018", "ford", true], ["2018", "bmw", false], ["2017", "bmw", true], ["2016", "bmw", true], From 563d638fe2b8d788af7114f765ad5230cba33005 Mon Sep 17 00:00:00 2001 From: CarlNation Date: Thu, 3 Aug 2023 15:02:42 -0400 Subject: [PATCH 07/16] CSR-1588 pass referral and parent account to logging api --- src/mixins/analytics-mixin.js | 4 ++++ src/store/index.js | 8 ++++++++ 2 files changed, 12 insertions(+) diff --git a/src/mixins/analytics-mixin.js b/src/mixins/analytics-mixin.js index 88b4772f8..3d0f61104 100644 --- a/src/mixins/analytics-mixin.js +++ b/src/mixins/analytics-mixin.js @@ -38,6 +38,8 @@ export default { event: pageEvent, shouldUseSessionId: false, experimentsForUser: store.getters.applicationUser.experiments, + referralNumber: store.getters.order.referralNumber, + parentAccountNumber: store.getters.order.payment.parentAccountNumber, }; baseMixin.methods.dispatchStoreAction(storeActions.LOG_PAGE_VIEW, payload, false); @@ -57,6 +59,8 @@ export default { value: value, shouldUseSessionId: false, experimentsForUser: store.getters.applicationUser.experiments, + referralNumber: store.getters.order.referralNumber, + parentAccountNumber: store.getters.order.payment.parentAccountNumber, }; baseMixin.methods.dispatchStoreAction(storeActions.LOG_CUSTOM_EVENT, payload, false); diff --git a/src/store/index.js b/src/store/index.js index 4d4093a61..99dc5bdaa 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -891,6 +891,8 @@ export const actions = { event, shouldUseSessionId, experimentsForUser, + referralNumber, + parentAccountNumber, } ) { var payload = { @@ -903,6 +905,8 @@ export const actions = { event: event, shouldUseSessionId: shouldUseSessionId, experimentsForUser: experimentsForUser, + referralNumber: referralNumber, + parentAccountNumber: parentAccountNumber, }; return globalMethods @@ -935,6 +939,8 @@ export const actions = { value, shouldUseSessionId, experimentsForUser, + referralNumber, + parentAccountNumber, } ) { var payload = { @@ -949,6 +955,8 @@ export const actions = { value: value, shouldUseSessionId: shouldUseSessionId, experimentsForUser: experimentsForUser, + referralNumber: referralNumber, + parentAccountNumber: parentAccountNumber, }; return globalMethods From 792c379080daa30c920b4ba9da216b7d48ce76d4 Mon Sep 17 00:00:00 2001 From: CarlNation Date: Fri, 4 Aug 2023 11:49:13 -0400 Subject: [PATCH 08/16] CSR-1588 persist referral seq number and send to analytics --- src/constants/store-mutations.js | 1 + .../heritage-integration/order-helper.js | 1 + src/mixins/analytics-mixin.js | 4 ++-- src/store/index.js | 19 +++++++++++++------ src/store/store.spec.js | 1 + 5 files changed, 18 insertions(+), 8 deletions(-) diff --git a/src/constants/store-mutations.js b/src/constants/store-mutations.js index d4e07cf0a..2cf59db27 100644 --- a/src/constants/store-mutations.js +++ b/src/constants/store-mutations.js @@ -40,6 +40,7 @@ const storeMutations = { // ORDER MUTATIONS UPDATE_REFERRAL_NUMBER: "updateReferralNumber", + UPDATE_REFERRAL_SEQUENCE_NUMBER: "updateReferralSequenceNumber", UPDATE_REFERRAL_DATE: "updateReferralDate", UPDATE_REFERRAL_CORRELATION_ID: "updateReferralCorrelationId", UPDATE_PARENT_ACCT_NUMBER: "updateParentAcctNumber", diff --git a/src/helpers/heritage-integration/order-helper.js b/src/helpers/heritage-integration/order-helper.js index 010c39ec9..01f5a5d67 100644 --- a/src/helpers/heritage-integration/order-helper.js +++ b/src/helpers/heritage-integration/order-helper.js @@ -114,6 +114,7 @@ async function saveSessionHelper() { storeActions.UPDATE_STORE_WITH_SAVE_SESSION_RESPONSE, { referralNumber: savedSessionInfo.data.referralNumber?.toString(), + referralSequenceNumber: savedSessionInfo.data.referralSequenceNumber, referralCorrelationId: savedSessionInfo.data.referralCorrelationId, referralDate: savedSessionInfo.data.referralDate, parentAccountNumber: savedSessionInfo.data.parentAccountNumber?.toString(), diff --git a/src/mixins/analytics-mixin.js b/src/mixins/analytics-mixin.js index 3d0f61104..8637cfa64 100644 --- a/src/mixins/analytics-mixin.js +++ b/src/mixins/analytics-mixin.js @@ -38,7 +38,7 @@ export default { event: pageEvent, shouldUseSessionId: false, experimentsForUser: store.getters.applicationUser.experiments, - referralNumber: store.getters.order.referralNumber, + referralSequenceNumber: store.getters.order.referralSequenceNumber ?? store.getters.order.referralNumber, parentAccountNumber: store.getters.order.payment.parentAccountNumber, }; @@ -59,7 +59,7 @@ export default { value: value, shouldUseSessionId: false, experimentsForUser: store.getters.applicationUser.experiments, - referralNumber: store.getters.order.referralNumber, + referralSequenceNumber: store.getters.order.referralSequenceNumber ?? store.getters.order.referralNumber, parentAccountNumber: store.getters.order.payment.parentAccountNumber, }; diff --git a/src/store/index.js b/src/store/index.js index 99dc5bdaa..e91962a11 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -93,6 +93,7 @@ const getDefaultState = () => { jobMaxMinutes: null, }, referralNumber: null, + referralSequenceNumber: null, referralDate: null, referralCorrelationId: null, eon: null, @@ -185,6 +186,9 @@ export const mutations = { updateReferralNumber(state, referralNumber) { state.order.referralNumber = referralNumber; }, + updateReferralSequenceNumber(state, referralSequenceNumber) { + state.order.referralSequenceNumber = referralSequenceNumber; + }, updateReferralDate(state, referralDate) { state.order.referralDate = referralDate; }, @@ -398,6 +402,7 @@ export const mutations = { // Misc Mutations updateStateWithOrderInformation(state, sessionInformation) { state.order.referralNumber = sessionInformation.order.referralNumber; + state.order.referralSequenceNumber = sessionInformation.order.referralSequenceNumber; state.order.referralDate = sessionInformation.order.referralDate; state.order.referralCorrelationId = sessionInformation.order.referralCorrelationId; state.order.eon = sessionInformation.order.eon; @@ -863,6 +868,7 @@ export const actions = { context, { referralNumber, + referralSequenceNumber, referralDate, referralCorrelationId, eon, @@ -872,6 +878,7 @@ export const actions = { } ) { context.commit(storeMutations.UPDATE_REFERRAL_NUMBER, referralNumber); + context.commit(storeMutations.UPDATE_REFERRAL_SEQUENCE_NUMBER, referralSequenceNumber); context.commit(storeMutations.UPDATE_REFERRAL_DATE, referralDate); context.commit(storeMutations.UPDATE_REFERRAL_CORRELATION_ID, referralCorrelationId); context.commit(storeMutations.UPDATE_EON, eon); @@ -891,7 +898,7 @@ export const actions = { event, shouldUseSessionId, experimentsForUser, - referralNumber, + referralSequenceNumber, parentAccountNumber, } ) { @@ -905,7 +912,7 @@ export const actions = { event: event, shouldUseSessionId: shouldUseSessionId, experimentsForUser: experimentsForUser, - referralNumber: referralNumber, + referralSequenceNumber: referralSequenceNumber, parentAccountNumber: parentAccountNumber, }; @@ -939,7 +946,7 @@ export const actions = { value, shouldUseSessionId, experimentsForUser, - referralNumber, + referralSequenceNumber, parentAccountNumber, } ) { @@ -955,7 +962,7 @@ export const actions = { value: value, shouldUseSessionId: shouldUseSessionId, experimentsForUser: experimentsForUser, - referralNumber: referralNumber, + referralSequenceNumber: referralSequenceNumber, parentAccountNumber: parentAccountNumber, }; @@ -1456,8 +1463,8 @@ export const actions = { existingPromoCode: null, referralCorrelationId: order.referralCorrelationId, referralDate: order.referralDate, - referralNumber: order.referralNumber?.toString(), // TODO It'd be nice to save these as strings in the first place - referralSequenceNumber: order.referralNumber?.toString(), // TODO Pass the referralSequence number once insurance flow creates it + referralNumber: order.referralNumber?.toString(), + referralSequenceNumber: order.referralSequenceNumber, eon: order.eon, }, }, diff --git a/src/store/store.spec.js b/src/store/store.spec.js index f56a7ca49..71411b0af 100644 --- a/src/store/store.spec.js +++ b/src/store/store.spec.js @@ -802,6 +802,7 @@ describe("Actions", () => { // Act actions.updateStoreWithSaveSessionResponse(context, { referralNumber: "123", + referralSequenceNumber: 123, referralDate: new Date().toUTCString(), referralCorrelationId: "xxx-xxx-xxx", parentAccountNumber: "167132", From 1f32f91398fe16272d3062c701c7a629cd7c408d Mon Sep 17 00:00:00 2001 From: CarlNation Date: Fri, 4 Aug 2023 12:56:11 -0400 Subject: [PATCH 09/16] CSR-1588 prettier --- src/mixins/analytics-mixin.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/mixins/analytics-mixin.js b/src/mixins/analytics-mixin.js index 8637cfa64..5836112cf 100644 --- a/src/mixins/analytics-mixin.js +++ b/src/mixins/analytics-mixin.js @@ -38,7 +38,9 @@ export default { event: pageEvent, shouldUseSessionId: false, experimentsForUser: store.getters.applicationUser.experiments, - referralSequenceNumber: store.getters.order.referralSequenceNumber ?? store.getters.order.referralNumber, + referralSequenceNumber: + store.getters.order.referralSequenceNumber ?? + store.getters.order.referralNumber, parentAccountNumber: store.getters.order.payment.parentAccountNumber, }; @@ -59,7 +61,9 @@ export default { value: value, shouldUseSessionId: false, experimentsForUser: store.getters.applicationUser.experiments, - referralSequenceNumber: store.getters.order.referralSequenceNumber ?? store.getters.order.referralNumber, + referralSequenceNumber: + store.getters.order.referralSequenceNumber ?? + store.getters.order.referralNumber, parentAccountNumber: store.getters.order.payment.parentAccountNumber, }; From 14c3fe0663388a4c8e839d6fa44d18c47eaf469d Mon Sep 17 00:00:00 2001 From: CarlNation Date: Fri, 4 Aug 2023 14:21:08 -0400 Subject: [PATCH 10/16] CSR-1588 Seq number should always be returned by safelite api so no need to fall back to referral number --- src/mixins/analytics-mixin.js | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/mixins/analytics-mixin.js b/src/mixins/analytics-mixin.js index 5836112cf..37615f68b 100644 --- a/src/mixins/analytics-mixin.js +++ b/src/mixins/analytics-mixin.js @@ -38,9 +38,7 @@ export default { event: pageEvent, shouldUseSessionId: false, experimentsForUser: store.getters.applicationUser.experiments, - referralSequenceNumber: - store.getters.order.referralSequenceNumber ?? - store.getters.order.referralNumber, + referralSequenceNumber: store.getters.order.referralSequenceNumber, parentAccountNumber: store.getters.order.payment.parentAccountNumber, }; @@ -61,9 +59,7 @@ export default { value: value, shouldUseSessionId: false, experimentsForUser: store.getters.applicationUser.experiments, - referralSequenceNumber: - store.getters.order.referralSequenceNumber ?? - store.getters.order.referralNumber, + referralSequenceNumber: store.getters.order.referralSequenceNumber, parentAccountNumber: store.getters.order.payment.parentAccountNumber, }; From 576e96afaed90e71953a55ad6970d729dc7c0a98 Mon Sep 17 00:00:00 2001 From: CarlNation <32103961+CarlNation@users.noreply.github.com> Date: Fri, 28 Jul 2023 13:34:43 -0400 Subject: [PATCH 11/16] Revert "Merge pull request #1278 from Safelite/feature/CSR-1582" This reverts commit 5c67a0859e4700049f6ab86ba5c6424e02e51117. --- .../heritage-integration/navigation-helper.js | 2 +- src/router/index.js | 16 +--------------- 2 files changed, 2 insertions(+), 16 deletions(-) diff --git a/src/helpers/heritage-integration/navigation-helper.js b/src/helpers/heritage-integration/navigation-helper.js index d90562791..913fbcb1b 100644 --- a/src/helpers/heritage-integration/navigation-helper.js +++ b/src/helpers/heritage-integration/navigation-helper.js @@ -98,7 +98,7 @@ export async function skipVinLookupNotRepair() { /* Logic for getting the last "valid" page a user visited. */ -export async function getLatestPageForRedirection() { +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. diff --git a/src/router/index.js b/src/router/index.js index 2f28e06d5..11efa6080 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -19,7 +19,6 @@ import { loadSessionIfPresent, saveSession } from "@/helpers/heritage-integratio import { getPageToRouteExistingOrderTo, navigateToHeritageFunnel, - getLatestPageForRedirection, } from "@/helpers/heritage-integration/navigation-helper"; import baseMixin from "@/mixins/base-mixin"; @@ -125,21 +124,8 @@ const routes = [ .filter((x) => x.name === routeData[0].name)[0] .components.default(); - // The save quote link via heritage default.aspx... will land here. - // Heritage will attempt to send the customer to the lastest page in NextGen possible. - // If the link was created prior to reaching the end of NextGen, the save quote link - // was going to GoToFunnelStartOn404. This will send as deep into NextGen as possible. if (!arePagePrerequisitesValid(nextComponent)) { - var pageToRedirectTo = await getLatestPageForRedirection(); - if (pageToRedirectTo) { - return next({ - path: "/", - query: { fmgPage: pageToRedirectTo }, - params: to.params, - }); - } else { - await GoToFunnelStartOn404(next); - } + await GoToFunnelStartOn404(next); } // Assign current query string parameters, as well as our fmgPage one. From a8154dc8c640356764018c694b1935b256033f82 Mon Sep 17 00:00:00 2001 From: Adam Caouette Date: Mon, 14 Aug 2023 10:57:10 -0400 Subject: [PATCH 12/16] CSR-886: unit tests for Schedule page --- jest.config.js | 1 - .../address-lookup/address-lookup.spec.js | 1 - src/layouts/schedule/schedule.spec.js | 728 ++++++++++++++---- src/layouts/schedule/schedule.spec.js1 | 0 src/layouts/schedule/schedule.vue | 7 +- 5 files changed, 576 insertions(+), 161 deletions(-) create mode 100644 src/layouts/schedule/schedule.spec.js1 diff --git a/jest.config.js b/jest.config.js index 34a45f34a..633a99e67 100644 --- a/jest.config.js +++ b/jest.config.js @@ -17,7 +17,6 @@ module.exports = { "!src/ux-components/text-link/**/*.vue", "!src/layouts/vin-lookup/**/*.vue", //Temporary for Quote page testing "!src/common-components/funnel-header/menu-modal/**/*.vue", - "!src/layouts/schedule/*.vue", // Temp test exclusion while in development "!src/layouts/schedule/helpers/schedule-helper.js", // Temp test exclusion while in development "!src/layouts/review/*.vue", // Temp test exclusion while in development // END diff --git a/src/layouts/address-lookup/address-lookup.spec.js b/src/layouts/address-lookup/address-lookup.spec.js index 2c4b44950..63847588b 100644 --- a/src/layouts/address-lookup/address-lookup.spec.js +++ b/src/layouts/address-lookup/address-lookup.spec.js @@ -681,7 +681,6 @@ function setupMocks({ }, ], router: { - navigate: jest.fn(), navigate: jest.fn(), navigateWithSaving: jest.fn(), navigateWithoutSaving: jest.fn(), diff --git a/src/layouts/schedule/schedule.spec.js b/src/layouts/schedule/schedule.spec.js index 2c4bafc33..56b2ce13b 100644 --- a/src/layouts/schedule/schedule.spec.js +++ b/src/layouts/schedule/schedule.spec.js @@ -1,15 +1,77 @@ +// Components +import schedule from "@/layouts/schedule/schedule.vue"; + +// Supporting Files import { shallowMount } from "@vue/test-utils"; import { getMountOptions } from "@/helpers/unit-test-helper.js"; -import { applicationConfig } from "@/constants/application-config"; -import { storeActions } from "@/constants/store-actions"; -import schedule from "@/layouts/schedule/schedule.vue"; import store from "@/store"; -import * as navigateToHeritage from "@/helpers/heritage-integration/navigation-helper"; +import router from "@/router"; import { nextTick } from "vue"; +import baseMixin from "../../mixins/base-mixin"; -jest.mock("@/store", () => ({ - commit: jest.fn(), - dispatch: jest.fn(), +// Mock basemixin +jest.mock("@/mixins/base-mixin.js", () => ({ + methods: { + dispatchStoreAction: jest.fn().mockImplementation((storeAction) => { + if (storeAction === "getShopTimeSlots") { + return { + data: { + estimatedServiceMinutesMinimum: 90, + estimatedServiceMinutesMaximum: 120, + days: [ + { + date: "2023-12-01", + timeSlots: [ + { + id: "06747-01820-S-B*20424*7 AM", + startTime: "07:00", + endTime: "08:00", + offerPremium: false, + }, + ], + }, + ], + }, + }; + } + if (storeAction === "getMobilePremiumFee") { + return Promise.resolve({ + data: { + partNumber: "EARLY BIRD", + description: null, + partType: "EARLY BIRD", + laborAmount: 0, + sellingPrice: 14.99, + kitPrice: 0, + }, + }); + } + if (storeAction === "priceOrderItemsAndSaveServerData") { + return Promise.resolve([ + { + partNumber: "EARLY BIRD", + description: null, + partType: "EARLY BIRD", + laborAmount: 0, + sellingPrice: 14.99, + kitPrice: 0, + }, + ]); + } + if (storeAction === "saveSupportingItemsSuppressingStateResetting") { + return Promise.resolve([ + { + partNumber: "EARLY BIRD", + description: null, + partType: "EARLY BIRD", + laborAmount: 0, + sellingPrice: 14.99, + kitPrice: 0, + }, + ]); + } + }), + }, })); // Mock fetchCmsContentForPage @@ -18,50 +80,415 @@ jest.mock("@/helpers/cms-content-helper", () => ({ splitCopyOnCMSPlaceHolder: jest.fn(() => ["A", "B"]), })); -jest.mock( - "@/store", - () => { - return {}; - }, - { virtual: true } -); - -store.getters = { - order: { - schedule: { - date: "2020-01-01", +beforeEach(() => { + jest.restoreAllMocks(); + jest.clearAllMocks(); + store.getters = { + order: { + schedule: { + date: "2019-01-01", + startTime: "09:00", + endTime: "10:00", + routeCode: "000" + }, + lineItems: { + glassParts: [ + { + partNumber: "ABC123", + }, + ], + supportingItems: [], + }, + serviceLocation: { + appointmentType: "Inshop", + zipCode: "12345", + zipCodeCtu: "01234", + provider: { + providerNumber: "123", + }, + }, + damage: { + isRepair: false, + }, + referralNumber: "1234567", + }, + payment: { + isInsurance: true, }, lineItems: { glassParts: [], supportingItems: [], }, - serviceLocation: { - appointmentType: "Inshop", - }, - }, - lineItems: { - glassParts: [], - supportingItems: [], - }, -}; + }; +}); +afterEach(() => { + store.getters = {}; + jest.restoreAllMocks(); + jest.clearAllMocks(); +}); -describe("schedule.vue", () => { - test("Should navigateWithoutSaving", async () => { - //Arrange - const { wrapper } = setupMocks({ - customMountOptions: { - router: { - navigateWithSaving: jest.fn(), - }, - route: { schedule }, - }, +describe("schedule.vue...", () => { + describe("initial load", () => { + test("should pass arePagePrerequisitesValid with a mobile order and no providerNumber", () => { + //Arrange + const { wrapper } = setupMocks({}); + store.getters.order.serviceLocation.appointmentType = "Mobile"; + store.getters.order.serviceLocation.provider = null; + + //Act + const arePagePrerequisitesValid = wrapper.vm.arePagePrerequisitesValid(); + + //Assert + expect(arePagePrerequisitesValid).toBe(true); + }); + test("should pass arePagePrerequisitesValid with a inshop order and providerNumber", () => { + //Arrange + const { wrapper } = setupMocks({}); + + //Act + const arePagePrerequisitesValid = wrapper.vm.arePagePrerequisitesValid(); + + //Assert + expect(arePagePrerequisitesValid).toBe(true); + }); + test("should fail arePagePrerequisitesValid with a replace with no glass parts", async () => { + //Arrange + const { wrapper } = setupMocks({}); + store.getters.order.lineItems.glassParts = []; + + //Act + const arePagePrerequisitesValid2 = await wrapper.vm.arePagePrerequisitesValid(); + + //Assert + expect(arePagePrerequisitesValid2).toBe(false); + }); + test("should fail arePagePrerequisitesValid without isInsurance", () => { + //Arrange + const { wrapper } = setupMocks({}); + store.getters.payment.isInsurance = null; + + //Act + const arePagePrerequisitesValid = wrapper.vm.arePagePrerequisitesValid(); + + //Assert + expect(arePagePrerequisitesValid).toBe(false); }); + test("should return newShopTimeSlots when getAvailableDatesMethod is called", async () => { + //Arrange + const { wrapper } = setupMocks({}); + wrapper.vm.selectableDatesData = { + days: [], + }; + + //Act + const newShopTimeSlots = await wrapper.vm.getAvailableDatesMethod( + "2023-01-01", + "2023-01-31" + ); + + //Assert + expect(newShopTimeSlots).toStrictEqual({ + days: [ + { + date: "2023-12-01", + timeSlots: [ + { + endTime: "08:00", + id: "06747-01820-S-B*20424*7 AM", + offerPremium: false, + startTime: "07:00", + }, + ], + }, + ], + estimatedServiceMinutesMinimum: 90, + estimatedServiceMinutesMaximum: 120, + }); + }); + + test("should call API service in day ranges of 34 or less when getAvailableDatesMethod is called with large date ranges", async () => { + //Arrange + const { wrapper } = setupMocks({}); + wrapper.vm.selectableDatesData = { + days: [], + }; + + //Act + await wrapper.vm.getAvailableDates.call( + wrapper.vm, + "2023-01-01", + "2023-03-31", + "Inshop", + "123" + ); + + //Assert + expect(baseMixin.methods.dispatchStoreAction).toHaveBeenCalledTimes(3); + expect(baseMixin.methods.dispatchStoreAction).toHaveBeenCalledWith( + "getShopTimeSlots", + expect.anything(), + expect.anything() + ); + }); + + describe("beforeRouteEnter function... ", () => { + test("should call next() and call all functions within next", async () => { + //Arrange + const { wrapper } = setupMocks({}); + wrapper.vm.selectableDatesData = { + days: [], + }; + wrapper.vm.updateFooterButtonText = jest.fn(); + const nextFunction = jest.fn((c) => { + c(wrapper.vm); + }); + + //Act + await schedule.beforeRouteEnter.call( + wrapper.vm, + { query: { fmgPage: "schedule" } }, + undefined, + nextFunction + ); + + //Assert + expect(nextFunction).toHaveBeenCalled(); + expect(wrapper.vm.setCmsContent).toHaveBeenCalledWith("content"); + expect(wrapper.vm.$refs.datePicker.initializeComponent).toHaveBeenCalledWith( + expect.objectContaining({ + calendarViewDirection: "future", + }) + ); + expect(wrapper.vm.$refs.locationAlerts.initializeComponent).toHaveBeenCalled(); + expect(wrapper.vm.selectableDatesData).toStrictEqual( + expect.objectContaining({ + days: expect.any(Array), + estimatedServiceMinutesMaximum: expect.any(Number), + estimatedServiceMinutesMinimum: expect.any(Number) + }) + ); + expect(wrapper.vm.mobilePremiumAppointmentFee).toStrictEqual( + expect.objectContaining({ + partNumber: expect.any(String) + }) + ); + expect(wrapper.vm.updateFooterButtonText).toHaveBeenCalled(); + }); + + }); + + describe("computed properties...", () => { + + test("timeSlotsForSelectedDate should return timeslots if selected date is available", () => { + //Arrange + const { wrapper } = setupMocks({}); + wrapper.vm.selectableDatesData = { + days: [{ + "date": "2022-11-11", + "timeSlots": [ + { + "id": "1820I-01820-M-I*20425*AM", + "startTime": "08:00", + "endTime": "12:00", + "offerPremium": true + }, + { + "id": "1820I-01820-M-I*20425*PM", + "startTime": "12:00", + "endTime": "17:00", + "offerPremium": false + } + ] + }], + }; + wrapper.setData({ + selectedDate: "2022-11-11" + }); + + //Act + const testValue = wrapper.vm.timeSlotsForSelectedDate; + + //Assert + expect(testValue).toStrictEqual( + expect.objectContaining({ + "date": "2022-11-11" + }) + ); + + }); + + test("timeSlotsForSelectedDate should be null if no date has been selected", () => { + //Arrange + const { wrapper } = setupMocks({}); + wrapper.vm.selectableDatesData = { + days: [{ + "date": "2022-11-11", + "timeSlots": [ + { + "id": "1820I-01820-M-I*20425*AM", + "startTime": "08:00", + "endTime": "12:00", + "offerPremium": true + }, + { + "id": "1820I-01820-M-I*20425*PM", + "startTime": "12:00", + "endTime": "17:00", + "offerPremium": false + } + ] + }], + }; + wrapper.setData({ + selectedDate: undefined + }); + + //Act + const testValue = wrapper.vm.timeSlotsForSelectedDate; + + //Assert + expect(testValue).toBe(null) + + }); + + }); + }); + + describe("schedule page methods...", () => { + test("getServiceZipCtuCodeFromStore should return zipCodeCtu", () => { + //Arrange + const { wrapper } = setupMocks({}); + wrapper.vm.selectableDatesData = { + days: [], + }; + + //Act + const testValue = wrapper.vm.getServiceZipCtuCodeFromStore(); + + //Assert + expect(testValue).toStrictEqual( + "01234" + ); + + }); + + test("openInshopTimeSlotsModal should trigger openModal method", () => { + //Arrange + const { wrapper } = setupMocks({}); + wrapper.vm.selectableDatesData = { + days: [], + }; + + //Act + wrapper.vm.openInshopTimeSlotsModal(); + + //Assert + expect(wrapper.vm.$refs.timeSlotModalQuestion.openModal).toBeCalled(); + + }); + + test("getSelectedRouteCode should return schedule routeCode", () => { + //Arrange + const { wrapper } = setupMocks({}); + + wrapper.vm.selectableDatesData = { + days: [], + }; + + //Act + const testValue = wrapper.vm.getSelectedRouteCode(); + + //Assert + expect(testValue).toStrictEqual( + "000" + ); + + }); + + + + test("timeSlotModalClosed should null any selected date when there's no route code", () => { + //Arrange + const { wrapper } = setupMocks({}); + wrapper.vm.selectableDatesData = { + days: [], + }; + wrapper.setData({ + selectedDate: "1980-05-05" + }); + wrapper.setData({ + selectedTimeSlot: { + date: "2019-01-01", + startTime: "09:00", + endTime: "10:00", + routeCode: null + } + }); + + //Act + wrapper.vm.timeSlotModalClosed(); + + //Assert + expect(wrapper.vm.selectedDate).toBe(null); + + }); + + + test("getDisplayTextForMilitaryTime should return the correctly formatted string", () => { + //Arrange + const { wrapper } = setupMocks({}); + wrapper.vm.selectableDatesData = { + days: [], + }; + const timeInput1 = "15:00"; + const timeInput2 = "15:30"; + + //Act + const testOutput1 = wrapper.vm.getDisplayTextForMilitaryTime(timeInput1); + const testOutput2 = wrapper.vm.getDisplayTextForMilitaryTime(timeInput2); + const testOutput3 = wrapper.vm.getDisplayTextForMilitaryTime(timeInput1, true); + const testOutput4 = wrapper.vm.getDisplayTextForMilitaryTime(timeInput2, true); + + //Assert + expect(testOutput1).toBe("3:00 PM"); + expect(testOutput2).toBe("3:30 PM"); + expect(testOutput3).toBe("3 PM"); + expect(testOutput4).toBe("3:30 PM"); + + }); + + test("getDisplayTextForMilitaryTime should return the correctly formatted string", () => { + //Arrange + const { wrapper } = setupMocks({}); + wrapper.vm.selectableDatesData = { + days: [], + }; + wrapper.vm.$router.navigateWithoutSaving = jest.fn(); + wrapper.vm.$route = "testRoute"; + + //Act + wrapper.vm.backButtonAction(); + + //Assert + expect(wrapper.vm.$router.navigateWithoutSaving).toBeCalledWith("CLICKED_BACK", "testRoute"); + + }); + + + }); + + test("forwardButtonAction should call route method navigateWithoutSaving", async () => { + //Arrange + const { wrapper } = setupMocks({}); wrapper.vm.dispatchStoreAction = jest.fn(() => { return { data: [], }; }); + wrapper.vm.$router.navigateWithSaving = jest.fn(() => { + return {}; + }); //Act await wrapper.vm.forwardButtonAction(); @@ -69,137 +496,125 @@ describe("schedule.vue", () => { //Assert expect(wrapper.vm.$router.navigateWithSaving).toHaveBeenCalled(); }); - test("should pass arePagePrerequisitesValid with a mobile order and no providerNumber", () => { + + + test("for mobile appts, updateSupportingItems should call store action to save supporting items", async () => { //Arrange + store.getters.order.serviceLocation.appointmentType = "Mobile"; + store.getters.lineItems.supportingItems = [{ + "partNumber": "EARLY BIRD", + "description": null, + "partType": "EARLY BIRD", + "laborAmount": 0, + "sellingPrice": 0, + "kitPrice": 0 + }]; const { wrapper } = setupMocks({}); - store.getters = { - order: { - schedule: { - date: "2020-01-01", - }, - serviceLocation: { - zipCode: "12345", - zipCodeCtu: "value", - appointmentType: "Mobile", - }, - damage: { - isRepair: true, - }, - referralNumber: "1234567", - }, - payment: { - isInsurance: true, - }, - lineItems: { - supportingItems: [], - }, - }; + wrapper.vm.dispatchStoreAction = jest.fn(() => { + return { + data: [], + }; + }); + wrapper.vm.mobilePremiumAppointmentFee = 14.99; + wrapper.setData({ + selectedTimeSlot: { + date: "2019-01-01", + startTime: "09:00", + endTime: "10:00", + routeCode: null, + isPremiumAppointment: true + } + }); - let arePagePrerequisitesValid = wrapper.vm.arePagePrerequisitesValid(); + //Act + await wrapper.vm.updateSupportingItems(); + + //Assert + expect(wrapper.vm.dispatchStoreAction).toBeCalledWith( + "saveSupportingItemsSuppressingStateResetting", + expect.arrayContaining([ + expect.objectContaining({ + partType: "EARLY BIRD" + }) + ]), + expect.anything() + ); - expect(arePagePrerequisitesValid).toBe(true); }); - test("should pass arePagePrerequisitesValid with a inshop order and providerNumber", () => { + + test("for Inshop appts, updateSupportingItems should call store action to save supporting items WITHOUT the EARLY BIRD supporting item", async () => { //Arrange + store.getters.order.serviceLocation.appointmentType = "Inshop"; + store.getters.lineItems.supportingItems = [{ + "partNumber": "EARLY BIRD", + "description": null, + "partType": "EARLY BIRD", + "laborAmount": 0, + "sellingPrice": 0, + "kitPrice": 0 + }]; const { wrapper } = setupMocks({}); - store.getters = { - order: { - schedule: { - date: "2020-01-01", - }, - serviceLocation: { - zipCode: "12345", - zipCodeCtu: "value", - appointmentType: "Inshop", - provider: { - providerNumber: "5", - }, - }, - damage: { - isRepair: true, - }, - referralNumber: "1234567", - }, - payment: { - isInsurance: true, - }, - lineItems: { - supportingItems: [], - }, - }; + wrapper.vm.dispatchStoreAction = jest.fn(() => { + return { + data: [], + }; + }); + wrapper.vm.mobilePremiumAppointmentFee = 14.99; + wrapper.setData({ + selectedTimeSlot: { + date: "2019-01-01", + startTime: "09:00", + endTime: "10:00", + routeCode: null, + isPremiumAppointment: true + } + }); - let arePagePrerequisitesValid = wrapper.vm.arePagePrerequisitesValid(); + //Act + await wrapper.vm.updateSupportingItems(); + + //Assert + expect(wrapper.vm.dispatchStoreAction).toBeCalledWith( + "saveSupportingItemsSuppressingStateResetting", + expect.not.arrayContaining([ + expect.objectContaining({ + partType: "EARLY BIRD" + }) + ]), + expect.anything() + ); - expect(arePagePrerequisitesValid).toBe(true); }); - test("should fail arePagePrerequisitesValid with a replace with no glass parts", () => { + + test("if no EARLY BIRD supporting item, then updateSupportingItems should NOT call store action", async () => { //Arrange + store.getters.order.serviceLocation.appointmentType = "Mobile"; + store.getters.lineItems.supportingItems = []; const { wrapper } = setupMocks({}); - store.getters = { - order: { - schedule: { - date: "2020-01-01", - }, - serviceLocation: { - zipCode: "12345", - zipCodeCtu: "value", - appointmentType: "Inshop", - provider: { - providerNumber: "5", - }, - }, - damage: { - isRepair: false, - }, - referralNumber: "1234567", - }, - payment: { - isInsurance: true, - }, - lineItems: { - supportingItems: [], - glassParts: [], - }, - }; + wrapper.vm.dispatchStoreAction = jest.fn(() => { + return { + data: [], + }; + }); + wrapper.vm.mobilePremiumAppointmentFee = 14.99; + wrapper.setData({ + selectedTimeSlot: { + date: "2019-01-01", + startTime: "09:00", + endTime: "10:00", + routeCode: null, + isPremiumAppointment: false + } + }); - let arePagePrerequisitesValid = wrapper.vm.arePagePrerequisitesValid(); + //Act + await wrapper.vm.updateSupportingItems(); + + //Assert + expect(wrapper.vm.dispatchStoreAction).not.toBeCalled(); - expect(arePagePrerequisitesValid).toBe(false); }); - test("should fail arePagePrerequisitesValid without isInsurance", () => { - //Arrange - const { wrapper } = setupMocks({}); - store.getters = { - order: { - schedule: { - date: "2020-01-01", - }, - serviceLocation: { - zipCode: "12345", - zipCodeCtu: "value", - appointmentType: "Inshop", - provider: { - providerNumber: "5", - }, - }, - damage: { - isRepair: true, - }, - referralNumber: "1234567", - }, - payment: { - isInsurance: null, - }, - lineItems: { - supportingItems: [], - glassParts: [], - }, - }; - let arePagePrerequisitesValid = wrapper.vm.arePagePrerequisitesValid(); - - expect(arePagePrerequisitesValid).toBe(false); - }); }); const mockCmsContent = {}; @@ -210,6 +625,7 @@ function setupMocks({ customMountOptions }) { }); mountOptions.global.mocks["$store"] = store; + mountOptions.global.mocks["$router"] = router; mountOptions["attachTo"] = document.body; mountOptions.mixins = [ { @@ -223,6 +639,12 @@ function setupMocks({ customMountOptions }) { ]; const wrapper = shallowMount(schedule, mountOptions); + wrapper.vm.setCmsContent = jest.fn(); + wrapper.vm.$refs.datePicker.initializeComponent = jest.fn(); + wrapper.vm.$refs.locationAlerts.initializeComponent = jest.fn(); + wrapper.vm.$refs.funnelFooter.updateButtonText = jest.fn(); + wrapper.vm.$refs.timeSlotModalQuestion.openModal = jest.fn(); + return { wrapper }; } diff --git a/src/layouts/schedule/schedule.spec.js1 b/src/layouts/schedule/schedule.spec.js1 new file mode 100644 index 000000000..e69de29bb diff --git a/src/layouts/schedule/schedule.vue b/src/layouts/schedule/schedule.vue index 6a42b7a92..00b3e796b 100644 --- a/src/layouts/schedule/schedule.vue +++ b/src/layouts/schedule/schedule.vue @@ -320,6 +320,7 @@ export default { ); return newShopTimeSlots; }, + getAvailableDates, getServiceZipCtuCodeFromStore() { return store.getters.order.serviceLocation.zipCodeCtu; }, @@ -338,12 +339,6 @@ export default { getSupportingItems() { return store.getters.lineItems.supportingItems; }, - isMobilePremiumFeeOnOrderInVuex() { - const supportingItemsFromVuex = store.getters.lineItems.supportingItems; - return !!supportingItemsFromVuex.filter( - (lineItem) => lineItem.partType === PREMIUM_FEE_PART_TYPE - ).length; - }, timeSlotModalClosed() { // Clear the selectedDate if no timeSlot has been selected if (this.selectedTimeSlot.routeCode == null) { From 80e7248bd9424f89567c344faf7f9cb40a22f013 Mon Sep 17 00:00:00 2001 From: Adam Caouette Date: Mon, 14 Aug 2023 11:09:05 -0400 Subject: [PATCH 13/16] CSR-886: unit tests formatting updates --- src/layouts/schedule/schedule.spec.js | 184 ++++++++++++-------------- 1 file changed, 85 insertions(+), 99 deletions(-) diff --git a/src/layouts/schedule/schedule.spec.js b/src/layouts/schedule/schedule.spec.js index 56b2ce13b..b47036c10 100644 --- a/src/layouts/schedule/schedule.spec.js +++ b/src/layouts/schedule/schedule.spec.js @@ -89,7 +89,7 @@ beforeEach(() => { date: "2019-01-01", startTime: "09:00", endTime: "10:00", - routeCode: "000" + routeCode: "000", }, lineItems: { glassParts: [ @@ -135,7 +135,7 @@ describe("schedule.vue...", () => { store.getters.order.serviceLocation.appointmentType = "Mobile"; store.getters.order.serviceLocation.provider = null; - //Act + //Act const arePagePrerequisitesValid = wrapper.vm.arePagePrerequisitesValid(); //Assert @@ -265,45 +265,45 @@ describe("schedule.vue...", () => { expect.objectContaining({ days: expect.any(Array), estimatedServiceMinutesMaximum: expect.any(Number), - estimatedServiceMinutesMinimum: expect.any(Number) + estimatedServiceMinutesMinimum: expect.any(Number), }) ); expect(wrapper.vm.mobilePremiumAppointmentFee).toStrictEqual( expect.objectContaining({ - partNumber: expect.any(String) + partNumber: expect.any(String), }) ); expect(wrapper.vm.updateFooterButtonText).toHaveBeenCalled(); }); - }); describe("computed properties...", () => { - test("timeSlotsForSelectedDate should return timeslots if selected date is available", () => { //Arrange const { wrapper } = setupMocks({}); wrapper.vm.selectableDatesData = { - days: [{ - "date": "2022-11-11", - "timeSlots": [ - { - "id": "1820I-01820-M-I*20425*AM", - "startTime": "08:00", - "endTime": "12:00", - "offerPremium": true - }, - { - "id": "1820I-01820-M-I*20425*PM", - "startTime": "12:00", - "endTime": "17:00", - "offerPremium": false - } - ] - }], + days: [ + { + date: "2022-11-11", + timeSlots: [ + { + id: "1820I-01820-M-I*20425*AM", + startTime: "08:00", + endTime: "12:00", + offerPremium: true, + }, + { + id: "1820I-01820-M-I*20425*PM", + startTime: "12:00", + endTime: "17:00", + offerPremium: false, + }, + ], + }, + ], }; wrapper.setData({ - selectedDate: "2022-11-11" + selectedDate: "2022-11-11", }); //Act @@ -312,46 +312,45 @@ describe("schedule.vue...", () => { //Assert expect(testValue).toStrictEqual( expect.objectContaining({ - "date": "2022-11-11" + date: "2022-11-11", }) ); - }); test("timeSlotsForSelectedDate should be null if no date has been selected", () => { //Arrange const { wrapper } = setupMocks({}); wrapper.vm.selectableDatesData = { - days: [{ - "date": "2022-11-11", - "timeSlots": [ - { - "id": "1820I-01820-M-I*20425*AM", - "startTime": "08:00", - "endTime": "12:00", - "offerPremium": true - }, - { - "id": "1820I-01820-M-I*20425*PM", - "startTime": "12:00", - "endTime": "17:00", - "offerPremium": false - } - ] - }], + days: [ + { + date: "2022-11-11", + timeSlots: [ + { + id: "1820I-01820-M-I*20425*AM", + startTime: "08:00", + endTime: "12:00", + offerPremium: true, + }, + { + id: "1820I-01820-M-I*20425*PM", + startTime: "12:00", + endTime: "17:00", + offerPremium: false, + }, + ], + }, + ], }; wrapper.setData({ - selectedDate: undefined + selectedDate: undefined, }); //Act const testValue = wrapper.vm.timeSlotsForSelectedDate; //Assert - expect(testValue).toBe(null) - + expect(testValue).toBe(null); }); - }); }); @@ -367,10 +366,7 @@ describe("schedule.vue...", () => { const testValue = wrapper.vm.getServiceZipCtuCodeFromStore(); //Assert - expect(testValue).toStrictEqual( - "01234" - ); - + expect(testValue).toStrictEqual("01234"); }); test("openInshopTimeSlotsModal should trigger openModal method", () => { @@ -385,7 +381,6 @@ describe("schedule.vue...", () => { //Assert expect(wrapper.vm.$refs.timeSlotModalQuestion.openModal).toBeCalled(); - }); test("getSelectedRouteCode should return schedule routeCode", () => { @@ -400,14 +395,9 @@ describe("schedule.vue...", () => { const testValue = wrapper.vm.getSelectedRouteCode(); //Assert - expect(testValue).toStrictEqual( - "000" - ); - + expect(testValue).toStrictEqual("000"); }); - - test("timeSlotModalClosed should null any selected date when there's no route code", () => { //Arrange const { wrapper } = setupMocks({}); @@ -415,15 +405,15 @@ describe("schedule.vue...", () => { days: [], }; wrapper.setData({ - selectedDate: "1980-05-05" + selectedDate: "1980-05-05", }); wrapper.setData({ selectedTimeSlot: { date: "2019-01-01", startTime: "09:00", endTime: "10:00", - routeCode: null - } + routeCode: null, + }, }); //Act @@ -431,10 +421,8 @@ describe("schedule.vue...", () => { //Assert expect(wrapper.vm.selectedDate).toBe(null); - }); - test("getDisplayTextForMilitaryTime should return the correctly formatted string", () => { //Arrange const { wrapper } = setupMocks({}); @@ -455,7 +443,6 @@ describe("schedule.vue...", () => { expect(testOutput2).toBe("3:30 PM"); expect(testOutput3).toBe("3 PM"); expect(testOutput4).toBe("3:30 PM"); - }); test("getDisplayTextForMilitaryTime should return the correctly formatted string", () => { @@ -471,11 +458,11 @@ describe("schedule.vue...", () => { wrapper.vm.backButtonAction(); //Assert - expect(wrapper.vm.$router.navigateWithoutSaving).toBeCalledWith("CLICKED_BACK", "testRoute"); - + expect(wrapper.vm.$router.navigateWithoutSaving).toBeCalledWith( + "CLICKED_BACK", + "testRoute" + ); }); - - }); test("forwardButtonAction should call route method navigateWithoutSaving", async () => { @@ -497,18 +484,19 @@ describe("schedule.vue...", () => { expect(wrapper.vm.$router.navigateWithSaving).toHaveBeenCalled(); }); - test("for mobile appts, updateSupportingItems should call store action to save supporting items", async () => { //Arrange store.getters.order.serviceLocation.appointmentType = "Mobile"; - store.getters.lineItems.supportingItems = [{ - "partNumber": "EARLY BIRD", - "description": null, - "partType": "EARLY BIRD", - "laborAmount": 0, - "sellingPrice": 0, - "kitPrice": 0 - }]; + store.getters.lineItems.supportingItems = [ + { + partNumber: "EARLY BIRD", + description: null, + partType: "EARLY BIRD", + laborAmount: 0, + sellingPrice: 0, + kitPrice: 0, + }, + ]; const { wrapper } = setupMocks({}); wrapper.vm.dispatchStoreAction = jest.fn(() => { return { @@ -522,8 +510,8 @@ describe("schedule.vue...", () => { startTime: "09:00", endTime: "10:00", routeCode: null, - isPremiumAppointment: true - } + isPremiumAppointment: true, + }, }); //Act @@ -534,25 +522,26 @@ describe("schedule.vue...", () => { "saveSupportingItemsSuppressingStateResetting", expect.arrayContaining([ expect.objectContaining({ - partType: "EARLY BIRD" - }) + partType: "EARLY BIRD", + }), ]), expect.anything() ); - }); test("for Inshop appts, updateSupportingItems should call store action to save supporting items WITHOUT the EARLY BIRD supporting item", async () => { //Arrange store.getters.order.serviceLocation.appointmentType = "Inshop"; - store.getters.lineItems.supportingItems = [{ - "partNumber": "EARLY BIRD", - "description": null, - "partType": "EARLY BIRD", - "laborAmount": 0, - "sellingPrice": 0, - "kitPrice": 0 - }]; + store.getters.lineItems.supportingItems = [ + { + partNumber: "EARLY BIRD", + description: null, + partType: "EARLY BIRD", + laborAmount: 0, + sellingPrice: 0, + kitPrice: 0, + }, + ]; const { wrapper } = setupMocks({}); wrapper.vm.dispatchStoreAction = jest.fn(() => { return { @@ -566,8 +555,8 @@ describe("schedule.vue...", () => { startTime: "09:00", endTime: "10:00", routeCode: null, - isPremiumAppointment: true - } + isPremiumAppointment: true, + }, }); //Act @@ -578,12 +567,11 @@ describe("schedule.vue...", () => { "saveSupportingItemsSuppressingStateResetting", expect.not.arrayContaining([ expect.objectContaining({ - partType: "EARLY BIRD" - }) + partType: "EARLY BIRD", + }), ]), expect.anything() ); - }); test("if no EARLY BIRD supporting item, then updateSupportingItems should NOT call store action", async () => { @@ -603,8 +591,8 @@ describe("schedule.vue...", () => { startTime: "09:00", endTime: "10:00", routeCode: null, - isPremiumAppointment: false - } + isPremiumAppointment: false, + }, }); //Act @@ -612,9 +600,7 @@ describe("schedule.vue...", () => { //Assert expect(wrapper.vm.dispatchStoreAction).not.toBeCalled(); - }); - }); const mockCmsContent = {}; From 82a73565bd6d7e68c661cedf4c6e6a63fb4b4416 Mon Sep 17 00:00:00 2001 From: Scott Kiener Date: Tue, 15 Aug 2023 09:04:32 -0400 Subject: [PATCH 14/16] CSR-1582 | isInsurance is nullable & navigation changes Allow saveSession to send a null value for isInsurance Allow service packages to be auto selected based on if isInsurance is null Add in service location and schedule pages to navigation logic --- .../heritage-integration/navigation-helper.js | 13 ++++++++-- .../service-package-question.vue | 26 +------------------ src/store/index.js | 2 +- 3 files changed, 13 insertions(+), 28 deletions(-) diff --git a/src/helpers/heritage-integration/navigation-helper.js b/src/helpers/heritage-integration/navigation-helper.js index 913fbcb1b..db7881527 100644 --- a/src/helpers/heritage-integration/navigation-helper.js +++ b/src/helpers/heritage-integration/navigation-helper.js @@ -31,7 +31,8 @@ export async function getPageToRouteExistingOrderTo(toRoute = {}, existingHerita // Return that page, so that it can navigate like normal. if ( toRoute.query[queryStrings.FMG_PAGE] !== undefined && - toRoute.query[queryStrings.FMG_PAGE] !== fmgPageValues.QUOTE && + toRoute.query[queryStrings.FMG_PAGE] !== fmgPageValues.SERVICE_LOCATION && + toRoute.query[queryStrings.FMG_PAGE] !== fmgPageValues.SCHEDULE && !isVinRelatedPage(toRoute) ) { return overrideYmmsDirectionIfNeeded(toRoute); @@ -115,6 +116,8 @@ async function getLatestPageForRedirection() { 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(); @@ -129,7 +132,13 @@ async function getLatestPageForRedirection() { } else if (!estimateComponent.methods.arePagePrerequisitesValid()) { return fmgPageValues.VEHICLE_DAMAGE; } else { - if (quoteComponent.methods.arePagePrerequisitesValid()) { + if (scheduleComponent.methods.arePagePrerequisitesValid()) { + return fmgPageValues.SCHEDULE; + } else if (serviceLocationComponent.methods.arePagePrerequisitesValid()) { + // This should be reversed 45+ days after the 8.24 release (Sunday October 8th, 2023) + //return fmgPageValues.SERVICE_LOCATION; + return fmgPageValues.QUOTE; + } else if (quoteComponent.methods.arePagePrerequisitesValid()) { return fmgPageValues.QUOTE; } else if (capabilityQuestionsComponent.methods.arePagePrerequisitesValid()) { return fmgPageValues.CAPABILITY_QUESTIONS; diff --git a/src/layouts/quote/service-package-question/service-package-question.vue b/src/layouts/quote/service-package-question/service-package-question.vue index 29e6a9a9e..50cbfa128 100644 --- a/src/layouts/quote/service-package-question/service-package-question.vue +++ b/src/layouts/quote/service-package-question/service-package-question.vue @@ -44,7 +44,7 @@ export default { }, watch: { availableLineItems() { - if (this.allGlassPartsAndSupportingItemsHavePrices(this.$store.getters.lineItems)) { + if (this.$store.getters.payment.isInsurance != null) { this.selectDefaultPackage(); } }, @@ -230,30 +230,6 @@ export default { } this.selectedPackageName = lowestTierForPackage; }, - allGlassPartsAndSupportingItemsHavePrices(lineItems) { - if (lineItems?.glassParts) { - for (let i = 0; i < lineItems.glassParts.length; i++) { - if (this.priceIsNullOrZero(lineItems.glassParts[i])) { - return false; - } - } - } - if (lineItems?.supportingItems) { - for (let i = 0; i < lineItems.supportingItems.length; i++) { - if (this.priceIsNullOrZero(lineItems.supportingItems[i])) { - return false; - } - } - } - return true; - }, - priceIsNullOrZero(lineItem) { - return ( - (lineItem.kitPrice == null || lineItem.kitPrice == 0) && - (lineItem.laborAmount == null || lineItem.laborAmount == 0) && - (lineItem.sellingPrice == null || lineItem.sellingPrice == 0) - ); - }, getLowestTierForThisItem(vapsItem) { let lowestTierForThisItem = null; switch (vapsItem.partType) { diff --git a/src/store/index.js b/src/store/index.js index e91962a11..9b52e08a4 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -1429,7 +1429,7 @@ export const actions = { InsuranceCoverage: { isVerified: order.payment.insuranceCoverage.isVerified ?? false, }, - isInsurance: order.payment.isInsurance ?? false, + isInsurance: order.payment.isInsurance, parentAccountNumber: order.payment.parentAccountNumber, }, serviceLocation: { From b54fafb929e40bb8090540d9b2807ed45b83795b Mon Sep 17 00:00:00 2001 From: Scott Kiener Date: Tue, 15 Aug 2023 09:18:40 -0400 Subject: [PATCH 15/16] CSR-1582 | Unit tests and formatting --- .../service-package-question.spec.js | 116 +++--------------- 1 file changed, 16 insertions(+), 100 deletions(-) diff --git a/src/layouts/quote/service-package-question/service-package-question.spec.js b/src/layouts/quote/service-package-question/service-package-question.spec.js index af04ff36a..dc0d2005c 100644 --- a/src/layouts/quote/service-package-question/service-package-question.spec.js +++ b/src/layouts/quote/service-package-question/service-package-question.spec.js @@ -135,64 +135,9 @@ describe("service-package-question.vue", () => { expectedModifiedAnswers[packageNameKey].tierThree ); }); - it("should not select a default package if ANY glass part or supporting item has no prices", async () => { + it("should not select a default package if isInsurance is null", async () => { // Note, only the first WSREPAIR item has a 0 for laborAmount, this is enough to not try and select a default package - const wrapper = setupMocks({ - mountOptionsMockData: { - store: { - getters: { - lineItems: { - glassParts: [ - { - partNumber: "FW02627GBYNOEE", - description: "solar, 3rd visor band", - color: "Green Tint, Blue Shade", - partType: "WINDSHIELD", - canSafeliteRecalibrate: false, - requiresRecalibration: false, - requiresCapabilityQuestions: false, - recalibrationType: null, - childParts: null, - laborAmount: 5.0, - }, - ], - supportingItems: [ - { - partNumber: "SUPPLIES-REPAIR", - description: null, - partType: "REPAIR FEE", - laborAmount: 5.0, - }, - { - partNumber: "WSREPAIR", - description: null, - partType: "REPAIR FEE", - laborAmount: 0, - }, - { - partNumber: "WSREPAIR", - description: null, - partType: "REPAIR FEE", - laborAmount: 5.0, - }, - { - partNumber: "WSREPAIR", - description: null, - partType: "REPAIR FEE", - laborAmount: 5.0, - }, - ], - }, - order: { - damage: { - isRepair: false, - glassToReplace: [{ glassLocation: "Windshield" }], - }, - }, - }, - }, - }, - }); + const wrapper = setupMocks({}); // Act wrapper.setProps({ availableLineItems: null }); @@ -202,59 +147,24 @@ describe("service-package-question.vue", () => { // Assert expect(wrapper.vm.selectedPackageName).toBe(null); }); - it("should select a default package if ALL glass parts and supporting items have prices", async () => { + it("should select a default package if isInsurance is NOT null", async () => { const wrapper = setupMocks({ mountOptionsMockData: { store: { getters: { - lineItems: { - glassParts: [ - { - partNumber: "FW02627GBYNOEE", - description: "solar, 3rd visor band", - color: "Green Tint, Blue Shade", - partType: "WINDSHIELD", - canSafeliteRecalibrate: false, - requiresRecalibration: false, - requiresCapabilityQuestions: false, - recalibrationType: null, - childParts: null, - laborAmount: 5.0, - }, - ], - supportingItems: [ - { - partNumber: "SUPPLIES-REPAIR", - description: null, - partType: "REPAIR FEE", - laborAmount: 5.0, - }, - { - partNumber: "WSREPAIR", - description: null, - partType: "REPAIR FEE", - laborAmount: 5.0, - }, - { - partNumber: "WSREPAIR", - description: null, - partType: "REPAIR FEE", - laborAmount: 5.0, - }, - { - partNumber: "WSREPAIR", - description: null, - partType: "REPAIR FEE", - laborAmount: 5.0, - }, - ], - }, order: { damage: { isRepair: false, glassToReplace: [{ glassLocation: "Windshield" }], }, }, + lineItems: { + vaps: [], + }, + hasAnyNonWindshieldGlassParts: false, + payment: { + isInsurance: false, + }, }, }, }, @@ -329,6 +239,9 @@ describe("service-package-question.vue", () => { glassToReplace: [{ glassLocation: "Windshield" }], }, }, + payment: { + isInsurance: false, + }, }, }, }, @@ -758,6 +671,9 @@ function setupMocks({ mountOptionsMockData, props = mockProps }) { }, }, hasAnyNonWindshieldGlassParts: false, + payment: { + isInsurance: null, + }, }, }, }; From dc43455d92d206da25208d7b6514696ecdfd006b Mon Sep 17 00:00:00 2001 From: CarlNation Date: Tue, 15 Aug 2023 09:39:15 -0400 Subject: [PATCH 16/16] CSR-1564 CSR-1559 registration defaults CSR-1564 CSR-1559 registration defaults --- src/constants/store-mutations.js | 7 --- src/layouts/address-lookup/address-lookup.vue | 4 -- .../license-plate-lookup.vue | 2 - src/store/index.js | 43 ++----------------- src/store/store.spec.js | 2 +- 5 files changed, 5 insertions(+), 53 deletions(-) diff --git a/src/constants/store-mutations.js b/src/constants/store-mutations.js index 795eb62c9..fd568ead7 100644 --- a/src/constants/store-mutations.js +++ b/src/constants/store-mutations.js @@ -23,13 +23,6 @@ const storeMutations = { UPDATE_SUPPORTING_ITEMS: "updateSupportingItems", UPDATE_LINE_ITEMS_SERVER_DATA: "updateLineItemsServerData", - UPDATE_REGISTRATION_LICENSE_PLATE: "updateRegistrationLicensePlate", - UPDATE_REGISTRATION_ADDRESS: "updateRegistrationAddress", - UPDATE_REGISTRATION_CITY: "updateRegistrationCity", - UPDATE_REGISTRATION_STATE: "updateRegistrationState", - UPDATE_REGISTRATION_ZIP_CODE: "updateRegistrationZipCode", - UPDATE_REGISTRATION_FIRST_NAME: "updateRegistrationFirstName", - UPDATE_REGISTRATION_LAST_NAME: "updateRegistrationLastName", UPDATE_REGISTRATION: "updateRegistration", UPDATE_SERVICE_ZIP: "updateServiceZip", diff --git a/src/layouts/address-lookup/address-lookup.vue b/src/layouts/address-lookup/address-lookup.vue index fe3b00320..48ab0dd08 100644 --- a/src/layouts/address-lookup/address-lookup.vue +++ b/src/layouts/address-lookup/address-lookup.vue @@ -323,10 +323,6 @@ export default { registrationInfo: { firstName: this.customerQuestions.firstName, lastName: this.customerQuestions.lastName, - address: this.customerQuestions.addressQuestions.streetAddress, - city: this.customerQuestions.addressQuestions.city, - state: resultMap.serviceZipValidationResponse.state, - zipCode: this.customerQuestions.addressQuestions.zipCode, }, }, false diff --git a/src/layouts/license-plate-lookup/license-plate-lookup.vue b/src/layouts/license-plate-lookup/license-plate-lookup.vue index 49ff8ff26..326215243 100644 --- a/src/layouts/license-plate-lookup/license-plate-lookup.vue +++ b/src/layouts/license-plate-lookup/license-plate-lookup.vue @@ -292,8 +292,6 @@ export default { vehicleInfo: Object.assign(vinLookup.data.vehicle, { vin: vinLookup.data.vin }), registrationInfo: { licensePlate: this.licensePlate, - state: resultMap.registrationZipValidationResponse.state, - zipCode: this.registrationZipCode, }, }, false diff --git a/src/store/index.js b/src/store/index.js index b64a09aa7..c3b599138 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -39,12 +39,6 @@ const getDefaultState = () => { imageColor: null, registration: { licensePlate: null, - address: null, - city: null, - state: null, - zipCode: null, - firstName: null, - lastName: null, }, }, serviceLocation: { @@ -217,27 +211,6 @@ export const mutations = { updateInsuranceVerifiedStatus(state, isVerified) { state.order.payment.insuranceCoverage.isVerified = isVerified; }, - updateRegistrationLicensePlate(state, licensePlate) { - state.order.vehicle.registration.licensePlate = licensePlate; - }, - updateRegistrationAddress(state, registrationAddress) { - state.order.vehicle.registration.address = registrationAddress; - }, - updateRegistrationCity(state, registrationCity) { - state.order.vehicle.registration.city = registrationCity; - }, - updateRegistrationState(state, registrationState) { - state.order.vehicle.registration.state = registrationState; - }, - updateRegistrationZipCode(state, registrationZipCode) { - state.order.vehicle.registration.zipCode = registrationZipCode; - }, - updateRegistrationFirstName(state, firstName) { - state.order.vehicle.registration.firstName = firstName; - }, - updateRegistrationLastName(state, lastName) { - state.order.vehicle.registration.lastName = lastName; - }, updateCustomerEmailAddress(state, customerEmailAddress) { state.order.customer.emailAddress = customerEmailAddress; }, @@ -358,12 +331,8 @@ export const mutations = { }, resetRegistrationState(state) { state.order.vehicle.registration.licensePlate = null; - state.order.vehicle.registration.address = null; - state.order.vehicle.registration.city = null; - state.order.vehicle.registration.state = null; - state.order.vehicle.registration.zipCode = null; - state.order.vehicle.registration.firstName = null; - state.order.vehicle.registration.lastName = null; + state.order.customer.firstName = null; + state.order.customer.lastName = null; }, resetGlassPartsState(state) { state.order.lineItems.glassParts = null; @@ -1775,12 +1744,8 @@ export const actions = { ) { //Reset dependent state when changing if ( - registrationInfo?.address !== context.state.order.vehicle.registration?.address || - registrationInfo?.city !== context.state.order.vehicle.registration?.city || - registrationInfo?.state !== context.state.order.vehicle.registration?.state || - registrationInfo?.zipCode !== context.state.order.vehicle.registration?.zipCode || - registrationInfo?.firstName !== context.state.order.vehicle.registration?.firstName || - registrationInfo?.lastName !== context.state.order.vehicle.registration?.lastName + registrationInfo?.firstName !== context.state.order.customer?.firstName || + registrationInfo?.lastName !== context.state.order.customer?.lastName ) { context.dispatch(storeActions.RESET_REGISTRATION_STATE_AND_DEPENDENCIES); diff --git a/src/store/store.spec.js b/src/store/store.spec.js index e813cb21e..f70bbd3d1 100644 --- a/src/store/store.spec.js +++ b/src/store/store.spec.js @@ -1552,7 +1552,7 @@ describe("Actions", () => { isCarIdDifferent: true, isSelectedGlassAvailableForVehicle: false, vehicleInfo: { carId: "C010101", vin: "XXXXX" }, - registrationInfo: { zipCode: "80020", address: "123 Marys Ave" }, + registrationInfo: { firstName: "abc", lastName: "123" }, serviceLocationInfo: { state: "CO" }, customerEmail: "test@safelite.com", };