From 6e0609f8c1bbafe5bbfe89a7d368edc4bbfef4ec Mon Sep 17 00:00:00 2001 From: Chris Redelinghuys Date: Tue, 20 Jan 2026 10:38:26 -0500 Subject: [PATCH 1/4] CASH-2183: Conditional PIA --- src/constants/experiments.js | 3 ++ src/layouts/payment-method/payment-method.vue | 44 ++++++++++++++++++- 2 files changed, 45 insertions(+), 2 deletions(-) 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..bd4b8212b 100644 --- a/src/layouts/payment-method/payment-method.vue +++ b/src/layouts/payment-method/payment-method.vue @@ -810,11 +810,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; From f3166de125140c0cd29aeb4eec5da08152e0f776 Mon Sep 17 00:00:00 2001 From: CarlNation Date: Tue, 20 Jan 2026 10:41:20 -0500 Subject: [PATCH 2/4] CASH-2186 CASSH-2186 when doing a zip change when the recal ack modal is in effect, will have to navigate back to service-zip so we can add any necessary recal parts. --- src/layouts/schedule/schedule.vue | 54 +++++++++++++++----- src/router/constants/navigation-scenarios.js | 1 + src/router/constants/routing-table.js | 4 ++ 3 files changed, 45 insertions(+), 14 deletions(-) diff --git a/src/layouts/schedule/schedule.vue b/src/layouts/schedule/schedule.vue index a812ab5f6..b63e5fb21 100644 --- a/src/layouts/schedule/schedule.vue +++ b/src/layouts/schedule/schedule.vue @@ -1387,7 +1387,7 @@ export default { this.showRecalAcknowledgementPopup = false; }, async forwardButtonAction() { - const showRecalAcknowledgementModal = await this.showRecalAcknowledgementModal(); + const showRecalAcknowledgementModal = this.showRecalAcknowledgementModal(); if ( showRecalAcknowledgementModal && this.isRecalAcknowledgedForScheduling !== RECAL_ACK_YES @@ -1725,7 +1725,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) => { @@ -1803,18 +1823,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; @@ -1823,6 +1833,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 192e1572e..562615591 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, + }, ], }, { From 2914a508781ac8448b3429523fdb4a464f190a10 Mon Sep 17 00:00:00 2001 From: Chris Redelinghuys Date: Tue, 20 Jan 2026 10:56:01 -0500 Subject: [PATCH 3/4] CASH-2183: Null check --- src/layouts/payment-method/payment-method.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/layouts/payment-method/payment-method.vue b/src/layouts/payment-method/payment-method.vue index bd4b8212b..2a6d1d9ed 100644 --- a/src/layouts/payment-method/payment-method.vue +++ b/src/layouts/payment-method/payment-method.vue @@ -815,7 +815,7 @@ export default { this.currentDeductible > 0 ); } else { - if (piaExperience.includes("PIA Disabled")) { + if (piaExperience?.includes("PIA Disabled")) { return this.isConditionalPIAEnabled; } else { return piaExperience === "PIA Optional" || piaExperience === "PIA Required"; From 19dad3a5ca5bad982b05415ad6d0921a072bd15e Mon Sep 17 00:00:00 2001 From: CarlNation Date: Wed, 21 Jan 2026 12:30:13 -0500 Subject: [PATCH 4/4] CASH-1297 CASH-1297 this is a temporary defect fix for this card --- src/layouts/payment-method/payment-method.vue | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/layouts/payment-method/payment-method.vue b/src/layouts/payment-method/payment-method.vue index 2a6d1d9ed..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(