Merge branch 'release/2025.02.13' into release/2025.02.06
This commit is contained in:
commit
2c39e6f2b4
22 changed files with 356 additions and 67 deletions
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -125,7 +125,7 @@ const endpoints = {
|
|||
method: "POST",
|
||||
},
|
||||
SaveQuote: {
|
||||
url: "/order/api/v1/order/initiate-saved-progress-email",
|
||||
url: "/order/api/v1/order/save-progress",
|
||||
method: "POST",
|
||||
},
|
||||
GetSignature: {
|
||||
|
|
@ -168,6 +168,10 @@ const endpoints = {
|
|||
url: "/analytics/api/v1/analytics/initialize",
|
||||
method: "POST",
|
||||
},
|
||||
LogPartQuestions: {
|
||||
url: "/analytics/api/v1/analytics/log-part-questions",
|
||||
method: "POST",
|
||||
},
|
||||
GetExperimentsByUser: {
|
||||
url: "/analytics/api/v1/analytics/get-experiments",
|
||||
method: "GET",
|
||||
|
|
|
|||
|
|
@ -18,6 +18,8 @@ const errorMessages = {
|
|||
LAST_NAME_REQUIRED: "Please enter your last name",
|
||||
EMAIL_ADDRESS_REQUIRED: "Please enter your email address",
|
||||
EMAIL_ADDRESS_FORMAT: "Please enter a valid email address",
|
||||
EMAIL_SMS_REQUIRED: "Please enter your mobile phone number or email",
|
||||
EMAIL_SMS_FORMAT: "Please enter a valid mobile phone number or email",
|
||||
SERVICE_ZIP_REQUIRED: "Please enter your service ZIP",
|
||||
SERVICE_ZIP_FORMAT: "Please enter a valid service ZIP",
|
||||
VIN_REQUIRED: "Please enter your VIN",
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
const experimentUniverses = {
|
||||
CONCEPT_FUNNEL: "ConceptFunnel",
|
||||
RECAL_PRICE_REMOVAL: "NextGen_RecalPriceRemoval",
|
||||
MSR: "MSR",
|
||||
};
|
||||
|
||||
const experimentSettings = {
|
||||
|
|
@ -16,6 +17,7 @@ const experimentSettings = {
|
|||
RECAL_PRICE_REMOVE: "RecalPriceRemove",
|
||||
INSURANCE_TAB_TO_DISPLAY_THRESHOLD_INTERNAL: "NextGen_InternalInsuranceTabDisplayThreshold",
|
||||
INSURANCE_TAB_TO_DISPLAY_THRESHOLD_EXTERNAL: "NextGen_ExternalInsuranceTabDisplayThreshold",
|
||||
DISPLAY_MSR: "DisplayMSR",
|
||||
};
|
||||
|
||||
const experimentTriggers = {
|
||||
|
|
|
|||
|
|
@ -5,4 +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",
|
||||
};
|
||||
|
|
|
|||
7
src/constants/part-number-strings.js
Normal file
7
src/constants/part-number-strings.js
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
const partNumberStrings = {
|
||||
// Recalibration
|
||||
MOBILE_STATIC_RECAL_FEE: "RECAL MOBILE",
|
||||
MOBILE_DUAL_RECAL_FEE: "RECAL MOBILEDUAL",
|
||||
};
|
||||
|
||||
export { partNumberStrings };
|
||||
|
|
@ -46,6 +46,7 @@ const queryStrings = {
|
|||
ORGANIC_SOCIAL: "organic_social",
|
||||
EXPERIMENTS: "experiments",
|
||||
FROM_HERITAGE: "fromheritage",
|
||||
PHONE_NUMBER: "phonenumber",
|
||||
};
|
||||
|
||||
export { queryStrings };
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
const storeActions = {
|
||||
// Content Actions
|
||||
GET_PAGE_DATA: "getPageData",
|
||||
SAVE_PAGE_DATA: "savePageData",
|
||||
|
||||
// Vehicle Actions
|
||||
GET_VEHICLE_YEARS: "getVehicleYears",
|
||||
|
|
@ -42,10 +43,6 @@ const storeActions = {
|
|||
VALIDATE_ZIP: "validateZip",
|
||||
PRICE_ORDER_ITEMS_AND_SAVE_SERVER_DATA: "priceOrderItemsAndSaveServerData",
|
||||
TAX_ORDER_ITEMS_AND_SAVE_SERVER_DATA: "taxOrderItemsAndSaveServerData",
|
||||
LOG_EXPERIMENT_EXPOSURE: "logExperimentExposure",
|
||||
LOG_PAGE_VIEW: "logPageView",
|
||||
LOG_CUSTOM_EVENT: "logCustomEvent",
|
||||
INITIALIZE_SESSION: "initializeSession",
|
||||
GET_EXPERIMENTS_BY_USER: "GetExperimentsByUser",
|
||||
RUN_EXPERIMENTS_FOR_TRIGGER: "runExperimentsForTrigger",
|
||||
CLEAR_VIN: "clearVin",
|
||||
|
|
@ -57,6 +54,13 @@ const storeActions = {
|
|||
GET_BILL_TO_ACCOUNT_NUMBER: "getBillToAccountNumber",
|
||||
GET_RECAL_PARTS_AND_SAVE_TO_LINE_ITEMS: "getRecalPartsAndSaveToLineItems",
|
||||
|
||||
// Analytics
|
||||
LOG_EXPERIMENT_EXPOSURE_AND_UPDATE_STORE: "logExperimentExposureAndUpdateStore",
|
||||
LOG_PAGE_VIEW: "logPageView",
|
||||
LOG_CUSTOM_EVENT: "logCustomEvent",
|
||||
INITIALIZE_SESSION: "initializeSession",
|
||||
LOG_PART_QUESTIONS: "logPartQuestions",
|
||||
|
||||
// DEPENDENCY MUTATIONS
|
||||
RESET_VEHICLE_STATE_AND_DEPENDENCIES: "resetVehicleStateAndDependencies",
|
||||
RESET_DAMAGE_STATE_AND_DEPENDENCIES: "resetDamageAndDependencies",
|
||||
|
|
@ -73,6 +77,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",
|
||||
|
|
|
|||
|
|
@ -16,6 +16,8 @@ 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",
|
||||
|
|
@ -39,6 +41,7 @@ const storeMutations = {
|
|||
|
||||
// CUSTOMER MUTATIONS
|
||||
UPDATE_CUSTOMER_EMAIL_ADDRESS: "updateCustomerEmailAddress",
|
||||
UPDATE_CUSTOMER_PHONE_NUMBER: "updateCustomerPhoneNumber",
|
||||
UPDATE_CUSTOMER_DETAILS: "updateCustomerDetails",
|
||||
|
||||
// ORDER MUTATIONS
|
||||
|
|
@ -105,6 +108,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",
|
||||
|
|
@ -113,6 +117,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
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -70,6 +70,7 @@ export default {
|
|||
[headerKeys.REFERRAL_SEQUENCE_NUMBER]: order?.referralSequenceNumber,
|
||||
[headerKeys.TRANSACTION_ID]: crypto.randomUUID(),
|
||||
[headerKeys.EON]: order?.eon,
|
||||
[headerKeys.LOG_ENABLED]: store.getters.applicationUser?.loggingOption ?? false,
|
||||
};
|
||||
|
||||
axios({
|
||||
|
|
|
|||
|
|
@ -114,6 +114,43 @@ export default {
|
|||
async beforeRouteEnter(to, from, next) {
|
||||
const hasRecalPriceRemoveExperiment = await store.getters.shouldHideRecalibration;
|
||||
|
||||
// send part question data to SPS API for logging
|
||||
const orderFromStore = await deepClone(store.getters.order);
|
||||
const ctu = orderFromStore.serviceLocation?.zipCodeCtu;
|
||||
|
||||
const partsOrQuestions = orderFromStore.damage?.partQuestionAnswers;
|
||||
|
||||
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
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
// Create order
|
||||
await baseMixin.methods.dispatchStoreAction(storeActions.CREATE_SUBMITTED_ORDER); // This nulls the Store order
|
||||
|
||||
// Call APIs
|
||||
|
|
|
|||
|
|
@ -11,7 +11,10 @@ export async function getPricedMobileFeePart(serviceZipCode, pageNameToLog) {
|
|||
// Get the Mobile Fee Part
|
||||
const mobileFeePart = await baseMixin.methods.dispatchStoreActionWithLogging(
|
||||
storeActions.GET_MOBILE_FEE_PART,
|
||||
null,
|
||||
{
|
||||
serviceZipCode: serviceZipCode,
|
||||
serviceZipCodeCtu: zipCodeData.zipCodeCtu,
|
||||
},
|
||||
pageNameToLog,
|
||||
false
|
||||
);
|
||||
|
|
|
|||
|
|
@ -7,6 +7,7 @@ import { getMountOptions } from "@/helpers/unit-test-helper";
|
|||
|
||||
import store from "@/store";
|
||||
import baseMixin from "@/mixins/base-mixin";
|
||||
import { experimentSettings } from "@/constants/experiments";
|
||||
|
||||
// Define Mocks
|
||||
jest.mock("@/helpers/cms-content-helper", () => ({
|
||||
|
|
@ -181,6 +182,9 @@ beforeEach(() => {
|
|||
zipCode: "43235",
|
||||
state: "OH",
|
||||
},
|
||||
vehicle: {
|
||||
isMobileStaticRecalibrationApplicable: true,
|
||||
},
|
||||
},
|
||||
damage: {
|
||||
isRepair: false,
|
||||
|
|
@ -196,6 +200,9 @@ beforeEach(() => {
|
|||
zipCode: "43054",
|
||||
},
|
||||
},
|
||||
experimentSettings: {
|
||||
settingName: experimentSettings.DISPLAY_MSR,
|
||||
},
|
||||
};
|
||||
});
|
||||
|
||||
|
|
|
|||
|
|
@ -139,6 +139,8 @@ import contentGroupModal from "@/fmg-components/content-group-modal/content-grou
|
|||
|
||||
// Supporting files
|
||||
import baseMixin from "@/mixins/base-mixin.js";
|
||||
import experimentMixin from "@/mixins/experiment-mixin.js";
|
||||
import { experimentSettings } from "@/constants/experiments";
|
||||
import { AppointmentTypeStrings } from "@/constants/schedule-constants";
|
||||
|
||||
import { fetchCmsContentForPage } from "@/helpers/cms-content-helper";
|
||||
|
|
@ -151,6 +153,7 @@ import {
|
|||
import { navigateToHeritageFunnel } from "@/helpers/heritage-integration/navigation-helper";
|
||||
import { applicationConfig } from "@/constants/application-config";
|
||||
import { Provider } from "@/layouts/service-location/classes/provider";
|
||||
import { partNumberStrings } from "@/constants/part-number-strings";
|
||||
|
||||
import store from "@/store";
|
||||
|
||||
|
|
@ -188,6 +191,8 @@ export default {
|
|||
isRecalibrationServiceableInshop: null,
|
||||
isGlassServiceableMobile: null,
|
||||
isRecalibrationServiceableMobile: null,
|
||||
isVehicleMobileStaticRecalibrationApplicable:
|
||||
this.getIsVehicleMobileStaticRecalibrationApplicableFromStore(),
|
||||
selectedAppointmentType: this.getSelectedAppointmentType(),
|
||||
selectedProvider: this.getSelectedProvider(),
|
||||
mobileFeePart: null,
|
||||
|
|
@ -306,11 +311,29 @@ export default {
|
|||
},
|
||||
isServiceableMobile() {
|
||||
if (this.isRecalibrationServiceableMobile !== null) {
|
||||
return this.isGlassServiceableMobile && this.isRecalibrationServiceableMobile;
|
||||
return (
|
||||
(this.isGlassServiceableMobile && this.isRecalibrationServiceableMobile) ||
|
||||
this.isMobileStaticRecalibrationApplicable
|
||||
);
|
||||
} else {
|
||||
return this.isGlassServiceableMobile;
|
||||
}
|
||||
},
|
||||
isMobileStaticRecalibrationApplicable() {
|
||||
return (
|
||||
this.displayMSR &&
|
||||
this.isVehicleMobileStaticRecalibrationApplicable &&
|
||||
this.mobileFeePart?.partNumber == partNumberStrings.MOBILE_STATIC_RECAL_FEE &&
|
||||
(this.isInsurance ? this.mobileFeePart?.isInsurable : true)
|
||||
);
|
||||
},
|
||||
displayMSR() {
|
||||
return (
|
||||
experimentMixin.methods
|
||||
.getSettingValue(experimentSettings.DISPLAY_MSR)
|
||||
?.toLowerCase() === "true"
|
||||
);
|
||||
},
|
||||
mobileFeeApplies() {
|
||||
if (
|
||||
this.mobileFeePart?.laborAmount > 0 ||
|
||||
|
|
@ -349,7 +372,8 @@ export default {
|
|||
return (
|
||||
this.isServiceableInshop &&
|
||||
this.isGlassServiceableMobile &&
|
||||
this.isRecalibrationServiceableMobile === false
|
||||
this.isRecalibrationServiceableMobile === false &&
|
||||
!this.isMobileStaticRecalibrationApplicable
|
||||
);
|
||||
},
|
||||
displayRecalibrationWarning() {
|
||||
|
|
@ -485,6 +509,9 @@ export default {
|
|||
getSelectedProvider() {
|
||||
return store.getters.order.serviceLocation.provider;
|
||||
},
|
||||
getIsVehicleMobileStaticRecalibrationApplicableFromStore() {
|
||||
return store.getters.order.vehicle.isMobileStaticRecalibrationApplicable;
|
||||
},
|
||||
resetMobileLocation() {
|
||||
this.streetAddress = "";
|
||||
this.apartmentNumberOrBusinessName = "";
|
||||
|
|
|
|||
|
|
@ -181,6 +181,7 @@ function applyMockStoreDataToGetters() {
|
|||
payment: mockStoreData.payment,
|
||||
policy: mockStoreData.policy,
|
||||
externalParameterServiceZip: mockStoreData.externalParameterServiceZip,
|
||||
emailOrSms: mockStoreData.customer.emailAddress,
|
||||
};
|
||||
store.state.order = mockStoreData;
|
||||
store.state.applicationUser.experiments = mockExperimentSettings;
|
||||
|
|
@ -241,7 +242,7 @@ describe("service-zip.vue", () => {
|
|||
|
||||
// Assert
|
||||
expect(wrapper.vm.serviceZipCode).toEqual("11111");
|
||||
expect(wrapper.vm.emailAddress).toEqual("builddigitaltest@safelite.com");
|
||||
expect(wrapper.vm.emailOrSms).toEqual("builddigitaltest@safelite.com");
|
||||
});
|
||||
|
||||
test("Zip in querystring -> pushed to data", () => {
|
||||
|
|
|
|||
|
|
@ -23,11 +23,11 @@
|
|||
<textboxQuestion
|
||||
class="mb-0"
|
||||
cmsWidgetName="EmailAddressQuestionWidget"
|
||||
v-model="emailAddress"
|
||||
inputId="emailAddress"
|
||||
v-model="emailOrSms"
|
||||
inputId="emailOrSms"
|
||||
:isRequired="!IsEmailOptional"
|
||||
disableAutoFill
|
||||
:validationRules="EmailValidationRules"
|
||||
:validationRules="EmailOrSmsValidationRules"
|
||||
:addOptionalText="IsEmailOptional" />
|
||||
<textBlock cmsWidgetName="QuoteEmailTextBlockWidget" typeStyle="caption" />
|
||||
|
||||
|
|
@ -88,16 +88,17 @@ import vinPagesMixin from "@/mixins/vin-pages-mixin";
|
|||
import { saveSession } from "@/helpers/heritage-integration/order-helper.js";
|
||||
import baseMixin from "@/mixins/base-mixin.js";
|
||||
import { queryStrings } from "@/constants/query-strings";
|
||||
import { fmgPageValues } from "@/router/router-constants/fmgPage-values";
|
||||
|
||||
// Define Validation Rules
|
||||
defineRule("zip-required", required(errorMessages.SERVICE_ZIP_REQUIRED));
|
||||
defineRule("zip-format", regex(/(^\d{5}$)|(^\d{5}-\d{4}$)/, errorMessages.SERVICE_ZIP_FORMAT));
|
||||
defineRule("email-address-required", required(errorMessages.EMAIL_ADDRESS_REQUIRED));
|
||||
defineRule("email-sms-required", required(errorMessages.EMAIL_SMS_REQUIRED));
|
||||
defineRule(
|
||||
"email-address-format",
|
||||
"email-sms-format",
|
||||
regex(
|
||||
/^([a-zA-Z0-9_\-.+]+)@([a-zA-Z0-9-]+)\.([a-zA-Z]{2,})$/,
|
||||
errorMessages.EMAIL_ADDRESS_FORMAT
|
||||
/^([a-zA-Z0-9_\-.+]+)@([a-zA-Z0-9-]+)\.([a-zA-Z]{2,})$|^\(?(\d{3})\)?[-. ]?(\d{3})[-. ]?(\d{4})$/,
|
||||
errorMessages.EMAIL_SMS_FORMAT
|
||||
)
|
||||
);
|
||||
defineRule("option-required", required(errorMessages.OPTION_REQUIRED));
|
||||
|
|
@ -108,7 +109,7 @@ export default {
|
|||
data() {
|
||||
return {
|
||||
serviceZipCode: this.getZipFromStore() ?? this.$route.query.zipcode,
|
||||
emailAddress: this.getEmailFromStore(),
|
||||
emailOrSms: this.getEmailOrSmsFromStore(),
|
||||
displayInvalidZipAlert: false,
|
||||
displayNonServiceableZipAlert: false,
|
||||
};
|
||||
|
|
@ -160,11 +161,11 @@ export default {
|
|||
store.getters.order.serviceLocation.zipCode
|
||||
);
|
||||
},
|
||||
getEmailFromStore() {
|
||||
return (
|
||||
store.getters.externalParameterServiceZip.emailAddress ??
|
||||
store.getters.order.customer.emailAddress
|
||||
);
|
||||
getEmailOrSmsFromStore() {
|
||||
return store.getters.emailOrSms;
|
||||
},
|
||||
getPhoneFromStore() {
|
||||
return store.getters.order.customer.phoneNumber;
|
||||
},
|
||||
arePagePrerequisitesValid() {
|
||||
return store.getters.damage.isRepair || store.getters.damage.glassToReplace?.length > 0;
|
||||
|
|
@ -186,7 +187,23 @@ export default {
|
|||
},
|
||||
async forwardButtonAction() {
|
||||
const zipCodeData = await this.getZipCodeData(this.serviceZipCode);
|
||||
await this.dispatchStoreAction(storeActions.SAVE_EMAIL, this.emailAddress, false);
|
||||
|
||||
if (vinPagesMixin.methods.isPhoneNumber(this.emailOrSms)) {
|
||||
const phone = this.emailOrSms.replace(/[()]/g, "");
|
||||
await this.dispatchStoreAction(storeActions.SAVE_PHONE_NUMBER, phone, false);
|
||||
} else {
|
||||
await this.dispatchStoreAction(storeActions.SAVE_EMAIL, this.emailOrSms, false);
|
||||
}
|
||||
|
||||
await this.dispatchStoreAction(
|
||||
storeActions.SAVE_PAGE_DATA,
|
||||
{
|
||||
page: fmgPageValues.EMAIL_SMS_PAGES,
|
||||
data: { emailOrSmsValue: this.emailOrSms },
|
||||
},
|
||||
false
|
||||
);
|
||||
|
||||
await this.dispatchStoreAction(
|
||||
storeActions.SAVE_SERVICE_ZIP_CODE_INFO,
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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,6 +121,7 @@ export default {
|
|||
modelOptions: [],
|
||||
styleOptions: [],
|
||||
displayNoServiceAlert: false,
|
||||
isMobileStaticRecalibrationApplicable: this.getIsMobileStaticRecalibrationApplicable(),
|
||||
};
|
||||
},
|
||||
|
||||
|
|
@ -182,7 +187,7 @@ export default {
|
|||
if (experimentForLogging !== undefined) {
|
||||
// Log experiment exposure
|
||||
baseMixin.methods.dispatchStoreActionWithLogging(
|
||||
storeActions.LOG_EXPERIMENT_EXPOSURE,
|
||||
storeActions.LOG_EXPERIMENT_EXPOSURE_AND_UPDATE_STORE,
|
||||
{
|
||||
userId: getUserIdValue(),
|
||||
deviceId: getDeviceIdValue(),
|
||||
|
|
@ -439,6 +444,8 @@ 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;
|
||||
|
|
@ -457,6 +464,8 @@ export default {
|
|||
imageUrl: this.imageUrl,
|
||||
imageVifNumber: this.imageVifNumber,
|
||||
imageVifColor: this.imageVifColor,
|
||||
isMobileStaticRecalibrationApplicable:
|
||||
this.isMobileStaticRecalibrationApplicable,
|
||||
},
|
||||
false
|
||||
);
|
||||
|
|
@ -532,6 +541,9 @@ export default {
|
|||
getImageVifColorfromStore() {
|
||||
return store.getters.vehicle.imageVifColor;
|
||||
},
|
||||
getIsMobileStaticRecalibrationApplicable() {
|
||||
return store.getters.vehicle.isMobileStaticRecalibrationApplicable;
|
||||
},
|
||||
},
|
||||
|
||||
components: {
|
||||
|
|
|
|||
|
|
@ -16,6 +16,11 @@ export default {
|
|||
? "email-address-format"
|
||||
: "email-address-required|email-address-format";
|
||||
},
|
||||
EmailOrSmsValidationRules() {
|
||||
return this.IsEmailOptional
|
||||
? "email-sms-format"
|
||||
: "email-sms-required|email-sms-format";
|
||||
},
|
||||
},
|
||||
methods: {
|
||||
async navigateForwardWithSingleCarMatch() {
|
||||
|
|
@ -56,5 +61,9 @@ export default {
|
|||
false
|
||||
);
|
||||
},
|
||||
isPhoneNumber(input) {
|
||||
const phoneRegex = /^\(?(\d{3})\)?[-. ]?(\d{3})[-. ]?(\d{4})$/;
|
||||
return phoneRegex.test(input);
|
||||
},
|
||||
},
|
||||
};
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -23,6 +23,7 @@ const fmgPageValues = {
|
|||
PAYMENT_PIA_RETURN: "payment-pia-return",
|
||||
CONFIRMATION: "confirmation",
|
||||
RETURN_USER: "return-user",
|
||||
EMAIL_SMS_PAGES: "email-or-sms-related-pages",
|
||||
};
|
||||
|
||||
const funnelStartPageName = fmgPageValues.VEHICLE;
|
||||
|
|
|
|||
|
|
@ -68,6 +68,7 @@ const getDefaultState = () => {
|
|||
registration: {
|
||||
licensePlate: null,
|
||||
},
|
||||
isMobileStaticRecalibrationApplicable: false,
|
||||
},
|
||||
serviceLocation: {
|
||||
address: null,
|
||||
|
|
@ -225,6 +226,10 @@ 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;
|
||||
},
|
||||
|
|
@ -338,6 +343,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;
|
||||
|
|
@ -350,6 +358,8 @@ 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;
|
||||
|
|
@ -488,6 +498,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;
|
||||
|
|
@ -521,6 +535,10 @@ export const mutations = {
|
|||
externalParameterState.isExternalParameter = externalParameterStatus.INACTIVE;
|
||||
saveExternalParameterState(externalParameterState);
|
||||
},
|
||||
resetExternalParameterCustomerState(state) {
|
||||
externalParameterState.customer.phoneNumber = null;
|
||||
saveExternalParameterState(externalParameterState);
|
||||
},
|
||||
|
||||
// RESET DEPENDENCY MUTATIONS
|
||||
resetVehicleState(state) {
|
||||
|
|
@ -534,6 +552,7 @@ 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;
|
||||
|
|
@ -659,34 +678,38 @@ export const mutations = {
|
|||
sessionInformation.order.payment.billToAccountNumber;
|
||||
state.order.payment.inactivePromos = sessionInformation.order.payment.inactivePromos;
|
||||
|
||||
state.order.serviceLocation.address =
|
||||
sessionInformation.order.serviceLocation.streetAddress;
|
||||
state.order.serviceLocation.address2 =
|
||||
sessionInformation.order.serviceLocation.streetAddress2;
|
||||
state.order.serviceLocation.city = sessionInformation.order.serviceLocation.city;
|
||||
state.order.serviceLocation.state = sessionInformation.order.serviceLocation.state;
|
||||
state.order.serviceLocation.zipCode = sessionInformation.order.serviceLocation.zipCode;
|
||||
state.order.serviceLocation.zipCodeCtu =
|
||||
sessionInformation.order.serviceLocation.zipCodeCtu;
|
||||
//Do not assign default service type once user make service type selection
|
||||
if (state.order.serviceLocation.appointmentType == null) {
|
||||
state.order.serviceLocation.address =
|
||||
sessionInformation.order.serviceLocation.streetAddress;
|
||||
state.order.serviceLocation.address2 =
|
||||
sessionInformation.order.serviceLocation.streetAddress2;
|
||||
state.order.serviceLocation.city = sessionInformation.order.serviceLocation.city;
|
||||
state.order.serviceLocation.state = sessionInformation.order.serviceLocation.state;
|
||||
state.order.serviceLocation.zipCode = sessionInformation.order.serviceLocation.zipCode;
|
||||
state.order.serviceLocation.zipCodeCtu =
|
||||
sessionInformation.order.serviceLocation.zipCodeCtu;
|
||||
|
||||
state.order.serviceLocation.appointmentType =
|
||||
sessionInformation.order.serviceLocation.appointmentType;
|
||||
state.order.serviceLocation.isVehicleProtected =
|
||||
sessionInformation.order.serviceLocation.isVehicleProtected;
|
||||
state.order.serviceLocation.appointmentType =
|
||||
sessionInformation.order.serviceLocation.appointmentType;
|
||||
state.order.serviceLocation.isVehicleProtected =
|
||||
sessionInformation.order.serviceLocation.isVehicleProtected;
|
||||
|
||||
state.order.serviceLocation.provider.providerNumber =
|
||||
sessionInformation.order.serviceLocation.provider?.providerNumber;
|
||||
state.order.serviceLocation.provider.address.streetAddress =
|
||||
sessionInformation.order.serviceLocation.provider?.address?.streetAddress;
|
||||
state.order.serviceLocation.provider.address.city =
|
||||
sessionInformation.order.serviceLocation.provider?.address?.city;
|
||||
state.order.serviceLocation.provider.address.state =
|
||||
sessionInformation.order.serviceLocation.provider?.address?.state;
|
||||
state.order.serviceLocation.provider.address.zipCode =
|
||||
sessionInformation.order.serviceLocation.provider?.address?.zipCode;
|
||||
state.order.serviceLocation.provider.address.zipCodeCtu =
|
||||
sessionInformation.order.serviceLocation.provider?.address?.zipCodeCtu;
|
||||
state.order.serviceLocation.techNotes = sessionInformation.order.serviceLocation.techNotes;
|
||||
state.order.serviceLocation.provider.providerNumber =
|
||||
sessionInformation.order.serviceLocation.provider?.providerNumber;
|
||||
state.order.serviceLocation.provider.address.streetAddress =
|
||||
sessionInformation.order.serviceLocation.provider?.address?.streetAddress;
|
||||
state.order.serviceLocation.provider.address.city =
|
||||
sessionInformation.order.serviceLocation.provider?.address?.city;
|
||||
state.order.serviceLocation.provider.address.state =
|
||||
sessionInformation.order.serviceLocation.provider?.address?.state;
|
||||
state.order.serviceLocation.provider.address.zipCode =
|
||||
sessionInformation.order.serviceLocation.provider?.address?.zipCode;
|
||||
state.order.serviceLocation.provider.address.zipCodeCtu =
|
||||
sessionInformation.order.serviceLocation.provider?.address?.zipCodeCtu;
|
||||
state.order.serviceLocation.techNotes =
|
||||
sessionInformation.order.serviceLocation.techNotes;
|
||||
}
|
||||
|
||||
// if we're loading a session and we do not have a provider number yet, then set isInsurance to null so that
|
||||
// a service package is not selected by default on the quote page.
|
||||
|
|
@ -730,14 +753,15 @@ export const mutations = {
|
|||
state.applicationUser.savedSessionId =
|
||||
sessionInformation.applicationUser.savedSessionId;
|
||||
}
|
||||
|
||||
state.order.schedule.date = sessionInformation.order.schedule?.date;
|
||||
state.order.schedule.startTime = sessionInformation.order.schedule?.startTime;
|
||||
state.order.schedule.endTime = sessionInformation.order.schedule?.endTime;
|
||||
state.order.schedule.routeCode = sessionInformation.order.schedule?.routeCode;
|
||||
state.order.schedule.jobMaxMinutes = sessionInformation.order.schedule?.jobMaxMinutes;
|
||||
state.order.schedule.jobMinMinutes = sessionInformation.order.schedule?.jobMinMinutes;
|
||||
|
||||
//Do not assign default schedule details once user make schedule selection
|
||||
if (state.order.schedule.date == null) {
|
||||
state.order.schedule.date = sessionInformation.order.schedule?.date;
|
||||
state.order.schedule.startTime = sessionInformation.order.schedule?.startTime;
|
||||
state.order.schedule.endTime = sessionInformation.order.schedule?.endTime;
|
||||
state.order.schedule.routeCode = sessionInformation.order.schedule?.routeCode;
|
||||
state.order.schedule.jobMaxMinutes = sessionInformation.order.schedule?.jobMaxMinutes;
|
||||
state.order.schedule.jobMinMinutes = sessionInformation.order.schedule?.jobMinMinutes;
|
||||
}
|
||||
state.order.policy.currentDeductible = sessionInformation.order.policy?.currentDeductible;
|
||||
state.order.policy.originalDeductible = sessionInformation.order.policy?.originalDeductible;
|
||||
state.order.policy.additionalAuthFlag = sessionInformation.order.policy?.additionalAuthFlag;
|
||||
|
|
@ -976,7 +1000,28 @@ export const getters = {
|
|||
externalParameterQuote: (state) => externalParameterState?.quote,
|
||||
externalParameterServiceZip: (state) => externalParameterState?.serviceZip,
|
||||
externalParameterEstimate: (state) => externalParameterState?.estimate,
|
||||
externalParameterCustomer: (state) => externalParameterState?.customer,
|
||||
isExternalParameter: (state) => externalParameterState?.isExternalParameter,
|
||||
|
||||
emailOrSms: (state) => {
|
||||
const email = externalParameterState.serviceZip.emailAddress ?? state.order.customer.emailAddress;
|
||||
const phone = state.order.customer.phoneNumber;
|
||||
|
||||
if (!phone && !email) {
|
||||
return null;
|
||||
}
|
||||
|
||||
if (phone && !email) {
|
||||
return phone;
|
||||
}
|
||||
|
||||
if (email && !phone) {
|
||||
return email;
|
||||
}
|
||||
|
||||
// if we're here, then we have both email and phone so get the value from pageData to reflect what they entered on the page
|
||||
return state.applicationUser.pageData[fmgPageValues.EMAIL_SMS_PAGES]?.emailOrSmsValue;
|
||||
},
|
||||
};
|
||||
|
||||
function getNonFalseValuesOfPropertyInArrayOfObjects(array, propertyName) {
|
||||
|
|
@ -1242,10 +1287,23 @@ export const actions = {
|
|||
},
|
||||
|
||||
// Analytics Actions
|
||||
logExperimentExposure(
|
||||
logExperimentExposureAndUpdateStore(
|
||||
context,
|
||||
{ payload: { userId, deviceId, sessionKey, pageName, experiment }, pageNameToLog }
|
||||
) {
|
||||
const experiments = deepClone(context.getters.applicationUser.experiments);
|
||||
const experimentToMarkAsExposed = experiments.find(ex => {
|
||||
ex.universeId == experiment.universeId &&
|
||||
ex.testId == experiment.testIde &&
|
||||
ex.variationId == experiment.variationId &&
|
||||
ex.assignmentId == experiment.assignmentId
|
||||
});
|
||||
if (experimentToMarkAsExposed) {
|
||||
experimentToMarkAsExposed.isExposed = true;
|
||||
}
|
||||
|
||||
context.commit(storeMutations.UPDATE_EXPERIMENTS, experiments);
|
||||
|
||||
return globalMethods.callHttpClient({
|
||||
method: endpoints.LogExperimentExposureIfAssigned.method,
|
||||
endpoint: endpoints.LogExperimentExposureIfAssigned.url,
|
||||
|
|
@ -1438,6 +1496,29 @@ export const actions = {
|
|||
});
|
||||
},
|
||||
|
||||
logPartQuestions(
|
||||
context,
|
||||
{ eon, ctu, workOrderId, workOrderNumber, carId, glassLocation, partQuestions, userAgent }
|
||||
) {
|
||||
var payload = {
|
||||
applicationName: applicationConfig.APPLICATION_NAME,
|
||||
eon: eon,
|
||||
ctu: ctu,
|
||||
workOrderId: workOrderId,
|
||||
workOrderNumber: workOrderNumber,
|
||||
carId: carId,
|
||||
glassLocation: glassLocation,
|
||||
partQuestions: partQuestions,
|
||||
userAgent: navigator.userAgent,
|
||||
};
|
||||
|
||||
return globalMethods.callHttpClient({
|
||||
method: endpoints.LogPartQuestions.method,
|
||||
endpoint: endpoints.LogPartQuestions.url,
|
||||
payload: payload,
|
||||
});
|
||||
},
|
||||
|
||||
// Misc Actions
|
||||
setReferralInformation(context, { referralNumber, referralDate, referralCorrelationId, eon }) {
|
||||
context.commit(storeMutations.UPDATE_REFERRAL_NUMBER, referralNumber);
|
||||
|
|
@ -1601,7 +1682,7 @@ export const actions = {
|
|||
return response;
|
||||
},
|
||||
|
||||
getMobileFeePart(context, { pageNameToLog }) {
|
||||
getMobileFeePart(context, { payload: { serviceZipCode, serviceZipCodeCtu }, pageNameToLog }) {
|
||||
const serviceType = context.getters.damage.isRepair ? "Repair" : "Install";
|
||||
const facilityType = "Mobile";
|
||||
const parentAccountNumber = context.getters.payment.parentAccountNumber;
|
||||
|
|
@ -1613,16 +1694,31 @@ 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 =
|
||||
order.serviceLocation?.provider?.address?.zipCode ?? order.serviceLocation?.zipCode;
|
||||
serviceZipCode ??
|
||||
order.serviceLocation?.provider?.address?.zipCode ??
|
||||
order.serviceLocation?.zipCode;
|
||||
|
||||
var providerNumber =
|
||||
order.serviceLocation?.provider?.providerNumber ?? order.serviceLocation?.zipCodeCtu;
|
||||
serviceZipCodeCtu ??
|
||||
order.serviceLocation?.provider?.providerNumber ??
|
||||
order.serviceLocation?.zipCodeCtu;
|
||||
if (providerNumber.startsWith("00") && providerNumber.length > 5) {
|
||||
providerNumber = providerNumber.substring(1);
|
||||
}
|
||||
|
||||
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}`;
|
||||
}
|
||||
}
|
||||
|
||||
if (coverageStatus) {
|
||||
endPoint = `${endPoint}&coverageStatus=${coverageStatus}`;
|
||||
}
|
||||
|
|
@ -2196,7 +2292,7 @@ export const actions = {
|
|||
response.data
|
||||
);
|
||||
|
||||
await resetScheduleIfUnavailable(context, response.data.order, pageNameToLog);
|
||||
await resetScheduleIfUnavailable(context, context.state.order, pageNameToLog);
|
||||
return response;
|
||||
},
|
||||
(error) => {
|
||||
|
|
@ -2223,7 +2319,18 @@ export const actions = {
|
|||
// Vehicle
|
||||
saveVehicle(
|
||||
context,
|
||||
{ year, make, model, style, carId, category, imageUrl, imageVifNumber, imageVifColor }
|
||||
{
|
||||
year,
|
||||
make,
|
||||
model,
|
||||
style,
|
||||
carId,
|
||||
category,
|
||||
imageUrl,
|
||||
imageVifNumber,
|
||||
imageVifColor,
|
||||
isMobileStaticRecalibrationApplicable,
|
||||
}
|
||||
) {
|
||||
if (
|
||||
context.state.order.vehicle.year != year ||
|
||||
|
|
@ -2244,6 +2351,10 @@ 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
|
||||
);
|
||||
}
|
||||
},
|
||||
|
||||
|
|
@ -2968,6 +3079,17 @@ 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
|
||||
);
|
||||
},
|
||||
|
||||
savePageData(context, emailOrSms) {
|
||||
context.commit(storeMutations.UPDATE_PAGE_DATA, emailOrSms);
|
||||
},
|
||||
|
||||
saveVin(context, { isSelectedGlassAvailableForVehicle, vehicleInfo }) {
|
||||
//Reset dependent state when changing
|
||||
if (vehicleInfo.vin !== context.state.order.vehicle.vin) {
|
||||
|
|
@ -3061,6 +3183,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);
|
||||
}
|
||||
},
|
||||
|
|
@ -3633,6 +3756,9 @@ function createExternalParameterDefaultState() {
|
|||
isInsurance: null,
|
||||
servicePackage: null,
|
||||
},
|
||||
customer: {
|
||||
phoneNumber: null,
|
||||
},
|
||||
};
|
||||
// set to session storage
|
||||
saveExternalParameterState(externalParameterDefaultState);
|
||||
|
|
@ -3647,3 +3773,15 @@ function getExternalParameterDefaultState() {
|
|||
function saveExternalParameterState(externalParameterState) {
|
||||
window.sessionStorage.setItem("externalParameterState", JSON.stringify(externalParameterState));
|
||||
}
|
||||
|
||||
//This function finds the recalibration part and returns the part number for it.
|
||||
function getRecalPartNumber(glassPartsArray) {
|
||||
const recalPart = glassPartsArray.childParts.find(
|
||||
(item) => item.partType === partTypeStrings.ADAS_RECALIBRATION
|
||||
);
|
||||
if (recalPart) {
|
||||
return recalPart.partNumber;
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue