diff --git a/src/layouts/insurance-company/insurance-company.vue b/src/layouts/insurance-company/insurance-company.vue
index 79e238d47..452484e48 100644
--- a/src/layouts/insurance-company/insurance-company.vue
+++ b/src/layouts/insurance-company/insurance-company.vue
@@ -16,6 +16,13 @@
v-model="parentAccountNumber"
:originalList="originalList" />
+
diff --git a/src/layouts/molding-questions/molding-questions.vue b/src/layouts/molding-questions/molding-questions.vue
index 1bcc3d7a8..2c5f5a7c3 100644
--- a/src/layouts/molding-questions/molding-questions.vue
+++ b/src/layouts/molding-questions/molding-questions.vue
@@ -78,6 +78,20 @@ export default {
);
}
+ if (store.getters.externalParameterCustomer?.phoneNumber) {
+ await baseMixin.methods.dispatchStoreAction(
+ storeActions.SAVE_PHONE_NUMBER,
+ store.getters.externalParameterCustomer.phoneNumber,
+ false
+ );
+
+ await baseMixin.methods.dispatchStoreAction(
+ storeActions.SAVE_IS_SMS_OPT_IN,
+ true,
+ false
+ );
+ }
+
baseMixin.methods.ResetExternalParamsAndHideModal();
}
});
diff --git a/src/layouts/part-questions/part-questions.vue b/src/layouts/part-questions/part-questions.vue
index f905e86c7..d60ddbb70 100644
--- a/src/layouts/part-questions/part-questions.vue
+++ b/src/layouts/part-questions/part-questions.vue
@@ -79,6 +79,21 @@ export default {
false
);
}
+
+ if (store.getters.externalParameterCustomer?.phoneNumber) {
+ await baseMixin.methods.dispatchStoreAction(
+ storeActions.SAVE_PHONE_NUMBER,
+ store.getters.externalParameterCustomer.phoneNumber,
+ false
+ );
+
+ await baseMixin.methods.dispatchStoreAction(
+ storeActions.SAVE_IS_SMS_OPT_IN,
+ true,
+ false
+ );
+ }
+
baseMixin.methods.ResetExternalParamsAndHideModal();
}
});
diff --git a/src/layouts/quote/quote.spec.js b/src/layouts/quote/quote.spec.js
index deca0d6d1..522bc4f2e 100644
--- a/src/layouts/quote/quote.spec.js
+++ b/src/layouts/quote/quote.spec.js
@@ -577,6 +577,56 @@ describe("quote.vue", () => {
//Assert
expect(wrapper.vm.isInsuranceSelected).toBe(false);
});
+ test("should default to cash if isCashSelected is true, despite all other checks pointing to insurance selection", async () => {
+ // Also needs no query parameter or previous selection in store to be present
+ //Arrange
+
+ store.getters = {
+ lineItems: {
+ glassParts: ["item", "item2"],
+ },
+ applicationUser: {
+ experiments: [],
+ },
+ order: {
+ lineItems: {
+ glassParts: ["item", "item2"],
+ },
+ payment: {
+ isInsurance: true,
+ },
+ customer: {
+ emailAddress: "test@test.com",
+ },
+ serviceLocation: {
+ state: null,
+ },
+ },
+ vehicle: {
+ cardId: "123",
+ },
+ experimentSettings: {
+ settingName: "SERVICE_PACKAGE_DISCOUNT",
+ },
+ };
+ mockTierOnePrice = 505;
+ const { wrapper } = setupMocks({});
+
+
+ //Act
+ await quote.beforeRouteEnter.call(
+ wrapper.vm,
+ { query: { fmgPage: "quote",
+ isInsuranceSelected: true,
+ isCashSelected: true,
+ } },
+ undefined,
+ (c) => c(wrapper.vm)
+ );
+
+ //Assert
+ expect(wrapper.vm.isInsuranceSelected).toBe(false);
+ });
test("should default to insurance if total economy package price is over $500", async () => {
// Also needs no query parameter or previous selection in store to be present
//Arrange
diff --git a/src/layouts/quote/quote.vue b/src/layouts/quote/quote.vue
index 4428f6e40..20dc16304 100644
--- a/src/layouts/quote/quote.vue
+++ b/src/layouts/quote/quote.vue
@@ -328,6 +328,10 @@ export default {
}
const getIsInsuranceSelectedValue = (availableLineItems, insuranceThreshold) => {
+ // query param checked here is set on insurance-selection "Pay on my own" link click
+ if (to.query?.isCashSelected || to.query?.iscashselected) {
+ return false;
+ }
const serviceLocationState = store.getters.order.serviceLocation.state;
// usually true when returning from heritage but can be false when returning from heritage on a save quote
diff --git a/src/layouts/service-location/mobile-location-modal-questions/mobile-location-modal-questions.spec.js b/src/layouts/service-location/mobile-location-modal-questions/mobile-location-modal-questions.spec.js
index 863a04c82..91f26b64d 100644
--- a/src/layouts/service-location/mobile-location-modal-questions/mobile-location-modal-questions.spec.js
+++ b/src/layouts/service-location/mobile-location-modal-questions/mobile-location-modal-questions.spec.js
@@ -203,7 +203,7 @@ describe("mobile-location-modal-questions.vue", () => {
expect(wrapper.vm.$refs.MobileLocationModalWidget.openModal).toHaveBeenCalled();
});
- it("Should emit update:modelValue on setMobileLocation for a valid address and vehicle protection answer", async () => {
+ it("Should emit updated-mobile-location-questions on setMobileLocation for a valid address and vehicle protection answer", async () => {
// Arrange
const mobileLocationQuestions = {
addressQuestions: {
@@ -240,17 +240,26 @@ describe("mobile-location-modal-questions.vue", () => {
});
wrapper.vm.$refs.MobileLocationModalWidget.closeModal = jest.fn();
+ // Mock the emitEvent function
+ wrapper.vm.emitEvent = jest.fn(async (eventName, payload) => {
+ return new Promise((resolve) => {
+ wrapper.vm.$emit(eventName, newMobileLocationQuestions, resolve);
+ resolve(newMobileLocationQuestions);
+ });
+ });
// Act
wrapper.vm.internalModel = newMobileLocationQuestions;
+
await wrapper.vm.setMobileLocation();
- let expectedEmit = [[newMobileLocationQuestions]];
-
// Assert
- expect(wrapper.emitted("update:modelValue")).toEqual(expectedEmit);
+ expect(wrapper.emitted()["updated-mobile-location-questions"]).toBeTruthy();
+ expect(wrapper.emitted()["updated-mobile-location-questions"][0][0]).toBe(
+ newMobileLocationQuestions
+ );
});
- it("Should not emit update:modelValue on setMobileLocation for an invalid address zip code", async () => {
+ it("Should not emit updated-mobile-location-questions on setMobileLocation for an invalid address zip code", async () => {
// Arrange
const mobileLocationQuestions = {
addressQuestions: {
@@ -293,7 +302,7 @@ describe("mobile-location-modal-questions.vue", () => {
await wrapper.vm.setMobileLocation();
// Assert
- expect(wrapper.emitted("update:modelValue")).not.toBeTruthy();
+ expect(wrapper.emitted("updated-mobile-location-questions")).not.toBeTruthy();
});
it("Should display invalid zip alert for invalid address zip inputs", async () => {
diff --git a/src/layouts/service-location/mobile-location-modal-questions/mobile-location-modal-questions.vue b/src/layouts/service-location/mobile-location-modal-questions/mobile-location-modal-questions.vue
index d88bd53e2..dadbaff8b 100644
--- a/src/layouts/service-location/mobile-location-modal-questions/mobile-location-modal-questions.vue
+++ b/src/layouts/service-location/mobile-location-modal-questions/mobile-location-modal-questions.vue
@@ -98,6 +98,7 @@ export default {
"updated-contains-military-base",
"updated-bill-to-account-number",
"mobileLocationSelected",
+ "updated-mobile-location-questions",
],
data() {
return {
@@ -251,10 +252,15 @@ export default {
if (!zipCodeData.isValid) {
this.displayInvalidZipAlert = true;
this.resetModalButtonStyle();
+ return;
} else if (zipCodeData.state != this.internalModel.addressQuestions.state) {
this.displayMismatchStateAndZipAlert = true;
this.resetModalButtonStyle();
- } else {
+ return;
+ } else if (
+ this.internalModel.addressQuestions.zipCode !==
+ this.modelValue.addressQuestions.zipCode
+ ) {
// retrieve mobile fee part
const serviceZipCode = this.internalModel.addressQuestions.zipCode;
const mobileFeePart = await getPricedMobileFeePart(
@@ -279,13 +285,17 @@ export default {
this.$emit("updated-contains-military-base", zipCodeData.containsMilitaryBase);
this.$emit("updated-mobile-ctu", zipCodeData.zipCodeCtu);
this.$emit("updated-bill-to-account-number", billToAccountNumber);
-
- // update the page level model
- this.$emit("update:modelValue", this.internalModel);
-
- //Page advance to Schedule page
- this.$emit("mobileLocationSelected");
}
+ // update the page level model
+ await this.emitEvent("updated-mobile-location-questions", this.internalModel);
+
+ this.$emit("mobileLocationSelected");
+ },
+ //creating emitEvent function to raise events with resolve callback to handle events sequencing
+ async emitEvent(eventName, payload) {
+ return new Promise((resolve) => {
+ this.$emit(eventName, payload, resolve);
+ });
},
},
watch: {
diff --git a/src/layouts/service-location/service-location.spec.js b/src/layouts/service-location/service-location.spec.js
index 68d2e948f..3cd5d93e1 100644
--- a/src/layouts/service-location/service-location.spec.js
+++ b/src/layouts/service-location/service-location.spec.js
@@ -460,11 +460,23 @@ describe("service-location.vue", () => {
};
// Act
- mobileLocationQuestionsComponent.vm.$emit(
- "update:modelValue",
+
+ // Mock the emitEvent function
+ mobileLocationQuestionsComponent.vm.emitEvent = jest.fn(async (eventName, payload) => {
+ return new Promise((resolve) => {
+ mobileLocationQuestionsComponent.vm.$emit(eventName, payload, resolve);
+ });
+ });
+
+ // Trigger the event
+ await mobileLocationQuestionsComponent.vm.emitEvent(
+ "updated-mobile-location-questions",
newMobileLocationQuestions
);
+ await wrapper.vm.$nextTick(); // Wait for DOM updates
+ await new Promise((resolve) => setTimeout(resolve, 0)); // Wait for promise to resolve
+
// Assert
expect(wrapper.vm.mobileLocationQuestions).toStrictEqual(newMobileLocationQuestions);
});
@@ -529,11 +541,23 @@ describe("service-location.vue", () => {
};
// Act
- mobileLocationQuestionsComponent.vm.$emit(
- "update:modelValue",
+
+ // Mock the emitEvent function
+ mobileLocationQuestionsComponent.vm.emitEvent = jest.fn(async (eventName, payload) => {
+ return new Promise((resolve) => {
+ mobileLocationQuestionsComponent.vm.$emit(eventName, payload, resolve);
+ });
+ });
+
+ // Trigger the event
+ await mobileLocationQuestionsComponent.vm.emitEvent(
+ "updated-mobile-location-questions",
newMobileLocationQuestions
);
+ await wrapper.vm.$nextTick(); // Wait for DOM updates
+ await new Promise((resolve) => setTimeout(resolve, 0)); // Wait for promise to resolve
+
// Assert
expect(wrapper.vm.serviceZipCodeQuestion).toStrictEqual(newServiceZipCodeInfo);
});
diff --git a/src/layouts/service-location/service-location.vue b/src/layouts/service-location/service-location.vue
index ef7a5491f..a17c0e02b 100644
--- a/src/layouts/service-location/service-location.vue
+++ b/src/layouts/service-location/service-location.vue
@@ -93,6 +93,7 @@
@updated-serviceability="setServiceabilityDetails"
@updated-contains-military-base="setContainsMilitaryBase"
@updated-mobile-ctu="setCtuForMobile"
+ @updated-mobile-location-questions="setMobileLocationQuestions"
validationRules="mobile-location-required"
ref="mobileLocationQuestions"
linkWidgetName="MobileLocationLinkWidget"
@@ -294,17 +295,18 @@ export default {
isVehicleProtected: this.isVehicleProtected,
};
},
- set: function (newValue) {
+ async set(newValue) {
if (newValue.addressQuestions.zipCode !== this.zipCode) {
- getShopProviderData(newValue.addressQuestions.zipCode).then((result) => {
+ await getShopProviderData(newValue.addressQuestions.zipCode).then((result) => {
this.shopProviderData = result.data;
this.selectedProvider = new Provider(
this.shopProviderData.mobileProviderNumber
);
});
}
-
this.setMobileLocation(newValue);
+ //handle promise
+ newValue.resolve?.();
},
},
isServiceableMobile() {
@@ -485,6 +487,10 @@ export default {
setMobileFeePart(mobileFeePart) {
this.mobileFeePart = mobileFeePart;
},
+ //creating async function as the computed property can not directly handle asynchronous operations or promises.
+ async setMobileLocationQuestions(newValue, resolve) {
+ this.mobileLocationQuestions = { ...newValue, resolve };
+ },
getServiceAddressFromStore() {
return store.getters.order.serviceLocation.address;
},
diff --git a/src/layouts/service-zip/service-zip.vue b/src/layouts/service-zip/service-zip.vue
index 717880553..ae7609da8 100644
--- a/src/layouts/service-zip/service-zip.vue
+++ b/src/layouts/service-zip/service-zip.vue
@@ -202,11 +202,18 @@ export default {
async forwardButtonAction() {
const zipCodeData = await this.getZipCodeData(this.serviceZipCode);
- 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);
+ // if no value due to field being optional, blank both phone and email address
+ if (!this.emailOrSms) {
+ await this.dispatchStoreAction(storeActions.SAVE_PHONE_NUMBER, "", false);
+ await this.dispatchStoreAction(storeActions.SAVE_EMAIL, "", false);
+ }
+ else {
+ 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(
diff --git a/src/layouts/vehicle-damage/vehicle-damage.vue b/src/layouts/vehicle-damage/vehicle-damage.vue
index 6e9c4b198..46efb4728 100644
--- a/src/layouts/vehicle-damage/vehicle-damage.vue
+++ b/src/layouts/vehicle-damage/vehicle-damage.vue
@@ -152,6 +152,20 @@ export default {
if (isValid) {
vm.forwardButtonAction();
} else {
+ if (store.getters.externalParameterCustomer?.phoneNumber) {
+ await baseMixin.methods.dispatchStoreAction(
+ storeActions.SAVE_PHONE_NUMBER,
+ store.getters.externalParameterCustomer.phoneNumber,
+ false
+ );
+
+ await baseMixin.methods.dispatchStoreAction(
+ storeActions.SAVE_IS_SMS_OPT_IN,
+ true,
+ false
+ );
+ }
+
if (store.getters.externalParameterServiceZip.zipCode) {
await baseMixin.methods.dispatchStoreAction(
storeActions.SAVE_SERVICE_ZIP_CODE_INFO,