From 8455ec926b07d674c5cac729d7b4df75374db68f Mon Sep 17 00:00:00 2001 From: Sneha Date: Wed, 8 Nov 2023 16:28:27 +0530 Subject: [PATCH 01/24] CSR-1393 --- src/constants/error-messages.js | 1 + src/fmg-components/cart/cart.vue | 12 +- src/layouts/payment-method/payment-method.vue | 10 +- .../promo-modal-question.vue | 167 ++++++++++++++++++ .../promo-question/promo-question.vue | 47 +++++ src/mixins/base-mixin.js | 15 ++ src/store/index.js | 3 +- 7 files changed, 247 insertions(+), 8 deletions(-) create mode 100644 src/layouts/payment-method/promo-modal-question/promo-modal-question.vue create mode 100644 src/layouts/payment-method/promo-modal-question/promo-question/promo-question.vue diff --git a/src/constants/error-messages.js b/src/constants/error-messages.js index ef5459395..71c782856 100644 --- a/src/constants/error-messages.js +++ b/src/constants/error-messages.js @@ -33,6 +33,7 @@ const errorMessages = { MAKE_REQUIRED: "Please select your vehicle make", MODEL_REQUIRED: "Please select your vehicle model", STYLE_REQUIRED: "Please select your vehicle style", + PROMO_REQUIRED: "Please enter a promo code", }; export { errorMessages }; diff --git a/src/fmg-components/cart/cart.vue b/src/fmg-components/cart/cart.vue index a5ab80faa..be22a118c 100644 --- a/src/fmg-components/cart/cart.vue +++ b/src/fmg-components/cart/cart.vue @@ -239,15 +239,15 @@ export default { let cartItem = null; cartItem = { - name: "Some Kind of Promo", // get from CMS? + name: promoLineItem?.[0]?.promoCode, // get from CMS? category: cartItemCategories.PROMOS, - cartItemType: promoLineItem.partType, + cartItemType: promoLineItem?.[0]?.partType, isDisplayed: true, subTotal: - (promoLineItem.kitPrice ?? 0) + - (promoLineItem.laborAmount ?? 0) + - (promoLineItem.sellingPrice ?? 0), - salesTax: promoLineItem.salesTax, + (promoLineItem?.[0]?.kitPrice ?? 0) + + (promoLineItem?.[0]?.laborAmount ?? 0) + + (promoLineItem?.[0]?.sellingPrice ?? 0), + salesTax: promoLineItem?.[0]?.salesTax, }; cartItems.push(cartItem); diff --git a/src/layouts/payment-method/payment-method.vue b/src/layouts/payment-method/payment-method.vue index 867dbb3fd..83ecde871 100644 --- a/src/layouts/payment-method/payment-method.vue +++ b/src/layouts/payment-method/payment-method.vue @@ -30,7 +30,13 @@ @cart-remove="cartRemove" recyclingModalCmsWidgetName="RecycleModal" /> -
+
+
diff --git a/src/layouts/payment-method/promo-modal-question/promo-modal-question.vue b/src/layouts/payment-method/promo-modal-question/promo-modal-question.vue new file mode 100644 index 000000000..43674b0c2 --- /dev/null +++ b/src/layouts/payment-method/promo-modal-question/promo-modal-question.vue @@ -0,0 +1,167 @@ + + diff --git a/src/layouts/payment-method/promo-modal-question/promo-question/promo-question.vue b/src/layouts/payment-method/promo-modal-question/promo-question/promo-question.vue new file mode 100644 index 000000000..6060e75fc --- /dev/null +++ b/src/layouts/payment-method/promo-modal-question/promo-question/promo-question.vue @@ -0,0 +1,47 @@ + + + diff --git a/src/mixins/base-mixin.js b/src/mixins/base-mixin.js index 8c85cf815..32e1e2750 100644 --- a/src/mixins/base-mixin.js +++ b/src/mixins/base-mixin.js @@ -80,6 +80,21 @@ export default { zipCodeCtu: serviceZipValidationResponse.data.zipCodeCtu, }; }, + async getPromoCodeData(promoCode, pageNameToLog = null) { + const pageName = pageNameToLog ?? this.$options?.name; + + const promoValidationResponse = await this.dispatchStoreActionWithLogging( + storeActions.VALIDATE_ORDER_PROMO_AND_SAVE_SERVER_DATA, + { promoCode: promoCode }, + pageName + ); + + return { + isValid: !("errorCode" in promoValidationResponse), + promoCode: promoValidationResponse?.orderPromos, + errorCode: promoValidationResponse?.errorCode, + }; + }, getTierOnePackagePrice(lineItems) { let lineItemsToPrice = lineItems.filter((lineItem) => { return ( diff --git a/src/store/index.js b/src/store/index.js index e2915a1af..8a0bd8176 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -2105,6 +2105,7 @@ export const actions = { context.commit(storeMutations.UPDATE_VAPS, vaps); }, savePromos(context, promos) { + addGuidToLineItemsIfNotAlreadyThere(promos); context.commit(storeMutations.UPDATE_PROMOS, promos); }, saveInactivePromos(context, inactivePromos) { @@ -2751,7 +2752,7 @@ function renameGlassToReplaceAttributes(glassToReplace) { } function addGuidToLineItemsIfNotAlreadyThere(lineItems) { - lineItems.forEach((lineItem) => { + lineItems?.forEach((lineItem) => { if (!lineItem.id) { lineItem.id = crypto.randomUUID(); } From 189350f1e9a6d084e9cf4f01e27c2fb556dbd69b Mon Sep 17 00:00:00 2001 From: Sneha Date: Wed, 8 Nov 2023 18:56:11 +0530 Subject: [PATCH 02/24] new --- .../promo-modal-question/promo-modal-question.vue | 14 +++++++++----- src/mixins/base-mixin.js | 4 ++-- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/src/layouts/payment-method/promo-modal-question/promo-modal-question.vue b/src/layouts/payment-method/promo-modal-question/promo-modal-question.vue index 43674b0c2..430bbc192 100644 --- a/src/layouts/payment-method/promo-modal-question/promo-modal-question.vue +++ b/src/layouts/payment-method/promo-modal-question/promo-modal-question.vue @@ -44,17 +44,18 @@ import promoQuestion from "@/layouts/payment-method/promo-modal-question/promo-q import modal from "@/digital-components/modal/modal"; import alert from "@/ux-components/alert/alert"; import { processIfStatements } from "@/helpers/cms-content-helper"; +import store from "@/store"; import { deepClone } from "@/helpers/object-helper"; -// import { -// getVapsThatNeedToBeAddedToSatisfyPromos, -// } from "@/helpers/promotions-helper"; +import { + getAddableVapsFromAvailableLineItems, +} from "@/helpers/promotions-helper"; export default { name: "promo-modal-question", data() { return { - promoCode: String, + promoCode: [], promoTextInputId: "", displayInvalidPromoAlert: false, lineItems:deepClone(this.modelValue), @@ -64,7 +65,7 @@ export default { modelValue: Object, linkWidgetName: String, modalWidgetName: String, - availableLineItems:Object + availableLineItems:Object, }, computed: { @@ -127,6 +128,9 @@ export default { async addPromoCode() { if (this.promoCode) { this.resetAlerts(); + const lineItems = store.getters.order.lineItems; + const getVaps = getAddableVapsFromAvailableLineItems(this.availableLineItems) + lineItems.vaps?.push(getVaps); const promoCodeData = await this.getPromoCodeData(this.promoCode,this.lineItems,this.availableLineItems, "payment-method"); if (promoCodeData.isValid) { let promos = []; diff --git a/src/mixins/base-mixin.js b/src/mixins/base-mixin.js index 32e1e2750..487d38361 100644 --- a/src/mixins/base-mixin.js +++ b/src/mixins/base-mixin.js @@ -80,12 +80,12 @@ export default { zipCodeCtu: serviceZipValidationResponse.data.zipCodeCtu, }; }, - async getPromoCodeData(promoCode, pageNameToLog = null) { + async getPromoCodeData(promoCode,lineItems,availableLineItems, pageNameToLog = null) { const pageName = pageNameToLog ?? this.$options?.name; const promoValidationResponse = await this.dispatchStoreActionWithLogging( storeActions.VALIDATE_ORDER_PROMO_AND_SAVE_SERVER_DATA, - { promoCode: promoCode }, + { promoCode: promoCode ,lineItems:lineItems,availableLineItems:availableLineItems}, pageName ); From b7f46e877f8e4902a2c2fc708b45d391097db8b7 Mon Sep 17 00:00:00 2001 From: Sneha Date: Thu, 9 Nov 2023 16:46:05 +0530 Subject: [PATCH 03/24] CSR-1393 --- src/layouts/payment-method/payment-method.vue | 2 +- .../promo-modal-question.vue | 90 +++++++++++++------ .../promo-question/promo-question.vue | 4 +- src/mixins/base-mixin.js | 33 ++++--- 4 files changed, 84 insertions(+), 45 deletions(-) diff --git a/src/layouts/payment-method/payment-method.vue b/src/layouts/payment-method/payment-method.vue index 83ecde871..c691c6765 100644 --- a/src/layouts/payment-method/payment-method.vue +++ b/src/layouts/payment-method/payment-method.vue @@ -30,7 +30,7 @@ @cart-remove="cartRemove" recyclingModalCmsWidgetName="RecycleModal" /> -
+
-
- Promo code "{{ promo?.promoCode }}" applied - +
+ Promo code "{{ promos }}" applied +
+ diff --git a/src/layouts/payment-method/promo-modal-question/promo-question/promo-question.vue b/src/layouts/payment-method/promo-modal-question/promo-question/promo-question.vue index 6060e75fc..b9161a938 100644 --- a/src/layouts/payment-method/promo-modal-question/promo-question/promo-question.vue +++ b/src/layouts/payment-method/promo-modal-question/promo-question/promo-question.vue @@ -25,9 +25,7 @@ defineRule("promo-required", required(errorMessages.PROMO_REQUIRED)); export default { name: "promo-question", props: { - modelValue: { - promoCode: String, - }, + modelValue:String, cmsWidgetName: String, }, computed: { diff --git a/src/mixins/base-mixin.js b/src/mixins/base-mixin.js index 487d38361..6175c121c 100644 --- a/src/mixins/base-mixin.js +++ b/src/mixins/base-mixin.js @@ -7,6 +7,7 @@ import { routerParams } from "@/router/router-constants/router-params"; import { queryStrings } from "@/constants/query-strings"; import { dynamicStrings } from "@/constants/dynamic-strings"; import { partTypeStrings } from "../constants/part-type-strings"; +//import { getAddableVapsFromAvailableLineItems } from "@/helpers/promotions-helper"; export default { data() { @@ -80,21 +81,25 @@ export default { zipCodeCtu: serviceZipValidationResponse.data.zipCodeCtu, }; }, - async getPromoCodeData(promoCode,lineItems,availableLineItems, pageNameToLog = null) { - const pageName = pageNameToLog ?? this.$options?.name; + // async getPromoCodeData(promoCode, lineItems, availableLineItems, pageNameToLog = null) { + // const pageName = pageNameToLog ?? this.$options?.name; + // const addableVaps = getAddableVapsFromAvailableLineItems(availableLineItems); + // const promoValidationResponse = await this.dispatchStoreActionWithLogging( + // storeActions.VALIDATE_ORDER_PROMO_AND_SAVE_SERVER_DATA, + // { + // promoCode: promoCode, + // lineItemsToUse: lineItems, + // addableVaps: addableVaps, + // }, + // pageName + // ); - const promoValidationResponse = await this.dispatchStoreActionWithLogging( - storeActions.VALIDATE_ORDER_PROMO_AND_SAVE_SERVER_DATA, - { promoCode: promoCode ,lineItems:lineItems,availableLineItems:availableLineItems}, - pageName - ); - - return { - isValid: !("errorCode" in promoValidationResponse), - promoCode: promoValidationResponse?.orderPromos, - errorCode: promoValidationResponse?.errorCode, - }; - }, + // return { + // isValid: !("errorCode" in promoValidationResponse), + // promoCode: promoValidationResponse?.orderPromos, + // errorCode: promoValidationResponse?.errorCode, + // }; + // }, getTierOnePackagePrice(lineItems) { let lineItemsToPrice = lineItems.filter((lineItem) => { return ( From 84c7e8c6176c13a55209def7acfae5b1dd05e572 Mon Sep 17 00:00:00 2001 From: hiteshkumar87 Date: Thu, 9 Nov 2023 18:03:45 +0530 Subject: [PATCH 04/24] add vaps to lineitems add vaps to lineitems --- .../promo-modal-question.vue | 66 +++++++++---------- .../promo-question/promo-question.vue | 2 +- 2 files changed, 34 insertions(+), 34 deletions(-) diff --git a/src/layouts/payment-method/promo-modal-question/promo-modal-question.vue b/src/layouts/payment-method/promo-modal-question/promo-modal-question.vue index c03713234..cc070cb0f 100644 --- a/src/layouts/payment-method/promo-modal-question/promo-modal-question.vue +++ b/src/layouts/payment-method/promo-modal-question/promo-modal-question.vue @@ -16,8 +16,8 @@ customInputId="promoCode" v-model="promoCode" cmsWidgetName="PromoQuestionWidget" /> -
- Promo code "{{ promos }}" applied +
+ Promo code "{{ promo[i].promoCode }}" applied 0?lineItems:null; + const promoValidationResponse = await baseMixin.methods.dispatchStoreActionWithLogging( storeActions.VALIDATE_ORDER_PROMO_AND_SAVE_SERVER_DATA, { promoCode: promoCode, - lineItemsToUse: lineItems, + lineItemsToUse: lineItemsToUse, addableVaps: addableVaps, }, - pageName + pageName,false ); return { @@ -136,33 +142,27 @@ export default { }, async addPromoCode() { if (this.promoCode) { - this.resetAlerts(); - // const getVaps = getVapsThatNeedToBeAddedToSatisfyPromos( - // this.promoCode, - // this.availableLineItems, - // this.lineItems - // ); - // this.lineItems.vaps?.push(getVaps); - + this.resetAlerts(); + const promoCodeData = await this.getPromoCodeData( this.promoCode, - this.lineItems, + this.modelValue, this.availableLineItems, "payment-method" ); - + if (promoCodeData.isValid) { let promos = []; promos.push(promoCodeData.promoCode); const modelValue = this.modelValue; modelValue.promos = promos; this.closeModal(); - // const getVaps = getVapsThatNeedToBeAddedToSatisfyPromos( - // this.promoCode, - // this.availableLineItems, - // this.lineItems - // ); - // this.lineItems.vaps?.push(getVaps); + const getVaps = getVapsThatNeedToBeAddedToSatisfyPromos( + promoCodeData.promoCode, + this.availableLineItems, + modelValue + ); + modelValue.vaps?.push(...getVaps); const message = this.getPromoAddedMessage(); this.$emit("added-to-cart", { messageHeadline: "Promo Applied!", @@ -196,12 +196,12 @@ export default { diff --git a/src/layouts/payment-method/promo-modal-question/promo-question/promo-question.vue b/src/layouts/payment-method/promo-modal-question/promo-question/promo-question.vue index b9161a938..25744e652 100644 --- a/src/layouts/payment-method/promo-modal-question/promo-question/promo-question.vue +++ b/src/layouts/payment-method/promo-modal-question/promo-question/promo-question.vue @@ -25,7 +25,7 @@ defineRule("promo-required", required(errorMessages.PROMO_REQUIRED)); export default { name: "promo-question", props: { - modelValue:String, + modelValue: String, cmsWidgetName: String, }, computed: { From 702d03f9742a9a382841b33170e9e838b52ed496 Mon Sep 17 00:00:00 2001 From: Matt Caimi Date: Fri, 10 Nov 2023 11:44:37 -0500 Subject: [PATCH 05/24] CSR-1462 break confirmation page out of iframe --- src/layouts/confirmation/confirmation.vue | 2 -- src/layouts/payment-pia-return/payment-pia-return.vue | 1 + src/router/index.js | 11 ++++++++++- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/layouts/confirmation/confirmation.vue b/src/layouts/confirmation/confirmation.vue index 94a7054e7..903df1dc6 100644 --- a/src/layouts/confirmation/confirmation.vue +++ b/src/layouts/confirmation/confirmation.vue @@ -73,8 +73,6 @@ import { get12HourTimeFormat, get12HourTimeMobileFormat } from "@/helpers/date-h export default { name: "confirmation", async beforeRouteEnter(to, from, next) { - await baseMixin.methods.dispatchStoreAction(storeActions.CREATE_SUBMITTED_ORDER); - // Call APIs const cmsContentPromise = fetchCmsContentForPage(to.query.fmgPage); diff --git a/src/layouts/payment-pia-return/payment-pia-return.vue b/src/layouts/payment-pia-return/payment-pia-return.vue index 54e49c620..8088cbb06 100644 --- a/src/layouts/payment-pia-return/payment-pia-return.vue +++ b/src/layouts/payment-pia-return/payment-pia-return.vue @@ -131,6 +131,7 @@ export default { } this.$refs.loadingModal.isModalVisible = false; + await baseMixin.methods.dispatchStoreAction(storeActions.CREATE_SUBMITTED_ORDER); this.$router.navigateWithoutSaving(this.navigationScenarios.PIA_SUCCESS, this.$route); }, forwardButtonAction() { diff --git a/src/router/index.js b/src/router/index.js index cec3ff193..f7ff73a94 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -169,7 +169,16 @@ router.beforeEach(async (to, from, next) => { showFmgLoadingModal(true); } - next(); + const toQueryPage = to.query?.fmgPage; + const notToPIAReturn = toQueryPage != "payment-pia-return"; + const isInIframe = window !== window.top; + + if (isInIframe && notToPIAReturn) { + const newUrl = `${window.top.location.origin}${to.href}`; + window.top.location.href = newUrl; + } else { + next(); + } }); router.afterEach(async (to, from) => { From 0735f949f1159fdb13bbafe762147d4aa98bf1ea Mon Sep 17 00:00:00 2001 From: CarlNation Date: Fri, 10 Nov 2023 13:37:29 -0500 Subject: [PATCH 06/24] CSR-1462 leave create submitted order in confirmation.vue --- src/layouts/confirmation/confirmation.vue | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/layouts/confirmation/confirmation.vue b/src/layouts/confirmation/confirmation.vue index 903df1dc6..bc414be9e 100644 --- a/src/layouts/confirmation/confirmation.vue +++ b/src/layouts/confirmation/confirmation.vue @@ -73,6 +73,8 @@ import { get12HourTimeFormat, get12HourTimeMobileFormat } from "@/helpers/date-h export default { name: "confirmation", async beforeRouteEnter(to, from, next) { + await baseMixin.methods.dispatchStoreAction(storeActions.CREATE_SUBMITTED_ORDER); + // Call APIs const cmsContentPromise = fetchCmsContentForPage(to.query.fmgPage); From a667d3ef471a6bc903dcb535013747ca5d90e378 Mon Sep 17 00:00:00 2001 From: CarlNation <32103961+CarlNation@users.noreply.github.com> Date: Fri, 10 Nov 2023 14:19:13 -0500 Subject: [PATCH 07/24] CSR prettier --- src/layouts/confirmation/confirmation.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/layouts/confirmation/confirmation.vue b/src/layouts/confirmation/confirmation.vue index bc414be9e..94a7054e7 100644 --- a/src/layouts/confirmation/confirmation.vue +++ b/src/layouts/confirmation/confirmation.vue @@ -74,7 +74,7 @@ export default { name: "confirmation", async beforeRouteEnter(to, from, next) { await baseMixin.methods.dispatchStoreAction(storeActions.CREATE_SUBMITTED_ORDER); - + // Call APIs const cmsContentPromise = fetchCmsContentForPage(to.query.fmgPage); From d041721858659146feb7bd13a9dc25ee7c2f2a9d Mon Sep 17 00:00:00 2001 From: Sneha Date: Mon, 13 Nov 2023 13:17:18 +0530 Subject: [PATCH 08/24] CSR-1393 --- src/fmg-components/cart/cart.vue | 12 +- src/layouts/payment-method/payment-method.vue | 1 + .../promo-modal-question.vue | 115 +++++++++++------- .../promo-question/promo-question.spec.js | 40 ++++++ src/mixins/base-mixin.js | 19 --- 5 files changed, 121 insertions(+), 66 deletions(-) create mode 100644 src/layouts/payment-method/promo-modal-question/promo-question/promo-question.spec.js diff --git a/src/fmg-components/cart/cart.vue b/src/fmg-components/cart/cart.vue index be22a118c..22d40eb73 100644 --- a/src/fmg-components/cart/cart.vue +++ b/src/fmg-components/cart/cart.vue @@ -239,15 +239,15 @@ export default { let cartItem = null; cartItem = { - name: promoLineItem?.[0]?.promoCode, // get from CMS? + name: promoLineItem?.promoCode, // get from CMS? category: cartItemCategories.PROMOS, - cartItemType: promoLineItem?.[0]?.partType, + cartItemType: promoLineItem?.partType, isDisplayed: true, subTotal: - (promoLineItem?.[0]?.kitPrice ?? 0) + - (promoLineItem?.[0]?.laborAmount ?? 0) + - (promoLineItem?.[0]?.sellingPrice ?? 0), - salesTax: promoLineItem?.[0]?.salesTax, + (promoLineItem?.kitPrice ?? 0) + + (promoLineItem?.laborAmount ?? 0) + + (promoLineItem?.sellingPrice ?? 0), + salesTax: promoLineItem?.salesTax, }; cartItems.push(cartItem); diff --git a/src/layouts/payment-method/payment-method.vue b/src/layouts/payment-method/payment-method.vue index c691c6765..03d3a9e8d 100644 --- a/src/layouts/payment-method/payment-method.vue +++ b/src/layouts/payment-method/payment-method.vue @@ -32,6 +32,7 @@
-
- Promo code "{{ promo[i].promoCode }}" applied + +
+ Promo code "{{ promo.promoCode }}" applied + @click-event="removeItem(promo.promoCode)" />
-
@@ -41,13 +41,13 @@ import textLink from "@/ux-components/text-link/text-link"; import promoQuestion from "@/layouts/payment-method/promo-modal-question/promo-question/promo-question"; import modal from "@/digital-components/modal/modal"; import alert from "@/ux-components/alert/alert"; -import { deepClone } from "@/helpers/object-helper"; import { storeActions } from "@/constants/store-actions.js"; import { getVapsThatNeedToBeAddedToSatisfyPromos, getAddableVapsFromAvailableLineItems, } from "@/helpers/promotions-helper"; import baseMixin from "@/mixins/base-mixin.js"; +import { cartItemCategories } from "@/constants/cart-item-categories"; export default { name: "promo-modal-question", @@ -55,7 +55,8 @@ export default { return { promoCode: "", promoTextInputId: "", - displayInvalidPromoAlert: false, + displayInvalidPromoAlert: false, + displayInvalidOnOrderPromoAlert: false, }; }, props: { @@ -81,6 +82,15 @@ export default { modal() { return this.$refs[this.modalName]; }, + PromoOnOrderText() { + return this.getCmsContent("AlertInvalidPromoOnOrderWidget", "HeadlineText"); + }, + InvalidPromoOnOrderText() { + return this.PromoText?.replaceAll("{custom:NEWPROMOCODE}", this.promoCode).replaceAll( + "{custom:OLDPROMOCODE}", + this.promoCode + ); + }, PromoText() { return this.getCmsContent("AlertInvalidPromoWidget", "HeadlineText"); }, @@ -93,9 +103,6 @@ export default { removeLinkText() { return this.getCmsContent("RemoveCartItemTextWidget", "Text"); }, - getPromoList(){ - return this.modelValue?.promos; - } }, methods: { resetAlerts() { @@ -104,6 +111,9 @@ export default { resetsOnPromoInput() { this.resetAlerts(); }, + getPromoList() { + return this.modelValue?.promos; + }, openModal() { this.modal.openModal(); }, @@ -118,12 +128,15 @@ export default { this.modal.resetButtonStyle(); }, getPromoAddedMessage() { - return this.AddPromoSuccessMessageFromCms?.replaceAll("{custom:PROMOCODE}", this.promoCode); + return this.AddPromoSuccessMessageFromCms?.replaceAll( + "{custom:PROMOCODE}", + this.promoCode + ); }, async getPromoCodeData(promoCode, lineItems, availableLineItems, pageNameToLog = null) { const pageName = pageNameToLog ?? this.$options?.name; const addableVaps = getAddableVapsFromAvailableLineItems(availableLineItems); - const lineItemsToUse = lineItems.Length > 0?lineItems:null; + const lineItemsToUse = lineItems.Length > 0 ? lineItems : null; const promoValidationResponse = await baseMixin.methods.dispatchStoreActionWithLogging( storeActions.VALIDATE_ORDER_PROMO_AND_SAVE_SERVER_DATA, { @@ -131,7 +144,8 @@ export default { lineItemsToUse: lineItemsToUse, addableVaps: addableVaps, }, - pageName,false + pageName, + false ); return { @@ -140,9 +154,17 @@ export default { errorCode: promoValidationResponse?.errorCode, }; }, + removeItem(promo) { + let lineItems = this.modelValue; + lineItems[cartItemCategories.PROMOS] = lineItems[cartItemCategories.PROMOS].filter( + (lineItemsToKeep) => lineItemsToKeep.promoCode != promo + ); + + this.$emit("update:modelValue", lineItems); + }, async addPromoCode() { if (this.promoCode) { - this.resetAlerts(); + this.resetAlerts(); const promoCodeData = await this.getPromoCodeData( this.promoCode, @@ -152,30 +174,37 @@ export default { ); if (promoCodeData.isValid) { - let promos = []; - promos.push(promoCodeData.promoCode); const modelValue = this.modelValue; - modelValue.promos = promos; - this.closeModal(); - const getVaps = getVapsThatNeedToBeAddedToSatisfyPromos( - promoCodeData.promoCode, - this.availableLineItems, - modelValue + const addedPromo = modelValue?.promos.find( + (promoItem) => + promoItem?.promoCode == promoCodeData.promoCode?.[0]?.promoCode ); - modelValue.vaps?.push(...getVaps); - const message = this.getPromoAddedMessage(); - this.$emit("added-to-cart", { - messageHeadline: "Promo Applied!", - messageCopy: message, - type: "alert-success", - isDismissible: true, - }); - } else { - if (promoCodeData.errorCode === "PromoDoesNotExist") { + if (addedPromo) { this.displayInvalidPromoAlert = true; this.focusOnPromoInput(); this.resetModalButtonStyle(); + } else { + modelValue?.promos.push(...promoCodeData.promoCode); + const getVaps = getVapsThatNeedToBeAddedToSatisfyPromos( + promoCodeData.promoCode, + this.availableLineItems, + modelValue + ); + modelValue.vaps?.push(...getVaps); + this.closeModal(); + const message = this.getPromoAddedMessage(); + this.$emit("added-to-cart", { + messageHeadline: "Promo Applied!", + messageCopy: message, + type: "alert-success", + isDismissible: true, + }); + this.promoCode = ""; } + } else { + this.displayInvalidPromoAlert = true; + this.focusOnPromoInput(); + this.resetModalButtonStyle(); } } }, @@ -196,12 +225,16 @@ export default { diff --git a/src/layouts/payment-method/promo-modal-question/promo-question/promo-question.spec.js b/src/layouts/payment-method/promo-modal-question/promo-question/promo-question.spec.js new file mode 100644 index 000000000..97a4346ad --- /dev/null +++ b/src/layouts/payment-method/promo-modal-question/promo-question/promo-question.spec.js @@ -0,0 +1,40 @@ +import { shallowMount } from "@vue/test-utils"; +import promoQuestion from "./promo-question"; + +describe("promo-question.vue", () => { + it("Should get the modelValue", async () => { + // Arrange + const text = "test"; + const wrapper = shallowMount(promoQuestion, { + props: { + modelValue: text, + }, + attachTo: document.body, + }); + + // Act + const modelValueText = wrapper.vm.value; + wrapper.vm.value = "test also"; + + // Assert + expect(modelValueText).toEqual("test"); + }); + + it("Should emit to set value", async () => { + // Arrange + const text = "test"; + const wrapper = shallowMount(promoQuestion, { + props: { + modelValue: text, + }, + attachTo: document.body, + }); + + // Act + const modelValueText = wrapper.vm.value; + wrapper.vm.value = "test also"; + + // Assert + expect(wrapper.emitted("update:modelValue")).toEqual([["test also"]]); + }); +}); diff --git a/src/mixins/base-mixin.js b/src/mixins/base-mixin.js index 6175c121c..1a941c94d 100644 --- a/src/mixins/base-mixin.js +++ b/src/mixins/base-mixin.js @@ -81,25 +81,6 @@ export default { zipCodeCtu: serviceZipValidationResponse.data.zipCodeCtu, }; }, - // async getPromoCodeData(promoCode, lineItems, availableLineItems, pageNameToLog = null) { - // const pageName = pageNameToLog ?? this.$options?.name; - // const addableVaps = getAddableVapsFromAvailableLineItems(availableLineItems); - // const promoValidationResponse = await this.dispatchStoreActionWithLogging( - // storeActions.VALIDATE_ORDER_PROMO_AND_SAVE_SERVER_DATA, - // { - // promoCode: promoCode, - // lineItemsToUse: lineItems, - // addableVaps: addableVaps, - // }, - // pageName - // ); - - // return { - // isValid: !("errorCode" in promoValidationResponse), - // promoCode: promoValidationResponse?.orderPromos, - // errorCode: promoValidationResponse?.errorCode, - // }; - // }, getTierOnePackagePrice(lineItems) { let lineItemsToPrice = lineItems.filter((lineItem) => { return ( From 4b493714450709dae0acd6af3381f0286b245d7b Mon Sep 17 00:00:00 2001 From: Sneha Date: Mon, 13 Nov 2023 13:20:16 +0530 Subject: [PATCH 09/24] Update base-mixin.js --- src/mixins/base-mixin.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/mixins/base-mixin.js b/src/mixins/base-mixin.js index 1a941c94d..8c85cf815 100644 --- a/src/mixins/base-mixin.js +++ b/src/mixins/base-mixin.js @@ -7,7 +7,6 @@ import { routerParams } from "@/router/router-constants/router-params"; import { queryStrings } from "@/constants/query-strings"; import { dynamicStrings } from "@/constants/dynamic-strings"; import { partTypeStrings } from "../constants/part-type-strings"; -//import { getAddableVapsFromAvailableLineItems } from "@/helpers/promotions-helper"; export default { data() { From 5fda20d9ab34c6a8d5942be9ba4ba1eec8063730 Mon Sep 17 00:00:00 2001 From: Sneha Date: Mon, 13 Nov 2023 13:36:45 +0530 Subject: [PATCH 10/24] Update cart.vue --- src/fmg-components/cart/cart.vue | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/fmg-components/cart/cart.vue b/src/fmg-components/cart/cart.vue index d79ae15df..5d3382540 100644 --- a/src/fmg-components/cart/cart.vue +++ b/src/fmg-components/cart/cart.vue @@ -226,12 +226,10 @@ export default { cartItemType: promoLineItem?.partType, isDisplayed: true, subTotal: - (promoLineItem?.kitPrice ?? 0) + (promoLineItem?.laborAmount ?? 0) + (promoLineItem?.sellingPrice ?? 0), salesTax: promoLineItem?.salesTax, - }; promoLineItem.cartItemType = cartItem.cartItemType; From ab507a92803f0c15c02c0b2438cbe0fb85c57179 Mon Sep 17 00:00:00 2001 From: hiteshkumar87 Date: Mon, 13 Nov 2023 16:08:38 +0530 Subject: [PATCH 11/24] taxable promo taxable promo and lineitems --- src/fmg-components/cart/cart.vue | 1 + src/layouts/payment-method/payment-method.vue | 2 +- .../promo-modal-question.vue | 92 +++++++++++++------ 3 files changed, 66 insertions(+), 29 deletions(-) diff --git a/src/fmg-components/cart/cart.vue b/src/fmg-components/cart/cart.vue index 5d3382540..461a09e49 100644 --- a/src/fmg-components/cart/cart.vue +++ b/src/fmg-components/cart/cart.vue @@ -230,6 +230,7 @@ export default { (promoLineItem?.laborAmount ?? 0) + (promoLineItem?.sellingPrice ?? 0), salesTax: promoLineItem?.salesTax, + lineItems:[], }; promoLineItem.cartItemType = cartItem.cartItemType; diff --git a/src/layouts/payment-method/payment-method.vue b/src/layouts/payment-method/payment-method.vue index 944b47d99..0d6f338bb 100644 --- a/src/layouts/payment-method/payment-method.vue +++ b/src/layouts/payment-method/payment-method.vue @@ -33,7 +33,7 @@ diff --git a/src/layouts/payment-method/promo-modal-question/promo-modal-question.vue b/src/layouts/payment-method/promo-modal-question/promo-modal-question.vue index d7154f6c4..07ecdba09 100644 --- a/src/layouts/payment-method/promo-modal-question/promo-modal-question.vue +++ b/src/layouts/payment-method/promo-modal-question/promo-modal-question.vue @@ -42,12 +42,12 @@ import promoQuestion from "@/layouts/payment-method/promo-modal-question/promo-q import modal from "@/digital-components/modal/modal"; import alert from "@/ux-components/alert/alert"; import { storeActions } from "@/constants/store-actions.js"; -import { - getVapsThatNeedToBeAddedToSatisfyPromos, - getAddableVapsFromAvailableLineItems, -} from "@/helpers/promotions-helper"; +import { getVapsThatNeedToBeAddedToSatisfyPromos } from "@/helpers/promotions-helper"; +import { deepClone } from "@/helpers/object-helper"; import baseMixin from "@/mixins/base-mixin.js"; import { cartItemCategories } from "@/constants/cart-item-categories"; +import store from "@/store"; +import { mapTaxedLineItemsToStoreFormat } from "@/store"; export default { name: "promo-modal-question", @@ -57,15 +57,15 @@ export default { promoTextInputId: "", displayInvalidPromoAlert: false, displayInvalidOnOrderPromoAlert: false, + lineItems: deepClone(this.modelValue), }; }, props: { modelValue: Object, linkWidgetName: String, modalWidgetName: String, - availableLineItems: Object, + availableVaps: Object, }, - computed: { promoLinkText() { return this.getCmsContent(this.linkWidgetName, "BodyText"); @@ -112,7 +112,7 @@ export default { this.resetAlerts(); }, getPromoList() { - return this.modelValue?.promos; + return this.lineItems.promos; }, openModal() { this.modal.openModal(); @@ -133,16 +133,16 @@ export default { this.promoCode ); }, - async getPromoCodeData(promoCode, lineItems, availableLineItems, pageNameToLog = null) { + async getPromoCodeData(promoCode, lineItems, availableVaps, pageNameToLog = null) { const pageName = pageNameToLog ?? this.$options?.name; - const addableVaps = getAddableVapsFromAvailableLineItems(availableLineItems); - const lineItemsToUse = lineItems.Length > 0 ? lineItems : null; + //const addableVaps = getAddableVapsFromAvailableLineItems(availableLineItems); + //const lineItemsToUse = lineItems.Length > 0 ? lineItems : null; const promoValidationResponse = await baseMixin.methods.dispatchStoreActionWithLogging( storeActions.VALIDATE_ORDER_PROMO_AND_SAVE_SERVER_DATA, { promoCode: promoCode, - lineItemsToUse: lineItemsToUse, - addableVaps: addableVaps, + lineItemsToUse: lineItems, + addableVaps: availableVaps, }, pageName, false @@ -155,27 +155,25 @@ export default { }; }, removeItem(promo) { - let lineItems = this.modelValue; - lineItems[cartItemCategories.PROMOS] = lineItems[cartItemCategories.PROMOS].filter( - (lineItemsToKeep) => lineItemsToKeep.promoCode != promo - ); + //let lineItems = this.modelValue; + this.lineItems[cartItemCategories.PROMOS] = this.lineItems[ + cartItemCategories.PROMOS + ].filter((lineItemsToKeep) => lineItemsToKeep.promoCode != promo); - this.$emit("update:modelValue", lineItems); + this.$emit("update:modelValue", this.lineItems); }, async addPromoCode() { if (this.promoCode) { this.resetAlerts(); - const promoCodeData = await this.getPromoCodeData( this.promoCode, - this.modelValue, - this.availableLineItems, + this.lineItems, + this.availableVaps, "payment-method" ); if (promoCodeData.isValid) { - const modelValue = this.modelValue; - const addedPromo = modelValue?.promos.find( + const addedPromo = this.lineItems?.promos.find( (promoItem) => promoItem?.promoCode == promoCodeData.promoCode?.[0]?.promoCode ); @@ -183,23 +181,55 @@ export default { this.displayInvalidPromoAlert = true; this.focusOnPromoInput(); this.resetModalButtonStyle(); - } else { - modelValue?.promos.push(...promoCodeData.promoCode); + } else { + const pricedLineItemsToTax = []; + pricedLineItemsToTax.push(...promoCodeData.promoCode); + const taxedLineItems = + await baseMixin.methods.dispatchStoreActionWithLogging( + storeActions.TAX_ORDER_ITEMS_AND_SAVE_SERVER_DATA, + { + billToAccountNumber: "87291", + providerNumber: + store.getters.order.serviceLocation.provider.providerNumber, + appointmentType: + store.getters.order.serviceLocation.appointmentType, + serviceLocationCity: store.getters.order.serviceLocation.city, + serviceLocationState: store.getters.order.serviceLocation.state, + serviceLocationZipCode: + store.getters.order.serviceLocation.zipCode, + pricedLineItems:pricedLineItemsToTax, + }, + "payment-method", + false + ); + // Match all line items to the line items as they are in the store + // and rebuild the original structure. + this.lineItems = mapTaxedLineItemsToStoreFormat( + taxedLineItems, + this.lineItems + ); + const taxedVaps = mapTaxedLineItemsToStoreFormat( + taxedLineItems, + this.availableVaps + ); + const getVaps = getVapsThatNeedToBeAddedToSatisfyPromos( promoCodeData.promoCode, - this.availableLineItems, - modelValue + taxedVaps, + this.lineItems ); - modelValue.vaps?.push(...getVaps); + this.lineItems?.promos.push(...promoCodeData.promoCode); + this.lineItems.vaps?.push(...getVaps); this.closeModal(); const message = this.getPromoAddedMessage(); + this.$emit("update:modelValue", this.lineItems); this.$emit("added-to-cart", { messageHeadline: "Promo Applied!", messageCopy: message, type: "alert-success", isDismissible: true, }); - this.promoCode = ""; + this.promoCode = ""; } } else { this.displayInvalidPromoAlert = true; @@ -213,6 +243,12 @@ export default { promoCode() { this.displayInvalidPromoAlert = false; }, + modelValue: { + handler(newValue) { + this.lineItems = deepClone(newValue); + }, + deep: true, + }, }, components: { From fa16142627062189fcd0111561bde2f607fb9442 Mon Sep 17 00:00:00 2001 From: Sneha Date: Mon, 13 Nov 2023 16:16:06 +0530 Subject: [PATCH 12/24] Formatting --- src/fmg-components/cart/cart.vue | 2 +- .../promo-modal-question/promo-modal-question.vue | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/fmg-components/cart/cart.vue b/src/fmg-components/cart/cart.vue index 461a09e49..afb13c0e1 100644 --- a/src/fmg-components/cart/cart.vue +++ b/src/fmg-components/cart/cart.vue @@ -230,7 +230,7 @@ export default { (promoLineItem?.laborAmount ?? 0) + (promoLineItem?.sellingPrice ?? 0), salesTax: promoLineItem?.salesTax, - lineItems:[], + lineItems: [], }; promoLineItem.cartItemType = cartItem.cartItemType; diff --git a/src/layouts/payment-method/promo-modal-question/promo-modal-question.vue b/src/layouts/payment-method/promo-modal-question/promo-modal-question.vue index 07ecdba09..91388396b 100644 --- a/src/layouts/payment-method/promo-modal-question/promo-modal-question.vue +++ b/src/layouts/payment-method/promo-modal-question/promo-modal-question.vue @@ -181,7 +181,7 @@ export default { this.displayInvalidPromoAlert = true; this.focusOnPromoInput(); this.resetModalButtonStyle(); - } else { + } else { const pricedLineItemsToTax = []; pricedLineItemsToTax.push(...promoCodeData.promoCode); const taxedLineItems = @@ -197,7 +197,7 @@ export default { serviceLocationState: store.getters.order.serviceLocation.state, serviceLocationZipCode: store.getters.order.serviceLocation.zipCode, - pricedLineItems:pricedLineItemsToTax, + pricedLineItems: pricedLineItemsToTax, }, "payment-method", false @@ -212,7 +212,7 @@ export default { taxedLineItems, this.availableVaps ); - + const getVaps = getVapsThatNeedToBeAddedToSatisfyPromos( promoCodeData.promoCode, taxedVaps, @@ -229,7 +229,7 @@ export default { type: "alert-success", isDismissible: true, }); - this.promoCode = ""; + this.promoCode = ""; } } else { this.displayInvalidPromoAlert = true; From 3873c23716087f607dbd4ba49baab034c5e6f6b7 Mon Sep 17 00:00:00 2001 From: Sneha Date: Mon, 13 Nov 2023 19:42:15 +0530 Subject: [PATCH 13/24] Removing toast --- src/layouts/payment-method/payment-method.vue | 1 - .../promo-modal-question.vue | 40 +++++++++---------- 2 files changed, 19 insertions(+), 22 deletions(-) diff --git a/src/layouts/payment-method/payment-method.vue b/src/layouts/payment-method/payment-method.vue index 0d6f338bb..d672dbd06 100644 --- a/src/layouts/payment-method/payment-method.vue +++ b/src/layouts/payment-method/payment-method.vue @@ -34,7 +34,6 @@ class="pb-3" v-model="lineItems" :availableVaps="availableVaps" - @added-to-cart="showAlert" linkWidgetName="PromoLinkWidget" modalWidgetName="PromoModalWidget" /> diff --git a/src/layouts/payment-method/promo-modal-question/promo-modal-question.vue b/src/layouts/payment-method/promo-modal-question/promo-modal-question.vue index 91388396b..08a58d27e 100644 --- a/src/layouts/payment-method/promo-modal-question/promo-modal-question.vue +++ b/src/layouts/payment-method/promo-modal-question/promo-modal-question.vue @@ -24,6 +24,14 @@ cmsWidgetName="AlertInvalidPromoWidget" alertClass="alert-danger" v-bind:isDismissible="true" /> +
Promo code "{{ promo.promoCode }}" applied - promoItem?.promoCode == promoCodeData.promoCode?.[0]?.promoCode - ); - if (addedPromo) { - this.displayInvalidPromoAlert = true; - this.focusOnPromoInput(); - this.resetModalButtonStyle(); - } else { const pricedLineItemsToTax = []; pricedLineItemsToTax.push(...promoCodeData.promoCode); const taxedLineItems = @@ -221,17 +220,15 @@ export default { this.lineItems?.promos.push(...promoCodeData.promoCode); this.lineItems.vaps?.push(...getVaps); this.closeModal(); - const message = this.getPromoAddedMessage(); this.$emit("update:modelValue", this.lineItems); - this.$emit("added-to-cart", { - messageHeadline: "Promo Applied!", - messageCopy: message, - type: "alert-success", - isDismissible: true, - }); this.promoCode = ""; - } } else { + if(promoCodeData.errorCode == "PromoStackingNotAllowed") + { + this.displayInvalidPromoOnOrderAlert = true; + this.focusOnPromoInput(); + this.resetModalButtonStyle(); + } this.displayInvalidPromoAlert = true; this.focusOnPromoInput(); this.resetModalButtonStyle(); @@ -242,6 +239,7 @@ export default { watch: { promoCode() { this.displayInvalidPromoAlert = false; + this.displayInvalidOnOrderPromoAlert = false; }, modelValue: { handler(newValue) { From 33d2db26d7a89daee9fc79f050d73cec3807ce29 Mon Sep 17 00:00:00 2001 From: Sneha Date: Mon, 13 Nov 2023 19:44:38 +0530 Subject: [PATCH 14/24] Update promo-modal-question.vue --- .../promo-modal-question.vue | 89 +++++++++---------- 1 file changed, 40 insertions(+), 49 deletions(-) diff --git a/src/layouts/payment-method/promo-modal-question/promo-modal-question.vue b/src/layouts/payment-method/promo-modal-question/promo-modal-question.vue index 08a58d27e..574d5356c 100644 --- a/src/layouts/payment-method/promo-modal-question/promo-modal-question.vue +++ b/src/layouts/payment-method/promo-modal-question/promo-modal-question.vue @@ -24,7 +24,7 @@ cmsWidgetName="AlertInvalidPromoWidget" alertClass="alert-danger" v-bind:isDismissible="true" /> - Date: Mon, 13 Nov 2023 20:11:00 +0530 Subject: [PATCH 15/24] CSR-1393 --- src/helpers/promotions-helper.js | 2 +- .../promo-modal-question/promo-modal-question.vue | 15 +++++++++------ 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/src/helpers/promotions-helper.js b/src/helpers/promotions-helper.js index d18a4aa17..996ca1aa6 100644 --- a/src/helpers/promotions-helper.js +++ b/src/helpers/promotions-helper.js @@ -16,7 +16,7 @@ export const addableVapsPromoPartNumbers = [ promoPartNumberStrings.WIPER_DISCOUNT_PART_NUMBER, ]; -const promoErrorCodes = { +export const promoErrorCodes = { UNKNOWN: "Unknown", PROMO_NOT_YET_IN_USE: "PromoNotYetInUse", PROMO_USAGE_COUNT_EXCEEDED: "PromoUsageCountExceeded", diff --git a/src/layouts/payment-method/promo-modal-question/promo-modal-question.vue b/src/layouts/payment-method/promo-modal-question/promo-modal-question.vue index 574d5356c..db04dfb00 100644 --- a/src/layouts/payment-method/promo-modal-question/promo-modal-question.vue +++ b/src/layouts/payment-method/promo-modal-question/promo-modal-question.vue @@ -9,6 +9,7 @@ lineItemsToKeep.promoCode != promo); - - this.$emit("update:modelValue", this.lineItems); }, async addPromoCode() { if (this.promoCode) { @@ -212,10 +216,9 @@ export default { this.lineItems?.promos.push(...promoCodeData.promoCode); this.lineItems.vaps?.push(...getVaps); this.closeModal(); - this.$emit("update:modelValue", this.lineItems); this.promoCode = ""; } else { - if (promoCodeData.errorCode == "PromoStackingNotAllowed") { + if (promoCodeData.errorCode == promoErrorCodes.PROMO_STACKING_NOT_ALLOWED) { this.displayInvalidPromoOnOrderAlert = true; this.focusOnPromoInput(); this.resetModalButtonStyle(); From ba9ac2b4dbd9391e0dc471da8b886a6dccbbfaec Mon Sep 17 00:00:00 2001 From: Bryan Mauger Date: Mon, 13 Nov 2023 10:03:03 -0500 Subject: [PATCH 16/24] CSR-1775 fix misalignment of hamburger button. --- src/layouts/payment-method/payment-method.vue | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/layouts/payment-method/payment-method.vue b/src/layouts/payment-method/payment-method.vue index 0d6f338bb..988116409 100644 --- a/src/layouts/payment-method/payment-method.vue +++ b/src/layouts/payment-method/payment-method.vue @@ -2,8 +2,8 @@
-
-
+
+
From 0a9e59bf2276ce0098b3bf3eb0592dfe43ec338d Mon Sep 17 00:00:00 2001 From: Scott Kiener Date: Mon, 13 Nov 2023 11:18:08 -0500 Subject: [PATCH 17/24] CSR-1452 | Inactive promos bug fix, related refactoring Created a shared "removeCurrentlyActivePromoCodesFromInactivePromos" method and used it in multiple places to fix bug --- src/helpers/promotions-helper.js | 11 +++++++++++ src/store/index.js | 31 +++++++------------------------ 2 files changed, 18 insertions(+), 24 deletions(-) diff --git a/src/helpers/promotions-helper.js b/src/helpers/promotions-helper.js index 996ca1aa6..1c5170f14 100644 --- a/src/helpers/promotions-helper.js +++ b/src/helpers/promotions-helper.js @@ -246,6 +246,17 @@ export function getVapsThatNeedToBeAddedToSatisfyPromos( } } +export function removeCurrentlyActivePromoCodesFromInactivePromos(activePromoObjects, inactivePromos) { + activePromoObjects = activePromoObjects ?? []; + inactivePromos = inactivePromos ?? []; + const activePromoCodes = activePromoObjects.map((promoObject) => + getPromoCodeWithoutBundleIdentifier(promoObject.promoCode).toUpperCase() + ); + return inactivePromos.filter((inactivePromo) => { + return !activePromoCodes.includes(inactivePromo.toUpperCase()); + }); +} + // bundle promos look like: "bundlePromo/###"" for each promo, this returns "bundlePromo" only export function getPromoCodeWithoutBundleIdentifier(promoCode) { return promoCode.split("/")[0]; diff --git a/src/store/index.js b/src/store/index.js index 4b4c4ca6d..678a48cbb 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -23,7 +23,8 @@ import { getDisplayTextForDurationLength, } from "@/layouts/schedule/helpers/schedule-helper"; import { paymentMethods } from "@/constants/payment-method-constants"; -import { getPromoCodeWithoutBundleIdentifier } from "@/helpers/promotions-helper"; +import { getPromoCodeWithoutBundleIdentifier, + removeCurrentlyActivePromoCodesFromInactivePromos } from "@/helpers/promotions-helper"; import { getDateDifferenceInDays } from "@/helpers/date-helper"; // Export State const getDefaultState = () => { @@ -2120,14 +2121,6 @@ export const actions = { addGuidToLineItemsIfNotAlreadyThere(vaps); context.commit(storeMutations.UPDATE_VAPS, vaps); }, - // COMBINE THESE - savePromos(context, promos) { - addGuidToLineItemsIfNotAlreadyThere(promos); - context.commit(storeMutations.UPDATE_PROMOS, promos); - }, - saveInactivePromos(context, inactivePromos) { - context.commit(storeMutations.UPDATE_INACTIVE_PROMOS, inactivePromos); - }, // Manage promo saving to ensure a promoCode never ends up in both active and inactive saveActiveAndOrInactivePromos(context, { activePromos = null, inactivePromos = null }) { let activePromosToSave; @@ -2139,12 +2132,7 @@ export const actions = { } else if (activePromos && inactivePromos) { // Prioritize active promos when both inactive and active are supplied activePromosToSave = activePromos; - const activePromoCodes = activePromos.map((promoObject) => - getPromoCodeWithoutBundleIdentifier(promoObject.promoCode) - ); - inactivePromosToSave = inactivePromos.filter((inactivePromo) => { - return !activePromoCodes.includes(inactivePromo); - }); + inactivePromosToSave = removeCurrentlyActivePromoCodesFromInactivePromos(activePromosToSave, inactivePromos); } else if (!activePromos) { // Only inactivePromos supplied inactivePromosToSave = inactivePromos; @@ -2156,14 +2144,7 @@ export const actions = { } else if (!inactivePromos) { // Only activePromos supplied activePromosToSave = activePromos; - const activePromoCodes = activePromos.map((promoObject) => - getPromoCodeWithoutBundleIdentifier(promoObject.promoCode) - ); - inactivePromosToSave = (context.getters.payment.inactivePromos ?? []).filter( - (inactivePromo) => { - return !activePromoCodes.includes(inactivePromo); - } - ); + inactivePromosToSave = removeCurrentlyActivePromoCodesFromInactivePromos(activePromosToSave, context.getters.payment.inactivePromos ?? []) } context.commit(storeMutations.UPDATE_PROMOS, activePromosToSave); context.commit(storeMutations.UPDATE_INACTIVE_PROMOS, inactivePromosToSave); @@ -2361,10 +2342,12 @@ export const actions = { const order = context.getters.order; activePromosToUse = activePromosToUse ?? order.lineItems.promos; - inactivePromosToUse = inactivePromosToUse ?? order.payment.inactivePromos; lineItemsToUse = lineItemsToUse ? deepClone(lineItemsToUse) : deepClone(order.lineItems); lineItemsToUse.promos = activePromosToUse; + inactivePromosToUse = inactivePromosToUse ?? order.payment.inactivePromos; + inactivePromosToUse = removeCurrentlyActivePromoCodesFromInactivePromos(lineItemsToUse.promos, inactivePromosToUse); + let requestObject = { inactivePromos: inactivePromosToUse, order: { From 7b7bd5da876601c99d7cbc909d8fc395e3e3c663 Mon Sep 17 00:00:00 2001 From: Scott Kiener Date: Mon, 13 Nov 2023 14:07:10 -0500 Subject: [PATCH 18/24] CSR-1452 | Formatting --- src/helpers/promotions-helper.js | 5 ++++- src/store/index.js | 21 ++++++++++++++++----- 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/src/helpers/promotions-helper.js b/src/helpers/promotions-helper.js index 1c5170f14..f91a7a91b 100644 --- a/src/helpers/promotions-helper.js +++ b/src/helpers/promotions-helper.js @@ -246,7 +246,10 @@ export function getVapsThatNeedToBeAddedToSatisfyPromos( } } -export function removeCurrentlyActivePromoCodesFromInactivePromos(activePromoObjects, inactivePromos) { +export function removeCurrentlyActivePromoCodesFromInactivePromos( + activePromoObjects, + inactivePromos +) { activePromoObjects = activePromoObjects ?? []; inactivePromos = inactivePromos ?? []; const activePromoCodes = activePromoObjects.map((promoObject) => diff --git a/src/store/index.js b/src/store/index.js index 678a48cbb..320ff3e28 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -23,8 +23,10 @@ import { getDisplayTextForDurationLength, } from "@/layouts/schedule/helpers/schedule-helper"; import { paymentMethods } from "@/constants/payment-method-constants"; -import { getPromoCodeWithoutBundleIdentifier, - removeCurrentlyActivePromoCodesFromInactivePromos } from "@/helpers/promotions-helper"; +import { + getPromoCodeWithoutBundleIdentifier, + removeCurrentlyActivePromoCodesFromInactivePromos, +} from "@/helpers/promotions-helper"; import { getDateDifferenceInDays } from "@/helpers/date-helper"; // Export State const getDefaultState = () => { @@ -2132,7 +2134,10 @@ export const actions = { } else if (activePromos && inactivePromos) { // Prioritize active promos when both inactive and active are supplied activePromosToSave = activePromos; - inactivePromosToSave = removeCurrentlyActivePromoCodesFromInactivePromos(activePromosToSave, inactivePromos); + inactivePromosToSave = removeCurrentlyActivePromoCodesFromInactivePromos( + activePromosToSave, + inactivePromos + ); } else if (!activePromos) { // Only inactivePromos supplied inactivePromosToSave = inactivePromos; @@ -2144,7 +2149,10 @@ export const actions = { } else if (!inactivePromos) { // Only activePromos supplied activePromosToSave = activePromos; - inactivePromosToSave = removeCurrentlyActivePromoCodesFromInactivePromos(activePromosToSave, context.getters.payment.inactivePromos ?? []) + inactivePromosToSave = removeCurrentlyActivePromoCodesFromInactivePromos( + activePromosToSave, + context.getters.payment.inactivePromos ?? [] + ); } context.commit(storeMutations.UPDATE_PROMOS, activePromosToSave); context.commit(storeMutations.UPDATE_INACTIVE_PROMOS, inactivePromosToSave); @@ -2346,7 +2354,10 @@ export const actions = { lineItemsToUse.promos = activePromosToUse; inactivePromosToUse = inactivePromosToUse ?? order.payment.inactivePromos; - inactivePromosToUse = removeCurrentlyActivePromoCodesFromInactivePromos(lineItemsToUse.promos, inactivePromosToUse); + inactivePromosToUse = removeCurrentlyActivePromoCodesFromInactivePromos( + lineItemsToUse.promos, + inactivePromosToUse + ); let requestObject = { inactivePromos: inactivePromosToUse, From f06d9e9e5e09c25d2b8b777d1b71a84d4ce20d66 Mon Sep 17 00:00:00 2001 From: Scott Kiener Date: Mon, 13 Nov 2023 14:23:40 -0500 Subject: [PATCH 19/24] CSR-1452 | Loading modal spinner for revalidate (payment-method) --- .../loading-modal/loading-modal.vue | 24 ++++++++++--------- src/layouts/payment-method/payment-method.vue | 2 ++ 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/src/fmg-components/loading-modal/loading-modal.vue b/src/fmg-components/loading-modal/loading-modal.vue index c3722000b..820ff6f7b 100644 --- a/src/fmg-components/loading-modal/loading-modal.vue +++ b/src/fmg-components/loading-modal/loading-modal.vue @@ -54,6 +54,14 @@