diff --git a/jest.config.js b/jest.config.js index ce4aa3ad6..04f474e53 100644 --- a/jest.config.js +++ b/jest.config.js @@ -12,6 +12,7 @@ module.exports = { "!src/constants/*.js", "!src/router/**/*.js", "!src/helpers/unit-test-helper.js", + "!src/helpers/logger.js", "!src/layouts/vehicle-damage/windshield-options/windshield-options.vue", "!src/layouts/reveal/**/*.vue", "!src/layouts/payment-method/**/*.vue", diff --git a/src/constants/header-keys.js b/src/constants/header-keys.js index d9b3578c4..ed88393b5 100644 --- a/src/constants/header-keys.js +++ b/src/constants/header-keys.js @@ -5,5 +5,5 @@ export const headerKeys = { SESSION_SEQUENCE_NUMBER: "X-Session-Sequence-Number", TRANSACTION_ID: "X-Transaction-Id", EON: "X-Enterprise-Order-Number", - LOG_ENABLED: "log-enabled" + LOG_ENABLED: "log-enabled", }; diff --git a/src/constants/query-strings.js b/src/constants/query-strings.js index 210ac28f0..f5881f005 100644 --- a/src/constants/query-strings.js +++ b/src/constants/query-strings.js @@ -46,6 +46,7 @@ const queryStrings = { ORGANIC_SOCIAL: "organic_social", EXPERIMENTS: "experiments", FROM_HERITAGE: "fromheritage", + PHONE_NUMBER: "phonenumber", }; export { queryStrings }; diff --git a/src/constants/store-actions.js b/src/constants/store-actions.js index aee8d705f..ec6b0db0c 100644 --- a/src/constants/store-actions.js +++ b/src/constants/store-actions.js @@ -76,6 +76,7 @@ const storeActions = { SAVE_SERVICE_LOCATION: "saveServiceLocation", SAVE_SCHEDULE: "saveSchedule", SAVE_EMAIL: "saveEmail", + SAVE_PHONE_NUMBER: "savePhoneNumber", SAVE_REGISTRATION_LICENSE_PLATE_LOOKUP: "saveRegistrationLicensePlateLookup", SAVE_VIN: "saveVin", SAVE_REGISTRATION_ADDRESS_LOOKUP: "saveRegistrationAddressLookup", diff --git a/src/constants/store-mutations.js b/src/constants/store-mutations.js index f625e27cf..0836beb06 100644 --- a/src/constants/store-mutations.js +++ b/src/constants/store-mutations.js @@ -16,8 +16,6 @@ const storeMutations = { UPDATE_VEHICLE_IMAGE_COLOR: "updateVehicleImageColor", UPDATE_VEHICLE_VIN: "updateVehicleVin", UPDATE_VEHICLE: "updateVehicle", - UPDATE_VEHICLE_MOBILE_STATIC_RECALIBRATION_APPLICABLE: - "updateIsMobileStaticRecalibrationApplicable", UPDATE_IS_REPAIR: "updateIsRepair", UPDATE_NUMBER_OF_CHIPS: "updateNumberOfChips", @@ -41,6 +39,7 @@ const storeMutations = { // CUSTOMER MUTATIONS UPDATE_CUSTOMER_EMAIL_ADDRESS: "updateCustomerEmailAddress", + UPDATE_CUSTOMER_PHONE_NUMBER: "updateCustomerPhoneNumber", UPDATE_CUSTOMER_DETAILS: "updateCustomerDetails", // ORDER MUTATIONS @@ -107,6 +106,7 @@ const storeMutations = { UPDATE_EXTERNAL_PARAMETER_VIN_SELECTION: "updateExternalParameterVinSelection", UPDATE_EXTERNAL_PARAMETER_SERVICE_PACKAGE: "updateExternalParameterServicePackage", UPDATE_EXTERNAL_PARAMETER_SOURCE: "updateExternalParameterSource", + UPDATE_EXTERNAL_PARAMETER_PHONE_NUMBER: "updateExternalParameterPhoneNumber", //RESET EXTERNAL_PARAMETER MUTATIONS RESET_EXTERNAL_PARAMETER_VEHICLE_STATE: "resetExternalParameterVehicleState", @@ -115,6 +115,7 @@ const storeMutations = { RESET_EXTERNAL_PARAMETER_SERVICEZIP_STATE: "resetExternalParameterServiceZipState", RESET_EXTERNAL_PARAMETER_QUOTE_STATE: "resetExternalParameterQuoteState", RESET_EXTERNAL_PARAMETER_SOURCE_STATE: "resetExternalParameterSourceState", + RESET_EXTERNAL_PARAMETER_CUSTOMER_STATE: "resetExternalParameterCustomerState", RESET_IS_EXTERNAL_PARAMETER: "resetIsExternalParameter", //Affiliate Cookies diff --git a/src/fmg-components/save-progress-popup-question/save-progress-popup-question.vue b/src/fmg-components/save-progress-popup-question/save-progress-popup-question.vue index 5d98d5c4b..34ef44e71 100644 --- a/src/fmg-components/save-progress-popup-question/save-progress-popup-question.vue +++ b/src/fmg-components/save-progress-popup-question/save-progress-popup-question.vue @@ -219,7 +219,7 @@ export default { .textbox-question { padding: 0; margin: 0 0 1.5rem 0; - + label { text-align: left; font-weight: 900; @@ -258,7 +258,7 @@ export default { &.progress-saved { .modal-footer-button, - .modal-disclaimer { + .modal-disclaimer { display: none; } .skip-button { diff --git a/src/layouts/confirmation/confirmation.vue b/src/layouts/confirmation/confirmation.vue index f699d6a59..0739a9af6 100644 --- a/src/layouts/confirmation/confirmation.vue +++ b/src/layouts/confirmation/confirmation.vue @@ -116,39 +116,39 @@ export default { // send part question data to SPS API for logging const orderFromStore = await deepClone(store.getters.order); - const ctu = orderFromStore.serviceLocation?.zipCodeCtu + const ctu = orderFromStore.serviceLocation?.zipCodeCtu; const partsOrQuestions = orderFromStore.damage?.partQuestionAnswers; - partsOrQuestions.forEach(pqa => { - const payloadPartQuestions = []; - pqa.answeredQuestions.forEach(answer => { - payloadPartQuestions.push({ - questionSeq: answer?.questionNum, - questionText: answer?.questionText, - answerText: answer?.selectedAnswerText, - basePart: pqa?.result, + if (partsOrQuestions) { + partsOrQuestions.forEach(pqa => { + const payloadPartQuestions = []; + pqa.answeredQuestions.forEach(answer => { + payloadPartQuestions.push({ + questionSeq: answer?.questionNum, + questionText: answer?.questionText, + answerText: answer?.selectedAnswerText, + basePart: pqa?.result, + }); }); + + const payload = { + eon: orderFromStore.eon, + ctu: ctu, + workOrderId: orderFromStore.workOrderId, + workOrderNumber: orderFromStore.workOrderNumber, + carId: orderFromStore.vehicle.carId, + glassLocation: pqa?.glassLocation, + partQuestions: payloadPartQuestions, + }; + + baseMixin.methods.dispatchStoreAction( + storeActions.LOG_PART_QUESTIONS, + payload, + false + ); }); - - const payload = { - eon: orderFromStore.eon, - ctu: ctu, - workOrderId: orderFromStore.workOrderId, - workOrderNumber: orderFromStore.workOrderNumber, - carId: orderFromStore.vehicle.carId, - glassLocation: pqa?.glassLocation, - partQuestions: payloadPartQuestions, - }; - - baseMixin.methods.dispatchStoreAction( - storeActions.LOG_PART_QUESTIONS, - payload, - false - ); - - }); - + } // Create order await baseMixin.methods.dispatchStoreAction(storeActions.CREATE_SUBMITTED_ORDER); // This nulls the Store order diff --git a/src/layouts/service-location/service-location.spec.js b/src/layouts/service-location/service-location.spec.js index 54f28a89c..68d2e948f 100644 --- a/src/layouts/service-location/service-location.spec.js +++ b/src/layouts/service-location/service-location.spec.js @@ -182,9 +182,6 @@ beforeEach(() => { zipCode: "43235", state: "OH", }, - vehicle: { - isMobileStaticRecalibrationApplicable: true, - }, }, damage: { isRepair: false, diff --git a/src/layouts/service-location/service-location.vue b/src/layouts/service-location/service-location.vue index 9addea705..ef7a5491f 100644 --- a/src/layouts/service-location/service-location.vue +++ b/src/layouts/service-location/service-location.vue @@ -191,8 +191,6 @@ export default { isRecalibrationServiceableInshop: null, isGlassServiceableMobile: null, isRecalibrationServiceableMobile: null, - isVehicleMobileStaticRecalibrationApplicable: - this.getIsVehicleMobileStaticRecalibrationApplicableFromStore(), selectedAppointmentType: this.getSelectedAppointmentType(), selectedProvider: this.getSelectedProvider(), mobileFeePart: null, @@ -322,9 +320,8 @@ export default { isMobileStaticRecalibrationApplicable() { return ( this.displayMSR && - this.isVehicleMobileStaticRecalibrationApplicable && this.mobileFeePart?.partNumber == partNumberStrings.MOBILE_STATIC_RECAL_FEE && - (this.isInsurance ? this.mobileFeePart?.isInsurable : true) + (this.isInsurance && !this.isITAC ? this.mobileFeePart?.isInsurable : true) ); }, displayMSR() { @@ -401,6 +398,9 @@ export default { isInsurance() { return store.getters.payment.isInsurance; }, + isITAC() { + return store.getters.order.policy.isItac; + }, }, methods: { arePagePrerequisitesValid() { @@ -509,9 +509,6 @@ export default { getSelectedProvider() { return store.getters.order.serviceLocation.provider; }, - getIsVehicleMobileStaticRecalibrationApplicableFromStore() { - return store.getters.order.vehicle.isMobileStaticRecalibrationApplicable; - }, resetMobileLocation() { this.streetAddress = ""; this.apartmentNumberOrBusinessName = ""; diff --git a/src/layouts/vehicle/vehicle.vue b/src/layouts/vehicle/vehicle.vue index c81dfa2b0..728e1dcfd 100644 --- a/src/layouts/vehicle/vehicle.vue +++ b/src/layouts/vehicle/vehicle.vue @@ -80,7 +80,11 @@ import vehicleQuestion from "@/layouts/vehicle/vehicle-question/vehicle-question // Supporting files import { fetchCmsContentForPage } from "@/helpers/cms-content-helper"; import { experimentUniverses } from "@/constants/experiments"; -import { getSessionKeyValue, getUserIdValue, getDeviceIdValue } from "@/helpers/heritage-integration/cookie-helper"; +import { + getSessionKeyValue, + getUserIdValue, + getDeviceIdValue, +} from "@/helpers/heritage-integration/cookie-helper"; import { settleAllPromises } from "@/helpers/layout-helper"; import { Form, defineRule } from "vee-validate"; import { required } from "@/helpers/validation-rules"; @@ -117,7 +121,6 @@ export default { modelOptions: [], styleOptions: [], displayNoServiceAlert: false, - isMobileStaticRecalibrationApplicable: this.getIsMobileStaticRecalibrationApplicable(), }; }, @@ -440,8 +443,6 @@ export default { this.imageVifNumber = result?.data.imageVifNumber; this.imageVifColor = result?.data.imageVifColor; this.displayNoServiceAlert = !result?.data.canSafeliteService; - this.isMobileStaticRecalibrationApplicable = - result?.data.isMobileStaticRecalibrationApplicable; }, resetAlert() { this.displayNoServiceAlert = false; @@ -460,8 +461,6 @@ export default { imageUrl: this.imageUrl, imageVifNumber: this.imageVifNumber, imageVifColor: this.imageVifColor, - isMobileStaticRecalibrationApplicable: - this.isMobileStaticRecalibrationApplicable, }, false ); @@ -537,9 +536,6 @@ export default { getImageVifColorfromStore() { return store.getters.vehicle.imageVifColor; }, - getIsMobileStaticRecalibrationApplicable() { - return store.getters.vehicle.isMobileStaticRecalibrationApplicable; - }, }, components: { diff --git a/src/router/index.js b/src/router/index.js index 76d1203b7..83004b38c 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -837,6 +837,7 @@ function updateExternalParameterState() { const externalParameterServicePackage = getQuerystringParameter(queryStrings.SERVICE_PACKAGE); const externalParameterNumberOfChips = getQuerystringParameter(queryStrings.NUMBER_OF_CHIPS); const externalParameterSource = getQuerystringParameter(queryStrings.EXPERIMENTS); + const externalParameterPhoneNumber = getQuerystringParameter(queryStrings.PHONE_NUMBER); if ( externalParameterYear && externalParameterMake && @@ -892,6 +893,13 @@ function updateExternalParameterState() { if (externalParameterSource) { store.commit(storeMutations.UPDATE_EXTERNAL_PARAMETER_SOURCE, externalParameterSource); } + if (externalParameterPhoneNumber) { + store.commit( + storeMutations.UPDATE_EXTERNAL_PARAMETER_PHONE_NUMBER, + externalParameterPhoneNumber + ); + store.dispatch(storeActions.SAVE_PHONE_NUMBER, externalParameterPhoneNumber); + } } // if there is an existing external parameter state then they have already been through from an external source(LeadGen) and diff --git a/src/store/index.js b/src/store/index.js index 77a1f1e95..c07fffbd3 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -68,7 +68,6 @@ const getDefaultState = () => { registration: { licensePlate: null, }, - isMobileStaticRecalibrationApplicable: false, }, serviceLocation: { address: null, @@ -226,10 +225,6 @@ export const mutations = { updateVehicleVin(state, vin) { state.order.vehicle.vin = vin; }, - updateIsMobileStaticRecalibrationApplicable(state, isMobileStaticRecalibrationApplicable) { - state.order.vehicle.isMobileStaticRecalibrationApplicable = - isMobileStaticRecalibrationApplicable; - }, updateIsRepair(state, isRepair) { state.order.damage.isRepair = isRepair; }, @@ -343,6 +338,9 @@ export const mutations = { updateCustomerEmailAddress(state, customerEmailAddress) { state.order.customer.emailAddress = customerEmailAddress; }, + updateCustomerPhoneNumber(state, phoneNumber) { + state.order.customer.phoneNumber = phoneNumber; + }, updateVehicle(state, vehicleInfo) { state.order.vehicle.year = vehicleInfo.year; state.order.vehicle.make = vehicleInfo.make; @@ -355,8 +353,6 @@ export const mutations = { state.order.vehicle.imageUrl = vehicleInfo.imageUrl; state.order.vehicle.imageVifNumber = vehicleInfo.imageVifNumber; state.order.vehicle.imageColor = vehicleInfo.imageVifColor; - state.order.vehicle.isMobileStaticRecalibrationApplicable = - vehicleInfo.isMobileStaticRecalibrationApplicable; }, updateRegistration(state, registrationInfo) { state.order.vehicle.registration.licensePlate = registrationInfo?.licensePlate; @@ -495,6 +491,10 @@ export const mutations = { externalParameterState.quote.servicePackage = servicePackage; saveExternalParameterState(externalParameterState); }, + updateExternalParameterPhoneNumber(state, phoneNumber) { + externalParameterState.customer.phoneNumber = phoneNumber; + saveExternalParameterState(externalParameterState); + }, //RESET ExternalParameter MUTATIONS resetExternalParameterVehicleState(state) { externalParameterState.vehicle.year = null; @@ -528,6 +528,10 @@ export const mutations = { externalParameterState.isExternalParameter = externalParameterStatus.INACTIVE; saveExternalParameterState(externalParameterState); }, + resetExternalParameterCustomerState(state) { + externalParameterState.customer.phoneNumber = null; + saveExternalParameterState(externalParameterState); + }, // RESET DEPENDENCY MUTATIONS resetVehicleState(state) { @@ -541,7 +545,6 @@ export const mutations = { state.order.vehicle.imageUrl = null; state.order.vehicle.imageVifNumber = null; state.order.vehicle.imageColor = null; - state.order.vehicle.isMobileStaticRecalibrationApplicable = false; }, resetDamageState(state) { state.order.damage.isRepair = null; @@ -984,6 +987,7 @@ export const getters = { externalParameterQuote: (state) => externalParameterState?.quote, externalParameterServiceZip: (state) => externalParameterState?.serviceZip, externalParameterEstimate: (state) => externalParameterState?.estimate, + externalParameterCustomer: (state) => externalParameterState?.customer, isExternalParameter: (state) => externalParameterState?.isExternalParameter, }; @@ -1448,16 +1452,7 @@ export const actions = { logPartQuestions( context, - { - eon, - ctu, - workOrderId, - workOrderNumber, - carId, - glassLocation, - partQuestions, - userAgent, - } + { eon, ctu, workOrderId, workOrderNumber, carId, glassLocation, partQuestions, userAgent } ) { var payload = { applicationName: applicationConfig.APPLICATION_NAME, @@ -1468,15 +1463,14 @@ export const actions = { carId: carId, glassLocation: glassLocation, partQuestions: partQuestions, - userAgent: navigator.userAgent + userAgent: navigator.userAgent, }; - return globalMethods - .callHttpClient({ - method: endpoints.LogPartQuestions.method, - endpoint: endpoints.LogPartQuestions.url, - payload: payload, - }); + return globalMethods.callHttpClient({ + method: endpoints.LogPartQuestions.method, + endpoint: endpoints.LogPartQuestions.url, + payload: payload, + }); }, // Misc Actions @@ -1654,8 +1648,6 @@ export const actions = { const coverageStatus = coverageStatusEnum(order.payment?.insuranceCoverage?.coverageStatus); const coverageType = coverageTypeEnum(order.payment?.insuranceCoverage?.coverageType); const isItacOptimized = order.policy?.isItac ?? false; - const isMobileStaticRecalibrationApplicable = - order.vehicle?.isMobileStaticRecalibrationApplicable; const zipCode = serviceZipCode ?? order.serviceLocation?.provider?.address?.zipCode ?? @@ -1671,12 +1663,10 @@ export const actions = { var endPoint = `${endpoints.GetMobileFeePart.url}/?serviceType=${serviceType}&facilityType=${facilityType}&parentAccountNumber=${parentAccountNumber}&billToAccountNumber=${billToAccountNumber}&providerNumber=${providerNumber}&isItacOptimized=${isItacOptimized}&zipCode=${zipCode}`; - if (isMobileStaticRecalibrationApplicable) { - const recalPartNumber = getRecalPartNumber(order.lineItems?.glassParts[0]); - const carId = order.vehicle?.carId; - if (recalPartNumber && carId) { - endPoint = `${endPoint}&partNumbers=${recalPartNumber}&carId=${carId}`; - } + const recalPartNumber = getRecalPartNumber(order.lineItems?.glassParts[0]); + const carId = order.vehicle?.carId; + if (recalPartNumber && carId) { + endPoint = `${endPoint}&partNumbers=${recalPartNumber}&carId=${carId}`; } if (coverageStatus) { @@ -2279,18 +2269,7 @@ export const actions = { // Vehicle saveVehicle( context, - { - year, - make, - model, - style, - carId, - category, - imageUrl, - imageVifNumber, - imageVifColor, - isMobileStaticRecalibrationApplicable, - } + { year, make, model, style, carId, category, imageUrl, imageVifNumber, imageVifColor } ) { if ( context.state.order.vehicle.year != year || @@ -2311,10 +2290,6 @@ export const actions = { context.commit(storeMutations.UPDATE_VEHICLE_IMAGE_URL, imageUrl); context.commit(storeMutations.UPDATE_VEHICLE_IMAGE_VIF_NUMBER, imageVifNumber); context.commit(storeMutations.UPDATE_VEHICLE_IMAGE_COLOR, imageVifColor); - context.commit( - storeMutations.UPDATE_VEHICLE_MOBILE_STATIC_RECALIBRATION_APPLICABLE, - isMobileStaticRecalibrationApplicable - ); } }, @@ -3039,6 +3014,10 @@ export const actions = { context.commit(storeMutations.UPDATE_CUSTOMER_EMAIL_ADDRESS, email === "" ? null : email); }, + savePhoneNumber(context, phoneNumber) { + context.commit(storeMutations.UPDATE_CUSTOMER_PHONE_NUMBER, phoneNumber === "" ? null : phoneNumber); + }, + saveVin(context, { isSelectedGlassAvailableForVehicle, vehicleInfo }) { //Reset dependent state when changing if (vehicleInfo.vin !== context.state.order.vehicle.vin) { @@ -3132,6 +3111,7 @@ export const actions = { context.commit(storeMutations.RESET_EXTERNAL_PARAMETER_ESTIMATE_STATE); context.commit(storeMutations.RESET_EXTERNAL_PARAMETER_SERVICEZIP_STATE); context.commit(storeMutations.RESET_EXTERNAL_PARAMETER_QUOTE_STATE); + context.commit(storeMutations.RESET_EXTERNAL_PARAMETER_CUSTOMER_STATE); context.commit(storeMutations.RESET_IS_EXTERNAL_PARAMETER); } }, @@ -3704,6 +3684,9 @@ function createExternalParameterDefaultState() { isInsurance: null, servicePackage: null, }, + customer: { + phoneNumber: null, + }, }; // set to session storage saveExternalParameterState(externalParameterDefaultState);