diff --git a/src/constants/experiments.js b/src/constants/experiments.js index a2a648a65..1d689d727 100644 --- a/src/constants/experiments.js +++ b/src/constants/experiments.js @@ -12,6 +12,9 @@ const experimentSettings = { SUPPRESS_VIN_CAPTURE: "SuppressVinCapture", DISPLAY_AVAILABILITY_INDICATORS: "DisplayAvailabilityIndicators", PIA_EXPERIENCE: "PIA Experience", + CONDITIONAL_PROVIDER_NUMBERS: "ConditionalProviderNumbers", + CONDITIONAL_PROVIDER_NUMBERS_2: "ConditionalProviderNumbers2", + CONDITIONAL_PROVIDER_SHUTOFF_DATE: "ConditionalProviderShutoffDate", PIA_INSURANCE: "DisplayPIAInsurance", SUBMIT_ORDER_ENABLE_PIA: "SubmitOrder_Enable_PIA", IS_EMAIL_OPTIONAL: "isEmailOptional", diff --git a/src/layouts/payment-method/payment-method.vue b/src/layouts/payment-method/payment-method.vue index 0fa02e80a..a66c1b758 100644 --- a/src/layouts/payment-method/payment-method.vue +++ b/src/layouts/payment-method/payment-method.vue @@ -609,6 +609,19 @@ export default { return; } + const billToAccountNumber = await baseMixin.methods.dispatchStoreActionWithLogging( + storeActions.GET_BILL_TO_ACCOUNT_NUMBER, + {}, + "payment-method", + false + ); + + baseMixin.methods.dispatchStoreAction( + storeActions.SAVE_BILL_TO_ACCOUNT_NUMBER, + billToAccountNumber, + false + ); + this.dispatchStoreAction(storeActions.RESET_SAVE_SESSION_PROMISE); const shouldUseAdyen = experimentMixin.methods.hasSettingEqualTo( @@ -810,11 +823,51 @@ export default { const piaInsurance = this.getSettingValue(experimentSettings.PIA_INSURANCE); if (this.isInsurance) { - return piaInsurance === "true" && this.currentDeductible > 0; + return ( + (piaInsurance === "true" || this.isConditionalPIAEnabled) && + this.currentDeductible > 0 + ); } else { - return piaExperience === "PIA Optional" || piaExperience === "PIA Required"; + if (piaExperience?.includes("PIA Disabled")) { + return this.isConditionalPIAEnabled; + } else { + return piaExperience === "PIA Optional" || piaExperience === "PIA Required"; + } } }, + isConditionalPIAEnabled() { + const conditionalProviderNumbers = this.getSettingValue( + experimentSettings.CONDITIONAL_PROVIDER_NUMBERS + ); + const conditionalProviderNumbers2 = this.getSettingValue( + experimentSettings.CONDITIONAL_PROVIDER_NUMBERS_2 + ); + const conditionalProviderShutoffDate = this.getSettingValue( + experimentSettings.CONDITIONAL_PROVIDER_SHUTOFF_DATE + ); + + const allConditionalProviderNumbers = [ + conditionalProviderNumbers, + conditionalProviderNumbers2, + ] + .filter(Boolean) + .join(","); + const providerNumber = + this.$store.getters.order.serviceLocation.provider.providerNumber; + const appointmentDate = new Date(this.$store.getters.order.schedule.date); + const shutoffDate = new Date(conditionalProviderShutoffDate); + if (allConditionalProviderNumbers && conditionalProviderShutoffDate) { + const providerNumbersArray = allConditionalProviderNumbers + .split(",") + .map((num) => num.trim()); + if (!providerNumbersArray.includes(providerNumber)) { + return false; + } else { + return appointmentDate <= shutoffDate; + } + } + return false; + }, paymentMethod() { if (!this.isPiaEnabled) { return paymentMethods.LATER; diff --git a/src/layouts/schedule/schedule.vue b/src/layouts/schedule/schedule.vue index 9b4187053..f7c1ead18 100644 --- a/src/layouts/schedule/schedule.vue +++ b/src/layouts/schedule/schedule.vue @@ -1368,7 +1368,7 @@ export default { this.showRecalAcknowledgementPopup = false; }, async forwardButtonAction() { - const showRecalAcknowledgementModal = await this.showRecalAcknowledgementModal(); + const showRecalAcknowledgementModal = this.showRecalAcknowledgementModal(); if ( showRecalAcknowledgementModal && this.isRecalAcknowledgedForScheduling !== RECAL_ACK_YES @@ -1706,7 +1706,27 @@ export default { this.selectedProvider = this.shopProviderData.shopProviders[0]; } }, - handleZipCodeChange(newZipCode) { + async handleZipCodeChange(newZipCode) { + // if we were showing the recal ack modal and now are changing the zip, we need to navigate + // to service-zip so we can get call parts again to add the recal part if needed + if (this.shouldShowRecalAckModal()) { + await baseMixin.methods.dispatchStoreAction( + storeActions.SAVE_SERVICE_ZIP_CODE_INFO, + { + zipCode: newZipCode.zipCode, + state: newZipCode.state, + zipCodeCtu: newZipCode.zipCodeCtu, + }, + false + ); + + this.$router.navigateWithSaving( + this.navigationScenarios.ZIP_CODE_CHANGED_RECAL_ACK, + this.pageName + ); + return; + } + this.resetMobileLocation(); getShopProviderData(newZipCode.zipCode, this.pageName).then((result) => { @@ -1783,18 +1803,8 @@ export default { setSelectedDateToFirstAvailable() { this.selectedDate = this.getFirstAvailableDate(); }, - async showRecalAcknowledgementModal() { - const order = this.$store.getters.order; - const containsRecalPart = containsRecalParts(order.lineItems); - const hasPartWithRecalRequirement = anyPartWithRequiresRecalFlag(order.lineItems); - - // if any of the glass parts contain an item with the requiresRecalibration flag set to true - // and the order does not contain a recalibration part, show the recalibration acknowledgement modal - if ( - !containsRecalPart && - hasPartWithRecalRequirement && - this.isRecalAcknowledgedForScheduling !== RECAL_ACK_YES - ) { + showRecalAcknowledgementModal() { + if (this.shouldShowRecalAckModal()) { this.$refs.navbar.removeLoader(); this.$refs.recalAckModal.openModal(); return true; @@ -1803,6 +1813,22 @@ export default { this.closeRecalAcknowledgementPopup(); return false; }, + shouldShowRecalAckModal() { + // if any of the glass parts contain an item with the requiresRecalibration flag set to true + // and the order does not contain a recalibration part, show the recalibration acknowledgement modal + const order = this.$store.getters.order; + const containsRecalPart = containsRecalParts(order.lineItems); + const hasPartWithRecalRequirement = anyPartWithRequiresRecalFlag(order.lineItems); + + if ( + !containsRecalPart && + hasPartWithRecalRequirement && + this.isRecalAcknowledgedForScheduling !== RECAL_ACK_YES + ) { + return true; + } + return false; + }, async showMobileFirstModal() { if (!this.selectedRouteCodeData?.routeCode) { const pmMobileDays = experimentMixin.methods.getSettingValue( diff --git a/src/router/constants/navigation-scenarios.js b/src/router/constants/navigation-scenarios.js index c2247d59b..0d0ee836f 100644 --- a/src/router/constants/navigation-scenarios.js +++ b/src/router/constants/navigation-scenarios.js @@ -57,6 +57,7 @@ const navigationScenarios = { // Schedule CLICKED_CHANGE_LOCATION: "CLICKED_CHANGE_LOCATION", + ZIP_CODE_CHANGED_RECAL_ACK: "ZIP_CODE_CHANGED_RECAL_ACK", // Payment CLICKED_INSURANCE: "CLICKED_INSURANCE", diff --git a/src/router/constants/routing-table.js b/src/router/constants/routing-table.js index 48cd49b3f..3b237d747 100644 --- a/src/router/constants/routing-table.js +++ b/src/router/constants/routing-table.js @@ -486,6 +486,10 @@ const routingTable = function () { scenario: navigationScenarios.CLICKED_FORWARD_WITH_MOBILE_SERVICE, destinationPageData: routeData.MOBILE_DETAILS, }, + { + scenario: navigationScenarios.ZIP_CODE_CHANGED_RECAL_ACK, + destinationPageData: routeData.SERVICE_ZIP, + }, ], }, {