From 9f3fb0144f3c5107e0a13998d50e0d6d7ecfd27c Mon Sep 17 00:00:00 2001 From: Chris Redelinghuys Date: Mon, 12 Jan 2026 16:11:38 -0500 Subject: [PATCH 1/2] CASH-2114: Price OEM parts and show price difference on page --- src/constants/part-type-strings.js | 1 + .../oem-glass-question/oem-glass-question.vue | 7 ++- src/layouts/quote/quote.vue | 54 +++++++++++++++++-- 3 files changed, 56 insertions(+), 6 deletions(-) diff --git a/src/constants/part-type-strings.js b/src/constants/part-type-strings.js index 17b96d2fb..0118c0b2c 100644 --- a/src/constants/part-type-strings.js +++ b/src/constants/part-type-strings.js @@ -12,6 +12,7 @@ const partTypeStrings = { SERVICE_PACKAGE_DISCOUNT: "SERVICE PACKAGE DISCOUNT", QUOTE_PAGE_DISCOUNT: "QUOTE PAGE DISCOUNT", DONATION: "DONATION", + WINDSHIELD: "WINDSHIELD", }; export { partTypeStrings }; diff --git a/src/layouts/quote/oem-glass-question/oem-glass-question.vue b/src/layouts/quote/oem-glass-question/oem-glass-question.vue index b591587c6..f07338e71 100644 --- a/src/layouts/quote/oem-glass-question/oem-glass-question.vue +++ b/src/layouts/quote/oem-glass-question/oem-glass-question.vue @@ -25,6 +25,8 @@ export default { props: { cmsWidgetName: String, modelValue: Boolean, + oemGlassPartPrice: Number, + aftermarketGlassPartPrice: Number, }, data() { return { @@ -36,7 +38,10 @@ export default { return this.getCmsContent(this.cmsWidgetName, "HeaderText"); }, bodyText() { - return this.getCmsContent(this.cmsWidgetName, "BodyText"); + let priceDifference = this.oemGlassPartPrice - this.aftermarketGlassPartPrice; + let bodyText = this.getCmsContent(this.cmsWidgetName, "BodyText"); + bodyText = bodyText.replace("{custom:OEMGLASSPRICE}", "$" + priceDifference.toFixed(2)); + return bodyText; }, footerText() { return this.getCmsContent(this.cmsWidgetName, "FooterText"); diff --git a/src/layouts/quote/quote.vue b/src/layouts/quote/quote.vue index a11b0d588..82cb61b86 100644 --- a/src/layouts/quote/quote.vue +++ b/src/layouts/quote/quote.vue @@ -89,7 +89,9 @@ + v-model="isOemGlassSelected" + :oemGlassPartPrice="oemGlassPartPrice" + :aftermarketGlassPartPrice="aftermarketGlassPartPrice" /> 0) { + pricedAlternateGlassParts = await baseMixin.methods.dispatchStoreActionWithLogging( + storeActions.PRICE_ORDER_ITEMS_AND_SAVE_SERVER_DATA, + { + availableLineItems: alternateGlassPartsForOem, + }, + "quote", + false + ); + } + // When calling pricing from the quote page, always use the cash parent account but save the existing one in case it's unverified insurance navigating backwards var holdParentAccountNumber = store.getters.order.payment?.parentAccountNumber; var holdBillToAccountNumber = store.getters.order.payment?.billToAccountNumber; @@ -422,9 +436,40 @@ export default { vm.holdBillToAccountNumber = holdBillToAccountNumber; vm.skipToInsurance = shouldSkipToInsurance; vm.offerOem = offerOem; - vm.alternateGlassPartsForOem = alternateGlassPartsForOem; // oemParts + vm.alternateGlassPartsForOem = pricedAlternateGlassParts; // oemParts vm.isOemGlassSelected = isOemGlassSelected; + const getOEMGlassPartPrice = () => { + let price = 0; + if (vm.alternateGlassPartsForOem) { + let oemGlassPart = vm.isOemGlassSelected + ? vm.lineItems.glassParts + : vm.alternateGlassPartsForOem; + if (oemGlassPart) { + price = oemGlassPart.find( + (altPart) => altPart.partType === partTypeStrings.WINDSHIELD + )?.sellingPrice; + } + } + return price; + }; + const getAftermarketGlassPartPrice = () => { + let price = 0; + if (vm.alternateGlassPartsForOem) { + let aftermarketGlassPart = vm.isOemGlassSelected + ? vm.alternateGlassPartsForOem + : vm.lineItems.glassParts; + if (aftermarketGlassPart) { + price = aftermarketGlassPart.find( + (altPart) => altPart.partType === partTypeStrings.WINDSHIELD + )?.sellingPrice; + } + } + return price; + }; + vm.oemGlassPartPrice = getOEMGlassPartPrice(); + vm.aftermarketGlassPartPrice = getAftermarketGlassPartPrice(); + if (revalidatePromoResponse) { const revalidateAlerts = buildToastMessagesFromRevalidateOrValidatePromoResponse( revalidatePromoResponse, @@ -943,11 +988,10 @@ export default { return false; }, swapOEMGlassPartsOnOrder() { - const windshieldString = "WINDSHIELD"; this.lineItems.glassParts.forEach((part, index) => { - if (part.partType === windshieldString) { + if (part.partType === partTypeStrings.WINDSHIELD) { let altPartToUse = this.alternateGlassPartsForOem.find( - (altPart) => altPart.partType === windshieldString + (altPart) => altPart.partType === partTypeStrings.WINDSHIELD ); if (altPartToUse) { this.lineItems.glassParts[index] = altPartToUse; From 3ee017dd8a9ef706679d4a4b50bbae5c3e519607 Mon Sep 17 00:00:00 2001 From: Chris Redelinghuys Date: Mon, 12 Jan 2026 16:36:27 -0500 Subject: [PATCH 2/2] CASH-2114: Null check --- src/layouts/quote/quote.vue | 7 ++++--- src/styles/ux-variables.scss | 4 ++-- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/layouts/quote/quote.vue b/src/layouts/quote/quote.vue index 82cb61b86..bd7a09944 100644 --- a/src/layouts/quote/quote.vue +++ b/src/layouts/quote/quote.vue @@ -446,9 +446,10 @@ export default { ? vm.lineItems.glassParts : vm.alternateGlassPartsForOem; if (oemGlassPart) { - price = oemGlassPart.find( - (altPart) => altPart.partType === partTypeStrings.WINDSHIELD - )?.sellingPrice; + price = + oemGlassPart.find( + (altPart) => altPart.partType === partTypeStrings.WINDSHIELD + )?.sellingPrice || 0; } } return price; diff --git a/src/styles/ux-variables.scss b/src/styles/ux-variables.scss index 770d95b42..0c275ad51 100644 --- a/src/styles/ux-variables.scss +++ b/src/styles/ux-variables.scss @@ -123,8 +123,8 @@ $body-color: $gray-600; //Fonts $font-family-sans-serif: UrbanistRegular, Arial, Helvetica, sans-serif; -$font-family-monospace: UrbanistRegular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", - monospace; +$font-family-monospace: + UrbanistRegular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; // stylelint-enable value-keyword-case $font-family-base: $font-family-sans-serif; $font-family-code: $font-family-monospace;