From 2833666a34137d3cfa34fa98345d38e11e4465b8 Mon Sep 17 00:00:00 2001 From: Sneha Date: Thu, 2 May 2024 20:41:09 +0530 Subject: [PATCH 01/17] CSR-1994 --- src/constants/endpoints.js | 4 +++ src/constants/experiments.js | 1 + src/constants/store-actions.js | 1 + src/layouts/quote/quote.vue | 29 ++++++++++++++++--- .../service-package-question.vue | 14 +++++++++ .../service-package-radio.vue | 3 ++ src/store/index.js | 20 +++++++++++++ 7 files changed, 68 insertions(+), 4 deletions(-) diff --git a/src/constants/endpoints.js b/src/constants/endpoints.js index 592d2d668..3bc5a3069 100644 --- a/src/constants/endpoints.js +++ b/src/constants/endpoints.js @@ -72,6 +72,10 @@ const endpoints = { url: "/parts/api/v1/parts/mobile-fee", method: "GET", }, + CashServicePackageDiscount: { + url: "/parts/api/v1/parts/service-package-discount", + method: "POST", + }, GetServiceabilityDetails: { url: "/location/api/v1/location/serviceability-details", method: "GET", diff --git a/src/constants/experiments.js b/src/constants/experiments.js index bd480636f..eb7fed508 100644 --- a/src/constants/experiments.js +++ b/src/constants/experiments.js @@ -10,6 +10,7 @@ const experimentSettings = { PIA_INSURANCE: "DisplayPIAInsurance", SUBMIT_ORDER_ENABLE_PIA: "SubmitOrder_Enable_PIA", IS_EMAIL_OPTIONAL: "isEmailOptional", + SERVICE_PACKAGE_DISCOUNT: "OfferServicePackageDiscount", }; const experimentTriggers = { diff --git a/src/constants/store-actions.js b/src/constants/store-actions.js index 36be92432..9a247168a 100644 --- a/src/constants/store-actions.js +++ b/src/constants/store-actions.js @@ -29,6 +29,7 @@ const storeActions = { GET_PART_FROM_CAPABILITY_QUESTION_ANSWER: "getPartFromCapabilityQuestionAnswer", GET_MOLDING_QUESTIONS: "getMoldingQuestions", GET_MOBILE_FEE_PART: "getMobileFeePart", + CASH_SERVICE_PACKAGE_DISCOUNT: "cashServicePackageDiscount", GET_SERVICEABILITY_DETAILS: "getServiceabilityDetails", GET_SHOP_TIME_SLOTS: "getShopTimeSlots", GET_MOBILE_TIME_SLOTS: "getMobileTimeSlots", diff --git a/src/layouts/quote/quote.vue b/src/layouts/quote/quote.vue index 065d44e82..b09c997b9 100644 --- a/src/layouts/quote/quote.vue +++ b/src/layouts/quote/quote.vue @@ -28,8 +28,10 @@ groupName="ServicePackageQuestion" :availableLineItems="availableLineItems" :isInsuranceSelected="isInsuranceSelected" + :isDiscount="getServicePackageDiscount" @vapsItemsSelected="vapsItemsSelectedAction" :activePromos="lineItems.promos" + :lineItems="lineItems" v-on="{ 'buttonEvent.openModal': openModalAction }" validationRules="option-required" isRequired /> @@ -105,6 +107,7 @@ import { import { queryStrings } from "@/constants/query-strings"; import { getQuerystringParameter } from "@/helpers/querystring-helper"; import promoModalQuestion from "@/fmg-components/promo-modal-question/promo-modal-question"; +import { experimentSettings } from "@/constants/experiments"; defineRule("option-required", required(errorMessages.OPTION_REQUIRED)); @@ -126,6 +129,11 @@ export default { null, "quote" ); + const servicePackageDiscountPromise = baseMixin.methods.dispatchStoreActionWithLogging( + storeActions.CASH_SERVICE_PACKAGE_DISCOUNT, + null, + "quote" + ); const supportingItemsPromise = baseMixin.methods.dispatchStoreActionWithLogging( storeActions.GET_SUPPORTING_ITEMS, null, @@ -145,6 +153,10 @@ export default { resultKey: "rainDefense", promise: rainDefensePromise, }, + { + resultKey: "servicePackageDiscount", + promise: servicePackageDiscountPromise, + }, { resultKey: "supportingItems", promise: supportingItemsPromise, @@ -155,9 +167,13 @@ export default { const lineItems = deepClone(store.getters.order.lineItems); lineItems.vaps = lineItems.vaps ?? []; const nullSafeGlassParts = lineItems.glassParts ?? []; + lineItems.supportingItems = [ + ...resultMap.supportingItems, + resultMap.servicePackageDiscount, + ]; const availableLineItems = [ resultMap.rainDefense, - ...resultMap.supportingItems, + ...lineItems.supportingItems, ...resultMap.wipers, ...nullSafeGlassParts, ]; @@ -170,13 +186,12 @@ export default { "quote", false ); - baseMixin.methods.dispatchStoreAction( storeActions.SAVE_SUPPORTING_ITEMS, - resultMap.supportingItems, + lineItems.supportingItems, false ); - lineItems.supportingItems = resultMap.supportingItems; + const addableVaps = [...resultMap.wipers, resultMap.rainDefense]; // Promo logic @@ -236,6 +251,12 @@ export default { lineItemsCloneForWatcher() { return Object.assign({}, this.lineItems); }, + getServicePackageDiscount() { + const isServicePackageDiscount = this.getSettingValue( + experimentSettings.SERVICE_PACKAGE_DISCOUNT + ); + return isServicePackageDiscount === "True"; + }, }, methods: { openModalAction(modalName) { 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 2d0ba515e..d619e0df1 100644 --- a/src/layouts/quote/service-package-question/service-package-question.vue +++ b/src/layouts/quote/service-package-question/service-package-question.vue @@ -46,6 +46,8 @@ export default { isRequired: Boolean, isInsuranceSelected: Boolean, availableLineItems: null, + lineItems: null, + isDiscount: Boolean, activePromos: null, }, data() { @@ -103,6 +105,7 @@ export default { buttonFooterCopy: this.getFooterTextFromCms(answer.SubWidgetName), additionalButtonData: { strikeThroughPrice: this.getPackagePriceString(answer.Name), + discountedPrice: this.getServicePackageDiscount(), }, })); return modifiedAnswers; @@ -224,6 +227,17 @@ export default { return price; }, + // getServicePackageDiscountPrice(packageName, packageDiscount = false) { + // let price = 0; + // const discount = this.getDiscountedPackagePrice(packageName); + // if (packageDiscount) { + // price += baseMixin.methods.getTotalLineItemPrice(discount); + // } + // return price; + // }, + getServicePackageDiscount() { + if (!this.isInsuranceSelected && this.isDiscount) return true; + }, selectDefaultPackage() { const promosWithAddableVaps = getPromosWithAddableVaps(this.activePromos); const vapsThatMatchPromos = getLineItemsThatMatchPromos( 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 4eb1fad2c..8502caef6 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 @@ -55,6 +55,9 @@ v-if="this.buttonFooterCopy" v-html="this.buttonFooterCopy"> + Special: Save $ {{ + }} diff --git a/src/store/index.js b/src/store/index.js index 372ea28d5..64a7518d9 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -1391,6 +1391,26 @@ export const actions = { pageNameToLog: pageNameToLog, }); }, + cashServicePackageDiscount(context, { pageNameToLog }) { + const damage = context.getters.damage; + const damageType = damage.isRepair ? "Repair" : "Replace"; + const glassPieces = convertGlassPieceNamingForApi(damage.glassToReplace); + + return globalMethods + .callHttpClient({ + method: endpoints.CashServicePackageDiscount.method, + endpoint: endpoints.CashServicePackageDiscount.url, + payload: { + glassPieces: glassPieces, + damageType: damageType, + }, + logApiCall: true, + pageNameToLog: pageNameToLog, + }) + .then((response) => { + return response; + }); + }, getServiceabilityDetails(context, { payload: { serviceZipCode }, pageNameToLog }) { const lineItemsWithOnlyPartNumbers = context.getters.order.lineItems.supportingItems?.map( From e0a1d28c5be112b85116032b961bf5e4e117d214 Mon Sep 17 00:00:00 2001 From: Sneha Date: Wed, 8 May 2024 20:20:51 +0530 Subject: [PATCH 02/17] discontprice --- src/constants/part-type-strings.js | 1 + src/layouts/quote/quote.vue | 51 ++++++++++++------- .../service-package-question.vue | 34 +++++++------ .../service-package-radio.vue | 26 ++++++++-- 4 files changed, 76 insertions(+), 36 deletions(-) diff --git a/src/constants/part-type-strings.js b/src/constants/part-type-strings.js index aa56d1ed2..3ad66c40a 100644 --- a/src/constants/part-type-strings.js +++ b/src/constants/part-type-strings.js @@ -8,6 +8,7 @@ const partTypeStrings = { MOBILE_FEE: "MOBILE FEE", REPAIR_FEE: "REPAIR FEE", EARLY_BIRD: "EARLY BIRD", + SERVICE_PACKAGE_DISCOUNT: "SERVICE PACKAGE DISCOUNT", }; export { partTypeStrings }; diff --git a/src/layouts/quote/quote.vue b/src/layouts/quote/quote.vue index b09c997b9..cf1a79466 100644 --- a/src/layouts/quote/quote.vue +++ b/src/layouts/quote/quote.vue @@ -129,11 +129,6 @@ export default { null, "quote" ); - const servicePackageDiscountPromise = baseMixin.methods.dispatchStoreActionWithLogging( - storeActions.CASH_SERVICE_PACKAGE_DISCOUNT, - null, - "quote" - ); const supportingItemsPromise = baseMixin.methods.dispatchStoreActionWithLogging( storeActions.GET_SUPPORTING_ITEMS, null, @@ -153,10 +148,6 @@ export default { resultKey: "rainDefense", promise: rainDefensePromise, }, - { - resultKey: "servicePackageDiscount", - promise: servicePackageDiscountPromise, - }, { resultKey: "supportingItems", promise: supportingItemsPromise, @@ -167,17 +158,13 @@ export default { const lineItems = deepClone(store.getters.order.lineItems); lineItems.vaps = lineItems.vaps ?? []; const nullSafeGlassParts = lineItems.glassParts ?? []; - lineItems.supportingItems = [ - ...resultMap.supportingItems, - resultMap.servicePackageDiscount, - ]; const availableLineItems = [ resultMap.rainDefense, - ...lineItems.supportingItems, + ...resultMap.supportingItems, ...resultMap.wipers, ...nullSafeGlassParts, ]; - + lineItems.supportingItems = resultMap.supportingItems; const pricingResults = await baseMixin.methods.dispatchStoreActionWithLogging( storeActions.PRICE_ORDER_ITEMS_AND_SAVE_SERVER_DATA, { @@ -186,6 +173,7 @@ export default { "quote", false ); + baseMixin.methods.dispatchStoreAction( storeActions.SAVE_SUPPORTING_ITEMS, lineItems.supportingItems, @@ -252,16 +240,45 @@ export default { return Object.assign({}, this.lineItems); }, getServicePackageDiscount() { - const isServicePackageDiscount = this.getSettingValue( + const servicePackageDiscountSettingValue= this.getSettingValue( experimentSettings.SERVICE_PACKAGE_DISCOUNT ); - return isServicePackageDiscount === "True"; + const isServicePackageDiscount = servicePackageDiscountSettingValue === "True"; + + if (isServicePackageDiscount) { + this.getServicePackageDiscountPrice(); + } + return isServicePackageDiscount; }, }, methods: { openModalAction(modalName) { this.$refs[modalName].openModal(); }, + async getServicePackageDiscountPrice() { + const servicePackageDiscount = await baseMixin.methods.dispatchStoreActionWithLogging( + storeActions.CASH_SERVICE_PACKAGE_DISCOUNT, + null, + "quote" + ); + const availableLineItems = [servicePackageDiscount.data]; + + await baseMixin.methods.dispatchStoreActionWithLogging( + storeActions.PRICE_ORDER_ITEMS_AND_SAVE_SERVER_DATA, + { + availableLineItems: availableLineItems, + }, + "quote", + false + ); + + this.lineItems.supportingItems.push(...availableLineItems); + baseMixin.methods.dispatchStoreAction( + storeActions.SAVE_SUPPORTING_ITEMS, + this.lineItems.supportingItems, + false + ); + }, arePagePrerequisitesValid() { return ( store.getters.order.serviceLocation.zipCode && 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 d619e0df1..10dba52b7 100644 --- a/src/layouts/quote/service-package-question/service-package-question.vue +++ b/src/layouts/quote/service-package-question/service-package-question.vue @@ -101,11 +101,15 @@ export default { buttonLabel: this.getHeaderTextFromCms(answer.SubWidgetName), buttonLabelSubCopy: this.getSubheaderTextFromCms(answer.SubWidgetName), buttonBodyCopy: this.getBodyTextFromCms(answer.SubWidgetName), - buttonAuxillaryCopy: this.getDiscountedPackagePriceString(answer.Name), + buttonAuxillaryCopy: this.getDiscountedPackagePriceString( + answer.Name, + this.isDiscount && answer.Text != "" + ), buttonFooterCopy: this.getFooterTextFromCms(answer.SubWidgetName), additionalButtonData: { strikeThroughPrice: this.getPackagePriceString(answer.Name), - discountedPrice: this.getServicePackageDiscount(), + servicePackageDiscount: this.isDiscount && answer.Text != "", + Text: answer.Text, }, })); return modifiedAnswers; @@ -192,9 +196,21 @@ export default { return (this.isInsuranceSelected ? "As little as $" : "$") + formattedPriceFloat; }, getPackagePrice(packageName, { discountedPrice = false }) { - const lineItemsToPrice = [...this.nullSafeAvailableLineItems]; + var lineItemsToPrice = [...this.nullSafeAvailableLineItems]; + if (discountedPrice) { lineItemsToPrice.push(...removeVapsPromosFromPromoArray(this.activePromos)); + } else { + //remove service package discount part + const servicePackageDiscountParts = findLineItemsWithPartType( + partTypeStrings.SERVICE_PACKAGE_DISCOUNT, + this.nullSafeAvailableLineItems + ); + if (servicePackageDiscountParts) { + lineItemsToPrice = lineItemsToPrice.filter((item) => { + return item != servicePackageDiscountParts; + }); + } } let priceFloat = this.isInsuranceSelected ? 0 @@ -208,7 +224,6 @@ export default { }, getVapsPrice(packageName, applyPromoDiscounts = false) { const vapsItems = this.getVapsLineItemsForSelectedPackage(packageName); - let price = 0; vapsItems.forEach((item) => { @@ -227,17 +242,6 @@ export default { return price; }, - // getServicePackageDiscountPrice(packageName, packageDiscount = false) { - // let price = 0; - // const discount = this.getDiscountedPackagePrice(packageName); - // if (packageDiscount) { - // price += baseMixin.methods.getTotalLineItemPrice(discount); - // } - // return price; - // }, - getServicePackageDiscount() { - if (!this.isInsuranceSelected && this.isDiscount) return true; - }, selectDefaultPackage() { const promosWithAddableVaps = getPromosWithAddableVaps(this.activePromos); const vapsThatMatchPromos = getLineItemsThatMatchPromos( 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 8502caef6..64d41bb77 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 @@ -2,7 +2,10 @@

@@ -55,9 +58,10 @@ v-if="this.buttonFooterCopy" v-html="this.buttonFooterCopy">

- Special: Save $ {{ - }} +
@@ -142,6 +146,9 @@ export default { &.has-subheader { min-height: 80px; } + &.has-text { + min-height: 124px; + } &:before { content: ""; @@ -276,6 +283,17 @@ export default { .hide-when-closed { display: none; } + .discount-text { + width: 143px; + height: 40px; + padding: 8px 16px 8px 16px; + background-color: #e6f2ec; + font-size: 14px; + font-weight: 500; + line-height: 24px; + text-align: center; + color: #075f35; + } } } } From d7bc92ec0a294b3775f23aaabe27f1d93934c3aa Mon Sep 17 00:00:00 2001 From: Sneha Date: Thu, 9 May 2024 16:15:54 +0530 Subject: [PATCH 03/17] csr 1994 --- src/layouts/quote/quote.vue | 52 ++++++++----------- .../service-package-question.vue | 48 ++++++++++------- .../service-package-radio.vue | 2 +- 3 files changed, 51 insertions(+), 51 deletions(-) diff --git a/src/layouts/quote/quote.vue b/src/layouts/quote/quote.vue index cf1a79466..e94c48932 100644 --- a/src/layouts/quote/quote.vue +++ b/src/layouts/quote/quote.vue @@ -28,7 +28,7 @@ groupName="ServicePackageQuestion" :availableLineItems="availableLineItems" :isInsuranceSelected="isInsuranceSelected" - :isDiscount="getServicePackageDiscount" + :isServicePackageDiscount="getServicePackageDiscount" @vapsItemsSelected="vapsItemsSelectedAction" :activePromos="lineItems.promos" :lineItems="lineItems" @@ -88,6 +88,7 @@ import contentGroupModal from "@/fmg-components/content-group-modal/content-grou import loadingModal from "@/fmg-components/loading-modal/loading-modal.vue"; import afterpayModalBanner from "@/layouts/quote/afterpay-modal-banner/afterpay-modal-banner"; import baseMixin from "@/mixins/base-mixin.js"; +import experimentMixin from "@/mixins/experiment-mixin.js"; import vehicleQuestionsMixin from "../../mixins/vehicle-questions-mixin"; import { settleAllPromises } from "@/helpers/layout-helper"; import { storeActions } from "@/constants/store-actions"; @@ -158,13 +159,28 @@ export default { const lineItems = deepClone(store.getters.order.lineItems); lineItems.vaps = lineItems.vaps ?? []; const nullSafeGlassParts = lineItems.glassParts ?? []; + const servicePackageDiscountSettingValue = experimentMixin.methods.getSettingValue( + experimentSettings.SERVICE_PACKAGE_DISCOUNT + ); + const isServicePackageDiscount = servicePackageDiscountSettingValue === "True"; + if (isServicePackageDiscount) { + const servicePackageDiscount = await baseMixin.methods.dispatchStoreActionWithLogging( + storeActions.CASH_SERVICE_PACKAGE_DISCOUNT, + null, + "quote" + ); + lineItems.supportingItems = [...resultMap.supportingItems,servicePackageDiscount.data]; + } + else{ + lineItems.supportingItems = resultMap.supportingItems; + } const availableLineItems = [ resultMap.rainDefense, - ...resultMap.supportingItems, + ...lineItems.supportingItems, ...resultMap.wipers, ...nullSafeGlassParts, ]; - lineItems.supportingItems = resultMap.supportingItems; + const pricingResults = await baseMixin.methods.dispatchStoreActionWithLogging( storeActions.PRICE_ORDER_ITEMS_AND_SAVE_SERVER_DATA, { @@ -233,6 +249,7 @@ export default { availableLineItems: null, lineItems: [], addableVaps: [], + servicePackageDiscountLineItems:[] }; }, computed: { @@ -240,14 +257,11 @@ export default { return Object.assign({}, this.lineItems); }, getServicePackageDiscount() { - const servicePackageDiscountSettingValue= this.getSettingValue( + const servicePackageDiscountSettingValue = this.getSettingValue( experimentSettings.SERVICE_PACKAGE_DISCOUNT ); const isServicePackageDiscount = servicePackageDiscountSettingValue === "True"; - if (isServicePackageDiscount) { - this.getServicePackageDiscountPrice(); - } return isServicePackageDiscount; }, }, @@ -255,30 +269,6 @@ export default { openModalAction(modalName) { this.$refs[modalName].openModal(); }, - async getServicePackageDiscountPrice() { - const servicePackageDiscount = await baseMixin.methods.dispatchStoreActionWithLogging( - storeActions.CASH_SERVICE_PACKAGE_DISCOUNT, - null, - "quote" - ); - const availableLineItems = [servicePackageDiscount.data]; - - await baseMixin.methods.dispatchStoreActionWithLogging( - storeActions.PRICE_ORDER_ITEMS_AND_SAVE_SERVER_DATA, - { - availableLineItems: availableLineItems, - }, - "quote", - false - ); - - this.lineItems.supportingItems.push(...availableLineItems); - baseMixin.methods.dispatchStoreAction( - storeActions.SAVE_SUPPORTING_ITEMS, - this.lineItems.supportingItems, - false - ); - }, arePagePrerequisitesValid() { return ( store.getters.order.serviceLocation.zipCode && 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 10dba52b7..431a28679 100644 --- a/src/layouts/quote/service-package-question/service-package-question.vue +++ b/src/layouts/quote/service-package-question/service-package-question.vue @@ -47,7 +47,7 @@ export default { isInsuranceSelected: Boolean, availableLineItems: null, lineItems: null, - isDiscount: Boolean, + isServicePackageDiscount: Boolean, activePromos: null, }, data() { @@ -101,15 +101,12 @@ export default { buttonLabel: this.getHeaderTextFromCms(answer.SubWidgetName), buttonLabelSubCopy: this.getSubheaderTextFromCms(answer.SubWidgetName), buttonBodyCopy: this.getBodyTextFromCms(answer.SubWidgetName), - buttonAuxillaryCopy: this.getDiscountedPackagePriceString( - answer.Name, - this.isDiscount && answer.Text != "" - ), + buttonAuxillaryCopy: this.getDiscountedPackagePriceString(answer.Name,this.isServicePackageDiscount && answer.Text != ""), buttonFooterCopy: this.getFooterTextFromCms(answer.SubWidgetName), additionalButtonData: { strikeThroughPrice: this.getPackagePriceString(answer.Name), - servicePackageDiscount: this.isDiscount && answer.Text != "", - Text: answer.Text, + servicePackageDiscount: this.isServicePackageDiscount && answer.Text != "", + Text: answer.Text+this.getServicePackageDiscountPrice(), }, })); return modifiedAnswers; @@ -185,32 +182,36 @@ export default { }, getPackagePriceString(packageName) { const formattedPriceFloat = parseFloat( - this.getPackagePrice(packageName, { discountedPrice: false }) + this.getPackagePrice(packageName, { discountedPrice: false,servicePackageDiscount:false }) ).toFixed(2); return "$" + formattedPriceFloat; }, - getDiscountedPackagePriceString(packageName) { + getDiscountedPackagePriceString(packageName,servicePackageDiscount) { const formattedPriceFloat = parseFloat( - this.getPackagePrice(packageName, { discountedPrice: true }) + this.getPackagePrice(packageName, { discountedPrice: true, servicePackageDiscount }) ).toFixed(2); return (this.isInsuranceSelected ? "As little as $" : "$") + formattedPriceFloat; }, - getPackagePrice(packageName, { discountedPrice = false }) { - var lineItemsToPrice = [...this.nullSafeAvailableLineItems]; + getPackagePrice(packageName, { discountedPrice = false , servicePackageDiscount = false}) { - if (discountedPrice) { - lineItemsToPrice.push(...removeVapsPromosFromPromoArray(this.activePromos)); - } else { //remove service package discount part const servicePackageDiscountParts = findLineItemsWithPartType( partTypeStrings.SERVICE_PACKAGE_DISCOUNT, this.nullSafeAvailableLineItems ); - if (servicePackageDiscountParts) { - lineItemsToPrice = lineItemsToPrice.filter((item) => { - return item != servicePackageDiscountParts; + const parts = this.nullSafeAvailableLineItems.filter((item) => { + return item.partType != servicePackageDiscountParts?.[0].partType; }); - } + + + var lineItemsToPrice = [...parts]; + + if (discountedPrice) { + lineItemsToPrice.push(...removeVapsPromosFromPromoArray(this.activePromos)); + } + if(servicePackageDiscount) + { + lineItemsToPrice.push(...servicePackageDiscountParts); } let priceFloat = this.isInsuranceSelected ? 0 @@ -222,6 +223,15 @@ export default { return priceFloat; }, + getServicePackageDiscountPrice(){ + const servicePackageDiscountParts = findLineItemsWithPartType( + partTypeStrings.SERVICE_PACKAGE_DISCOUNT, + this.nullSafeAvailableLineItems + ); + let price = 0; + price += baseMixin.methods.getTotalLineItemPrice(servicePackageDiscountParts?.[0]); + return Math.abs(price); + }, getVapsPrice(packageName, applyPromoDiscounts = false) { const vapsItems = this.getVapsLineItemsForSelectedPackage(packageName); let price = 0; 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 64d41bb77..a8e1af0bd 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 @@ -284,7 +284,7 @@ export default { display: none; } .discount-text { - width: 143px; + width: 170px; height: 40px; padding: 8px 16px 8px 16px; background-color: #e6f2ec; From e90d4c4246816bb47241f6d567d5e0db7140750f Mon Sep 17 00:00:00 2001 From: hiteshkumar87 Date: Thu, 9 May 2024 19:09:44 +0530 Subject: [PATCH 04/17] CSR-1994 fix pricing issue when service package discount not available --- src/layouts/quote/quote.vue | 21 ++++--- .../service-package-question.vue | 60 ++++++++++--------- 2 files changed, 43 insertions(+), 38 deletions(-) diff --git a/src/layouts/quote/quote.vue b/src/layouts/quote/quote.vue index e94c48932..e7f3f3c3b 100644 --- a/src/layouts/quote/quote.vue +++ b/src/layouts/quote/quote.vue @@ -160,27 +160,26 @@ export default { lineItems.vaps = lineItems.vaps ?? []; const nullSafeGlassParts = lineItems.glassParts ?? []; const servicePackageDiscountSettingValue = experimentMixin.methods.getSettingValue( - experimentSettings.SERVICE_PACKAGE_DISCOUNT - ); - const isServicePackageDiscount = servicePackageDiscountSettingValue === "True"; - if (isServicePackageDiscount) { - const servicePackageDiscount = await baseMixin.methods.dispatchStoreActionWithLogging( + experimentSettings.SERVICE_PACKAGE_DISCOUNT + ); + const isServicePackageDiscount = servicePackageDiscountSettingValue === "True"; + if (isServicePackageDiscount) { + const servicePackageDiscount = await baseMixin.methods.dispatchStoreActionWithLogging( storeActions.CASH_SERVICE_PACKAGE_DISCOUNT, null, "quote" ); - lineItems.supportingItems = [...resultMap.supportingItems,servicePackageDiscount.data]; - } - else{ + lineItems.supportingItems = [...resultMap.supportingItems, servicePackageDiscount.data]; + } else { lineItems.supportingItems = resultMap.supportingItems; - } + } const availableLineItems = [ resultMap.rainDefense, ...lineItems.supportingItems, ...resultMap.wipers, ...nullSafeGlassParts, ]; - + const pricingResults = await baseMixin.methods.dispatchStoreActionWithLogging( storeActions.PRICE_ORDER_ITEMS_AND_SAVE_SERVER_DATA, { @@ -249,7 +248,7 @@ export default { availableLineItems: null, lineItems: [], addableVaps: [], - servicePackageDiscountLineItems:[] + servicePackageDiscountLineItems: [], }; }, computed: { 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 431a28679..02f612b2f 100644 --- a/src/layouts/quote/service-package-question/service-package-question.vue +++ b/src/layouts/quote/service-package-question/service-package-question.vue @@ -101,12 +101,15 @@ export default { buttonLabel: this.getHeaderTextFromCms(answer.SubWidgetName), buttonLabelSubCopy: this.getSubheaderTextFromCms(answer.SubWidgetName), buttonBodyCopy: this.getBodyTextFromCms(answer.SubWidgetName), - buttonAuxillaryCopy: this.getDiscountedPackagePriceString(answer.Name,this.isServicePackageDiscount && answer.Text != ""), + buttonAuxillaryCopy: this.getDiscountedPackagePriceString( + answer.Name, + this.isServicePackageDiscount && answer.Text != "" + ), buttonFooterCopy: this.getFooterTextFromCms(answer.SubWidgetName), additionalButtonData: { strikeThroughPrice: this.getPackagePriceString(answer.Name), servicePackageDiscount: this.isServicePackageDiscount && answer.Text != "", - Text: answer.Text+this.getServicePackageDiscountPrice(), + Text: answer.Text + this.getServicePackageDiscountPrice(), }, })); return modifiedAnswers; @@ -182,35 +185,36 @@ export default { }, getPackagePriceString(packageName) { const formattedPriceFloat = parseFloat( - this.getPackagePrice(packageName, { discountedPrice: false,servicePackageDiscount:false }) + this.getPackagePrice(packageName, { + discountedPrice: false, + servicePackageDiscount: false, + }) ).toFixed(2); return "$" + formattedPriceFloat; }, - getDiscountedPackagePriceString(packageName,servicePackageDiscount) { + getDiscountedPackagePriceString(packageName, servicePackageDiscount) { const formattedPriceFloat = parseFloat( this.getPackagePrice(packageName, { discountedPrice: true, servicePackageDiscount }) ).toFixed(2); return (this.isInsuranceSelected ? "As little as $" : "$") + formattedPriceFloat; }, - getPackagePrice(packageName, { discountedPrice = false , servicePackageDiscount = false}) { - - //remove service package discount part - const servicePackageDiscountParts = findLineItemsWithPartType( - partTypeStrings.SERVICE_PACKAGE_DISCOUNT, - this.nullSafeAvailableLineItems - ); - const parts = this.nullSafeAvailableLineItems.filter((item) => { - return item.partType != servicePackageDiscountParts?.[0].partType; - }); - - - var lineItemsToPrice = [...parts]; + getPackagePrice(packageName, { discountedPrice = false, servicePackageDiscount = false }) { + var lineItemsToPrice = [...this.nullSafeAvailableLineItems]; + //remove service package discount part + const servicePackageDiscountParts = findLineItemsWithPartType( + partTypeStrings.SERVICE_PACKAGE_DISCOUNT, + this.nullSafeAvailableLineItems + ); + if (servicePackageDiscountParts?.length > 0) { + lineItemsToPrice = this.nullSafeAvailableLineItems.filter((item) => { + return item.partType != servicePackageDiscountParts[0].partType; + }); + } if (discountedPrice) { lineItemsToPrice.push(...removeVapsPromosFromPromoArray(this.activePromos)); - } - if(servicePackageDiscount) - { + } + if (servicePackageDiscount) { lineItemsToPrice.push(...servicePackageDiscountParts); } let priceFloat = this.isInsuranceSelected @@ -223,14 +227,16 @@ export default { return priceFloat; }, - getServicePackageDiscountPrice(){ + getServicePackageDiscountPrice() { const servicePackageDiscountParts = findLineItemsWithPartType( - partTypeStrings.SERVICE_PACKAGE_DISCOUNT, - this.nullSafeAvailableLineItems - ); - let price = 0; - price += baseMixin.methods.getTotalLineItemPrice(servicePackageDiscountParts?.[0]); - return Math.abs(price); + partTypeStrings.SERVICE_PACKAGE_DISCOUNT, + this.nullSafeAvailableLineItems + ); + if (servicePackageDiscountParts?.length > 0) { + let price = 0; + price += baseMixin.methods.getTotalLineItemPrice(servicePackageDiscountParts[0]); + return Math.abs(price); + } else return 0; }, getVapsPrice(packageName, applyPromoDiscounts = false) { const vapsItems = this.getVapsLineItemsForSelectedPackage(packageName); From 07201731ac22e8c39e335ce22415ad24a351acec Mon Sep 17 00:00:00 2001 From: Sneha Date: Mon, 13 May 2024 15:27:41 +0530 Subject: [PATCH 05/17] CSR-1994 --- src/constants/cart-item-types.js | 1 + src/fmg-components/cart/cart.vue | 64 +++++++++++++++++-- .../service-package-question.vue | 2 +- 3 files changed, 62 insertions(+), 5 deletions(-) diff --git a/src/constants/cart-item-types.js b/src/constants/cart-item-types.js index 342a4e672..d8ab9f66f 100644 --- a/src/constants/cart-item-types.js +++ b/src/constants/cart-item-types.js @@ -10,6 +10,7 @@ const cartItemTypes = { PROMOS: "PROMOS", EARLY_BIRD: "EARLY BIRD", SUPPLIES_REPAIR: "SUPPLIES-REPAIR", + SERVICE_PACKAGE_DISCOUNT: "SERVICE PACKAGE DISCOUNT", }; export { cartItemTypes }; diff --git a/src/fmg-components/cart/cart.vue b/src/fmg-components/cart/cart.vue index a5df47da1..d46d09481 100644 --- a/src/fmg-components/cart/cart.vue +++ b/src/fmg-components/cart/cart.vue @@ -100,7 +100,7 @@ !showCoverageAsVerified || (showCoverageAsVerified && !cartItem.isCoveredByInsurance) " - >{{ getFormattedAmount(cartItem.category, cartItem.subTotal) }}{{ getFormattedAmount(cartItem.category, Math.abs(cartItem.subTotal)) }} @@ -232,6 +232,13 @@ export default { return subTotal; }, + getServicePackageDiscount() { + const servicePackageDiscountLineItems = this.servicePackageDiscountCartItem; + let subTotal = 0; + + subTotal += servicePackageDiscountLineItems?.subTotal; + return subTotal; + }, getVapsCartItemsForSelectedPackage(packageName) { const packageContentTypes = getPackageContents( this.glassToReplace, @@ -376,6 +383,9 @@ export default { if (this.mobileFeeCartItem) { cartItems.push(this.mobileFeeCartItem); } + if (this.servicePackageDiscountCartItem) { + cartItems.push(this.servicePackageDiscountCartItem); + } if (this.premiumAppointmentDiscountCartItem) { cartItems.push(this.premiumAppointmentDiscountCartItem); @@ -426,6 +436,9 @@ export default { } packagePrice += this.getVapsPrice(this.packageLevel); + if (this.servicePackageDiscountCartItem) { + packagePrice -= this.getServicePackageDiscount(); + } return packagePrice; }, @@ -760,13 +773,56 @@ export default { return cartItem; }, + servicePackageDiscountCartItemName() { + return this.getCmsContent("ServicePackageDiscountTextWidget", "Text"); + }, + servicePackageDiscountCartItem() { + let cartItem = null; + + const servicePackageDiscountLineItem = this.supportingItems.find( + (lineItem) => lineItem.partType == partTypeStrings.SERVICE_PACKAGE_DISCOUNT + ); + + if (servicePackageDiscountLineItem) { + cartItem = { + name: + this.servicePackageDiscountCartItemName + + Math.abs(this.getTotalLineItemPrice(servicePackageDiscountLineItem)), + category: cartItemCategories.SUPPORTING_ITEMS, + cartItemType: cartItemTypes.SERVICE_PACKAGE_DISCOUNT, + isDisplayed: true, + isRemovable: false, + subTotal: 0, + salesTax: 0, + lineItems: [], + isCoveredByInsurance: false, + }; + + servicePackageDiscountLineItem.cartItemType = cartItem.cartItemType; + cartItem.lineItems.push(servicePackageDiscountLineItem); + + cartItem.subTotal += + (servicePackageDiscountLineItem.kitPrice ?? 0) + + (servicePackageDiscountLineItem.laborAmount ?? 0) + + (servicePackageDiscountLineItem.sellingPrice ?? 0); + + cartItem.salesTax += servicePackageDiscountLineItem.salesTax ?? 0; + } + + return cartItem; + }, otherSupportingItemsCartItem() { let cartItem = null; - // Don't include fees they are part of the package total - let otherSupportingItemsLineItems = baseMixin.methods.filterOutFees( - this.supportingItems + const servicePackageDiscountLineItem = this.supportingItems.find( + (lineItem) => lineItem.partType == partTypeStrings.SERVICE_PACKAGE_DISCOUNT ); + const otherSupportingItems = this.supportingItems.filter((item) => { + return item != servicePackageDiscountLineItem; + }); + // Don't include fees they are part of the package total + let otherSupportingItemsLineItems = + baseMixin.methods.filterOutFees(otherSupportingItems); if (otherSupportingItemsLineItems.length > 0) { cartItem = { 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 02f612b2f..ea3fbb6de 100644 --- a/src/layouts/quote/service-package-question/service-package-question.vue +++ b/src/layouts/quote/service-package-question/service-package-question.vue @@ -236,7 +236,7 @@ export default { let price = 0; price += baseMixin.methods.getTotalLineItemPrice(servicePackageDiscountParts[0]); return Math.abs(price); - } else return 0; + } }, getVapsPrice(packageName, applyPromoDiscounts = false) { const vapsItems = this.getVapsLineItemsForSelectedPackage(packageName); From cb825a51c722a71c9d6d56e2ccd4d4bd201f5134 Mon Sep 17 00:00:00 2001 From: hiteshkumar87 Date: Mon, 13 May 2024 17:53:40 +0530 Subject: [PATCH 06/17] CSR-1994 code optimize --- src/fmg-components/cart/cart.vue | 4 +- src/layouts/quote/quote.vue | 46 ++++++++----- .../service-package-question.vue | 69 ++++++++++++++----- 3 files changed, 83 insertions(+), 36 deletions(-) diff --git a/src/fmg-components/cart/cart.vue b/src/fmg-components/cart/cart.vue index d46d09481..76f09338d 100644 --- a/src/fmg-components/cart/cart.vue +++ b/src/fmg-components/cart/cart.vue @@ -100,7 +100,9 @@ !showCoverageAsVerified || (showCoverageAsVerified && !cartItem.isCoveredByInsurance) " - >{{ getFormattedAmount(cartItem.category, Math.abs(cartItem.subTotal)) }}{{ + getFormattedAmount(cartItem.category, Math.abs(cartItem.subTotal)) + }} diff --git a/src/layouts/quote/quote.vue b/src/layouts/quote/quote.vue index e7f3f3c3b..f7c1d5745 100644 --- a/src/layouts/quote/quote.vue +++ b/src/layouts/quote/quote.vue @@ -28,8 +28,8 @@ groupName="ServicePackageQuestion" :availableLineItems="availableLineItems" :isInsuranceSelected="isInsuranceSelected" - :isServicePackageDiscount="getServicePackageDiscount" @vapsItemsSelected="vapsItemsSelectedAction" + @servicePackageDiscountSelected="servicePackageDiscountSelectedAction" :activePromos="lineItems.promos" :lineItems="lineItems" v-on="{ 'buttonEvent.openModal': openModalAction }" @@ -109,7 +109,7 @@ import { queryStrings } from "@/constants/query-strings"; import { getQuerystringParameter } from "@/helpers/querystring-helper"; import promoModalQuestion from "@/fmg-components/promo-modal-question/promo-modal-question"; import { experimentSettings } from "@/constants/experiments"; - +import { partTypeStrings } from "@/constants/part-type-strings"; defineRule("option-required", required(errorMessages.OPTION_REQUIRED)); export default { @@ -164,12 +164,17 @@ export default { ); const isServicePackageDiscount = servicePackageDiscountSettingValue === "True"; if (isServicePackageDiscount) { - const servicePackageDiscount = await baseMixin.methods.dispatchStoreActionWithLogging( - storeActions.CASH_SERVICE_PACKAGE_DISCOUNT, - null, - "quote" - ); - lineItems.supportingItems = [...resultMap.supportingItems, servicePackageDiscount.data]; + const servicePackageDiscountPart = + await baseMixin.methods.dispatchStoreActionWithLogging( + storeActions.CASH_SERVICE_PACKAGE_DISCOUNT, + null, + "quote" + ); + //add service package discount part to supporting items to get price together + lineItems.supportingItems = [ + ...resultMap.supportingItems, + servicePackageDiscountPart.data, + ]; } else { lineItems.supportingItems = resultMap.supportingItems; } @@ -188,7 +193,12 @@ export default { "quote", false ); - + if (isServicePackageDiscount) { + //remove service package discount part after pricing + lineItems.supportingItems = lineItems.supportingItems.filter((item) => { + item.partType !== partTypeStrings.SERVICE_PACKAGE_DISCOUNT; + }); + } baseMixin.methods.dispatchStoreAction( storeActions.SAVE_SUPPORTING_ITEMS, lineItems.supportingItems, @@ -248,21 +258,12 @@ export default { availableLineItems: null, lineItems: [], addableVaps: [], - servicePackageDiscountLineItems: [], }; }, computed: { lineItemsCloneForWatcher() { return Object.assign({}, this.lineItems); }, - getServicePackageDiscount() { - const servicePackageDiscountSettingValue = this.getSettingValue( - experimentSettings.SERVICE_PACKAGE_DISCOUNT - ); - const isServicePackageDiscount = servicePackageDiscountSettingValue === "True"; - - return isServicePackageDiscount; - }, }, methods: { openModalAction(modalName) { @@ -305,6 +306,9 @@ export default { vapsItemsSelectedAction(vapsItemsSelected) { this.lineItems.vaps = vapsItemsSelected; }, + servicePackageDiscountSelectedAction(servicePackageDiscountSelected) { + this.lineItems.supportingItems = servicePackageDiscountSelected; + }, backButtonAction() { vehicleQuestionsMixin.methods.navigateBack(this); }, @@ -342,7 +346,11 @@ export default { false ); } - + this.dispatchStoreAction( + this.storeActions.SAVE_SUPPORTING_ITEMS, + this.lineItems.supportingItems, + false + ); this.dispatchStoreAction(this.storeActions.SAVE_VAPS, this.lineItems.vaps, false); this.dispatchStoreAction( storeActions.SAVE_ACTIVE_AND_OR_INACTIVE_PROMOS, 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 ea3fbb6de..21b07c447 100644 --- a/src/layouts/quote/service-package-question/service-package-question.vue +++ b/src/layouts/quote/service-package-question/service-package-question.vue @@ -47,7 +47,6 @@ export default { isInsuranceSelected: Boolean, availableLineItems: null, lineItems: null, - isServicePackageDiscount: Boolean, activePromos: null, }, data() { @@ -71,12 +70,34 @@ export default { selectedPackageName(newValue) { const VapsProductsInSelectedPackage = this.getVapsLineItemsForSelectedPackage(newValue); this.$emit("vapsItemsSelected", VapsProductsInSelectedPackage); + const servicePackageDiscountPartInSelectedPackage = + this.getServicePackageDiscountPartForSelectedPackage(newValue); + let supportingItems = this.supportingLineItems; + if (servicePackageDiscountPartInSelectedPackage?.length > 0) { + supportingItems.push(servicePackageDiscountPartInSelectedPackage[0]); + } else { + if ( + supportingItems?.length > 0 && + containsLineItemWithPartType( + partTypeStrings.SERVICE_PACKAGE_DISCOUNT, + supportingItems + ) + ) { + supportingItems = supportingItems.filter( + (item) => item.partType !== partTypeStrings.SERVICE_PACKAGE_DISCOUNT + ); + } + } + this.$emit("servicePackageDiscountSelected", supportingItems); }, }, computed: { nullSafeAvailableLineItems() { return this.availableLineItems ?? []; }, + supportingLineItems() { + return this.lineItems.supportingItems; + }, servicePackageAnswers() { const cmsWidgetName = this.isInsuranceSelected ? this.insuranceCmsWidgetName @@ -103,12 +124,13 @@ export default { buttonBodyCopy: this.getBodyTextFromCms(answer.SubWidgetName), buttonAuxillaryCopy: this.getDiscountedPackagePriceString( answer.Name, - this.isServicePackageDiscount && answer.Text != "" + this.isServicePackageDiscountOnOrder && answer.Text != "" ), buttonFooterCopy: this.getFooterTextFromCms(answer.SubWidgetName), additionalButtonData: { strikeThroughPrice: this.getPackagePriceString(answer.Name), - servicePackageDiscount: this.isServicePackageDiscount && answer.Text != "", + servicePackageDiscount: + this.isServicePackageDiscountOnOrder && answer.Text != "", Text: answer.Text + this.getServicePackageDiscountPrice(), }, })); @@ -120,6 +142,12 @@ export default { this.nullSafeAvailableLineItems ); }, + isServicePackageDiscountOnOrder() { + return containsLineItemWithPartType( + partTypeStrings.SERVICE_PACKAGE_DISCOUNT, + this.nullSafeAvailableLineItems + ); + }, frontWipersApplicableForTierTwo() { return shouldFrontWipersBeAvailable( this.glassToReplace, @@ -166,6 +194,12 @@ export default { isRepair() { return this.$store.getters.order.damage.isRepair; }, + servicePackageDiscountParts() { + return findLineItemsWithPartType( + partTypeStrings.SERVICE_PACKAGE_DISCOUNT, + this.nullSafeAvailableLineItems + ); + }, }, methods: { processIfStatements, @@ -200,14 +234,11 @@ export default { }, getPackagePrice(packageName, { discountedPrice = false, servicePackageDiscount = false }) { var lineItemsToPrice = [...this.nullSafeAvailableLineItems]; + //remove service package discount part - const servicePackageDiscountParts = findLineItemsWithPartType( - partTypeStrings.SERVICE_PACKAGE_DISCOUNT, - this.nullSafeAvailableLineItems - ); - if (servicePackageDiscountParts?.length > 0) { + if (this.isServicePackageDiscountOnOrder) { lineItemsToPrice = this.nullSafeAvailableLineItems.filter((item) => { - return item.partType != servicePackageDiscountParts[0].partType; + return item.partType != this.servicePackageDiscountParts[0].partType; }); } @@ -215,7 +246,7 @@ export default { lineItemsToPrice.push(...removeVapsPromosFromPromoArray(this.activePromos)); } if (servicePackageDiscount) { - lineItemsToPrice.push(...servicePackageDiscountParts); + lineItemsToPrice.push(...this.servicePackageDiscountParts); } let priceFloat = this.isInsuranceSelected ? 0 @@ -228,13 +259,11 @@ export default { return priceFloat; }, getServicePackageDiscountPrice() { - const servicePackageDiscountParts = findLineItemsWithPartType( - partTypeStrings.SERVICE_PACKAGE_DISCOUNT, - this.nullSafeAvailableLineItems - ); - if (servicePackageDiscountParts?.length > 0) { + if (this.isServicePackageDiscountOnOrder) { let price = 0; - price += baseMixin.methods.getTotalLineItemPrice(servicePackageDiscountParts[0]); + price += baseMixin.methods.getTotalLineItemPrice( + this.servicePackageDiscountParts[0] + ); return Math.abs(price); } }, @@ -295,6 +324,14 @@ export default { return vapsLineItemsForSelectedPackage; }, + getServicePackageDiscountPartForSelectedPackage(packageName) { + const selectedPackage = this.servicePackageAnswers.filter((item) => { + return item.value === packageName; + }); + if (selectedPackage?.[0]?.additionalButtonData?.servicePackageDiscount) { + return this.servicePackageDiscountParts; + } else return []; + }, combineLineItemsWithoutDuplicates(lineItemsOne, lineItemsTwo) { const combinedLineItemArray = [...lineItemsTwo]; lineItemsOne.forEach((lineItemOne) => { From b9ef25818378bd18de7d531b61d30e48f0a0f0cd Mon Sep 17 00:00:00 2001 From: hiteshkumar87 Date: Mon, 13 May 2024 20:19:50 +0530 Subject: [PATCH 07/17] CSR-1994 code optimize --- src/layouts/quote/quote.vue | 6 +++--- .../service-package-question/service-package-question.vue | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/layouts/quote/quote.vue b/src/layouts/quote/quote.vue index f7c1d5745..3e1ef4966 100644 --- a/src/layouts/quote/quote.vue +++ b/src/layouts/quote/quote.vue @@ -195,9 +195,9 @@ export default { ); if (isServicePackageDiscount) { //remove service package discount part after pricing - lineItems.supportingItems = lineItems.supportingItems.filter((item) => { - item.partType !== partTypeStrings.SERVICE_PACKAGE_DISCOUNT; - }); + lineItems.supportingItems = lineItems.supportingItems.filter( + (item) => item.partType !== partTypeStrings.SERVICE_PACKAGE_DISCOUNT + ); } baseMixin.methods.dispatchStoreAction( storeActions.SAVE_SUPPORTING_ITEMS, 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 21b07c447..2d4a05790 100644 --- a/src/layouts/quote/service-package-question/service-package-question.vue +++ b/src/layouts/quote/service-package-question/service-package-question.vue @@ -325,9 +325,9 @@ export default { return vapsLineItemsForSelectedPackage; }, getServicePackageDiscountPartForSelectedPackage(packageName) { - const selectedPackage = this.servicePackageAnswers.filter((item) => { - return item.value === packageName; - }); + const selectedPackage = this.servicePackageAnswers.filter( + (item) => item.value === packageName + ); if (selectedPackage?.[0]?.additionalButtonData?.servicePackageDiscount) { return this.servicePackageDiscountParts; } else return []; From 2a790bd5f21e9113bf5fd551486b4e8e424a9671 Mon Sep 17 00:00:00 2001 From: Sneha Date: Fri, 17 May 2024 12:54:34 +0530 Subject: [PATCH 08/17] Unit testcases --- src/fmg-components/cart/cart.spec.js | 43 +++++++++++ src/fmg-components/cart/cart.vue | 4 +- src/layouts/quote/quote.spec.js | 76 ++++++++++++++++++- .../service-package-question.spec.js | 28 +++++++ .../service-package-question.vue | 2 +- 5 files changed, 150 insertions(+), 3 deletions(-) diff --git a/src/fmg-components/cart/cart.spec.js b/src/fmg-components/cart/cart.spec.js index cbb5a1610..10207c8bb 100644 --- a/src/fmg-components/cart/cart.spec.js +++ b/src/fmg-components/cart/cart.spec.js @@ -306,6 +306,49 @@ describe("cart.vue", () => { expect(found).toBe(true); }); + // Service package discount Fee Cart Item + test("if there is service package discount fee on the order, a service package discount cart item should be added to the cart", () => { + // Arrange + const lineItems = { + glassParts: [], + supportingItems: [ + { + description: null, + id: "bc00294e-6baa-403e-866e-52c267187a15", + kitPrice: 0, + laborAmount: 0, + partNumber: "DISC CASHSAVE70", + partType: "SERVICE PACKAGE DISCOUNT", + salesTax: null, + sellingPrice: -70, + }, + ], + vaps: [], + promos: [], + }; + + const availableVaps = []; + + // Act + const { wrapper } = setupMocks({ + props: { + modelValue: lineItems, + availableVaps: availableVaps, + }, + }); + + // Assert + expect(wrapper.vm.servicePackageDiscountCartItem).not.toBeNull(); + expect(wrapper.vm.servicePackageDiscountCartItem.subTotal).toEqual(-70); + expect(wrapper.vm.servicePackageDiscountCartItem.salesTax).toEqual(0); + + const found = + wrapper.vm.cartItems.findIndex( + (cartItem) => cartItem == wrapper.vm.servicePackageDiscountCartItem + ) >= 0; + expect(found).toBe(true); + }); + // Other Supporting Items Cart Item test("if there are other supporting items on the order, an other supporting items cart item should be added to the cart but should not be displayed", () => { // Arrange diff --git a/src/fmg-components/cart/cart.vue b/src/fmg-components/cart/cart.vue index 76f09338d..9a0f1b876 100644 --- a/src/fmg-components/cart/cart.vue +++ b/src/fmg-components/cart/cart.vue @@ -789,7 +789,9 @@ export default { cartItem = { name: this.servicePackageDiscountCartItemName + - Math.abs(this.getTotalLineItemPrice(servicePackageDiscountLineItem)), + Math.abs( + baseMixin.methods.getTotalLineItemPrice(servicePackageDiscountLineItem) + ), category: cartItemCategories.SUPPORTING_ITEMS, cartItemType: cartItemTypes.SERVICE_PACKAGE_DISCOUNT, isDisplayed: true, diff --git a/src/layouts/quote/quote.spec.js b/src/layouts/quote/quote.spec.js index 323b9a7d5..4543140dd 100644 --- a/src/layouts/quote/quote.spec.js +++ b/src/layouts/quote/quote.spec.js @@ -6,6 +6,9 @@ import quote from "@/layouts/quote/quote.vue"; import store from "@/store"; import * as navigateToHeritage from "@/helpers/heritage-integration/navigation-helper"; import { nextTick } from "vue"; +import { experimentSettings } from "@/constants/experiments"; +import baseMixin from "@/mixins/base-mixin.js"; +import { support } from "jquery"; jest.mock("@/store", () => ({ commit: jest.fn(), @@ -60,9 +63,14 @@ const mockMixin = { filterOutFees: jest.fn().mockImplementation(() => { return null; }), + getSettingValue: jest.fn((settingName) => { + if (settingName === experimentSettings.SERVICE_PACKAGE_DISCOUNT) { + return true; + } + return false; + }), }, }; - let mockTierOnePrice = 501; const mockPriceOrderStoreAction = storeActions.PRICE_ORDER_ITEMS_AND_SAVE_SERVER_DATA; @@ -234,8 +242,12 @@ describe("quote.vue", () => { vehicle: { cardId: "123", }, + experimentSettings: { + settingName: "SERVICE_PACKAGE_DISCOUNT", + }, }; const { wrapper } = setupMocks({}); + //mock this to avoid needing to populate this.$route in an unrelated test wrapper.vm.getDefaultIsInsuranceSelectedValue = jest.fn(); @@ -254,6 +266,47 @@ describe("quote.vue", () => { // This should have its own test //expect(vm.isInsuranceSelected !== null).toBe(true); }); + test("Returns true if service package discount setting is true", async () => { + //Arrange + store.getters = { + lineItems: { + glassParts: ["item", "item2"], + }, + order: { + lineItems: { + glassParts: ["item", "item2"], + }, + payment: {}, + serviceLocation: { + zipCode: "12345", + zipCodeCtu: "value", + }, + }, + vehicle: { + cardId: "123", + }, + experimentSettings: { + settingName: "SERVICE_PACKAGE_DISCOUNT", + }, + }; + const { wrapper } = setupMocks({}); + + wrapper.vm.$route = { query: { isInsurance: "false" } }; + + const isServicePackageDiscount = mockMixin.methods.getSettingValue( + experimentSettings.SERVICE_PACKAGE_DISCOUNT + ); + + //Act + await quote.beforeRouteEnter.call( + wrapper.vm, + { query: { fmgPage: "quote" } }, + undefined, + (c) => c(wrapper.vm) + ); + //Assert + expect(isServicePackageDiscount).toBe(true); + }); test("should default to insurance if query param 'isInsurance' is true", async () => { //Arrange store.getters = { @@ -274,6 +327,9 @@ describe("quote.vue", () => { vehicle: { cardId: "123", }, + experimentSettings: { + settingName: "SERVICE_PACKAGE_DISCOUNT", + }, }; const { wrapper } = setupMocks({}); wrapper.vm.$route = { query: { isInsurance: "true" } }; @@ -309,6 +365,9 @@ describe("quote.vue", () => { vehicle: { cardId: "123", }, + experimentSettings: { + settingName: "SERVICE_PACKAGE_DISCOUNT", + }, }; const { wrapper } = setupMocks({}); wrapper.vm.$route = { query: { isInsurance: "false" } }; @@ -345,6 +404,9 @@ describe("quote.vue", () => { vehicle: { cardId: "123", }, + experimentSettings: { + settingName: "SERVICE_PACKAGE_DISCOUNT", + }, }; const { wrapper } = setupMocks({}); // Ensure that query param isn't overriding selection @@ -381,6 +443,9 @@ describe("quote.vue", () => { vehicle: { cardId: "123", }, + experimentSettings: { + settingName: "SERVICE_PACKAGE_DISCOUNT", + }, }; const { wrapper } = setupMocks({}); // Ensure that query param isn't overriding selection @@ -418,6 +483,9 @@ describe("quote.vue", () => { vehicle: { cardId: "123", }, + experimentSettings: { + settingName: "SERVICE_PACKAGE_DISCOUNT", + }, }; mockTierOnePrice = 200; const { wrapper } = setupMocks({}); @@ -457,6 +525,9 @@ describe("quote.vue", () => { vehicle: { cardId: "123", }, + experimentSettings: { + settingName: "SERVICE_PACKAGE_DISCOUNT", + }, }; mockTierOnePrice = 505; const { wrapper } = setupMocks({}); @@ -495,6 +566,9 @@ describe("quote.vue", () => { vehicle: { cardId: "123", }, + experimentSettings: { + settingName: "SERVICE_PACKAGE_DISCOUNT", + }, }; const { wrapper } = setupMocks({}); wrapper.vm.$route = { query: null }; 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 8163c6324..7f8d7e665 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 @@ -6,6 +6,9 @@ import { mockProcessedCmsContent, inputQuestionWidgetAnswers, } from "./service-package-question-test-helper"; +import { containsLineItemWithPartType } from "@/helpers/service-package-helper"; +import baseMixin from "@/mixins/base-mixin.js"; +import { partTypeStrings } from "@/constants/part-type-strings"; import { nextTick } from "vue"; jest.mock("@/store", () => ({ @@ -68,6 +71,31 @@ describe("service-package-question.vue", () => { }, ]); }); + it("isServicePackageDiscountOnOrder returns true if it contains service package discount lineItems", () => { + // Arrange + const wrapper = setupMocks({}); + const recalLineItem = { + partNumber: "RECAL STATIC", + Description: "Recalibration", + partType: "recalibration", + Quantity: "1", + price: 150.0, + }; + const servicePackageDiscountLineItem = { + partNumber: "DISC CASHSAVE70", + Description: null, + partType: "SERVICE PACKAGE DISCOUNT", + price: -70, + }; + const lineItems = [recalLineItem, servicePackageDiscountLineItem]; + const partType = partTypeStrings.SERVICE_PACKAGE_DISCOUNT; + + // Act + const result = containsLineItemWithPartType(partType, lineItems); + + // Assert + expect(result).toBe(true); + }); it("should have the correct insurance pricing text when insurance is selected", () => { // Arrange mockProps.isInsuranceSelected = true; 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 2d4a05790..9fe4908bc 100644 --- a/src/layouts/quote/service-package-question/service-package-question.vue +++ b/src/layouts/quote/service-package-question/service-package-question.vue @@ -96,7 +96,7 @@ export default { return this.availableLineItems ?? []; }, supportingLineItems() { - return this.lineItems.supportingItems; + return this.lineItems?.supportingItems; }, servicePackageAnswers() { const cmsWidgetName = this.isInsuranceSelected From 04b505c860d4fc82e2ab80a5a7f25ed381da46c6 Mon Sep 17 00:00:00 2001 From: Sneha Date: Mon, 20 May 2024 16:45:20 +0530 Subject: [PATCH 09/17] unit test --- src/layouts/quote/quote.spec.js | 29 ++++++ .../service-package-question.spec.js | 97 ++++++++++++++++++- 2 files changed, 125 insertions(+), 1 deletion(-) diff --git a/src/layouts/quote/quote.spec.js b/src/layouts/quote/quote.spec.js index 4543140dd..bce20d75c 100644 --- a/src/layouts/quote/quote.spec.js +++ b/src/layouts/quote/quote.spec.js @@ -607,6 +607,35 @@ describe("quote.vue", () => { expect(wrapper.vm.lineItems.promos !== null).toBe(true); }); + test("On forward button action save supporting lineItems", async () => { + //Arrange + store.getters.payment = { + insuranceCoverage: {}, + isInsurance: false, + }; + store.getters.order = { + lineItems: [], + payment: { + parentAccountNumber: 167132, + }, + }; + const { wrapper } = setupMocks({ + customMountOptions: { + router: { + navigateWithSaving: jest.fn(), + }, + route: { quote }, + }, + }); + + wrapper.vm.forwardButtonAction(); + + expect(wrapper.vm.dispatchStoreAction).toHaveBeenCalledWith( + "saveSupportingItems", + wrapper.vm.lineItems.supportingItems, + false + ); + }); }); function setupMocks({ customMountOptions }) { 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 7f8d7e665..8fe2ac941 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 @@ -6,7 +6,10 @@ import { mockProcessedCmsContent, inputQuestionWidgetAnswers, } from "./service-package-question-test-helper"; -import { containsLineItemWithPartType } from "@/helpers/service-package-helper"; +import { + containsLineItemWithPartType, + findLineItemsWithPartType, +} from "@/helpers/service-package-helper"; import baseMixin from "@/mixins/base-mixin.js"; import { partTypeStrings } from "@/constants/part-type-strings"; import { nextTick } from "vue"; @@ -49,6 +52,30 @@ describe("service-package-question.vue", () => { price: 35.5, }, ], + lineItems: { + supportingItems: [ + { + description: null, + id: "b0c68683-da85-46ba-bc86-2642bd9d5fdb", + kitPrice: 0, + laborAmount: 0, + partNumber: "RECYCLE FEE", + partType: "REPLACE FEE", + salesTax: null, + sellingPrice: 0, + }, + { + description: null, + id: "5f205a07-3c08-4244-9935-76d63a7bcd19", + kitPrice: 0, + laborAmount: 395, + partNumber: "RECAL STATIC", + partType: "RECALIBRATION", + salesTax: null, + sellingPrice: 0, + }, + ], + }, activePromos: [], }; const packageNameKey = "05_01_CSR_Quote_Standard_Repair"; @@ -71,6 +98,74 @@ describe("service-package-question.vue", () => { }, ]); }); + it("should emit relevant service package discount items in an array", async () => { + // Arrange + const wrapper = setupMocks({}); + // Act + wrapper.componentVM.selectedPackageName = "TierTwo"; + await nextTick(); + + // Assert + expect(wrapper.emitted()["servicePackageDiscountSelected"][0][0]).toEqual( + mockProps.lineItems.supportingItems + ); + }); + it("should return undefined when there is no discount", () => { + const wrapper = setupMocks({}); + const partType = partTypeStrings.SERVICE_PACKAGE_DISCOUNT; + wrapper.vm.isServicePackageDiscountOnOrder = containsLineItemWithPartType( + partType, + mockProps.lineItems.supportingItems + ); + + const price = wrapper.vm.getServicePackageDiscountPrice(); + + expect(price).toBeUndefined(); + }); + it("should return price when there is discount", () => { + const wrapper = setupMocks({}); + const partType = partTypeStrings.SERVICE_PACKAGE_DISCOUNT; + const supportingItems = [ + { + description: null, + id: "b0c68683-da85-46ba-bc86-2642bd9d5fdb", + kitPrice: 0, + laborAmount: 0, + partNumber: "RECYCLE FEE", + partType: "REPLACE FEE", + salesTax: null, + sellingPrice: 0, + }, + { + description: null, + id: "5f205a07-3c08-4244-9935-76d63a7bcd19", + kitPrice: 0, + laborAmount: 395, + partNumber: "RECAL STATIC", + partType: "RECALIBRATION", + salesTax: null, + sellingPrice: 0, + }, + { + description: null, + kitPrice: 0, + laborAmount: 0, + partNumber: "DISC CASHSAVE70", + partType: "SERVICE PACKAGE DISCOUNT", + salesTax: null, + sellingPrice: -70, + }, + ]; + wrapper.vm.isServicePackageDiscountOnOrder = containsLineItemWithPartType( + partType, + supportingItems + ); + const servicePackageDiscountLineItem = findLineItemsWithPartType(partType, supportingItems); + wrapper.vm.getServicePackageDiscountPrice(); + const price = baseMixin.methods.getTotalLineItemPrice(servicePackageDiscountLineItem[0]); + + expect(Math.abs(price)).toEqual(70); + }); it("isServicePackageDiscountOnOrder returns true if it contains service package discount lineItems", () => { // Arrange const wrapper = setupMocks({}); From 024ac0adecf5668308f3546448df258c32da3b12 Mon Sep 17 00:00:00 2001 From: Sneha Date: Mon, 20 May 2024 17:58:29 +0530 Subject: [PATCH 10/17] Fixing test --- .../service-package-question.spec.js | 112 ++++++------------ 1 file changed, 36 insertions(+), 76 deletions(-) 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 8fe2ac941..80a769ec3 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 @@ -51,6 +51,12 @@ describe("service-package-question.vue", () => { partType: "RAIN DEFENSE", price: 35.5, }, + { + partNumber: "DISC CASHSAVE70", + description: null, + partType: "SERVICE PACKAGE DISCOUNT", + price: -70, + }, ], lineItems: { supportingItems: [ @@ -74,6 +80,15 @@ describe("service-package-question.vue", () => { salesTax: null, sellingPrice: 0, }, + { + description: null, + kitPrice: 0, + laborAmount: 0, + partNumber: "DISC CASHSAVE70", + partType: "SERVICE PACKAGE DISCOUNT", + salesTax: null, + sellingPrice: -70, + }, ], }, activePromos: [], @@ -98,69 +113,18 @@ describe("service-package-question.vue", () => { }, ]); }); - it("should emit relevant service package discount items in an array", async () => { - // Arrange - const wrapper = setupMocks({}); - // Act - wrapper.componentVM.selectedPackageName = "TierTwo"; - await nextTick(); - - // Assert - expect(wrapper.emitted()["servicePackageDiscountSelected"][0][0]).toEqual( - mockProps.lineItems.supportingItems - ); - }); - it("should return undefined when there is no discount", () => { - const wrapper = setupMocks({}); - const partType = partTypeStrings.SERVICE_PACKAGE_DISCOUNT; - wrapper.vm.isServicePackageDiscountOnOrder = containsLineItemWithPartType( - partType, - mockProps.lineItems.supportingItems - ); - - const price = wrapper.vm.getServicePackageDiscountPrice(); - - expect(price).toBeUndefined(); - }); it("should return price when there is discount", () => { const wrapper = setupMocks({}); const partType = partTypeStrings.SERVICE_PACKAGE_DISCOUNT; - const supportingItems = [ - { - description: null, - id: "b0c68683-da85-46ba-bc86-2642bd9d5fdb", - kitPrice: 0, - laborAmount: 0, - partNumber: "RECYCLE FEE", - partType: "REPLACE FEE", - salesTax: null, - sellingPrice: 0, - }, - { - description: null, - id: "5f205a07-3c08-4244-9935-76d63a7bcd19", - kitPrice: 0, - laborAmount: 395, - partNumber: "RECAL STATIC", - partType: "RECALIBRATION", - salesTax: null, - sellingPrice: 0, - }, - { - description: null, - kitPrice: 0, - laborAmount: 0, - partNumber: "DISC CASHSAVE70", - partType: "SERVICE PACKAGE DISCOUNT", - salesTax: null, - sellingPrice: -70, - }, - ]; + wrapper.vm.isServicePackageDiscountOnOrder = containsLineItemWithPartType( partType, - supportingItems + mockProps.lineItems.supportingItems + ); + const servicePackageDiscountLineItem = findLineItemsWithPartType( + partType, + mockProps.lineItems.supportingItems ); - const servicePackageDiscountLineItem = findLineItemsWithPartType(partType, supportingItems); wrapper.vm.getServicePackageDiscountPrice(); const price = baseMixin.methods.getTotalLineItemPrice(servicePackageDiscountLineItem[0]); @@ -169,27 +133,23 @@ describe("service-package-question.vue", () => { it("isServicePackageDiscountOnOrder returns true if it contains service package discount lineItems", () => { // Arrange const wrapper = setupMocks({}); - const recalLineItem = { - partNumber: "RECAL STATIC", - Description: "Recalibration", - partType: "recalibration", - Quantity: "1", - price: 150.0, - }; - const servicePackageDiscountLineItem = { - partNumber: "DISC CASHSAVE70", - Description: null, - partType: "SERVICE PACKAGE DISCOUNT", - price: -70, - }; - const lineItems = [recalLineItem, servicePackageDiscountLineItem]; - const partType = partTypeStrings.SERVICE_PACKAGE_DISCOUNT; - - // Act - const result = containsLineItemWithPartType(partType, lineItems); // Assert - expect(result).toBe(true); + expect(wrapper.vm.isServicePackageDiscountOnOrder).toBe(true); + }); + it("servicePackageDiscountParts should returns service package discount lineItems", () => { + // Arrange + const wrapper = setupMocks({}); + + // Assert + expect(wrapper.vm.servicePackageDiscountParts).toEqual([ + { + partNumber: "DISC CASHSAVE70", + description: null, + partType: "SERVICE PACKAGE DISCOUNT", + price: -70, + }, + ]); }); it("should have the correct insurance pricing text when insurance is selected", () => { // Arrange From 01e2df15a53f15723dfbf91542de393b636e7fe6 Mon Sep 17 00:00:00 2001 From: hiteshkumar87 Date: Mon, 20 May 2024 19:04:53 +0530 Subject: [PATCH 11/17] CSR-1994 code optimize --- src/layouts/quote/quote.vue | 28 ++++++------------- .../service-package-question.vue | 3 +- 2 files changed, 10 insertions(+), 21 deletions(-) diff --git a/src/layouts/quote/quote.vue b/src/layouts/quote/quote.vue index 3e1ef4966..f7e82156a 100644 --- a/src/layouts/quote/quote.vue +++ b/src/layouts/quote/quote.vue @@ -31,7 +31,6 @@ @vapsItemsSelected="vapsItemsSelectedAction" @servicePackageDiscountSelected="servicePackageDiscountSelectedAction" :activePromos="lineItems.promos" - :lineItems="lineItems" v-on="{ 'buttonEvent.openModal': openModalAction }" validationRules="option-required" isRequired /> @@ -109,7 +108,6 @@ import { queryStrings } from "@/constants/query-strings"; import { getQuerystringParameter } from "@/helpers/querystring-helper"; import promoModalQuestion from "@/fmg-components/promo-modal-question/promo-modal-question"; import { experimentSettings } from "@/constants/experiments"; -import { partTypeStrings } from "@/constants/part-type-strings"; defineRule("option-required", required(errorMessages.OPTION_REQUIRED)); export default { @@ -163,26 +161,23 @@ export default { experimentSettings.SERVICE_PACKAGE_DISCOUNT ); const isServicePackageDiscount = servicePackageDiscountSettingValue === "True"; + //Service package cash discount api call when experiment is active + var servicePackageDiscountPart = []; if (isServicePackageDiscount) { - const servicePackageDiscountPart = + const servicePackageDiscountPartResponse = await baseMixin.methods.dispatchStoreActionWithLogging( storeActions.CASH_SERVICE_PACKAGE_DISCOUNT, null, "quote" ); - //add service package discount part to supporting items to get price together - lineItems.supportingItems = [ - ...resultMap.supportingItems, - servicePackageDiscountPart.data, - ]; - } else { - lineItems.supportingItems = resultMap.supportingItems; + servicePackageDiscountPart = servicePackageDiscountPartResponse.data; } const availableLineItems = [ resultMap.rainDefense, - ...lineItems.supportingItems, + ...resultMap.supportingItems, ...resultMap.wipers, ...nullSafeGlassParts, + ...servicePackageDiscountPart, ]; const pricingResults = await baseMixin.methods.dispatchStoreActionWithLogging( @@ -193,18 +188,13 @@ export default { "quote", false ); - if (isServicePackageDiscount) { - //remove service package discount part after pricing - lineItems.supportingItems = lineItems.supportingItems.filter( - (item) => item.partType !== partTypeStrings.SERVICE_PACKAGE_DISCOUNT - ); - } + baseMixin.methods.dispatchStoreAction( storeActions.SAVE_SUPPORTING_ITEMS, - lineItems.supportingItems, + resultMap.supportingItems, false ); - + lineItems.supportingItems = resultMap.supportingItems; const addableVaps = [...resultMap.wipers, resultMap.rainDefense]; // Promo logic 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 9fe4908bc..24e855511 100644 --- a/src/layouts/quote/service-package-question/service-package-question.vue +++ b/src/layouts/quote/service-package-question/service-package-question.vue @@ -46,7 +46,6 @@ export default { isRequired: Boolean, isInsuranceSelected: Boolean, availableLineItems: null, - lineItems: null, activePromos: null, }, data() { @@ -96,7 +95,7 @@ export default { return this.availableLineItems ?? []; }, supportingLineItems() { - return this.lineItems?.supportingItems; + return this.$store.getters.lineItems?.supportingItems; }, servicePackageAnswers() { const cmsWidgetName = this.isInsuranceSelected From 5c16471169dcd1b7a3c8725240b7763c2a7f95b4 Mon Sep 17 00:00:00 2001 From: Sneha Date: Mon, 20 May 2024 19:15:37 +0530 Subject: [PATCH 12/17] Revert "Merge branch 'develop' into feature/CSR-1994" This reverts commit d606aa85f69dde4c194e2a44ca866c6a40a392c8, reversing changes made to 04b505c860d4fc82e2ab80a5a7f25ed381da46c6. --- src/constants/coverage-status.js | 20 +++++ src/constants/experiments.js | 1 + src/constants/insurance.js | 30 ------- src/constants/pay-with-insurance-states.js | 1 + src/constants/tint-mapper.js | 1 - src/fmg-components/cart/cart.vue | 89 ++++++++----------- .../heritage-integration/navigation-helper.js | 19 +++- .../navigation-helper.spec.js | 18 ++-- src/layouts/confirmation/confirmation.vue | 2 +- src/layouts/estimate/estimate.vue | 2 + .../insurance-company-question.vue | 45 ++++------ .../insurance-company/insurance-company.vue | 19 +--- src/layouts/payment-method/payment-method.vue | 12 ++- src/layouts/payment/payment.vue | 2 +- src/layouts/quote/quote.vue | 2 +- .../appointment-type-question.vue | 13 +-- .../mobile-location-modal-questions.vue | 2 - .../service-location/service-location.vue | 40 +++------ .../vehicle-damage/vehicle-damage.spec.js | 1 - src/layouts/vehicle-damage/vehicle-damage.vue | 2 +- src/layouts/vehicle/vehicle.vue | 2 +- src/layouts/vin-lookup/vin-lookup.spec.js | 1 - src/router/index.js | 29 +----- src/store/index.js | 10 +-- 24 files changed, 134 insertions(+), 229 deletions(-) create mode 100644 src/constants/coverage-status.js delete mode 100644 src/constants/insurance.js create mode 100644 src/constants/pay-with-insurance-states.js diff --git a/src/constants/coverage-status.js b/src/constants/coverage-status.js new file mode 100644 index 000000000..1c75c00a6 --- /dev/null +++ b/src/constants/coverage-status.js @@ -0,0 +1,20 @@ +const coverageStatus = { + PENDING: "Pending", + NOCOMP: "NoComp", + VERIFIED: "Verified", +}; + +export function coverageStatusValue(intCoverageStatus) { + switch (intCoverageStatus) { + case 0: + return coverageStatus.PENDING; + case 1: + return coverageStatus.NOCOMP; + case 2: + return coverageStatus.VERIFIED; + default: + return null; + } +} + +export { coverageStatus }; diff --git a/src/constants/experiments.js b/src/constants/experiments.js index ee83ec447..eb7fed508 100644 --- a/src/constants/experiments.js +++ b/src/constants/experiments.js @@ -4,6 +4,7 @@ const experimentUniverses = { const experimentSettings = { GOOGLE_CUSTOM_DIMENSION_INDEX: "Google Custom Dimension Index", + SUPPRESS_VIN_CAPTURE: "SuppressVinCapture", DISPLAY_AVAILABILITY_INDICATORS: "DisplayAvailabilityIndicators", PIA_EXPERIENCE: "PIA Experience", PIA_INSURANCE: "DisplayPIAInsurance", diff --git a/src/constants/insurance.js b/src/constants/insurance.js deleted file mode 100644 index 2574fdbc6..000000000 --- a/src/constants/insurance.js +++ /dev/null @@ -1,30 +0,0 @@ -import { cartItemTypes } from "@/constants/cart-item-types"; - -export const payWithInsuranceStates = ["AZ", "CT", "FL", "KY", "MA", "MN", "NY", "SC"]; - -export const cartItemTypesCoveredByInsurance = [ - cartItemTypes.GLASS_PARTS, - cartItemTypes.SUPPORTING_ITEMS, - cartItemTypes.RECYCLE_FEE, - cartItemTypes.REPLACE_FEE, - cartItemTypes.SUPPLIES_REPAIR, -]; - -export const coverageStatus = { - PENDING: "Pending", - NOCOMP: "NoComp", - VERIFIED: "Verified", -}; - -export function coverageStatusValue(intCoverageStatus) { - switch (intCoverageStatus) { - case 0: - return coverageStatus.PENDING; - case 1: - return coverageStatus.NOCOMP; - case 2: - return coverageStatus.VERIFIED; - default: - return null; - } -} diff --git a/src/constants/pay-with-insurance-states.js b/src/constants/pay-with-insurance-states.js new file mode 100644 index 000000000..e65589557 --- /dev/null +++ b/src/constants/pay-with-insurance-states.js @@ -0,0 +1 @@ +export const payWithInsuranceStates = ["AZ", "CT", "FL", "KY", "MA", "MN", "NY", "SC"]; diff --git a/src/constants/tint-mapper.js b/src/constants/tint-mapper.js index c290dd1db..519de0855 100644 --- a/src/constants/tint-mapper.js +++ b/src/constants/tint-mapper.js @@ -33,7 +33,6 @@ const tintMap = { { name: "green tint", src: "Glass-NoShade-GreenTint.svg" }, { name: "gray tint privacy", src: "Glass-NoShade-GrayTint.svg" }, { name: "blue tint", src: "Glass-NoShade-BlueTint.svg" }, - { name: "green tint privacy", src: "Glass-NoShade-Privacy.svg" }, // No shade or tint { name: "clear", src: "Glass-NoShade-NoTint.svg" }, diff --git a/src/fmg-components/cart/cart.vue b/src/fmg-components/cart/cart.vue index a8227036a..9a0f1b876 100644 --- a/src/fmg-components/cart/cart.vue +++ b/src/fmg-components/cart/cart.vue @@ -11,7 +11,9 @@ class="col d-flex justify-content-between py-0"> {{ amountDueText }} {{ - getLineItemAmount(amountDue, showCoverageAsPending) + showCoverageAsPending + ? verifyingCoverageText + : getFormattedAmount("", amountDue) }} @@ -22,10 +24,9 @@ {{ - getLineItemAmount( - deductibleLineItem.subTotal, - showCoverageAsPending - ) + showCoverageAsPending + ? verifyingCoverageText + : getFormattedAmount("", deductibleLineItem.subTotal) }} @@ -34,12 +35,12 @@
- {{ getLineItemAmount(packagePrice) }} + {{ getFormattedAmount("", packagePrice) }} - {{ getLineItemAmount(packagePriceWithoutDiscount) }} + {{ getFormattedAmount("", packagePriceWithoutDiscount) }}
@@ -100,7 +101,7 @@ (showCoverageAsVerified && !cartItem.isCoveredByInsurance) " >{{ - getLineItemAmount(cartItem.subTotal, null, cartItem.category) + getFormattedAmount(cartItem.category, Math.abs(cartItem.subTotal)) }} @@ -108,19 +109,27 @@
{{ subtotalText }} - {{ getLineItemAmount(subTotal, showCoverageAsPending) }} + {{ + showCoverageAsPending + ? verifyingCoverageText + : getFormattedAmount("", subTotal) + }}
{{ salesTaxText }} - {{ getLineItemAmount(salesTax) }} + {{ getFormattedAmount("", salesTax) }}
- {{ amountPaidText }} - {{ getLineItemAmount(amountPaid) }} + {{ amountPaidText }}{{ getFormattedAmount("", amountPaid) }}
{{ amountDueText }} - {{ getLineItemAmount(amountDue, showCoverageAsPending) }} + {{ + showCoverageAsPending + ? verifyingCoverageText + : getFormattedAmount("", amountDue) + }}
lineItemsToKeep.cartItemType != cartItemType @@ -529,9 +535,7 @@ export default { subTotal: 0, salesTax: 0, lineItems: [], - isCoveredByInsurance: cartItemTypesCoveredByInsurance.includes( - cartItemTypes.FRONT_WIPERS - ), + isCoveredByInsurance: false, }; frontWiperLineItems.forEach((lineItem) => { @@ -569,9 +573,7 @@ export default { subTotal: 0, salesTax: 0, lineItems: [], - isCoveredByInsurance: cartItemTypesCoveredByInsurance.includes( - cartItemTypes.REAR_WIPERS - ), + isCoveredByInsurance: false, }; rearWiperLineItems.forEach((lineItem) => { @@ -609,9 +611,7 @@ export default { subTotal: 0, salesTax: 0, lineItems: [], - isCoveredByInsurance: cartItemTypesCoveredByInsurance.includes( - cartItemTypes.RAIN_DEFENSE - ), + isCoveredByInsurance: false, }; rainDefenseLineItem.cartItemType = cartItem.cartItemType; @@ -632,7 +632,7 @@ export default { if (this.glassParts.length > 0) { this.glassParts.forEach((lineItem) => { - let cartItem = { + let glassPartCartItem = { name: null, category: cartItemCategories.GLASS_PARTS, cartItemType: cartItemTypes.GLASS_PARTS, @@ -642,25 +642,24 @@ export default { (lineItem.kitPrice ?? 0) + (lineItem.laborAmount ?? 0) + (lineItem.sellingPrice ?? 0), + salesTax: lineItem.salesTax ?? 0, lineItems: [], - isCoveredByInsurance: cartItemTypesCoveredByInsurance.includes( - cartItemTypes.GLASS_PARTS - ), + isCoveredByInsurance: true, }; if (lineItem.childParts?.length > 0) { lineItem.childParts.forEach((childPartLineItem) => { - cartItem.subTotal += + glassPartCartItem.subTotal += (childPartLineItem.kitPrice ?? 0) + (childPartLineItem.laborAmount ?? 0) + (childPartLineItem.sellingPrice ?? 0); - cartItem.salesTax += childPartLineItem.salesTax; + glassPartCartItem.salesTax += childPartLineItem.salesTax; }); } - glassPartCartItems.push(cartItem); + glassPartCartItems.push(glassPartCartItem); }); } @@ -686,9 +685,7 @@ export default { subTotal: 0, salesTax: 0, lineItems: [], - isCoveredByInsurance: cartItemTypesCoveredByInsurance.includes( - cartItemTypes.REPLACE_FEE - ), + isCoveredByInsurance: true, }; recycleFeeLineItem.cartItemType = cartItem.cartItemType; @@ -726,9 +723,7 @@ export default { subTotal: 0, salesTax: 0, lineItems: [], - isCoveredByInsurance: cartItemTypesCoveredByInsurance.includes( - cartItemTypes.SUPPLIES_REPAIR - ), + isCoveredByInsurance: true, }; suppliesRepairLineItem.cartItemType = cartItem.cartItemType; @@ -764,9 +759,7 @@ export default { subTotal: 0, salesTax: 0, lineItems: [], - isCoveredByInsurance: cartItemTypesCoveredByInsurance.includes( - cartItemTypes.MOBILE_FEE - ), + isCoveredByInsurance: false, }; mobileFeeLineItem.cartItemType = cartItem.cartItemType; @@ -845,9 +838,7 @@ export default { subTotal: 0, salesTax: 0, lineItems: [], - isCoveredByInsurance: cartItemTypesCoveredByInsurance.includes( - cartItemTypes.SUPPORTING_ITEMS - ), + isCoveredByInsurance: true, }; otherSupportingItemsLineItems.forEach((lineItem) => { @@ -885,9 +876,7 @@ export default { subTotal: 0, salesTax: 0, lineItems: [], - isCoveredByInsurance: cartItemTypesCoveredByInsurance.includes( - cartItemTypes.EARLY_BIRD - ), + isCoveredByInsurance: false, }; premiumAppointmentDiscountLineItem.cartItemType = cartItem.cartItemType; @@ -933,7 +922,7 @@ export default { subTotal: 0, salesTax: 0, lineItems: [], - isCoveredByInsurance: cartItemTypesCoveredByInsurance.includes(promoCode), + isCoveredByInsurance: false, }; promoLineItems.forEach((promoLineItem) => { diff --git a/src/helpers/heritage-integration/navigation-helper.js b/src/helpers/heritage-integration/navigation-helper.js index a0d3bb92c..cb3844bfc 100644 --- a/src/helpers/heritage-integration/navigation-helper.js +++ b/src/helpers/heritage-integration/navigation-helper.js @@ -5,6 +5,9 @@ import { lazyLoadComponent } from "@/router/dynamic-routing/component-loader.js" import { saveSession } from "@/helpers/heritage-integration/order-helper.js"; import { fmgPageValues } from "@/router/router-constants/fmgPage-values"; import { storeActions } from "@/constants/store-actions.js"; +import { settleAllPromises } from "@/helpers/layout-helper"; +import experimentMixin from "@/mixins/experiment-mixin"; +import { experimentSettings } from "@/constants/experiments"; import { includesWindshieldReplacement } from "@/helpers/damage-helper"; import store from "@/store"; import router from "@/router"; @@ -30,7 +33,7 @@ export async function getDirectNavigation(toRoute) { // vehicle -> vehicle-damage // quote -> vin-lookup/estimate // insurance-company -> vin-lookup/estimate - if (store.getters.requiresVerifiedRedirecting) { + if (store.getters.payment.insuranceCoverage.isVerified) { if (fmgPageValue === fmgPageValues.VEHICLE) { return fmgPageValues.VEHICLE_DAMAGE; } @@ -74,7 +77,7 @@ export async function getImplicitNavigation(toRoute) { if (quoteComponent.methods.arePagePrerequisitesValid()) { // Do not send to quote if verified insurance user. - if (store.getters.requiresVerifiedRedirecting) { + if (store.getters.payment.insuranceCoverage.isVerified) { return fmgPageValues.HERITAGE; } else { return fmgPageValues.QUOTE; @@ -139,7 +142,11 @@ export async function skipVinLookup() { ? await store.dispatch(storeActions.IS_VIN_OPTIONAL_VEHICLE) : false; - return isVinOptionalVehicle || !includesWindshieldReplacement(); + return ( + isVinOptionalVehicle || + !includesWindshieldReplacement() || + experimentMixin.methods.hasSettingEqualTo(experimentSettings.SUPPRESS_VIN_CAPTURE, "true") + ); } export async function skipVinLookupNotRepair() { @@ -151,7 +158,11 @@ export async function skipVinLookupNotRepair() { ? await store.dispatch(storeActions.IS_VIN_OPTIONAL_VEHICLE) : false; - return isVinOptionalVehicle || !includesWindshieldReplacement(); + return ( + isVinOptionalVehicle || + !includesWindshieldReplacement() || + experimentMixin.methods.hasSettingEqualTo(experimentSettings.SUPPRESS_VIN_CAPTURE, "true") + ); } async function getLazyLoadedComponent(pageName) { diff --git a/src/helpers/heritage-integration/navigation-helper.spec.js b/src/helpers/heritage-integration/navigation-helper.spec.js index 671a1b46e..963a6434c 100644 --- a/src/helpers/heritage-integration/navigation-helper.spec.js +++ b/src/helpers/heritage-integration/navigation-helper.spec.js @@ -115,6 +115,16 @@ describe("getPageToRouteExistingOrderTo", () => { store.commit(storeMutations.UPDATE_IS_REPAIR, false); store.commit(storeMutations.UPDATE_MAKE, "acura"); + const mockExperimentsList = [ + { + universeName: "ConceptFunnel", + settings: { + SuppressVinCapture: false, + }, + }, + ]; + store.commit(storeMutations.UPDATE_EXPERIMENTS, mockExperimentsList); + // Mock out the lazy load calls for all components. mockLazyLoadComponentReturnValues({ [fmgPageValues.VEHICLE]: true, @@ -361,7 +371,6 @@ describe("getPageToRouteExistingOrderTo", () => { }; store.commit(storeMutations.UPDATE_IS_VERIFIED_INSURANCE, true); - store.commit(storeMutations.UPDATE_REFERRAL_NUMBER, "666666"); // Act const result = await getPageToRouteExistingOrderTo(toRoute); @@ -380,7 +389,6 @@ describe("getPageToRouteExistingOrderTo", () => { }; store.commit(storeMutations.UPDATE_IS_VERIFIED_INSURANCE, true); - store.commit(storeMutations.UPDATE_REFERRAL_NUMBER, "666666"); store.commit(storeMutations.UPDATE_IS_REPAIR, true); store.commit(storeMutations.UPDATE_MAKE, "acura"); @@ -400,7 +408,6 @@ describe("getPageToRouteExistingOrderTo", () => { }; store.commit(storeMutations.UPDATE_IS_VERIFIED_INSURANCE, true); - store.commit(storeMutations.UPDATE_REFERRAL_NUMBER, "666666"); store.commit(storeMutations.UPDATE_IS_REPAIR, true); store.commit(storeMutations.UPDATE_MAKE, "acura"); @@ -422,7 +429,6 @@ describe("getPageToRouteExistingOrderTo", () => { }; store.commit(storeMutations.UPDATE_IS_VERIFIED_INSURANCE, true); - store.commit(storeMutations.UPDATE_REFERRAL_NUMBER, "666666"); store.commit(storeMutations.UPDATE_IS_REPAIR, false); store.commit(storeMutations.UPDATE_MAKE, "acura"); store.commit(storeMutations.UPDATE_GLASS_TO_REPLACE, [ @@ -445,7 +451,6 @@ describe("getPageToRouteExistingOrderTo", () => { }; store.commit(storeMutations.UPDATE_IS_VERIFIED_INSURANCE, true); - store.commit(storeMutations.UPDATE_REFERRAL_NUMBER, "666666"); store.commit(storeMutations.UPDATE_IS_REPAIR, false); store.commit(storeMutations.UPDATE_MAKE, "acura"); store.commit(storeMutations.UPDATE_GLASS_TO_REPLACE, [ @@ -471,7 +476,6 @@ describe("getPageToRouteExistingOrderTo", () => { }; store.commit(storeMutations.UPDATE_IS_VERIFIED_INSURANCE, false); - store.commit(storeMutations.UPDATE_REFERRAL_NUMBER, "55555"); // Act const result = await getPageToRouteExistingOrderTo(toRoute); @@ -489,7 +493,6 @@ describe("getPageToRouteExistingOrderTo", () => { }; store.commit(storeMutations.UPDATE_IS_VERIFIED_INSURANCE, false); - store.commit(storeMutations.UPDATE_REFERRAL_NUMBER, "55555"); // Act const result = await getPageToRouteExistingOrderTo(toRoute); @@ -507,7 +510,6 @@ describe("getPageToRouteExistingOrderTo", () => { }; store.commit(storeMutations.UPDATE_IS_VERIFIED_INSURANCE, false); - store.commit(storeMutations.UPDATE_REFERRAL_NUMBER, "55555"); // Act const result = await getPageToRouteExistingOrderTo(toRoute); diff --git a/src/layouts/confirmation/confirmation.vue b/src/layouts/confirmation/confirmation.vue index 39da072a3..1947bec22 100644 --- a/src/layouts/confirmation/confirmation.vue +++ b/src/layouts/confirmation/confirmation.vue @@ -96,7 +96,7 @@ import { convertDateStringToDate } from "@/layouts/schedule/helpers/schedule-hel import { deepClone } from "@/helpers/object-helper"; import { Form } from "vee-validate"; import { get12HourTimeFormat, get12HourTimeMobileFormat } from "@/helpers/date-helper"; -import { coverageStatus } from "@/constants/insurance"; +import { coverageStatus } from "@/constants/coverage-status"; export default { name: "confirmation", diff --git a/src/layouts/estimate/estimate.vue b/src/layouts/estimate/estimate.vue index b298132ca..9c2ce4caf 100644 --- a/src/layouts/estimate/estimate.vue +++ b/src/layouts/estimate/estimate.vue @@ -112,6 +112,8 @@ import { skipVinLookup, skipVinLookupNotRepair, } from "@/helpers/heritage-integration/navigation-helper"; +import experimentMixin from "@/mixins/experiment-mixin"; +import { experimentSettings } from "@/constants/experiments"; import vinPagesMixin from "@/mixins/vin-pages-mixin"; import { navigateToHeritageFunnel } from "@/helpers/heritage-integration/navigation-helper"; import { saveSession } from "@/helpers/heritage-integration/order-helper.js"; diff --git a/src/layouts/insurance-company/insurance-company-question.vue b/src/layouts/insurance-company/insurance-company-question.vue index f8f7bbc6a..49e1eb8c8 100644 --- a/src/layouts/insurance-company/insurance-company-question.vue +++ b/src/layouts/insurance-company/insurance-company-question.vue @@ -96,29 +96,15 @@ export default { findMatches(request, response) { const matches = []; const term = request?.term?.toUpperCase(); - const nonPriorityMatches = []; - this.searchableInsuranceCompanyList.forEach((company, index) => { if ( - company.accountName.toUpperCase().indexOf(term) !== -1 || - company.altTerms.toUpperCase().indexOf(term) !== -1 + company.accountName.indexOf(term) !== -1 || + company.altTerms.indexOf(term) !== -1 ) { matches.push(company.accountName); } }); - - // Prioritize matched typed entries to top of list - const priorityMatches = matches.filter((companyName, index) => { - if (companyName.toUpperCase().indexOf(term) === 0) { - return companyName; - } else { - nonPriorityMatches.push(companyName); - } - }); - - const prioritizedMatches = [...priorityMatches, ...nonPriorityMatches]; - - response(prioritizedMatches); + response(matches); }, selectInsuranceCompany(parentAccountName) { // this runs upon user selection within jQueryUI Autocomplete @@ -126,14 +112,9 @@ export default { console.error("No insurance companies found"); return; } - if (parentAccountName) { - const parentAccountNumber = this.getParentAccountNumber(parentAccountName); - this.selectedAccountNumber = parentAccountNumber; - this.selectedAccountName = this.getParentAccountName(parentAccountNumber); - } else { - this.selectedAccountNumber = ""; - this.selectedAccountName = ""; - } + const parentAccountNumber = this.getParentAccountNumber(parentAccountName); + this.selectedAccountNumber = parentAccountNumber; + this.selectedAccountName = this.getParentAccountName(parentAccountNumber); }, }, mounted() { @@ -150,12 +131,20 @@ export default { }, minLength: 0, // Necessary to display fmenu when clearing input + // Bold matching letters as you type in the input + search: function (event, ui) { + setTimeout(() => { + let w = $(this).autocomplete("widget").find("div"); + let regExpString = "(" + this.value + ")"; + let re = new RegExp(regExpString, "i"); + w.html((i, html) => + html.replace(re, "$1") + ); + }, 5); + }, select: function (event, ui) { select(ui.item.value); }, - change: function (event, ui) { - select(ui?.item?.value); - }, }); }, 0); }, diff --git a/src/layouts/insurance-company/insurance-company.vue b/src/layouts/insurance-company/insurance-company.vue index a15de8311..55a8149e3 100644 --- a/src/layouts/insurance-company/insurance-company.vue +++ b/src/layouts/insurance-company/insurance-company.vue @@ -20,7 +20,7 @@
@@ -44,7 +44,7 @@ import { storeActions } from "@/constants/store-actions"; import { Form, defineRule } from "vee-validate"; import baseMixin from "@/mixins/base-mixin.js"; import { navigateToHeritageFunnel } from "@/helpers/heritage-integration/navigation-helper"; -import { applicationConfig } from "@/constants/application-config"; + import store from "@/store"; export default { @@ -84,22 +84,9 @@ export default { originalList: [], }; }, - computed: { - isParentAccountNumber() { - return !!this.parentAccountNumber; - }, - }, methods: { - isCashParentAccountNumber() { - return ( - applicationConfig.CASH_PARENT_ACCOUNT_NUMBER.toString() === - store.getters.order?.payment?.parentAccountNumber.toString() - ); - }, parentAccountNumberFromStore() { - const accountNumber = !this.isCashParentAccountNumber() - ? store.getters.order?.payment?.parentAccountNumber.toString() - : ""; + const accountNumber = store.getters.order?.payment?.parentAccountNumber.toString(); return accountNumber; }, arePagePrerequisitesValid() { diff --git a/src/layouts/payment-method/payment-method.vue b/src/layouts/payment-method/payment-method.vue index 0910920a9..07414ae7d 100644 --- a/src/layouts/payment-method/payment-method.vue +++ b/src/layouts/payment-method/payment-method.vue @@ -113,7 +113,7 @@ import { errorMessages } from "@/constants/error-messages"; import { AppointmentTypeStrings } from "@/constants/schedule-constants"; import { partTypeStrings } from "@/constants/part-type-strings"; import { mapTaxedLineItemsToStoreFormat } from "../../store"; -import { coverageStatus } from "@/constants/insurance"; +import { coverageStatus } from "@/constants/coverage-status"; defineRule("option-required", required(errorMessages.OPTION_REQUIRED)); @@ -559,12 +559,10 @@ export default { const piaExperience = this.getSettingValue(experimentSettings.PIA_EXPERIENCE); const piaInsurance = this.getSettingValue(experimentSettings.PIA_INSURANCE); - var isEnabled = false; - if (this.isInsurance) { - isEnabled = piaInsurance === "true" && this.currentDeductible !== 0; - } else { - isEnabled = piaExperience === "PIA Optional" || piaExperience === "PIA Required"; - } + const isEnabled = + piaExperience === "PIA Optional" || + piaExperience === "PIA Required" || + piaInsurance === "true"; return !isEnabled; }, diff --git a/src/layouts/payment/payment.vue b/src/layouts/payment/payment.vue index e21780181..90378efea 100644 --- a/src/layouts/payment/payment.vue +++ b/src/layouts/payment/payment.vue @@ -224,7 +224,7 @@ import { deepClone } from "@/helpers/object-helper"; import { submitWorkOrder } from "@/helpers/heritage-integration/order-helper.js"; import iframeResize from "../../../node_modules/iframe-resizer/js/iframeResizer.js"; import { routerParams } from "@/router/router-constants/router-params"; -import { coverageStatus } from "@/constants/insurance"; +import { coverageStatus } from "@/constants/coverage-status"; export default { name: "payment", diff --git a/src/layouts/quote/quote.vue b/src/layouts/quote/quote.vue index bf36b7d06..f7e82156a 100644 --- a/src/layouts/quote/quote.vue +++ b/src/layouts/quote/quote.vue @@ -98,7 +98,7 @@ import { required } from "@/helpers/validation-rules"; import { errorMessages } from "@/constants/error-messages"; import { Form, defineRule } from "vee-validate"; import { applicationConfig } from "@/constants/application-config"; -import { payWithInsuranceStates } from "@/constants/insurance"; +import { payWithInsuranceStates } from "@/constants/pay-with-insurance-states"; import { revalidatePromosAndValidateQueryStringPromo, buildToastMessagesFromRevalidateOrValidatePromoResponse, diff --git a/src/layouts/service-location/appointment-type-question/appointment-type-question.vue b/src/layouts/service-location/appointment-type-question/appointment-type-question.vue index 64bf159ff..ca452ac01 100644 --- a/src/layouts/service-location/appointment-type-question/appointment-type-question.vue +++ b/src/layouts/service-location/appointment-type-question/appointment-type-question.vue @@ -32,7 +32,6 @@ export default { cmsWidgetName: String, isServiceableMobile: Boolean, isServiceableInshop: Boolean, - mobileFeeApplies: Boolean, }, computed: { questionText() { @@ -46,8 +45,7 @@ export default { const shouldShowInshop = this.isServiceableInshop; const shouldShowDropoff = this.isServiceableInshop && !this.$store.getters.damage.isRepair; - - var answers = this.answersFromCms + return this.answersFromCms ? this.answersFromCms.filter((answer) => { return ( (answer.Name == AppointmentTypeStrings.IN_SHOP && shouldShowInshop) || @@ -56,15 +54,6 @@ export default { ); }) : []; - - if (!this.mobileFeeApplies) { - answers.forEach((item) => { - if (item.Name.toLowerCase() === "mobile") { - item.SubText = item.SubText.replace("*", ""); - } - }); - } - return answers; }, selectedValue: { get: function () { diff --git a/src/layouts/service-location/mobile-location-modal-questions/mobile-location-modal-questions.vue b/src/layouts/service-location/mobile-location-modal-questions/mobile-location-modal-questions.vue index 4558c3294..debc25f89 100644 --- a/src/layouts/service-location/mobile-location-modal-questions/mobile-location-modal-questions.vue +++ b/src/layouts/service-location/mobile-location-modal-questions/mobile-location-modal-questions.vue @@ -25,7 +25,6 @@ @@ -154,7 +153,6 @@ export default { alertInvalidZipWidgetName: String, customComponentId: String, validationRules: String, - mobileFeeApplies: Boolean, }, computed: { mobileLocationLinkPromptText() { diff --git a/src/layouts/service-location/service-location.vue b/src/layouts/service-location/service-location.vue index b83db7ebc..89b3320fd 100644 --- a/src/layouts/service-location/service-location.vue +++ b/src/layouts/service-location/service-location.vue @@ -67,7 +67,6 @@ :isServiceableMobile="isServiceableMobile" :isServiceableInshop="isServiceableInshop" :isDisplayed="isAppointmentTypeDisplayed" - :mobileFeeApplies="mobileFeeApplies" ref="appointmentTypeQuestion" groupName="appointmentTypeQuestion" cmsWidgetName="AppointmentTypeQuestionWidget" @@ -81,7 +80,6 @@ v-if="selectedAppointmentType === 'Mobile'" v-model="mobileLocationQuestions" :mobileFeePart="mobileFeePart" - :mobileFeeApplies="mobileFeeApplies" @updated-mobile-fee-part="setMobileFeePart" @updated-serviceability="setServiceabilityDetails" @updated-contains-military-base="setContainsMilitaryBase" @@ -141,7 +139,7 @@ import { getShopProviderData, } from "@/layouts/service-location/helpers/service-location-helper/service-location-helper"; import { navigateToHeritageFunnel } from "@/helpers/heritage-integration/navigation-helper"; -import { applicationConfig } from "@/constants/application-config"; + import { Provider } from "@/layouts/service-location/classes/provider"; import store from "@/store"; @@ -302,13 +300,6 @@ export default { return this.isGlassServiceableMobile; } }, - mobileFeeApplies() { - if (this.mobileFeePart) { - return true; - } else { - return false; - } - }, isServiceableInshop() { if (this.isRecalibrationServiceableInshop !== null) { return this.isGlassServiceableInshop && this.isRecalibrationServiceableInshop; @@ -359,26 +350,17 @@ export default { methods: { arePagePrerequisitesValid() { // insurance drops the recycle fee on replace orders so it won't be in supportingItems - if (store.getters.payment.isInsurance) { - if ( - store.getters.payment.parentAccountNumber !== - applicationConfig.CASH_PARENT_ACCOUNT_NUMBER && - store.getters.order.policy.policyNumber && - store.getters.order.serviceLocation.zipCode - ) { - return true; - } else { - return false; - } + if (store.getters.payment.isInsurance && !store.getters.order.damage.isRepair) { + return ( + store.getters.order.serviceLocation.zipCode !== null && + store.getters.payment.isInsurance !== null + ); } else { - if ( - store.getters.lineItems.supportingItems && - store.getters.order.serviceLocation.zipCode - ) { - return true; - } else { - return false; - } + return ( + store.getters.lineItems.supportingItems !== null && + store.getters.order.serviceLocation.zipCode !== null && + store.getters.payment.isInsurance !== null + ); } }, setData(zipCodeData, serviceabilityDetails, mobileFeePart, shopProviderData) { diff --git a/src/layouts/vehicle-damage/vehicle-damage.spec.js b/src/layouts/vehicle-damage/vehicle-damage.spec.js index 36f694d5e..1a2939d3d 100644 --- a/src/layouts/vehicle-damage/vehicle-damage.spec.js +++ b/src/layouts/vehicle-damage/vehicle-damage.spec.js @@ -728,7 +728,6 @@ describe("vehicle-damage.vue", () => { getters: { vehicle: {}, payment: { insuranceCoverage: { isVerified: true } }, - requiresVerifiedRedirecting: true, }, }, }, diff --git a/src/layouts/vehicle-damage/vehicle-damage.vue b/src/layouts/vehicle-damage/vehicle-damage.vue index ec19c3800..3b613ad3a 100644 --- a/src/layouts/vehicle-damage/vehicle-damage.vue +++ b/src/layouts/vehicle-damage/vehicle-damage.vue @@ -541,7 +541,7 @@ export default { return this.$route.params[this.routerParams.DISPLAY_VEHICLE_CHANGE_ALERT]; }, shouldHideBackButton() { - return this.$store.getters.requiresVerifiedRedirecting; + return this.$store.getters.payment.insuranceCoverage.isVerified; }, }, diff --git a/src/layouts/vehicle/vehicle.vue b/src/layouts/vehicle/vehicle.vue index 82dc54f22..e4a19d335 100644 --- a/src/layouts/vehicle/vehicle.vue +++ b/src/layouts/vehicle/vehicle.vue @@ -348,7 +348,7 @@ export default { isDisabled(options) { if ( !options.length || - store.getters.requiresVerifiedRedirecting || + store.getters.payment?.insuranceCoverage?.isVerified || getFunnelCookie()?.HasDelayedClaimRegistration ) { return true; diff --git a/src/layouts/vin-lookup/vin-lookup.spec.js b/src/layouts/vin-lookup/vin-lookup.spec.js index 39aa0f008..1d7d3f493 100644 --- a/src/layouts/vin-lookup/vin-lookup.spec.js +++ b/src/layouts/vin-lookup/vin-lookup.spec.js @@ -22,7 +22,6 @@ jest.mock("@/store", () => ({ customer: { emailAddress: "builddigitaltest@safelite.com", }, - referralNumber: "666666", }, payment: { insuranceCoverage: { diff --git a/src/router/index.js b/src/router/index.js index 2ce833135..90ac5881b 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -116,22 +116,6 @@ const routes = [ } } - // Reroute around pages that should not be available. - - // Exception 1: Integrated Users should not see vehicle or quote pages. - if (store.getters.requiresVerifiedRedirecting) { - if (to.query.fmgPage === fmgPageValues.VEHICLE) { - to.query.fmgPage = fmgPageValues.VEHICLE_DAMAGE; - } else if ( - to.query.fmgPage === fmgPageValues.QUOTE || - to.query.fmgPage === fmgPageValues.INSURANCE_COMPANY - ) { - // Push to heritage if going to quote & integrated. - await navigateToHeritageFunnel({ shouldSaveSession: false }); - return next(false); - } - } - await runExperiments(to.query.fmgPage); // Process funnel cookie. @@ -160,7 +144,6 @@ const routes = [ if (!isExistingFmgPageName(to.query.fmgPage)) { console.log("Not an existing fmg page name:" + to.query.fmgPage); GoToFunnelStartOn404(next); - return; } // Get route info for the given url. Names will have a 1:1 relationship with names in the Cms. @@ -245,7 +228,7 @@ router.beforeEach(async (to, from, next) => { // Refresh page if navigating to self to prevent locking. // For now only carved out for vehicle; all modals are opened through anchor tags at the moment, // which also self navigate, but relied on the page remaining the same on self-navigation. - } else if (toQueryPage === fromQueryPage && toQueryPage === getRedirectedStartPage()) { + } else if (toQueryPage === fromQueryPage && toQueryPage === funnelStartPageName) { router.go(0); } else { next(); @@ -494,7 +477,7 @@ async function DisplayPageError() { // we use the pageError querystring as a counter to how many times a user has experienced an error and been routed here. // once they receive more than 1 pageerrors, we'll reset their state to hopefully correct any issues they may be having. var navPage = fmgPageValues.VEHICLE; - if (store.getters.requiresVerifiedRedirecting) { + if (store.getters.payment.insuranceCoverage.isVerified) { navPage = fmgPageValues.VEHICLE_DAMAGE; } @@ -559,12 +542,4 @@ async function runExperiments(nextPage) { ); } -function getRedirectedStartPage() { - if (store.getters.requiresVerifiedRedirecting) { - return fmgPageValues.VEHICLE_DAMAGE; - } else { - return funnelStartPageName; - } -} - export default router; diff --git a/src/store/index.js b/src/store/index.js index 5d142a1f9..64a7518d9 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -33,8 +33,7 @@ import { } from "@/helpers/promotions-helper"; import { getDateDifferenceInDays } from "@/helpers/date-helper"; import sharedMutations from "./vuex-shared-mutations/vuexSharedMutations"; -import { coverageStatus, coverageStatusValue } from "@/constants/insurance"; - +import { coverageStatus, coverageStatusValue } from "@/constants/coverage-status"; // Export State const getDefaultState = () => { return { @@ -776,9 +775,6 @@ export const getters = { } return false; }, - requiresVerifiedRedirecting: (state) => { - return state.order?.referralNumber?.length === 6; - }, }; function getNonFalseValuesOfPropertyInArrayOfObjects(array, propertyName) { @@ -1386,9 +1382,7 @@ export const actions = { getMobileFeePart(context, { pageNameToLog }) { const damageType = context.getters.damage.isRepair ? "Repair" : "Replace"; const parentAccountNumber = context.getters.payment.parentAccountNumber; - const billToAccountNumber = context.getters.payment.billToAccountNumber - ? context.getters.payment.billToAccountNumber - : applicationConfig.CASH_DEFAULT_BILL_TO_ACCOUNT_NUMBER; + const billToAccountNumber = context.getters.payment.billToAccountNumber; return globalMethods.callHttpClient({ method: endpoints.GetMobileFeePart.method, From 9eafbe6f2121790583af454e304eb470ce73102d Mon Sep 17 00:00:00 2001 From: Sneha Date: Mon, 20 May 2024 19:24:43 +0530 Subject: [PATCH 13/17] Reapply "Merge branch 'develop' into feature/CSR-1994" This reverts commit 5c16471169dcd1b7a3c8725240b7763c2a7f95b4. --- src/constants/coverage-status.js | 20 ----- src/constants/experiments.js | 1 - src/constants/insurance.js | 30 +++++++ src/constants/pay-with-insurance-states.js | 1 - src/constants/tint-mapper.js | 1 + src/fmg-components/cart/cart.vue | 89 +++++++++++-------- .../heritage-integration/navigation-helper.js | 19 +--- .../navigation-helper.spec.js | 18 ++-- src/layouts/confirmation/confirmation.vue | 2 +- src/layouts/estimate/estimate.vue | 2 - .../insurance-company-question.vue | 45 ++++++---- .../insurance-company/insurance-company.vue | 19 +++- src/layouts/payment-method/payment-method.vue | 12 +-- src/layouts/payment/payment.vue | 2 +- src/layouts/quote/quote.vue | 2 +- .../appointment-type-question.vue | 13 ++- .../mobile-location-modal-questions.vue | 2 + .../service-location/service-location.vue | 40 ++++++--- .../vehicle-damage/vehicle-damage.spec.js | 1 + src/layouts/vehicle-damage/vehicle-damage.vue | 2 +- src/layouts/vehicle/vehicle.vue | 2 +- src/layouts/vin-lookup/vin-lookup.spec.js | 1 + src/router/index.js | 29 +++++- src/store/index.js | 10 ++- 24 files changed, 229 insertions(+), 134 deletions(-) delete mode 100644 src/constants/coverage-status.js create mode 100644 src/constants/insurance.js delete mode 100644 src/constants/pay-with-insurance-states.js diff --git a/src/constants/coverage-status.js b/src/constants/coverage-status.js deleted file mode 100644 index 1c75c00a6..000000000 --- a/src/constants/coverage-status.js +++ /dev/null @@ -1,20 +0,0 @@ -const coverageStatus = { - PENDING: "Pending", - NOCOMP: "NoComp", - VERIFIED: "Verified", -}; - -export function coverageStatusValue(intCoverageStatus) { - switch (intCoverageStatus) { - case 0: - return coverageStatus.PENDING; - case 1: - return coverageStatus.NOCOMP; - case 2: - return coverageStatus.VERIFIED; - default: - return null; - } -} - -export { coverageStatus }; diff --git a/src/constants/experiments.js b/src/constants/experiments.js index eb7fed508..ee83ec447 100644 --- a/src/constants/experiments.js +++ b/src/constants/experiments.js @@ -4,7 +4,6 @@ const experimentUniverses = { const experimentSettings = { GOOGLE_CUSTOM_DIMENSION_INDEX: "Google Custom Dimension Index", - SUPPRESS_VIN_CAPTURE: "SuppressVinCapture", DISPLAY_AVAILABILITY_INDICATORS: "DisplayAvailabilityIndicators", PIA_EXPERIENCE: "PIA Experience", PIA_INSURANCE: "DisplayPIAInsurance", diff --git a/src/constants/insurance.js b/src/constants/insurance.js new file mode 100644 index 000000000..2574fdbc6 --- /dev/null +++ b/src/constants/insurance.js @@ -0,0 +1,30 @@ +import { cartItemTypes } from "@/constants/cart-item-types"; + +export const payWithInsuranceStates = ["AZ", "CT", "FL", "KY", "MA", "MN", "NY", "SC"]; + +export const cartItemTypesCoveredByInsurance = [ + cartItemTypes.GLASS_PARTS, + cartItemTypes.SUPPORTING_ITEMS, + cartItemTypes.RECYCLE_FEE, + cartItemTypes.REPLACE_FEE, + cartItemTypes.SUPPLIES_REPAIR, +]; + +export const coverageStatus = { + PENDING: "Pending", + NOCOMP: "NoComp", + VERIFIED: "Verified", +}; + +export function coverageStatusValue(intCoverageStatus) { + switch (intCoverageStatus) { + case 0: + return coverageStatus.PENDING; + case 1: + return coverageStatus.NOCOMP; + case 2: + return coverageStatus.VERIFIED; + default: + return null; + } +} diff --git a/src/constants/pay-with-insurance-states.js b/src/constants/pay-with-insurance-states.js deleted file mode 100644 index e65589557..000000000 --- a/src/constants/pay-with-insurance-states.js +++ /dev/null @@ -1 +0,0 @@ -export const payWithInsuranceStates = ["AZ", "CT", "FL", "KY", "MA", "MN", "NY", "SC"]; diff --git a/src/constants/tint-mapper.js b/src/constants/tint-mapper.js index 519de0855..c290dd1db 100644 --- a/src/constants/tint-mapper.js +++ b/src/constants/tint-mapper.js @@ -33,6 +33,7 @@ const tintMap = { { name: "green tint", src: "Glass-NoShade-GreenTint.svg" }, { name: "gray tint privacy", src: "Glass-NoShade-GrayTint.svg" }, { name: "blue tint", src: "Glass-NoShade-BlueTint.svg" }, + { name: "green tint privacy", src: "Glass-NoShade-Privacy.svg" }, // No shade or tint { name: "clear", src: "Glass-NoShade-NoTint.svg" }, diff --git a/src/fmg-components/cart/cart.vue b/src/fmg-components/cart/cart.vue index 9a0f1b876..a8227036a 100644 --- a/src/fmg-components/cart/cart.vue +++ b/src/fmg-components/cart/cart.vue @@ -11,9 +11,7 @@ class="col d-flex justify-content-between py-0"> {{ amountDueText }} {{ - showCoverageAsPending - ? verifyingCoverageText - : getFormattedAmount("", amountDue) + getLineItemAmount(amountDue, showCoverageAsPending) }} @@ -24,9 +22,10 @@ {{ - showCoverageAsPending - ? verifyingCoverageText - : getFormattedAmount("", deductibleLineItem.subTotal) + getLineItemAmount( + deductibleLineItem.subTotal, + showCoverageAsPending + ) }} @@ -35,12 +34,12 @@
- {{ getFormattedAmount("", packagePrice) }} + {{ getLineItemAmount(packagePrice) }} - {{ getFormattedAmount("", packagePriceWithoutDiscount) }} + {{ getLineItemAmount(packagePriceWithoutDiscount) }}
@@ -101,7 +100,7 @@ (showCoverageAsVerified && !cartItem.isCoveredByInsurance) " >{{ - getFormattedAmount(cartItem.category, Math.abs(cartItem.subTotal)) + getLineItemAmount(cartItem.subTotal, null, cartItem.category) }} @@ -109,27 +108,19 @@
{{ subtotalText }} - {{ - showCoverageAsPending - ? verifyingCoverageText - : getFormattedAmount("", subTotal) - }} + {{ getLineItemAmount(subTotal, showCoverageAsPending) }}
{{ salesTaxText }} - {{ getFormattedAmount("", salesTax) }} + {{ getLineItemAmount(salesTax) }}
- {{ amountPaidText }}{{ getFormattedAmount("", amountPaid) }} + {{ amountPaidText }} + {{ getLineItemAmount(amountPaid) }}
{{ amountDueText }} - {{ - showCoverageAsPending - ? verifyingCoverageText - : getFormattedAmount("", amountDue) - }} + {{ getLineItemAmount(amountDue, showCoverageAsPending) }}
lineItemsToKeep.cartItemType != cartItemType @@ -535,7 +529,9 @@ export default { subTotal: 0, salesTax: 0, lineItems: [], - isCoveredByInsurance: false, + isCoveredByInsurance: cartItemTypesCoveredByInsurance.includes( + cartItemTypes.FRONT_WIPERS + ), }; frontWiperLineItems.forEach((lineItem) => { @@ -573,7 +569,9 @@ export default { subTotal: 0, salesTax: 0, lineItems: [], - isCoveredByInsurance: false, + isCoveredByInsurance: cartItemTypesCoveredByInsurance.includes( + cartItemTypes.REAR_WIPERS + ), }; rearWiperLineItems.forEach((lineItem) => { @@ -611,7 +609,9 @@ export default { subTotal: 0, salesTax: 0, lineItems: [], - isCoveredByInsurance: false, + isCoveredByInsurance: cartItemTypesCoveredByInsurance.includes( + cartItemTypes.RAIN_DEFENSE + ), }; rainDefenseLineItem.cartItemType = cartItem.cartItemType; @@ -632,7 +632,7 @@ export default { if (this.glassParts.length > 0) { this.glassParts.forEach((lineItem) => { - let glassPartCartItem = { + let cartItem = { name: null, category: cartItemCategories.GLASS_PARTS, cartItemType: cartItemTypes.GLASS_PARTS, @@ -642,24 +642,25 @@ export default { (lineItem.kitPrice ?? 0) + (lineItem.laborAmount ?? 0) + (lineItem.sellingPrice ?? 0), - salesTax: lineItem.salesTax ?? 0, lineItems: [], - isCoveredByInsurance: true, + isCoveredByInsurance: cartItemTypesCoveredByInsurance.includes( + cartItemTypes.GLASS_PARTS + ), }; if (lineItem.childParts?.length > 0) { lineItem.childParts.forEach((childPartLineItem) => { - glassPartCartItem.subTotal += + cartItem.subTotal += (childPartLineItem.kitPrice ?? 0) + (childPartLineItem.laborAmount ?? 0) + (childPartLineItem.sellingPrice ?? 0); - glassPartCartItem.salesTax += childPartLineItem.salesTax; + cartItem.salesTax += childPartLineItem.salesTax; }); } - glassPartCartItems.push(glassPartCartItem); + glassPartCartItems.push(cartItem); }); } @@ -685,7 +686,9 @@ export default { subTotal: 0, salesTax: 0, lineItems: [], - isCoveredByInsurance: true, + isCoveredByInsurance: cartItemTypesCoveredByInsurance.includes( + cartItemTypes.REPLACE_FEE + ), }; recycleFeeLineItem.cartItemType = cartItem.cartItemType; @@ -723,7 +726,9 @@ export default { subTotal: 0, salesTax: 0, lineItems: [], - isCoveredByInsurance: true, + isCoveredByInsurance: cartItemTypesCoveredByInsurance.includes( + cartItemTypes.SUPPLIES_REPAIR + ), }; suppliesRepairLineItem.cartItemType = cartItem.cartItemType; @@ -759,7 +764,9 @@ export default { subTotal: 0, salesTax: 0, lineItems: [], - isCoveredByInsurance: false, + isCoveredByInsurance: cartItemTypesCoveredByInsurance.includes( + cartItemTypes.MOBILE_FEE + ), }; mobileFeeLineItem.cartItemType = cartItem.cartItemType; @@ -838,7 +845,9 @@ export default { subTotal: 0, salesTax: 0, lineItems: [], - isCoveredByInsurance: true, + isCoveredByInsurance: cartItemTypesCoveredByInsurance.includes( + cartItemTypes.SUPPORTING_ITEMS + ), }; otherSupportingItemsLineItems.forEach((lineItem) => { @@ -876,7 +885,9 @@ export default { subTotal: 0, salesTax: 0, lineItems: [], - isCoveredByInsurance: false, + isCoveredByInsurance: cartItemTypesCoveredByInsurance.includes( + cartItemTypes.EARLY_BIRD + ), }; premiumAppointmentDiscountLineItem.cartItemType = cartItem.cartItemType; @@ -922,7 +933,7 @@ export default { subTotal: 0, salesTax: 0, lineItems: [], - isCoveredByInsurance: false, + isCoveredByInsurance: cartItemTypesCoveredByInsurance.includes(promoCode), }; promoLineItems.forEach((promoLineItem) => { diff --git a/src/helpers/heritage-integration/navigation-helper.js b/src/helpers/heritage-integration/navigation-helper.js index cb3844bfc..a0d3bb92c 100644 --- a/src/helpers/heritage-integration/navigation-helper.js +++ b/src/helpers/heritage-integration/navigation-helper.js @@ -5,9 +5,6 @@ import { lazyLoadComponent } from "@/router/dynamic-routing/component-loader.js" import { saveSession } from "@/helpers/heritage-integration/order-helper.js"; import { fmgPageValues } from "@/router/router-constants/fmgPage-values"; import { storeActions } from "@/constants/store-actions.js"; -import { settleAllPromises } from "@/helpers/layout-helper"; -import experimentMixin from "@/mixins/experiment-mixin"; -import { experimentSettings } from "@/constants/experiments"; import { includesWindshieldReplacement } from "@/helpers/damage-helper"; import store from "@/store"; import router from "@/router"; @@ -33,7 +30,7 @@ export async function getDirectNavigation(toRoute) { // vehicle -> vehicle-damage // quote -> vin-lookup/estimate // insurance-company -> vin-lookup/estimate - if (store.getters.payment.insuranceCoverage.isVerified) { + if (store.getters.requiresVerifiedRedirecting) { if (fmgPageValue === fmgPageValues.VEHICLE) { return fmgPageValues.VEHICLE_DAMAGE; } @@ -77,7 +74,7 @@ export async function getImplicitNavigation(toRoute) { if (quoteComponent.methods.arePagePrerequisitesValid()) { // Do not send to quote if verified insurance user. - if (store.getters.payment.insuranceCoverage.isVerified) { + if (store.getters.requiresVerifiedRedirecting) { return fmgPageValues.HERITAGE; } else { return fmgPageValues.QUOTE; @@ -142,11 +139,7 @@ export async function skipVinLookup() { ? await store.dispatch(storeActions.IS_VIN_OPTIONAL_VEHICLE) : false; - return ( - isVinOptionalVehicle || - !includesWindshieldReplacement() || - experimentMixin.methods.hasSettingEqualTo(experimentSettings.SUPPRESS_VIN_CAPTURE, "true") - ); + return isVinOptionalVehicle || !includesWindshieldReplacement(); } export async function skipVinLookupNotRepair() { @@ -158,11 +151,7 @@ export async function skipVinLookupNotRepair() { ? await store.dispatch(storeActions.IS_VIN_OPTIONAL_VEHICLE) : false; - return ( - isVinOptionalVehicle || - !includesWindshieldReplacement() || - experimentMixin.methods.hasSettingEqualTo(experimentSettings.SUPPRESS_VIN_CAPTURE, "true") - ); + return isVinOptionalVehicle || !includesWindshieldReplacement(); } async function getLazyLoadedComponent(pageName) { diff --git a/src/helpers/heritage-integration/navigation-helper.spec.js b/src/helpers/heritage-integration/navigation-helper.spec.js index 963a6434c..671a1b46e 100644 --- a/src/helpers/heritage-integration/navigation-helper.spec.js +++ b/src/helpers/heritage-integration/navigation-helper.spec.js @@ -115,16 +115,6 @@ describe("getPageToRouteExistingOrderTo", () => { store.commit(storeMutations.UPDATE_IS_REPAIR, false); store.commit(storeMutations.UPDATE_MAKE, "acura"); - const mockExperimentsList = [ - { - universeName: "ConceptFunnel", - settings: { - SuppressVinCapture: false, - }, - }, - ]; - store.commit(storeMutations.UPDATE_EXPERIMENTS, mockExperimentsList); - // Mock out the lazy load calls for all components. mockLazyLoadComponentReturnValues({ [fmgPageValues.VEHICLE]: true, @@ -371,6 +361,7 @@ describe("getPageToRouteExistingOrderTo", () => { }; store.commit(storeMutations.UPDATE_IS_VERIFIED_INSURANCE, true); + store.commit(storeMutations.UPDATE_REFERRAL_NUMBER, "666666"); // Act const result = await getPageToRouteExistingOrderTo(toRoute); @@ -389,6 +380,7 @@ describe("getPageToRouteExistingOrderTo", () => { }; store.commit(storeMutations.UPDATE_IS_VERIFIED_INSURANCE, true); + store.commit(storeMutations.UPDATE_REFERRAL_NUMBER, "666666"); store.commit(storeMutations.UPDATE_IS_REPAIR, true); store.commit(storeMutations.UPDATE_MAKE, "acura"); @@ -408,6 +400,7 @@ describe("getPageToRouteExistingOrderTo", () => { }; store.commit(storeMutations.UPDATE_IS_VERIFIED_INSURANCE, true); + store.commit(storeMutations.UPDATE_REFERRAL_NUMBER, "666666"); store.commit(storeMutations.UPDATE_IS_REPAIR, true); store.commit(storeMutations.UPDATE_MAKE, "acura"); @@ -429,6 +422,7 @@ describe("getPageToRouteExistingOrderTo", () => { }; store.commit(storeMutations.UPDATE_IS_VERIFIED_INSURANCE, true); + store.commit(storeMutations.UPDATE_REFERRAL_NUMBER, "666666"); store.commit(storeMutations.UPDATE_IS_REPAIR, false); store.commit(storeMutations.UPDATE_MAKE, "acura"); store.commit(storeMutations.UPDATE_GLASS_TO_REPLACE, [ @@ -451,6 +445,7 @@ describe("getPageToRouteExistingOrderTo", () => { }; store.commit(storeMutations.UPDATE_IS_VERIFIED_INSURANCE, true); + store.commit(storeMutations.UPDATE_REFERRAL_NUMBER, "666666"); store.commit(storeMutations.UPDATE_IS_REPAIR, false); store.commit(storeMutations.UPDATE_MAKE, "acura"); store.commit(storeMutations.UPDATE_GLASS_TO_REPLACE, [ @@ -476,6 +471,7 @@ describe("getPageToRouteExistingOrderTo", () => { }; store.commit(storeMutations.UPDATE_IS_VERIFIED_INSURANCE, false); + store.commit(storeMutations.UPDATE_REFERRAL_NUMBER, "55555"); // Act const result = await getPageToRouteExistingOrderTo(toRoute); @@ -493,6 +489,7 @@ describe("getPageToRouteExistingOrderTo", () => { }; store.commit(storeMutations.UPDATE_IS_VERIFIED_INSURANCE, false); + store.commit(storeMutations.UPDATE_REFERRAL_NUMBER, "55555"); // Act const result = await getPageToRouteExistingOrderTo(toRoute); @@ -510,6 +507,7 @@ describe("getPageToRouteExistingOrderTo", () => { }; store.commit(storeMutations.UPDATE_IS_VERIFIED_INSURANCE, false); + store.commit(storeMutations.UPDATE_REFERRAL_NUMBER, "55555"); // Act const result = await getPageToRouteExistingOrderTo(toRoute); diff --git a/src/layouts/confirmation/confirmation.vue b/src/layouts/confirmation/confirmation.vue index 1947bec22..39da072a3 100644 --- a/src/layouts/confirmation/confirmation.vue +++ b/src/layouts/confirmation/confirmation.vue @@ -96,7 +96,7 @@ import { convertDateStringToDate } from "@/layouts/schedule/helpers/schedule-hel import { deepClone } from "@/helpers/object-helper"; import { Form } from "vee-validate"; import { get12HourTimeFormat, get12HourTimeMobileFormat } from "@/helpers/date-helper"; -import { coverageStatus } from "@/constants/coverage-status"; +import { coverageStatus } from "@/constants/insurance"; export default { name: "confirmation", diff --git a/src/layouts/estimate/estimate.vue b/src/layouts/estimate/estimate.vue index 9c2ce4caf..b298132ca 100644 --- a/src/layouts/estimate/estimate.vue +++ b/src/layouts/estimate/estimate.vue @@ -112,8 +112,6 @@ import { skipVinLookup, skipVinLookupNotRepair, } from "@/helpers/heritage-integration/navigation-helper"; -import experimentMixin from "@/mixins/experiment-mixin"; -import { experimentSettings } from "@/constants/experiments"; import vinPagesMixin from "@/mixins/vin-pages-mixin"; import { navigateToHeritageFunnel } from "@/helpers/heritage-integration/navigation-helper"; import { saveSession } from "@/helpers/heritage-integration/order-helper.js"; diff --git a/src/layouts/insurance-company/insurance-company-question.vue b/src/layouts/insurance-company/insurance-company-question.vue index 49e1eb8c8..f8f7bbc6a 100644 --- a/src/layouts/insurance-company/insurance-company-question.vue +++ b/src/layouts/insurance-company/insurance-company-question.vue @@ -96,15 +96,29 @@ export default { findMatches(request, response) { const matches = []; const term = request?.term?.toUpperCase(); + const nonPriorityMatches = []; + this.searchableInsuranceCompanyList.forEach((company, index) => { if ( - company.accountName.indexOf(term) !== -1 || - company.altTerms.indexOf(term) !== -1 + company.accountName.toUpperCase().indexOf(term) !== -1 || + company.altTerms.toUpperCase().indexOf(term) !== -1 ) { matches.push(company.accountName); } }); - response(matches); + + // Prioritize matched typed entries to top of list + const priorityMatches = matches.filter((companyName, index) => { + if (companyName.toUpperCase().indexOf(term) === 0) { + return companyName; + } else { + nonPriorityMatches.push(companyName); + } + }); + + const prioritizedMatches = [...priorityMatches, ...nonPriorityMatches]; + + response(prioritizedMatches); }, selectInsuranceCompany(parentAccountName) { // this runs upon user selection within jQueryUI Autocomplete @@ -112,9 +126,14 @@ export default { console.error("No insurance companies found"); return; } - const parentAccountNumber = this.getParentAccountNumber(parentAccountName); - this.selectedAccountNumber = parentAccountNumber; - this.selectedAccountName = this.getParentAccountName(parentAccountNumber); + if (parentAccountName) { + const parentAccountNumber = this.getParentAccountNumber(parentAccountName); + this.selectedAccountNumber = parentAccountNumber; + this.selectedAccountName = this.getParentAccountName(parentAccountNumber); + } else { + this.selectedAccountNumber = ""; + this.selectedAccountName = ""; + } }, }, mounted() { @@ -131,20 +150,12 @@ export default { }, minLength: 0, // Necessary to display fmenu when clearing input - // Bold matching letters as you type in the input - search: function (event, ui) { - setTimeout(() => { - let w = $(this).autocomplete("widget").find("div"); - let regExpString = "(" + this.value + ")"; - let re = new RegExp(regExpString, "i"); - w.html((i, html) => - html.replace(re, "$1") - ); - }, 5); - }, select: function (event, ui) { select(ui.item.value); }, + change: function (event, ui) { + select(ui?.item?.value); + }, }); }, 0); }, diff --git a/src/layouts/insurance-company/insurance-company.vue b/src/layouts/insurance-company/insurance-company.vue index 55a8149e3..a15de8311 100644 --- a/src/layouts/insurance-company/insurance-company.vue +++ b/src/layouts/insurance-company/insurance-company.vue @@ -20,7 +20,7 @@
@@ -44,7 +44,7 @@ import { storeActions } from "@/constants/store-actions"; import { Form, defineRule } from "vee-validate"; import baseMixin from "@/mixins/base-mixin.js"; import { navigateToHeritageFunnel } from "@/helpers/heritage-integration/navigation-helper"; - +import { applicationConfig } from "@/constants/application-config"; import store from "@/store"; export default { @@ -84,9 +84,22 @@ export default { originalList: [], }; }, + computed: { + isParentAccountNumber() { + return !!this.parentAccountNumber; + }, + }, methods: { + isCashParentAccountNumber() { + return ( + applicationConfig.CASH_PARENT_ACCOUNT_NUMBER.toString() === + store.getters.order?.payment?.parentAccountNumber.toString() + ); + }, parentAccountNumberFromStore() { - const accountNumber = store.getters.order?.payment?.parentAccountNumber.toString(); + const accountNumber = !this.isCashParentAccountNumber() + ? store.getters.order?.payment?.parentAccountNumber.toString() + : ""; return accountNumber; }, arePagePrerequisitesValid() { diff --git a/src/layouts/payment-method/payment-method.vue b/src/layouts/payment-method/payment-method.vue index 07414ae7d..0910920a9 100644 --- a/src/layouts/payment-method/payment-method.vue +++ b/src/layouts/payment-method/payment-method.vue @@ -113,7 +113,7 @@ import { errorMessages } from "@/constants/error-messages"; import { AppointmentTypeStrings } from "@/constants/schedule-constants"; import { partTypeStrings } from "@/constants/part-type-strings"; import { mapTaxedLineItemsToStoreFormat } from "../../store"; -import { coverageStatus } from "@/constants/coverage-status"; +import { coverageStatus } from "@/constants/insurance"; defineRule("option-required", required(errorMessages.OPTION_REQUIRED)); @@ -559,10 +559,12 @@ export default { const piaExperience = this.getSettingValue(experimentSettings.PIA_EXPERIENCE); const piaInsurance = this.getSettingValue(experimentSettings.PIA_INSURANCE); - const isEnabled = - piaExperience === "PIA Optional" || - piaExperience === "PIA Required" || - piaInsurance === "true"; + var isEnabled = false; + if (this.isInsurance) { + isEnabled = piaInsurance === "true" && this.currentDeductible !== 0; + } else { + isEnabled = piaExperience === "PIA Optional" || piaExperience === "PIA Required"; + } return !isEnabled; }, diff --git a/src/layouts/payment/payment.vue b/src/layouts/payment/payment.vue index 90378efea..e21780181 100644 --- a/src/layouts/payment/payment.vue +++ b/src/layouts/payment/payment.vue @@ -224,7 +224,7 @@ import { deepClone } from "@/helpers/object-helper"; import { submitWorkOrder } from "@/helpers/heritage-integration/order-helper.js"; import iframeResize from "../../../node_modules/iframe-resizer/js/iframeResizer.js"; import { routerParams } from "@/router/router-constants/router-params"; -import { coverageStatus } from "@/constants/coverage-status"; +import { coverageStatus } from "@/constants/insurance"; export default { name: "payment", diff --git a/src/layouts/quote/quote.vue b/src/layouts/quote/quote.vue index f7e82156a..bf36b7d06 100644 --- a/src/layouts/quote/quote.vue +++ b/src/layouts/quote/quote.vue @@ -98,7 +98,7 @@ import { required } from "@/helpers/validation-rules"; import { errorMessages } from "@/constants/error-messages"; import { Form, defineRule } from "vee-validate"; import { applicationConfig } from "@/constants/application-config"; -import { payWithInsuranceStates } from "@/constants/pay-with-insurance-states"; +import { payWithInsuranceStates } from "@/constants/insurance"; import { revalidatePromosAndValidateQueryStringPromo, buildToastMessagesFromRevalidateOrValidatePromoResponse, diff --git a/src/layouts/service-location/appointment-type-question/appointment-type-question.vue b/src/layouts/service-location/appointment-type-question/appointment-type-question.vue index ca452ac01..64bf159ff 100644 --- a/src/layouts/service-location/appointment-type-question/appointment-type-question.vue +++ b/src/layouts/service-location/appointment-type-question/appointment-type-question.vue @@ -32,6 +32,7 @@ export default { cmsWidgetName: String, isServiceableMobile: Boolean, isServiceableInshop: Boolean, + mobileFeeApplies: Boolean, }, computed: { questionText() { @@ -45,7 +46,8 @@ export default { const shouldShowInshop = this.isServiceableInshop; const shouldShowDropoff = this.isServiceableInshop && !this.$store.getters.damage.isRepair; - return this.answersFromCms + + var answers = this.answersFromCms ? this.answersFromCms.filter((answer) => { return ( (answer.Name == AppointmentTypeStrings.IN_SHOP && shouldShowInshop) || @@ -54,6 +56,15 @@ export default { ); }) : []; + + if (!this.mobileFeeApplies) { + answers.forEach((item) => { + if (item.Name.toLowerCase() === "mobile") { + item.SubText = item.SubText.replace("*", ""); + } + }); + } + return answers; }, selectedValue: { get: function () { diff --git a/src/layouts/service-location/mobile-location-modal-questions/mobile-location-modal-questions.vue b/src/layouts/service-location/mobile-location-modal-questions/mobile-location-modal-questions.vue index debc25f89..4558c3294 100644 --- a/src/layouts/service-location/mobile-location-modal-questions/mobile-location-modal-questions.vue +++ b/src/layouts/service-location/mobile-location-modal-questions/mobile-location-modal-questions.vue @@ -25,6 +25,7 @@ @@ -153,6 +154,7 @@ export default { alertInvalidZipWidgetName: String, customComponentId: String, validationRules: String, + mobileFeeApplies: Boolean, }, computed: { mobileLocationLinkPromptText() { diff --git a/src/layouts/service-location/service-location.vue b/src/layouts/service-location/service-location.vue index 89b3320fd..b83db7ebc 100644 --- a/src/layouts/service-location/service-location.vue +++ b/src/layouts/service-location/service-location.vue @@ -67,6 +67,7 @@ :isServiceableMobile="isServiceableMobile" :isServiceableInshop="isServiceableInshop" :isDisplayed="isAppointmentTypeDisplayed" + :mobileFeeApplies="mobileFeeApplies" ref="appointmentTypeQuestion" groupName="appointmentTypeQuestion" cmsWidgetName="AppointmentTypeQuestionWidget" @@ -80,6 +81,7 @@ v-if="selectedAppointmentType === 'Mobile'" v-model="mobileLocationQuestions" :mobileFeePart="mobileFeePart" + :mobileFeeApplies="mobileFeeApplies" @updated-mobile-fee-part="setMobileFeePart" @updated-serviceability="setServiceabilityDetails" @updated-contains-military-base="setContainsMilitaryBase" @@ -139,7 +141,7 @@ import { getShopProviderData, } from "@/layouts/service-location/helpers/service-location-helper/service-location-helper"; import { navigateToHeritageFunnel } from "@/helpers/heritage-integration/navigation-helper"; - +import { applicationConfig } from "@/constants/application-config"; import { Provider } from "@/layouts/service-location/classes/provider"; import store from "@/store"; @@ -300,6 +302,13 @@ export default { return this.isGlassServiceableMobile; } }, + mobileFeeApplies() { + if (this.mobileFeePart) { + return true; + } else { + return false; + } + }, isServiceableInshop() { if (this.isRecalibrationServiceableInshop !== null) { return this.isGlassServiceableInshop && this.isRecalibrationServiceableInshop; @@ -350,17 +359,26 @@ export default { methods: { arePagePrerequisitesValid() { // insurance drops the recycle fee on replace orders so it won't be in supportingItems - if (store.getters.payment.isInsurance && !store.getters.order.damage.isRepair) { - return ( - store.getters.order.serviceLocation.zipCode !== null && - store.getters.payment.isInsurance !== null - ); + if (store.getters.payment.isInsurance) { + if ( + store.getters.payment.parentAccountNumber !== + applicationConfig.CASH_PARENT_ACCOUNT_NUMBER && + store.getters.order.policy.policyNumber && + store.getters.order.serviceLocation.zipCode + ) { + return true; + } else { + return false; + } } else { - return ( - store.getters.lineItems.supportingItems !== null && - store.getters.order.serviceLocation.zipCode !== null && - store.getters.payment.isInsurance !== null - ); + if ( + store.getters.lineItems.supportingItems && + store.getters.order.serviceLocation.zipCode + ) { + return true; + } else { + return false; + } } }, setData(zipCodeData, serviceabilityDetails, mobileFeePart, shopProviderData) { diff --git a/src/layouts/vehicle-damage/vehicle-damage.spec.js b/src/layouts/vehicle-damage/vehicle-damage.spec.js index 1a2939d3d..36f694d5e 100644 --- a/src/layouts/vehicle-damage/vehicle-damage.spec.js +++ b/src/layouts/vehicle-damage/vehicle-damage.spec.js @@ -728,6 +728,7 @@ describe("vehicle-damage.vue", () => { getters: { vehicle: {}, payment: { insuranceCoverage: { isVerified: true } }, + requiresVerifiedRedirecting: true, }, }, }, diff --git a/src/layouts/vehicle-damage/vehicle-damage.vue b/src/layouts/vehicle-damage/vehicle-damage.vue index 3b613ad3a..ec19c3800 100644 --- a/src/layouts/vehicle-damage/vehicle-damage.vue +++ b/src/layouts/vehicle-damage/vehicle-damage.vue @@ -541,7 +541,7 @@ export default { return this.$route.params[this.routerParams.DISPLAY_VEHICLE_CHANGE_ALERT]; }, shouldHideBackButton() { - return this.$store.getters.payment.insuranceCoverage.isVerified; + return this.$store.getters.requiresVerifiedRedirecting; }, }, diff --git a/src/layouts/vehicle/vehicle.vue b/src/layouts/vehicle/vehicle.vue index e4a19d335..82dc54f22 100644 --- a/src/layouts/vehicle/vehicle.vue +++ b/src/layouts/vehicle/vehicle.vue @@ -348,7 +348,7 @@ export default { isDisabled(options) { if ( !options.length || - store.getters.payment?.insuranceCoverage?.isVerified || + store.getters.requiresVerifiedRedirecting || getFunnelCookie()?.HasDelayedClaimRegistration ) { return true; diff --git a/src/layouts/vin-lookup/vin-lookup.spec.js b/src/layouts/vin-lookup/vin-lookup.spec.js index 1d7d3f493..39aa0f008 100644 --- a/src/layouts/vin-lookup/vin-lookup.spec.js +++ b/src/layouts/vin-lookup/vin-lookup.spec.js @@ -22,6 +22,7 @@ jest.mock("@/store", () => ({ customer: { emailAddress: "builddigitaltest@safelite.com", }, + referralNumber: "666666", }, payment: { insuranceCoverage: { diff --git a/src/router/index.js b/src/router/index.js index 90ac5881b..2ce833135 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -116,6 +116,22 @@ const routes = [ } } + // Reroute around pages that should not be available. + + // Exception 1: Integrated Users should not see vehicle or quote pages. + if (store.getters.requiresVerifiedRedirecting) { + if (to.query.fmgPage === fmgPageValues.VEHICLE) { + to.query.fmgPage = fmgPageValues.VEHICLE_DAMAGE; + } else if ( + to.query.fmgPage === fmgPageValues.QUOTE || + to.query.fmgPage === fmgPageValues.INSURANCE_COMPANY + ) { + // Push to heritage if going to quote & integrated. + await navigateToHeritageFunnel({ shouldSaveSession: false }); + return next(false); + } + } + await runExperiments(to.query.fmgPage); // Process funnel cookie. @@ -144,6 +160,7 @@ const routes = [ if (!isExistingFmgPageName(to.query.fmgPage)) { console.log("Not an existing fmg page name:" + to.query.fmgPage); GoToFunnelStartOn404(next); + return; } // Get route info for the given url. Names will have a 1:1 relationship with names in the Cms. @@ -228,7 +245,7 @@ router.beforeEach(async (to, from, next) => { // Refresh page if navigating to self to prevent locking. // For now only carved out for vehicle; all modals are opened through anchor tags at the moment, // which also self navigate, but relied on the page remaining the same on self-navigation. - } else if (toQueryPage === fromQueryPage && toQueryPage === funnelStartPageName) { + } else if (toQueryPage === fromQueryPage && toQueryPage === getRedirectedStartPage()) { router.go(0); } else { next(); @@ -477,7 +494,7 @@ async function DisplayPageError() { // we use the pageError querystring as a counter to how many times a user has experienced an error and been routed here. // once they receive more than 1 pageerrors, we'll reset their state to hopefully correct any issues they may be having. var navPage = fmgPageValues.VEHICLE; - if (store.getters.payment.insuranceCoverage.isVerified) { + if (store.getters.requiresVerifiedRedirecting) { navPage = fmgPageValues.VEHICLE_DAMAGE; } @@ -542,4 +559,12 @@ async function runExperiments(nextPage) { ); } +function getRedirectedStartPage() { + if (store.getters.requiresVerifiedRedirecting) { + return fmgPageValues.VEHICLE_DAMAGE; + } else { + return funnelStartPageName; + } +} + export default router; diff --git a/src/store/index.js b/src/store/index.js index 64a7518d9..5d142a1f9 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -33,7 +33,8 @@ import { } from "@/helpers/promotions-helper"; import { getDateDifferenceInDays } from "@/helpers/date-helper"; import sharedMutations from "./vuex-shared-mutations/vuexSharedMutations"; -import { coverageStatus, coverageStatusValue } from "@/constants/coverage-status"; +import { coverageStatus, coverageStatusValue } from "@/constants/insurance"; + // Export State const getDefaultState = () => { return { @@ -775,6 +776,9 @@ export const getters = { } return false; }, + requiresVerifiedRedirecting: (state) => { + return state.order?.referralNumber?.length === 6; + }, }; function getNonFalseValuesOfPropertyInArrayOfObjects(array, propertyName) { @@ -1382,7 +1386,9 @@ export const actions = { getMobileFeePart(context, { pageNameToLog }) { const damageType = context.getters.damage.isRepair ? "Repair" : "Replace"; const parentAccountNumber = context.getters.payment.parentAccountNumber; - const billToAccountNumber = context.getters.payment.billToAccountNumber; + const billToAccountNumber = context.getters.payment.billToAccountNumber + ? context.getters.payment.billToAccountNumber + : applicationConfig.CASH_DEFAULT_BILL_TO_ACCOUNT_NUMBER; return globalMethods.callHttpClient({ method: endpoints.GetMobileFeePart.method, From 26cfd3f4048d097c3a251429b48812438997b6bc Mon Sep 17 00:00:00 2001 From: hiteshkumar87 Date: Mon, 20 May 2024 20:05:37 +0530 Subject: [PATCH 14/17] CSR-1994 servicePackageDiscountPart to availableline items --- src/layouts/quote/quote.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/layouts/quote/quote.vue b/src/layouts/quote/quote.vue index bf36b7d06..a09b18bdc 100644 --- a/src/layouts/quote/quote.vue +++ b/src/layouts/quote/quote.vue @@ -170,7 +170,7 @@ export default { null, "quote" ); - servicePackageDiscountPart = servicePackageDiscountPartResponse.data; + servicePackageDiscountPart.push(servicePackageDiscountPartResponse.data); } const availableLineItems = [ resultMap.rainDefense, From 3424f7e514ece5cb3cb96cb52a5735cb35c89122 Mon Sep 17 00:00:00 2001 From: Sneha Date: Tue, 21 May 2024 10:33:58 +0530 Subject: [PATCH 15/17] Fixing conflicts --- src/constants/cart-item-categories.js | 1 + src/fmg-components/cart/cart.vue | 4 ++-- src/layouts/quote/quote.spec.js | 1 - .../service-package-question/service-package-question.vue | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/constants/cart-item-categories.js b/src/constants/cart-item-categories.js index 509cc626b..6bbb960b9 100644 --- a/src/constants/cart-item-categories.js +++ b/src/constants/cart-item-categories.js @@ -3,6 +3,7 @@ const cartItemCategories = { GLASS_PARTS: "glassParts", SUPPORTING_ITEMS: "supportingItems", PROMOS: "promos", + SERVICE_PACKAGE_DISCOUNT: "servicePackageDiscount", }; export { cartItemCategories }; diff --git a/src/fmg-components/cart/cart.vue b/src/fmg-components/cart/cart.vue index a8227036a..0cde7e160 100644 --- a/src/fmg-components/cart/cart.vue +++ b/src/fmg-components/cart/cart.vue @@ -272,7 +272,7 @@ export default { getLineItemAmount(amount, useVerifyingText, category) { if (useVerifyingText) return this.verifyingCoverageText; - return category == "promos" + return category == ("promos" && "servicePackageDiscount") ? "(" + this.currencyFormatter.format(amount * -1) + ")" : this.currencyFormatter.format(amount); }, @@ -799,7 +799,7 @@ export default { Math.abs( baseMixin.methods.getTotalLineItemPrice(servicePackageDiscountLineItem) ), - category: cartItemCategories.SUPPORTING_ITEMS, + category: cartItemCategories.SERVICE_PACKAGE_DISCOUNT, cartItemType: cartItemTypes.SERVICE_PACKAGE_DISCOUNT, isDisplayed: true, isRemovable: false, diff --git a/src/layouts/quote/quote.spec.js b/src/layouts/quote/quote.spec.js index bce20d75c..56a8d66e6 100644 --- a/src/layouts/quote/quote.spec.js +++ b/src/layouts/quote/quote.spec.js @@ -8,7 +8,6 @@ import * as navigateToHeritage from "@/helpers/heritage-integration/navigation-h import { nextTick } from "vue"; import { experimentSettings } from "@/constants/experiments"; import baseMixin from "@/mixins/base-mixin.js"; -import { support } from "jquery"; jest.mock("@/store", () => ({ commit: jest.fn(), 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 24e855511..c9e55ef3e 100644 --- a/src/layouts/quote/service-package-question/service-package-question.vue +++ b/src/layouts/quote/service-package-question/service-package-question.vue @@ -73,7 +73,7 @@ export default { this.getServicePackageDiscountPartForSelectedPackage(newValue); let supportingItems = this.supportingLineItems; if (servicePackageDiscountPartInSelectedPackage?.length > 0) { - supportingItems.push(servicePackageDiscountPartInSelectedPackage[0]); + supportingItems?.push(servicePackageDiscountPartInSelectedPackage[0]); } else { if ( supportingItems?.length > 0 && From 5989e446def7898e25cfbac469db0f695f582354 Mon Sep 17 00:00:00 2001 From: Sneha Date: Fri, 7 Jun 2024 17:04:45 +0530 Subject: [PATCH 16/17] Css changes --- .../service-package-radio.vue | 100 +++++++++++++----- 1 file changed, 72 insertions(+), 28 deletions(-) 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 a8e1af0bd..fbae237ca 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 @@ -1,4 +1,8 @@