From 2516adc2fc5bf975b92f9dc23084e3446c028130 Mon Sep 17 00:00:00 2001 From: Scott Kiener Date: Wed, 25 Oct 2023 10:33:14 -0400 Subject: [PATCH 1/2] CSR-1520 | Package selection promo logic --- .../button-question/button-question.vue | 3 +- src/helpers/promotions-helper.js | 29 +++++++++++++++++++ .../cash-or-insurance-question.vue | 9 ++++-- .../service-package-question.spec.js | 2 ++ .../service-package-question.vue | 25 ++++++++++++++-- .../service-package-radio.spec.js | 2 ++ .../service-package-radio.vue | 21 +++++++++++++- 7 files changed, 85 insertions(+), 6 deletions(-) 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 @@

- + + + +

Date: Wed, 25 Oct 2023 10:36:25 -0400 Subject: [PATCH 2/2] CSR-1520 | Formatting --- src/helpers/promotions-helper.js | 8 ++------ .../service-package-question.vue | 14 +++++++++----- .../service-package-radio.spec.js | 2 +- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/helpers/promotions-helper.js b/src/helpers/promotions-helper.js index 7aed45878..08f7daa8f 100644 --- a/src/helpers/promotions-helper.js +++ b/src/helpers/promotions-helper.js @@ -22,9 +22,7 @@ export function getPromosWithAddableVaps(promoList) { return []; } - return promoList.filter((promo) => - addableVapsPromoPartNumbers.includes(promo.partNumber) - ); + return promoList.filter((promo) => addableVapsPromoPartNumbers.includes(promo.partNumber)); } export function getLineItemsThatMatchPromos(promos, availableLineItems) { @@ -32,9 +30,7 @@ export function getLineItemsThatMatchPromos(promos, availableLineItems) { promos.forEach((promo) => { promo.discountedLineItemIds.forEach((discountedLineItemId) => { matchingLineItems.push( - ...availableLineItems.filter( - (lineItem) => lineItem.id === discountedLineItemId - ) + ...availableLineItems.filter((lineItem) => lineItem.id === discountedLineItemId) ); }); }); 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 229d97c1b..28727f155 100644 --- a/src/layouts/quote/service-package-question/service-package-question.vue +++ b/src/layouts/quote/service-package-question/service-package-question.vue @@ -223,9 +223,15 @@ export default { }, selectDefaultPackage() { const promosWithAddableVaps = getPromosWithAddableVaps(this.activePromos); - const vapsThatMatchPromos = getLineItemsThatMatchPromos(promosWithAddableVaps, this.nullSafeAvailableLineItems); + const vapsThatMatchPromos = getLineItemsThatMatchPromos( + promosWithAddableVaps, + this.nullSafeAvailableLineItems + ); const vapsFromStore = this.$store.getters.lineItems.vaps ?? []; - const vapsToUseForDefaultPackageSelection = this.combineLineItemsWithoutDuplicates(vapsThatMatchPromos, vapsFromStore); + const vapsToUseForDefaultPackageSelection = this.combineLineItemsWithoutDuplicates( + vapsThatMatchPromos, + vapsFromStore + ); this.selectedPackageName = getHighestRequiredTier( this.glassToReplace, @@ -256,9 +262,7 @@ export default { const combinedLineItemArray = [...lineItemsTwo]; lineItemsOne.forEach((lineItemOne) => { if ( - !lineItemsTwo.filter( - (lineItemTwo) => lineItemTwo.id === lineItemOne.id - ).length + !lineItemsTwo.filter((lineItemTwo) => lineItemTwo.id === lineItemOne.id).length ) { combinedLineItemArray.push(lineItemOne); } 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 333cb0663..fe42a73d0 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 @@ -123,7 +123,7 @@ const mockProps = { "

", buttonFooterCopy: "buttonFooterCopy test copy", buttonAuxillaryCopy: "buttonAuxillaryCopy test copy", - additionalButtonData: { strikeThroughPrice: "strikeThroughPrice test copy"}, + additionalButtonData: { strikeThroughPrice: "strikeThroughPrice test copy" }, }; function setupMocks({ mountOptionsMockData = {} }) {