diff --git a/src/constants/experiments.js b/src/constants/experiments.js index eeabeb7d6..83555fc04 100644 --- a/src/constants/experiments.js +++ b/src/constants/experiments.js @@ -12,6 +12,7 @@ const experimentSettings = { SUBMIT_ORDER_ENABLE_PIA: "SubmitOrder_Enable_PIA", IS_EMAIL_OPTIONAL: "isEmailOptional", SERVICE_PACKAGE_DISCOUNT: "OfferServicePackageDiscount", + PROMO_ON_PACKAGE: "Offer_Promo_On_Pkg", RECAL_PRICE_REMOVE: "RecalPriceRemove", INSURANCE_TAB_TO_DISPLAY_THRESHOLD_INTERNAL: "NextGen_InternalInsuranceTabDisplayThreshold", INSURANCE_TAB_TO_DISPLAY_THRESHOLD_EXTERNAL: "NextGen_ExternalInsuranceTabDisplayThreshold", diff --git a/src/layouts/capability-questions/capability-questions.vue b/src/layouts/capability-questions/capability-questions.vue index 4679fcb19..4d637c978 100644 --- a/src/layouts/capability-questions/capability-questions.vue +++ b/src/layouts/capability-questions/capability-questions.vue @@ -66,7 +66,7 @@ export default { }, false ); - } + } baseMixin.methods.ResetExternalParamsAndHideModal(); } }); diff --git a/src/layouts/insurance-company/insurance-company.vue b/src/layouts/insurance-company/insurance-company.vue index bc9e5755a..bc5034c67 100644 --- a/src/layouts/insurance-company/insurance-company.vue +++ b/src/layouts/insurance-company/insurance-company.vue @@ -46,10 +46,19 @@ import baseMixin from "@/mixins/base-mixin.js"; import { navigateToHeritageFunnel } from "@/helpers/heritage-integration/navigation-helper"; import { applicationConfig } from "@/constants/application-config"; import store from "@/store"; +import router from "@/router"; export default { name: "insurance-company", async beforeRouteEnter(to, from, next) { + //force reload if redirected from external application + if (from.redirectedFrom === undefined && !sessionStorage.getItem("reloaded")) { + sessionStorage.setItem("reloaded", "true"); + router.go(0); + } else { + sessionStorage.removeItem("reloaded"); + } + // Call APIs const cmsContentPromise = fetchCmsContentForPage(to.query.fmgPage); const insuranceCompanyListPromise = baseMixin.methods.dispatchStoreActionWithLogging( diff --git a/src/layouts/part-questions/part-questions.vue b/src/layouts/part-questions/part-questions.vue index ae1146aad..a6ca552bc 100644 --- a/src/layouts/part-questions/part-questions.vue +++ b/src/layouts/part-questions/part-questions.vue @@ -66,7 +66,7 @@ export default { }, false ); - } + } baseMixin.methods.ResetExternalParamsAndHideModal(); } }); diff --git a/src/layouts/quote/quote.vue b/src/layouts/quote/quote.vue index 823caf323..3bd9e26eb 100644 --- a/src/layouts/quote/quote.vue +++ b/src/layouts/quote/quote.vue @@ -346,12 +346,24 @@ export default { let internalThreshold = experimentMixin.methods.getSettingValue( experimentSettings.INSURANCE_TAB_TO_DISPLAY_THRESHOLD_INTERNAL ); + let externalThreshold = experimentMixin.methods.getSettingValue( + experimentSettings.INSURANCE_TAB_TO_DISPLAY_THRESHOLD_EXTERNAL + ); const isExternalParameter = store.getters.externalParameterState?.isExternalParameter; - if ( - isExternalParameter === externalParameterStatus.NOT_SET || - isExternalParameter === externalParameterStatus.INACTIVE - ) { + // prettier-ignore + { + const log = getQuerystringParameter(queryStrings.LOG); + if (eval(log)) { + console.log("------------- quote.vue thresholds start -----------------"); + console.log(new Date() + " isExternalParameter: " + isExternalParameter); + console.log(new Date() + " internalThreshold: " + internalThreshold); + console.log(new Date() + " externalThreshold: " + externalThreshold); + console.log("------------- quote.vue thresholds end -----------------"); + } + } + + if (isExternalParameter === externalParameterStatus.NOT_SET) { // there are no active or inactive external parameters; use internal threshold if (internalThreshold) thresholdToUse = internalThreshold; @@ -361,23 +373,26 @@ export default { ); baseMixin.methods.ResetExternalParamsAndHideModal(); } else { - // user came from an external source - if (store.getters.externalParameterQuote?.isInsurance == true) { + // user came from an external source, however, the externalParms may have been reset on service-zip, property-questions, etc... + if (eval(store.getters.externalParameterQuote?.isInsurance)) { // did user intentionally select insurance? vm.isInsuranceSelected = true; vm.servicePackage = store.getters.externalParameterQuote.servicePackage; await nextTick(); - const isValid = await baseMixin.methods.isFormValid(vm.$refs.theForm); - if (isValid) { - vm.forwardButtonAction(); - } else { - baseMixin.methods.ResetExternalParamsAndHideModal(); + + if ( + vm.servicePackage != null && + isExternalParameter === externalParameterStatus.ACTIVE + ) { + const isValid = await baseMixin.methods.isFormValid(vm.$refs.theForm); + if (isValid) { + baseMixin.methods.ResetExternalParamsAndHideModal(); + vm.forwardButtonAction(); + } } + baseMixin.methods.ResetExternalParamsAndHideModal(); } else { - const externalThreshold = experimentMixin.methods.getSettingValue( - experimentSettings.INSURANCE_TAB_TO_DISPLAY_THRESHOLD_EXTERNAL - ); - thresholdToUse = externalThreshold; + if (externalThreshold) thresholdToUse = externalThreshold; vm.isInsuranceSelected = getIsInsuranceSelectedValue( vm.availableLineItems, @@ -437,7 +452,7 @@ export default { }, arePagePrerequisitesValid() { const payment = store.getters.order.payment; - + // prettier-ignore { const log = getQuerystringParameter(queryStrings.LOG); 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 e24b77f6a..d8edb254c 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 @@ -10,6 +10,7 @@ import { containsLineItemWithPartType, findLineItemsWithPartType, } from "@/helpers/service-package-helper"; +import { experimentSettings } from "@/constants/experiments"; import baseMixin from "@/mixins/base-mixin.js"; import { partTypeStrings } from "@/constants/part-type-strings"; import { nextTick } from "vue"; @@ -19,6 +20,18 @@ jest.mock("@/store", () => ({ dispatch: jest.fn(), })); +const mockExperimentSettings = experimentSettings; + +jest.mock("@/mixins/experiment-mixin.js", () => ({ + methods: { + getSettingValue(settingName) { + if (settingName === mockExperimentSettings.PROMO_ON_PACKAGE) { + return true; + } + }, + }, +})); + describe("service-package-question.vue", () => { beforeEach(async () => { processedCmsContent = inputQuestionWidgetAnswers; @@ -162,6 +175,19 @@ describe("service-package-question.vue", () => { wrapper.vm.servicePackageAnswers[0].buttonAuxillaryCopy.includes("As little as") ).toBe(true); }); + it("should show service package discount when insurance is not selected", () => { + // Arrange + mockProps.isInsuranceSelected = false; + const wrapper = setupMocks({}); + // Act + + // Assert + expect( + wrapper.vm.servicePackageAnswers[0].additionalButtonData.Text.includes( + "Special: Save $" + ) + ).toBe(true); + }); it("should return [] from nullSafeAvailableLineItems and not error out if availableLineItems is null", () => { // Arrange mockProps.availableLineItems = null; 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 2a544e8ce..e475becd5 100644 --- a/src/layouts/quote/service-package-question/service-package-question.vue +++ b/src/layouts/quote/service-package-question/service-package-question.vue @@ -36,6 +36,8 @@ import { getLineItemsThatMatchPromos, } from "@/helpers/promotions-helper"; import { containsRecalParts, getItemsWithoutRecalParts } from "@/helpers/recal-helper"; +import experimentMixin from "@/mixins/experiment-mixin.js"; +import { experimentSettings } from "@/constants/experiments"; export default { name: "servicePackageQuestion", @@ -129,16 +131,22 @@ export default { buttonLabelSubCopy: this.getSubheaderTextFromCms(answer.SubWidgetName), buttonBodyCopy: this.getBodyTextFromCms(answer.SubWidgetName), //The package supports service-package-discount if it has the text value in CMS - buttonAuxillaryCopy: this.getDiscountedPackagePriceString( - answer.Name, - this.isServicePackageDiscountOnOrder && answer.Text != "" - ), + buttonAuxillaryCopy: this.isInsuranceSelected + ? this.getDiscountedPackagePriceString(answer.Name, false) + : this.getDiscountedPackagePriceString( + answer.Name, + this.isServicePackageDiscountOnOrder && + this.discountPackageNames == answer.Name + ), buttonFooterCopy: this.getFooterTextFromCms(answer.SubWidgetName), additionalButtonData: { strikeThroughPrice: this.getPackagePriceString(answer.Name), servicePackageDiscount: - this.isServicePackageDiscountOnOrder && answer.Text != "", - Text: answer.Text + this.getServicePackageDiscountPrice(), + this.isServicePackageDiscountOnOrder && + this.discountPackageNames == answer.Name, + Text: this.isInsuranceSelected + ? false + : "Special: Save $" + this.getServicePackageDiscountPrice(), }, })); return modifiedAnswers; @@ -149,6 +157,21 @@ export default { this.nullSafeAvailableLineItems ); }, + discountPackageNames() { + const discountServicePackage = experimentMixin.methods.getSettingValue( + experimentSettings.PROMO_ON_PACKAGE + ); + switch (discountServicePackage) { + case "ECON": + return packageNames.TIER_ONE; + case "STANDARD": + return packageNames.TIER_TWO; + case "PREMIUM": + return packageNames.TIER_THREE; + default: + return null; + } + }, frontWipersApplicableForTierTwo() { return shouldFrontWipersBeAvailable( this.glassToReplace, diff --git a/src/layouts/quote/service-package-question/service-package-radio/service-package-radio.vue b/src/layouts/quote/service-package-question/service-package-radio/service-package-radio.vue index 4a7fd38d4..97037c4e9 100644 --- a/src/layouts/quote/service-package-question/service-package-radio/service-package-radio.vue +++ b/src/layouts/quote/service-package-question/service-package-radio/service-package-radio.vue @@ -1,15 +1,8 @@