diff --git a/src/digital-components/button-question/button-question.vue b/src/digital-components/button-question/button-question.vue index 9fc13e2fe..e4c997f6d 100644 --- a/src/digital-components/button-question/button-question.vue +++ b/src/digital-components/button-question/button-question.vue @@ -52,7 +52,7 @@ https://safelite.atlassian.net/wiki/spaces/DC/pages/76644418/Button+Question+Com :isWide="isWide" :validationRules="validationRules" :textPosition="textPosition" - :additionalButtonData="additionalButtonData" + :additionalButtonData="answer.additionalButtonData" :lastValuePushedToGa="lastValuePushedToGa" :setLastValuePushedToGa="setLastValuePushedToGa" :suppressError="suppressError" @@ -252,6 +252,7 @@ export default { buttonFooterCopy: answer.buttonFooterCopy ?? answer.buttonFooterCopy, buttonImage: answer.buttonImage ?? answer.AnswerImageUrl, buttonImageId: answer.buttonImageId ?? answer.ImageId, + additionalButtonData: answer.additionalButtonData ?? answer.additionalButtonData, groupName: this.formatString(this.groupName), value: answer.value ?? diff --git a/src/helpers/promotions-helper.js b/src/helpers/promotions-helper.js index 00fd2ac9d..7aed45878 100644 --- a/src/helpers/promotions-helper.js +++ b/src/helpers/promotions-helper.js @@ -10,8 +10,37 @@ export const promoPartNumberStrings = { GLASS_CLEANER_DISCOUNT_PART_NUMBER: "DISC GLASS CLN", }; +export const addableVapsPromoPartNumbers = [ + promoPartNumberStrings.RAIN_DEFENSE_DISCOUNT_PART_NUMBER, + promoPartNumberStrings.WIPER_DISCOUNT_PART_NUMBER, +]; + export const pagesToStripPromoQueryStringFrom = ["quote", "payment-method"]; +export function getPromosWithAddableVaps(promoList) { + if (!promoList.length) { + return []; + } + + return promoList.filter((promo) => + addableVapsPromoPartNumbers.includes(promo.partNumber) + ); +} + +export function getLineItemsThatMatchPromos(promos, availableLineItems) { + const matchingLineItems = []; + promos.forEach((promo) => { + promo.discountedLineItemIds.forEach((discountedLineItemId) => { + matchingLineItems.push( + ...availableLineItems.filter( + (lineItem) => lineItem.id === discountedLineItemId + ) + ); + }); + }); + return matchingLineItems; +} + export function getAddableVapsFromAvailableLineItems(availableLineItems) { const addableVaps = []; addableVaps.push(...findLineItemsWithPartType(partTypeStrings.FRONT_WIPER, availableLineItems)); diff --git a/src/layouts/quote/cash-or-insurance-question/cash-or-insurance-question.vue b/src/layouts/quote/cash-or-insurance-question/cash-or-insurance-question.vue index a2afb1a7c..19382a19a 100644 --- a/src/layouts/quote/cash-or-insurance-question/cash-or-insurance-question.vue +++ b/src/layouts/quote/cash-or-insurance-question/cash-or-insurance-question.vue @@ -5,7 +5,6 @@ :groupName="groupName" buttonTypeString="listButtonHorizontal" v-model="selectedValues" - :additionalButtonData="additionalButtonData" isRequired /> @@ -25,7 +24,13 @@ export default { }, computed: { answersFromCms() { - return this.getCmsContent(this.cmsWidgetName, "Answers"); + const answers = this.getCmsContent(this.cmsWidgetName, "Answers"); + if (answers) { + answers.forEach( + (answer) => (answer.additionalButtonData = this.additionalButtonData) + ); + } + return answers; }, additionalButtonData() { return { 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 dc0d2005c..c156ef34c 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 @@ -46,6 +46,7 @@ describe("service-package-question.vue", () => { price: 35.5, }, ], + activePromos: [], }; const packageNameKey = "05_01_CSR_Quote_Standard_Repair"; Object.assign(processedCmsContent, mockProcessedCmsContent[packageNameKey]); @@ -291,6 +292,7 @@ describe("service-package-question.vue, matching business rules for package disp price: 35.5, }, ], + activePromos: [], }; }); it("should match the 05_01_CSR_Quote_Standard_Repair mock", () => { 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 70872153a..229d97c1b 100644 --- a/src/layouts/quote/service-package-question/service-package-question.vue +++ b/src/layouts/quote/service-package-question/service-package-question.vue @@ -32,6 +32,8 @@ import { import { getPromosThatMatchLineItemsOnOrder, removeVapsPromosFromPromoArray, + getPromosWithAddableVaps, + getLineItemsThatMatchPromos, } from "@/helpers/promotions-helper"; export default { @@ -54,7 +56,10 @@ export default { }, watch: { availableLineItems() { - if (this.$store.getters.payment.isInsurance != null) { + if ( + this.$store.getters.payment.isInsurance != null || + getPromosWithAddableVaps(this.activePromos).length + ) { this.selectDefaultPackage(); } }, @@ -217,13 +222,16 @@ export default { return price; }, selectDefaultPackage() { + const promosWithAddableVaps = getPromosWithAddableVaps(this.activePromos); + const vapsThatMatchPromos = getLineItemsThatMatchPromos(promosWithAddableVaps, this.nullSafeAvailableLineItems); const vapsFromStore = this.$store.getters.lineItems.vaps ?? []; + const vapsToUseForDefaultPackageSelection = this.combineLineItemsWithoutDuplicates(vapsThatMatchPromos, vapsFromStore); this.selectedPackageName = getHighestRequiredTier( this.glassToReplace, this.nullSafeAvailableLineItems, this.isRepair, - vapsFromStore + vapsToUseForDefaultPackageSelection ); }, getVapsLineItemsForSelectedPackage(packageName) { @@ -244,6 +252,19 @@ export default { return vapsLineItemsForSelectedPackage; }, + combineLineItemsWithoutDuplicates(lineItemsOne, lineItemsTwo) { + const combinedLineItemArray = [...lineItemsTwo]; + lineItemsOne.forEach((lineItemOne) => { + if ( + !lineItemsTwo.filter( + (lineItemTwo) => lineItemTwo.id === lineItemOne.id + ).length + ) { + combinedLineItemArray.push(lineItemOne); + } + }); + return combinedLineItemArray; + }, getCustomValueFromString(str) { switch (str) { case "isRecalibrationOnOrder": diff --git a/src/layouts/quote/service-package-question/service-package-radio/service-package-radio.spec.js b/src/layouts/quote/service-package-question/service-package-radio/service-package-radio.spec.js index fefef4044..333cb0663 100644 --- a/src/layouts/quote/service-package-question/service-package-radio/service-package-radio.spec.js +++ b/src/layouts/quote/service-package-question/service-package-radio/service-package-radio.spec.js @@ -122,6 +122,8 @@ const mockProps = { buttonBodyCopy: "", buttonFooterCopy: "buttonFooterCopy test copy", + buttonAuxillaryCopy: "buttonAuxillaryCopy test copy", + additionalButtonData: { strikeThroughPrice: "strikeThroughPrice test copy"}, }; function setupMocks({ mountOptionsMockData = {} }) { 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 7c4654721..138e174ce 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 @@ -7,7 +7,13 @@

- + + + +