From c6ec570f4c761584ece1408b6c167fadc5d2bb30 Mon Sep 17 00:00:00 2001 From: Scott Kiener Date: Mon, 6 Oct 2025 10:50:44 -0400 Subject: [PATCH 001/196] CASH-1527 | Initial attempt at updating salesforce Apparently it does not work in localhost. --- .../salesforce-helper-dev.js | 69 +++++-------------- .../salesforce-webchat/salesforce-webchat.vue | 13 ++-- .../sierra-webchat/sierra-webchat.vue | 16 ++--- src/helpers/webchat-helper.js | 2 +- src/styles/ux-variables.scss | 4 +- 5 files changed, 35 insertions(+), 69 deletions(-) diff --git a/src/digital-components/salesforce-webchat/salesforce-helper-dev.js b/src/digital-components/salesforce-webchat/salesforce-helper-dev.js index d11ccf0d4..f7f2b24fd 100644 --- a/src/digital-components/salesforce-webchat/salesforce-helper-dev.js +++ b/src/digital-components/salesforce-webchat/salesforce-helper-dev.js @@ -7,9 +7,9 @@ function setupCustomSettings( onWebchatCloseCallback ) { modifyEmbeddedSvcCallback(); - embedded_svc.addEventHandler("onSettingsCallCompleted", finishedLoadingCallback); - embedded_svc.addEventHandler("afterMaximize", onWebchatOpenCallback); - embedded_svc.addEventHandler("afterDestroy", onWebchatCloseCallback); + embeddedservice_bootstrap.addEventHandler("onSettingsCallCompleted", finishedLoadingCallback); + embeddedservice_bootstrap.addEventHandler("afterMaximize", onWebchatOpenCallback); + embeddedservice_bootstrap.addEventHandler("afterDestroy", onWebchatCloseCallback); } /* @@ -36,24 +36,6 @@ export function initializeSalesforceWebchatForDev( onWebchatCloseCallback ) { var initESW = function (gslbBaseURL) { - embedded_svc.settings.displayHelpButton = true; //Or false - embedded_svc.settings.language = ""; //For example, enter 'en' or 'en-US' - //embedded_svc.settings.defaultMinimizedText = '...'; //(Defaults to Chat with an Expert) - //embedded_svc.settings.disabledMinimizedText = '...'; //(Defaults to Agent Offline) - //embedded_svc.settings.loadingText = ''; //(Defaults to Loading) - //embedded_svc.settings.storageDomain = 'yourdomain.com'; //(Sets the domain for your deployment so that visitors can navigate subdomains during a chat session) - // Settings for Chat - //embedded_svc.settings.directToButtonRouting = function(prechatFormData) { - // Dynamically changes the button ID based on what the visitor enters in the pre-chat form. - // Returns a valid button ID. - //}; - //embedded_svc.settings.prepopulatedPrechatFields = {}; //Sets the auto-population of pre-chat form fields - //embedded_svc.settings.fallbackRouting = []; //An array of button IDs, user IDs, or userId_buttonId - //embedded_svc.settings.offlineSupportMinimizedText = '...'; //(Defaults to Contact Us) - - embedded_svc.settings.enabledFeatures = ["LiveAgent"]; - embedded_svc.settings.entryFeature = "LiveAgent"; - setupCustomSettings( modifyEmbeddedSvcCallback, finishedLoadingCallback, @@ -61,36 +43,19 @@ export function initializeSalesforceWebchatForDev( onWebchatCloseCallback ); - embedded_svc.init( - "https://safelite2--dev.sandbox.my.salesforce.com", - "https://safelite2--dev.sandbox.my.salesforce-sites.com/chat", - gslbBaseURL, - "00D6s0000008r6A", - "Sales_Central_Snap_in", - { - baseLiveAgentContentURL: - "https://c.la12s-core1.sfdc-8tgtt5.salesforceliveagent.com/content", - deploymentId: "572Wr0000017xKX", - buttonId: "573Wr000000CpgH", - baseLiveAgentURL: "https://d.la12s-core1.sfdc-8tgtt5.salesforceliveagent.com/chat", - eswLiveAgentDevName: - "EmbeddedServiceLiveAgent_Parent04IWr000003yKq9MAE_1961681659a", - isOfflineSupportEnabled: false, - } - ); - }; + try { + embeddedservice_bootstrap.settings.language = "en_US"; // For example, enter 'en' or 'en-US' - if (!window.embedded_svc) { - var s = document.createElement("script"); - s.setAttribute( - "src", - "https://safelite2--dev.sandbox.my.salesforce.com/embeddedservice/5.0/esw.min.js" - ); - s.onload = function () { - initESW(null); - }; - document.body.appendChild(s); - } else { - initESW("https://service.force.com"); - } + embeddedservice_bootstrap.init( + "00D6s0000008r6A", + "Sales_Central_TFN", + "https://safelite2--dev.sandbox.my.site.com/ESWSalesCentralTFN1755660094477", + { + scrt2URL: "https://safelite2--dev.sandbox.my.salesforce-scrt.com", + } + ); + } catch (err) { + console.error("Error loading Embedded Messaging: ", err); + } + }; } diff --git a/src/digital-components/salesforce-webchat/salesforce-webchat.vue b/src/digital-components/salesforce-webchat/salesforce-webchat.vue index 19ce71235..93e966f3e 100644 --- a/src/digital-components/salesforce-webchat/salesforce-webchat.vue +++ b/src/digital-components/salesforce-webchat/salesforce-webchat.vue @@ -33,7 +33,8 @@ export default { mounted() { // Load in script from salesforce CDN const script = document.createElement("script"); - script.src = "https://service.force.com/embeddedservice/5.0/esw.min.js"; + script.src = + "https://safelite2--dev.sandbox.my.site.com/ESWSalesCentralTFN1755660094477/assets/js/bootstrap.min.js"; script.onload = this.initializeSalesforceWebchat; document.body.appendChild(script); @@ -92,11 +93,11 @@ export default { } }, modifyEmbeddedSvcCallback() { - window.embedded_svc.settings.avatarImgURL = require("@/assets/img/salesforce-webchat/avatar_webchat.png"); - window.embedded_svc.settings.prechatBackgroundImgURL = require("@/assets/img/salesforce-webchat/safelite_logo_webchat.png"); - window.embedded_svc.settings.smallCompanyLogoImgURL = require("@/assets/img/salesforce-webchat/minimized_chat_bubble_webchat.png"); - window.embedded_svc.settings.displayHelpButton = false; - window.embedded_svc.addEventHandler("onChatEstablished", () => { + window.embeddedservice_bootstrap.settings.avatarImgURL = require("@/assets/img/salesforce-webchat/avatar_webchat.png"); + window.embeddedservice_bootstrap.settings.prechatBackgroundImgURL = require("@/assets/img/salesforce-webchat/safelite_logo_webchat.png"); + window.embeddedservice_bootstrap.settings.smallCompanyLogoImgURL = require("@/assets/img/salesforce-webchat/minimized_chat_bubble_webchat.png"); + window.embeddedservice_bootstrap.settings.displayHelpButton = false; + window.embeddedservice_bootstrap.addEventHandler("onChatEstablished", () => { this.pushEventForChatsToGA("support_chat", "chat_opened", "Live Agent", true); }); }, diff --git a/src/digital-components/sierra-webchat/sierra-webchat.vue b/src/digital-components/sierra-webchat/sierra-webchat.vue index cc88b5433..59c833dbf 100644 --- a/src/digital-components/sierra-webchat/sierra-webchat.vue +++ b/src/digital-components/sierra-webchat/sierra-webchat.vue @@ -139,8 +139,8 @@ export default { // Pass data to Salesforce chat if available const transfer = event.detail; if ( - window.embedded_svc && - typeof window.embedded_svc.bootstrapEmbeddedService === "function" + window.embeddedservice_bootstrap && + typeof window.embeddedservice_bootstrap.bootstrapEmbeddedService === "function" ) { if ( transfer && @@ -149,13 +149,13 @@ export default { transfer.data.last_name && transfer.data.email ) { - window.embedded_svc.settings.prepopulatedPrechatFields = { + window.embeddedservice_bootstrap.settings.prepopulatedPrechatFields = { FirstName: transfer.data.first_name, LastName: transfer.data.last_name, Email: transfer.data.email, Subject: transfer.data.chat_summary, }; - window.embedded_svc.settings.extraPrechatFormDetails = [ + window.embeddedservice_bootstrap.settings.extraPrechatFormDetails = [ { label: "Scarlett AI Summary", value: transfer.data.chat_summary, @@ -164,14 +164,14 @@ export default { }, ]; if ( - window.embedded_svc.liveAgentAPI && - typeof window.embedded_svc.liveAgentAPI.startChat === "function" + window.embeddedservice_bootstrap.liveAgentAPI && + typeof window.embeddedservice_bootstrap.liveAgentAPI.startChat === "function" ) { - window.embedded_svc.liveAgentAPI.startChat(); + window.embeddedservice_bootstrap.liveAgentAPI.startChat(); return; } } - window.embedded_svc.bootstrapEmbeddedService(); + window.embeddedservice_bootstrap.bootstrapEmbeddedService(); } }; window.addEventListener("sierra-chat-transfer", this._handleSierraTransfer); diff --git a/src/helpers/webchat-helper.js b/src/helpers/webchat-helper.js index 917d6de0f..90fc4a29a 100644 --- a/src/helpers/webchat-helper.js +++ b/src/helpers/webchat-helper.js @@ -11,7 +11,7 @@ export const webchatHelper = () => { if (webchatGlobalNonpersistedState.shouldLaunchSierra) { window.dispatchEvent(new CustomEvent("launch-sierra-webchat")); // launches the sierra chat } else { - window.embedded_svc.bootstrapEmbeddedService(); // launches the salesForce prechat form + window.embeddedservice_bootstrap.bootstrapEmbeddedService(); // launches the salesForce prechat form } } diff --git a/src/styles/ux-variables.scss b/src/styles/ux-variables.scss index c0a69a112..bec02081f 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; From 36100083fe86b8d382cdd20a0613dddaa43436a6 Mon Sep 17 00:00:00 2001 From: Scott Kiener Date: Mon, 6 Oct 2025 10:54:22 -0400 Subject: [PATCH 002/196] Add logging, remove wrapper function --- .../salesforce-helper-dev.js | 42 +++++++++---------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/src/digital-components/salesforce-webchat/salesforce-helper-dev.js b/src/digital-components/salesforce-webchat/salesforce-helper-dev.js index f7f2b24fd..2e56634cc 100644 --- a/src/digital-components/salesforce-webchat/salesforce-helper-dev.js +++ b/src/digital-components/salesforce-webchat/salesforce-helper-dev.js @@ -35,27 +35,27 @@ export function initializeSalesforceWebchatForDev( onWebchatOpenCallback, onWebchatCloseCallback ) { - var initESW = function (gslbBaseURL) { - setupCustomSettings( - modifyEmbeddedSvcCallback, - finishedLoadingCallback, - onWebchatOpenCallback, - onWebchatCloseCallback + setupCustomSettings( + modifyEmbeddedSvcCallback, + finishedLoadingCallback, + onWebchatOpenCallback, + onWebchatCloseCallback + ); + + try { + console.log("initializing embeddedservice_bootstrap"); + embeddedservice_bootstrap.settings.language = "en_US"; // For example, enter 'en' or 'en-US' + + embeddedservice_bootstrap.init( + "00D6s0000008r6A", + "Sales_Central_TFN", + "https://safelite2--dev.sandbox.my.site.com/ESWSalesCentralTFN1755660094477", + { + scrt2URL: "https://safelite2--dev.sandbox.my.salesforce-scrt.com", + } ); + } catch (err) { + console.error("Error loading Embedded Messaging: ", err); + } - try { - embeddedservice_bootstrap.settings.language = "en_US"; // For example, enter 'en' or 'en-US' - - embeddedservice_bootstrap.init( - "00D6s0000008r6A", - "Sales_Central_TFN", - "https://safelite2--dev.sandbox.my.site.com/ESWSalesCentralTFN1755660094477", - { - scrt2URL: "https://safelite2--dev.sandbox.my.salesforce-scrt.com", - } - ); - } catch (err) { - console.error("Error loading Embedded Messaging: ", err); - } - }; } From b6f497c13f908f54671613b6ccd9d83b5e551915 Mon Sep 17 00:00:00 2001 From: Scott Kiener Date: Wed, 8 Oct 2025 09:46:08 -0400 Subject: [PATCH 003/196] Update listeners --- .../salesforce-webchat/salesforce-helper-dev.js | 7 +++---- .../salesforce-webchat/salesforce-webchat.vue | 2 +- src/digital-components/sierra-webchat/sierra-webchat.vue | 3 ++- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/digital-components/salesforce-webchat/salesforce-helper-dev.js b/src/digital-components/salesforce-webchat/salesforce-helper-dev.js index 2e56634cc..a171fb974 100644 --- a/src/digital-components/salesforce-webchat/salesforce-helper-dev.js +++ b/src/digital-components/salesforce-webchat/salesforce-helper-dev.js @@ -7,9 +7,9 @@ function setupCustomSettings( onWebchatCloseCallback ) { modifyEmbeddedSvcCallback(); - embeddedservice_bootstrap.addEventHandler("onSettingsCallCompleted", finishedLoadingCallback); - embeddedservice_bootstrap.addEventHandler("afterMaximize", onWebchatOpenCallback); - embeddedservice_bootstrap.addEventHandler("afterDestroy", onWebchatCloseCallback); + window.addEventListener("onEmbeddedMessagingReady", finishedLoadingCallback); + window.addEventListener("onEmbeddedMessagingWindowMaximized", onWebchatOpenCallback); + window.addEventListener("onEmbeddedMessagingWindowClosed", onWebchatCloseCallback); } /* @@ -57,5 +57,4 @@ export function initializeSalesforceWebchatForDev( } catch (err) { console.error("Error loading Embedded Messaging: ", err); } - } diff --git a/src/digital-components/salesforce-webchat/salesforce-webchat.vue b/src/digital-components/salesforce-webchat/salesforce-webchat.vue index 93e966f3e..31719024e 100644 --- a/src/digital-components/salesforce-webchat/salesforce-webchat.vue +++ b/src/digital-components/salesforce-webchat/salesforce-webchat.vue @@ -97,7 +97,7 @@ export default { window.embeddedservice_bootstrap.settings.prechatBackgroundImgURL = require("@/assets/img/salesforce-webchat/safelite_logo_webchat.png"); window.embeddedservice_bootstrap.settings.smallCompanyLogoImgURL = require("@/assets/img/salesforce-webchat/minimized_chat_bubble_webchat.png"); window.embeddedservice_bootstrap.settings.displayHelpButton = false; - window.embeddedservice_bootstrap.addEventHandler("onChatEstablished", () => { + window.addEventListener("onEmbeddedMessagingConversationStarted", () => { this.pushEventForChatsToGA("support_chat", "chat_opened", "Live Agent", true); }); }, diff --git a/src/digital-components/sierra-webchat/sierra-webchat.vue b/src/digital-components/sierra-webchat/sierra-webchat.vue index 59c833dbf..6248ffa2d 100644 --- a/src/digital-components/sierra-webchat/sierra-webchat.vue +++ b/src/digital-components/sierra-webchat/sierra-webchat.vue @@ -165,7 +165,8 @@ export default { ]; if ( window.embeddedservice_bootstrap.liveAgentAPI && - typeof window.embeddedservice_bootstrap.liveAgentAPI.startChat === "function" + typeof window.embeddedservice_bootstrap.liveAgentAPI.startChat === + "function" ) { window.embeddedservice_bootstrap.liveAgentAPI.startChat(); return; From defd461145e5e9ed706031ba552ae3578171f576 Mon Sep 17 00:00:00 2001 From: scottkiener-at-safelite Date: Fri, 14 Nov 2025 11:08:00 -0500 Subject: [PATCH 004/196] Salesforcewebchat Changes --- .../salesforce-helper-dev.js | 3 +-- .../salesforce-webchat/salesforce-webchat.vue | 27 +++---------------- .../sierra-webchat/sierra-webchat.vue | 2 +- src/helpers/webchat-helper.js | 2 +- 4 files changed, 7 insertions(+), 27 deletions(-) diff --git a/src/digital-components/salesforce-webchat/salesforce-helper-dev.js b/src/digital-components/salesforce-webchat/salesforce-helper-dev.js index a171fb974..bc1b75dd3 100644 --- a/src/digital-components/salesforce-webchat/salesforce-helper-dev.js +++ b/src/digital-components/salesforce-webchat/salesforce-helper-dev.js @@ -7,7 +7,7 @@ function setupCustomSettings( onWebchatCloseCallback ) { modifyEmbeddedSvcCallback(); - window.addEventListener("onEmbeddedMessagingReady", finishedLoadingCallback); + window.addEventListener("onEmbeddedMessagingButtonCreated", finishedLoadingCallback); window.addEventListener("onEmbeddedMessagingWindowMaximized", onWebchatOpenCallback); window.addEventListener("onEmbeddedMessagingWindowClosed", onWebchatCloseCallback); } @@ -43,7 +43,6 @@ export function initializeSalesforceWebchatForDev( ); try { - console.log("initializing embeddedservice_bootstrap"); embeddedservice_bootstrap.settings.language = "en_US"; // For example, enter 'en' or 'en-US' embeddedservice_bootstrap.init( diff --git a/src/digital-components/salesforce-webchat/salesforce-webchat.vue b/src/digital-components/salesforce-webchat/salesforce-webchat.vue index 31719024e..1dca6de8c 100644 --- a/src/digital-components/salesforce-webchat/salesforce-webchat.vue +++ b/src/digital-components/salesforce-webchat/salesforce-webchat.vue @@ -16,7 +16,7 @@ export default { mixins: [analyticsMixin], data() { return { - isAgentAvailable: false, + isWebchatLoaded: false, isWebchatOpen: false, }; }, @@ -37,25 +37,9 @@ export default { "https://safelite2--dev.sandbox.my.site.com/ESWSalesCentralTFN1755660094477/assets/js/bootstrap.min.js"; script.onload = this.initializeSalesforceWebchat; document.body.appendChild(script); - - // Notify funnel-header about Salesforce chat open/close state - this._salesforceChatOpenObserver = new MutationObserver(() => { - const isOpen = !!document.querySelector(".embeddedServiceSidebar"); - window.dispatchEvent( - new CustomEvent("salesforce-chat-visibility", { detail: { open: isOpen } }) - ); - }); - this._salesforceChatOpenObserver.observe(document.body, { - childList: true, - subtree: true, - }); }, beforeUnmount() { // Clean up event listeners and observers - window.removeEventListener( - "salesforce-chat-visibility", - this._handleSalesforceChatVisibility - ); window.removeEventListener("sierra-chat-transfer", this._handleSierraToSalesforceTransfer); if (this._salesforceChatOpenObserver) { this._salesforceChatOpenObserver.disconnect(); @@ -93,16 +77,13 @@ export default { } }, modifyEmbeddedSvcCallback() { - window.embeddedservice_bootstrap.settings.avatarImgURL = require("@/assets/img/salesforce-webchat/avatar_webchat.png"); - window.embeddedservice_bootstrap.settings.prechatBackgroundImgURL = require("@/assets/img/salesforce-webchat/safelite_logo_webchat.png"); - window.embeddedservice_bootstrap.settings.smallCompanyLogoImgURL = require("@/assets/img/salesforce-webchat/minimized_chat_bubble_webchat.png"); - window.embeddedservice_bootstrap.settings.displayHelpButton = false; + window.embeddedservice_bootstrap.settings.hideChatButtonOnLoad = true; window.addEventListener("onEmbeddedMessagingConversationStarted", () => { this.pushEventForChatsToGA("support_chat", "chat_opened", "Live Agent", true); }); }, finishedLoadingCallback(data) { - this.isAgentAvailable = data.isAgentAvailable; + this.isWebchatLoaded = true; this.updateShouldShowWebchatButton(); }, onWebchatOpenCallback() { @@ -118,7 +99,7 @@ export default { updateShouldShowWebchatButton() { this.webchatGlobalNonpersistedState.showWebchatButton = !this.hideSalesforceWebchatLaunchButton && - this.isAgentAvailable && + this.isWebchatLoaded && !this.isWebchatOpen; }, }, diff --git a/src/digital-components/sierra-webchat/sierra-webchat.vue b/src/digital-components/sierra-webchat/sierra-webchat.vue index 6248ffa2d..4d43187e2 100644 --- a/src/digital-components/sierra-webchat/sierra-webchat.vue +++ b/src/digital-components/sierra-webchat/sierra-webchat.vue @@ -172,7 +172,7 @@ export default { return; } } - window.embeddedservice_bootstrap.bootstrapEmbeddedService(); + window.embeddedservice_bootstrap.utilAPI.launchChat(); } }; window.addEventListener("sierra-chat-transfer", this._handleSierraTransfer); diff --git a/src/helpers/webchat-helper.js b/src/helpers/webchat-helper.js index 90fc4a29a..e5254d08d 100644 --- a/src/helpers/webchat-helper.js +++ b/src/helpers/webchat-helper.js @@ -11,7 +11,7 @@ export const webchatHelper = () => { if (webchatGlobalNonpersistedState.shouldLaunchSierra) { window.dispatchEvent(new CustomEvent("launch-sierra-webchat")); // launches the sierra chat } else { - window.embeddedservice_bootstrap.bootstrapEmbeddedService(); // launches the salesForce prechat form + window.embeddedservice_bootstrap.utilAPI.launchChat(); // launches the salesForce prechat form } } From ffb4156b14033ab296430ea2881fa6b1abe2d283 Mon Sep 17 00:00:00 2001 From: Adam Caouette Date: Thu, 4 Dec 2025 16:25:28 -0500 Subject: [PATCH 005/196] CASH-1790: remove obsolete method --- src/layouts/schedule/schedule.vue | 23 ----------------------- 1 file changed, 23 deletions(-) diff --git a/src/layouts/schedule/schedule.vue b/src/layouts/schedule/schedule.vue index 5c54c07f3..377a49ad3 100644 --- a/src/layouts/schedule/schedule.vue +++ b/src/layouts/schedule/schedule.vue @@ -1130,29 +1130,6 @@ export default { ); } }, - getTimeSlotInfo() { - // Get the current date - const currentDate = getTodayDate(); - - // Add 10 days to the current date - currentDate.setDate(currentDate.getDate() + 10); - - // Format the date as yyyy-mm-dd - const year = currentDate.getFullYear(); - const month = String(currentDate.getMonth() + 1).padStart(2, "0"); - const day = String(currentDate.getDate()).padStart(2, "0"); - - const formattedDate = `${year}-${month}-${day}`; - - return { - date: formattedDate, - endTime: "12:00", - jobMaxMinutes: "180", - jobMinMinutes: "120", - routeCode: "3357I-03357-M-I*20988*AM", - startTime: "08:00", - }; - }, onShopSelected(shopQuestionPopUpData) { this.resetWaitlist(); this.preSelectedDate = null; From 56e14ab1cd0d2ecc3dd5ffc9ed97a26772a91e6b Mon Sep 17 00:00:00 2001 From: Adam Caouette Date: Thu, 4 Dec 2025 16:26:46 -0500 Subject: [PATCH 006/196] CASH-1790: add refs for self-documenting clarity --- .../schedule/time-slot-question/time-slot-question.vue | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/layouts/schedule/time-slot-question/time-slot-question.vue b/src/layouts/schedule/time-slot-question/time-slot-question.vue index 1b8a2cb2e..6f3fb3283 100644 --- a/src/layouts/schedule/time-slot-question/time-slot-question.vue +++ b/src/layouts/schedule/time-slot-question/time-slot-question.vue @@ -1,6 +1,7 @@ + From 3f9df4c331e7a5f4172bf8d9d220680ea549456f Mon Sep 17 00:00:00 2001 From: Chloe Herd Date: Wed, 7 Jan 2026 10:27:20 -0500 Subject: [PATCH 065/196] Page prereqs --- src/layouts/payment-adyen/payment-adyen.vue | 109 +++++++++++++++++++- 1 file changed, 105 insertions(+), 4 deletions(-) diff --git a/src/layouts/payment-adyen/payment-adyen.vue b/src/layouts/payment-adyen/payment-adyen.vue index 3e6853aaf..a8b1704a1 100644 --- a/src/layouts/payment-adyen/payment-adyen.vue +++ b/src/layouts/payment-adyen/payment-adyen.vue @@ -66,6 +66,8 @@ import { showFmgLoadingModal } from "../../helpers/loading-modal-helper"; import cart from "@/fmg-components/cart/cart"; import { coverageStatus } from "@/constants/insurance"; import { deepClone } from "@/helpers/object-helper"; +import store from "@/store"; +import { debugLog } from "@/helpers/debug-log-helper.js"; export default { name: "payment-adyen", @@ -110,11 +112,110 @@ export default { }, arePagePrerequisitesValid() { - // Stub, for checking if application is capable of entering this page - // And/or, is all information required for this page present? - // To prevent sequence-breaking from the end-user. + // Service Location + const serviceLocation = store.getters.order.serviceLocation; + const mobileReqs = !!( + serviceLocation.address && + serviceLocation.city && + serviceLocation.state && + serviceLocation.zipCode + ); - return true; + const providerLocation = serviceLocation.provider.address; + const dropOffInshopReqs = !!( + providerLocation.streetAddress && + providerLocation.city && + providerLocation.state && + providerLocation.zipCode + ); + + const isMobile = serviceLocation.appointmentType === AppointmentTypeStrings.MOBILE; + + const serviceLocationReqs = + (isMobile && mobileReqs) || (!isMobile && dropOffInshopReqs); + + // Insurance + const isInsuranceSet = store.getters.order.payment.isInsurance !== null; + + // Schedule + const schedule = store.getters.order.schedule; + const scheduleReqs = !!( + schedule.date && + schedule.startTime && + schedule.endTime && + schedule.jobMaxMinutes && + schedule.jobMinMinutes + ); + + // Customer + const customer = store.getters.order.customer; + const customerReqs = !!( + customer.firstName && + customer.lastName && + customer.phoneNumber && + customer.emailAddress + ); + + const paymentMethodReqs = + store.getters.order.payment.isPia !== null && + (store.getters.order.payment.isPia || !!store.getters.order.payment.piaType); + + const preReqResult = + serviceLocationReqs && + isInsuranceSet && + scheduleReqs && + customerReqs && + paymentMethodReqs; + + // prettier-ignore + { + debugLog("--- payment-adyen.vue pagePrereqs start ---", null, !preReqResult); + debugLog("mobileReqs:", mobileReqs, !preReqResult); + debugLog("serviceLocation.address:", serviceLocation.address, !preReqResult); + debugLog("serviceLocation.city:", serviceLocation.city, !preReqResult); + debugLog("serviceLocation.state:", serviceLocation.state, !preReqResult); + debugLog("serviceLocation.zipCode:", serviceLocation.zipCode, !preReqResult); + + debugLog("", null, !preReqResult); + + debugLog("dropOffInshopReqs:", dropOffInshopReqs, !preReqResult); + debugLog("serviceLocationReqs:", serviceLocationReqs, !preReqResult); + debugLog("providerLocation.streetAddress:", providerLocation.streetAddress, !preReqResult); + debugLog("providerLocation.city:", providerLocation.city, !preReqResult); + debugLog("providerLocation.state:", providerLocation.state, !preReqResult); + debugLog("providerLocation.zipCode:", providerLocation.zipCode, !preReqResult); + + debugLog("", null, !preReqResult); + + debugLog("isInsuranceSet:", isInsuranceSet, !preReqResult); + + debugLog("", null, !preReqResult); + + debugLog("scheduleReqs:", scheduleReqs, !preReqResult); + debugLog("schedule.date:", schedule.date, !preReqResult); + debugLog("schedule.startTime:", schedule.startTime, !preReqResult); + debugLog("schedule.endTime:", schedule.endTime, !preReqResult); + debugLog("schedule.jobMaxMinutes:", schedule.jobMaxMinutes, !preReqResult); + debugLog("schedule.jobMinMinutes:", schedule.jobMinMinutes, !preReqResult); + + debugLog("", null, !preReqResult); + + debugLog("customerReqs:", customerReqs, !preReqResult); + debugLog("customer.firstName:", customer.firstName, !preReqResult); + debugLog("customer.lastName:", customer.lastName, !preReqResult); + debugLog("customer.phoneNumber:", customer.phoneNumber, !preReqResult); + debugLog("customer.emailAddress:", customer.emailAddress, !preReqResult); + + debugLog("", null, !preReqResult); + + debugLog("paymentMethodReqs:", paymentMethodReqs, !preReqResult); + debugLog("store.getters.order.payment.isPia:", store.getters.order?.payment?.isPia, !preReqResult); + debugLog("store.getters.order.payment.piaType:", store.getters.order?.payment?.piaType, !preReqResult); + + debugLog("--- payment-adyen.vue pagePrereqs end ---", null, !preReqResult); + } + + return preReqResult; }, async initializeAdyen() { From 3d3d48a1ec2722102c252a1db6f85463d58ece40 Mon Sep 17 00:00:00 2001 From: Chloe Herd Date: Wed, 7 Jan 2026 11:17:14 -0500 Subject: [PATCH 066/196] Move hardcoded test values to env variables --- environment-variables.js | 2 ++ src/constants/application-config.js | 2 ++ src/helpers/adyen-helper.js | 5 +++-- src/layouts/payment-adyen/payment-adyen.vue | 1 - 4 files changed, 7 insertions(+), 3 deletions(-) diff --git a/environment-variables.js b/environment-variables.js index 4d894b006..17c797cfd 100644 --- a/environment-variables.js +++ b/environment-variables.js @@ -13,6 +13,8 @@ const environmentVariables = { ['__VUE_APP_SAFELITE_HOP__']: "https://sv2-safelitehop-dev.safelite.com/fmgCheckoutShared.aspx", ['__VUE_APP_SESSION_TIMEOUT_MINUTES__']: 30, ['__VUE_APP_SOLARWINDS_MONITORING_SCRIPT__']: "", + ['__VUE_APP_ADYEN_ENVIRONMENT__']: "test", + ['__VUE_APP_ADYEN_CLIENT_KEY__']: "test_WYGT4F5ZT5BRRL5MPWHK6QLYOIXZXROD", }; const keysOnly = Object.keys(environmentVariables); diff --git a/src/constants/application-config.js b/src/constants/application-config.js index b739d9ff9..91873d455 100644 --- a/src/constants/application-config.js +++ b/src/constants/application-config.js @@ -32,6 +32,8 @@ const applicationConfig = { COOKIE_NAME_LENGTH_MAX_LIMIT: 44, SESSION_TIMEOUT_MINUTES: process.env.__VUE_APP_SESSION_TIMEOUT_MINUTES__, RETURN_USER_PAGE: "/fmg/return-user", + ADYEN_CLIENT_KEY: process.env.__VUE_APP_ADYEN_CLIENT_KEY__, + ADYEN_ENVIRONMENT: process.env.__VUE_APP_ADYEN_ENVIRONMENT__, }; export { applicationConfig }; diff --git a/src/helpers/adyen-helper.js b/src/helpers/adyen-helper.js index 96d04f767..8de92bf89 100644 --- a/src/helpers/adyen-helper.js +++ b/src/helpers/adyen-helper.js @@ -4,6 +4,7 @@ import globalMethods from "@/global-methods"; import { endpoints } from "@/constants/endpoints"; import { AppointmentTypeStrings } from "@/constants/schedule-constants"; import { paymentMethods } from "@/constants/payment-method-constants"; +import { applicationConfig } from "../constants/application-config"; export async function getNewSession(sessionConfig) {} @@ -42,8 +43,8 @@ export async function createAdyenCheckout({ id: id, sessionData: sessionData, }, - clientKey: "test_WYGT4F5ZT5BRRL5MPWHK6QLYOIXZXROD", - environment: "test", + clientKey: applicationConfig.ADYEN_CLIENT_KEY, + environment: applicationConfig.ADYEN_ENVIRONMENT, locale: "en_US", countryCode: "US", showPayButton: showPayButton, diff --git a/src/layouts/payment-adyen/payment-adyen.vue b/src/layouts/payment-adyen/payment-adyen.vue index a8b1704a1..d09ffd14e 100644 --- a/src/layouts/payment-adyen/payment-adyen.vue +++ b/src/layouts/payment-adyen/payment-adyen.vue @@ -281,7 +281,6 @@ export default { value: this.adyenPriceTotal, currency: "USD", }, - environment: "test", // Change this to "live" when you're ready to accept live PayPal payments countryCode: "US", // Only needed for test. This will be automatically retrieved when you are in production. blockPayPalVenmoButton: true, blockPayPalPayLaterButton: true, From 5488b3d6a341aabdf79d0067eb64d23a1a5d4cc1 Mon Sep 17 00:00:00 2001 From: Chloe Herd Date: Wed, 7 Jan 2026 11:55:26 -0500 Subject: [PATCH 067/196] Prevent unwanted execution in error scenario --- src/layouts/payment-adyen/payment-adyen.vue | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/layouts/payment-adyen/payment-adyen.vue b/src/layouts/payment-adyen/payment-adyen.vue index d09ffd14e..d4420f437 100644 --- a/src/layouts/payment-adyen/payment-adyen.vue +++ b/src/layouts/payment-adyen/payment-adyen.vue @@ -430,6 +430,8 @@ export default { }; this.$router.handleSoftError(errorPayload); + + return; } // clear order From f02751ad6fd57f959606d41ab1ec3329eccd4640 Mon Sep 17 00:00:00 2001 From: Chloe Herd Date: Wed, 7 Jan 2026 12:14:17 -0500 Subject: [PATCH 068/196] Remove window.checkout Assignment as it is Unneeded --- src/layouts/payment-adyen/payment-adyen.vue | 1 - 1 file changed, 1 deletion(-) diff --git a/src/layouts/payment-adyen/payment-adyen.vue b/src/layouts/payment-adyen/payment-adyen.vue index d4420f437..fffd56b21 100644 --- a/src/layouts/payment-adyen/payment-adyen.vue +++ b/src/layouts/payment-adyen/payment-adyen.vue @@ -270,7 +270,6 @@ export default { console.log(checkout); - window.checkout = checkout; const dropin = new Dropin(checkout, { paymentMethodsConfiguration: { ideal: { From e3d705702cffbe337fb0ba4035025c7f00855b18 Mon Sep 17 00:00:00 2001 From: Chloe Herd Date: Wed, 7 Jan 2026 12:46:47 -0500 Subject: [PATCH 069/196] Add back environment setting per Adyen documentation. --- src/layouts/payment-adyen/payment-adyen.vue | 1 + 1 file changed, 1 insertion(+) diff --git a/src/layouts/payment-adyen/payment-adyen.vue b/src/layouts/payment-adyen/payment-adyen.vue index fffd56b21..b407f9d55 100644 --- a/src/layouts/payment-adyen/payment-adyen.vue +++ b/src/layouts/payment-adyen/payment-adyen.vue @@ -280,6 +280,7 @@ export default { value: this.adyenPriceTotal, currency: "USD", }, + environment: applicationConfig.ADYEN_ENVIRONMENT, countryCode: "US", // Only needed for test. This will be automatically retrieved when you are in production. blockPayPalVenmoButton: true, blockPayPalPayLaterButton: true, From 9d8e8c851bb931b819628ecccbd887f2805fb0ad Mon Sep 17 00:00:00 2001 From: Minojhini Valaiyapathi Date: Wed, 7 Jan 2026 13:32:22 -0500 Subject: [PATCH 070/196] CASH-1936 - Added parentAccountNumber property to partsorquestion endpoint --- src/store/index.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/store/index.js b/src/store/index.js index ca1d76f6f..14ecceece 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -1765,7 +1765,8 @@ export const actions = { const glassArray = damage.glassToReplace; const zipCode = order.serviceLocation.zipCode; const vin = vehicle.vin; - const serviceType = order.serviceLocation?.appointmentType; + const serviceType = damage.isRepair ? "Repair" : "Install"; + const parentAccountNumber = context.getters.payment.parentAccountNumber; const referralSeqNumber = order.referralSequenceNumber; // create a new array to avoid mutating state @@ -1781,6 +1782,7 @@ export const actions = { vin: vin, serviceType: serviceType, referralSeqNumber: referralSeqNumber, + parentAccountNumber: parentAccountNumber, }, logApiCall: true, pageNameToLog: pageNameToLog, From 09084dab48818bcfa09333bbd5e98cdcc9b1df84 Mon Sep 17 00:00:00 2001 From: Chloe Herd Date: Thu, 8 Jan 2026 13:59:26 -0500 Subject: [PATCH 071/196] Simplify + Add logging --- src/layouts/payment-adyen/payment-adyen.vue | 34 +++++---------------- 1 file changed, 8 insertions(+), 26 deletions(-) diff --git a/src/layouts/payment-adyen/payment-adyen.vue b/src/layouts/payment-adyen/payment-adyen.vue index b407f9d55..45bdc4961 100644 --- a/src/layouts/payment-adyen/payment-adyen.vue +++ b/src/layouts/payment-adyen/payment-adyen.vue @@ -378,37 +378,19 @@ export default { await this.saveAndSubmitWorkOrder(); }, - async handleFailedPayment(result) { + handleFailedPayment(result) { console.log(`Result =`); console.log(result); - // Fetch session info - const paymentSessionRequest = { - zipCodeCtu: this.locationInfo.zipCodeCtu, - workOrderNumber: this.workOrderNumberLastSixDigits, - sourceSystem: this.sourceSystem, - sessionId: this.sessionId, - sessionResult: result?.sessionResult, - }; + const stringToLog = `ADYEN PAYMENT NOT AUTHORIZED. Code = ${result?.resultCode}. Id = ${this.sessionId}`; - console.log(`Get session payload =`); - console.log(paymentSessionRequest); - - try { - const response = await globalMethods.callHttpClient({ - method: endpoints.GetAdyenSessionResult.method, - endpoint: endpoints.GetAdyenSessionResult.url, - payload: paymentSessionRequest, - logApiCall: true, - pageNameToLog: "payment-adyen", - }); - - console.log(response); - } catch (error) { - console.log(`Error getting session info after failure.`); - } + global.$logger.logError(stringToLog); + }, + handleError(error) { + const stringToLog = `ADYEN ERROR. Name = ${error.name}. Details = ${error.message}.`; + + global.$logger.logError(stringToLog); }, - handleError(error) {}, async saveAndSubmitWorkOrder() { // Work order submission after successful payment. From 6534b06238bb296b245491a33d26d3ece3591f86 Mon Sep 17 00:00:00 2001 From: Chloe Herd Date: Thu, 8 Jan 2026 16:40:43 -0500 Subject: [PATCH 072/196] Parity experience for failed payments. --- src/layouts/payment-adyen/payment-adyen.vue | 59 +++++++++++++++++++-- 1 file changed, 56 insertions(+), 3 deletions(-) diff --git a/src/layouts/payment-adyen/payment-adyen.vue b/src/layouts/payment-adyen/payment-adyen.vue index 45bdc4961..4ea759e2c 100644 --- a/src/layouts/payment-adyen/payment-adyen.vue +++ b/src/layouts/payment-adyen/payment-adyen.vue @@ -4,6 +4,16 @@
+
+ +
@@ -45,6 +55,7 @@ import Form from "vee-validate"; import funnelHeader from "@/fmg-components/funnel-header/funnel-header"; import navbar from "@/fmg-components/nav-bar/nav-bar"; import funnelSubHeader from "@/fmg-components/funnel-sub-header/funnel-sub-header"; +import alert from "@/ux-components/alert/alert"; import { fetchCmsContentForPage } from "@/helpers/cms-content-helper"; import { settleAllPromises } from "@/helpers/layout-helper"; @@ -75,6 +86,8 @@ export default { data() { return { sessionId: String, + dropinComponent: null, + hasPaymentFailureError: false, }; }, @@ -292,7 +305,11 @@ export default { name: "Credit or debit card", }, }, - }).mount("#adyen-container"); + }); + + this.dropinComponent = dropin; + + dropin.mount("#adyen-container"); }, async handleCompletedPayment(result) { @@ -378,13 +395,17 @@ export default { await this.saveAndSubmitWorkOrder(); }, - handleFailedPayment(result) { + async handleFailedPayment(result) { console.log(`Result =`); console.log(result); const stringToLog = `ADYEN PAYMENT NOT AUTHORIZED. Code = ${result?.resultCode}. Id = ${this.sessionId}`; - global.$logger.logError(stringToLog); + await global.$logger.logError(stringToLog); + + this.hasPaymentFailureError = true; + + this.dropinComponent?.update(); }, handleError(error) { const stringToLog = `ADYEN ERROR. Name = ${error.name}. Details = ${error.message}.`; @@ -423,6 +444,37 @@ export default { this.pageName ); }, + + async paymentFailedPayLater() { + console.log(`Doing final work order submission...`); + showFmgLoadingModal(true); + + await this.dispatchStoreAction( + storeActions.SAVE_PAYMENT_METHOD_CHOICE, + paymentMethods.PAY_LATER, + false + ); + + await this.dispatchStoreAction(storeActions.RESET_SAVE_SESSION_PROMISE); + + try { + await submitWorkOrder({ + pageNameToLog: this.pageName, + submitAfterSave: true, + }); + + await baseMixin.methods.dispatchStoreAction(storeActions.CREATE_SUBMITTED_STATE); + + this.$router.navigateWithoutSaving( + this.navigationScenarios.CLICKED_FORWARD, + this.pageName + ); + } catch (error) { + console.log(`Final submission failed after failed payment.`); + this.$router.handleSoftError(); + return; + } + }, }, computed: { @@ -563,6 +615,7 @@ export default { funnelSubHeader, navbar, cart, + alert, }, }; From 6aa8d3434cb6c1890b8dd303147368bfafed037a Mon Sep 17 00:00:00 2001 From: Chloe Herd Date: Thu, 8 Jan 2026 17:30:49 -0500 Subject: [PATCH 073/196] Parity for adyen failures in redirect flow --- src/layouts/payment-adyen/payment-adyen.vue | 6 +++++ .../methods/route-logic/adyen-return.js | 26 ++++++++++++++++--- 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/src/layouts/payment-adyen/payment-adyen.vue b/src/layouts/payment-adyen/payment-adyen.vue index 4ea759e2c..262614235 100644 --- a/src/layouts/payment-adyen/payment-adyen.vue +++ b/src/layouts/payment-adyen/payment-adyen.vue @@ -105,9 +105,15 @@ export default { const resultMap = await settleAllPromises(promiseResultMap); + const hasExistingPiaError = to.query?.piaFailure; + // Hydrate page with results next(async (vm) => { vm.setCmsContent(resultMap.cmsContent); + + if(hasExistingPiaError) { + vm.hasPaymentFailureError = true; + } }); }, diff --git a/src/router/methods/route-logic/adyen-return.js b/src/router/methods/route-logic/adyen-return.js index d94de4c38..1e423e056 100644 --- a/src/router/methods/route-logic/adyen-return.js +++ b/src/router/methods/route-logic/adyen-return.js @@ -15,7 +15,21 @@ export async function adyenReturnBeforeEnter(to, from) { const redirectResult = to?.query?.redirectResult; if (sessionId && redirectResult) { - const result = await finalizeAdyenPayment(sessionId, redirectResult); + let result = null; + + try { + result = await finalizeAdyenPayment(sessionId, redirectResult); + } catch (error) { + // Payment fails, so return user to payment-adyen screen to try again or pay later. + return { + name: routeData.PAYMENT_ADYEN.name, + query: { + piaFailure: true, + }, + replace: true, + }; + } + console.log(`Out of promise`); console.log(result); @@ -93,12 +107,18 @@ function finalizeAdyenPayment(sessionId, redirectResult) { onPaymentFailed: (result, component) => { console.log(`Payment failed`); console.log(result); - reject("Payment failed from Adyen"); + reject({ + paymentFailure: true, + message: "Payment failed from Adyen", + }); }, onError: (error, component) => { console.log(`Error occured`); console.log(error); - reject("Error from Adyen"); + reject({ + paymentFailure: false, + message: "Error from Adyen", + }); }, }, options: {}, From 3cbddd8cda0741951d17b5da0c5e46a228cc0aba Mon Sep 17 00:00:00 2001 From: Adam Caouette Date: Fri, 9 Jan 2026 10:58:04 -0500 Subject: [PATCH 074/196] CASH-2025: updates to store actions --- src/constants/store-actions.js | 1 + src/constants/store-mutations.js | 1 + src/store/index.js | 13 +++++++++++-- 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/src/constants/store-actions.js b/src/constants/store-actions.js index e09a4c78b..2fc0c88eb 100644 --- a/src/constants/store-actions.js +++ b/src/constants/store-actions.js @@ -111,6 +111,7 @@ const storeActions = { SAVE_PAYPAL_TOKEN: "savePaypalToken", SAVE_NEXTGEN_SETTLED_AMOUNT: "saveNextGenSettledAmount", SAVE_IS_RECAL_ACK_OPT_IN: "saveIsRecalAckOptIn", + SAVE_IS_OEM_GLASS_SELECTED: "saveIsOemGlassSelected", SAVE_IS_MSR_FEE_APPLICABLE: "saveIsMSRFeeApplicable", CREATE_SUBMITTED_STATE: "createSubmittedState", diff --git a/src/constants/store-mutations.js b/src/constants/store-mutations.js index 2112c789c..5167581e0 100644 --- a/src/constants/store-mutations.js +++ b/src/constants/store-mutations.js @@ -69,6 +69,7 @@ const storeMutations = { LOCK_TOKEN: "updateLockToken", UPDATE_SETTLED_TENDER_AMOUNT: "updateSettledTenderAmount", UPDATE_IS_RECAL_ACK_OPT_IN: "updateIsRecalAckOptIn", + UPDATE_IS_OEM_GLASS_SELECTED: "updateIsOemGlassSelected", UPDATE_IS_MSR_FEE_APPLICABLE: "updateIsMSRFeeApplicable", UPDATE_CASH_PRICE_SUBTOTAL: "updateCashPriceSubTotal", diff --git a/src/store/index.js b/src/store/index.js index 1c1f4038f..8dd6d7502 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -190,6 +190,7 @@ const getDefaultState = () => { settledTenderAmount: 0, isRecalAckOptIn: false, isMSRFeeApplicable: false, + isOemGlassSelected: false, }, applicationUser: { eventBus: [], @@ -342,6 +343,9 @@ export const mutations = { updateIsRecalAckOptIn(state, isRecalAckOptIn) { state.order.isRecalAckOptIn = isRecalAckOptIn; }, + updateIsOemGlassSelected(state, isOemGlassSelected) { + state.order.isOemGlassSelected = isOemGlassSelected; + }, updateIsMSRFeeApplicable(state, isMSRFeeApplicable) { state.order.isMSRFeeApplicable = isMSRFeeApplicable; }, @@ -674,6 +678,7 @@ export const mutations = { state.order.eon = sessionInformation.order.eon; state.order.customerPortalLoginToken = sessionInformation.order.CustomerPortalLoginToken; state.order.isRecalAckOptIn = sessionInformation.order.isRecalAckOptIn; + state.order.isOemGlassSelected = sessionInformation.order.isOemGlassSelected; if (state.order.vehicle.vin !== sessionInformation.order.vehicle?.vin) { state.applicationUser.pageData[routeData.PART_QUESTIONS.name] = null; @@ -1853,8 +1858,7 @@ export const actions = { const serviceType = order.serviceLocation?.appointmentType; const referralSeqNumber = order.referralSequenceNumber; const parentAccountNumber = applicationConfig.CASH_PARENT_ACCOUNT_NUMBER; - const oemEndorsementFlag = false; // Need to update from the store when available - + const oemEndorsementFlag = order.isOemGlassSelected; // create a new array to avoid mutating state const glassArrayForPayload = convertGlassPieceNamingForApi(glassArray); const resultsArrayForPayload = convertResultsForApi(resultsArray); @@ -2542,6 +2546,7 @@ export const actions = { lockToken: order.lockToken, isRecalAckOptIn: order.isRecalAckOptIn, isMSRFeeApplicable: order.isMSRFeeApplicable, + isOemGlassSelected: order.isOemGlassSelected, cashPriceSubTotal: order.cashPriceSubTotal, }, }, @@ -2959,6 +2964,10 @@ export const actions = { context.commit(storeMutations.UPDATE_IS_RECAL_ACK_OPT_IN, isRecalAckOptIn); }, + saveIsOemGlassSelected(context, isOemGlassSelected) { + context.commit(storeMutations.UPDATE_IS_OEM_GLASS_SELECTED, isOemGlassSelected); + }, + saveIsMSRFeeApplicable(context, isMSRFeeApplicable) { context.commit(storeMutations.UPDATE_IS_MSR_FEE_APPLICABLE, isMSRFeeApplicable); }, From 9af898604d8f28d12ee50ca2f6f410ecbc640068 Mon Sep 17 00:00:00 2001 From: Adam Caouette Date: Fri, 9 Jan 2026 10:59:33 -0500 Subject: [PATCH 075/196] CASH-2025: temp commenting during dev --- src/layouts/quote/quote.vue | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/layouts/quote/quote.vue b/src/layouts/quote/quote.vue index b08e9ed72..9f973d79d 100644 --- a/src/layouts/quote/quote.vue +++ b/src/layouts/quote/quote.vue @@ -2,6 +2,13 @@
+ +
+

+ alternateGlassPartsForOem: {{ alternateGlassPartsForOem }} +

+
+
@@ -743,6 +750,12 @@ export default { this.lineItems.supportingItems = this.filterOutFees(this.lineItems.supportingItems); } + // isOemGlassSelected? + // if it IS, then swap out the glass parts in the line items for these + + // if it's NOT selected BUT alternateGlassPartsForOem exist, then swap out + // // the existing glass line items for whatever is in alternateGlassPartsForOem + if (this.lineItems.glassParts?.length > 0) { this.dispatchStoreAction( this.storeActions.SAVE_GLASS_PARTS_SUPPRESSING_STATE_RESETTING, From c6e006020c1decd8a57fffd63e371c068f7acf34 Mon Sep 17 00:00:00 2001 From: Adam Caouette Date: Fri, 9 Jan 2026 11:01:16 -0500 Subject: [PATCH 076/196] CASH-2025: new oem glass question component --- .../oem-glass-question/oem-glass-question.vue | 134 ++++++++++++++++++ 1 file changed, 134 insertions(+) create mode 100644 src/layouts/quote/oem-glass-question/oem-glass-question.vue diff --git a/src/layouts/quote/oem-glass-question/oem-glass-question.vue b/src/layouts/quote/oem-glass-question/oem-glass-question.vue new file mode 100644 index 000000000..b1b4b4e48 --- /dev/null +++ b/src/layouts/quote/oem-glass-question/oem-glass-question.vue @@ -0,0 +1,134 @@ + + + + + From e7e499ca461ac96dc4a0a4a42737cde38cb95855 Mon Sep 17 00:00:00 2001 From: Adam Caouette Date: Fri, 9 Jan 2026 11:05:40 -0500 Subject: [PATCH 077/196] CASH-2025: add oem question and logic --- src/layouts/quote/quote.vue | 58 ++++++++++++++++++++++++++++++------- 1 file changed, 48 insertions(+), 10 deletions(-) diff --git a/src/layouts/quote/quote.vue b/src/layouts/quote/quote.vue index 9f973d79d..0f273dcb1 100644 --- a/src/layouts/quote/quote.vue +++ b/src/layouts/quote/quote.vue @@ -93,6 +93,11 @@ isInsuranceSelected ? isInsuranceContinueButtonText : '' " /> + + ({ @@ -410,6 +437,8 @@ export default { vm.holdParentAccountNumber = holdParentAccountNumber; vm.holdBillToAccountNumber = holdBillToAccountNumber; vm.skipToInsurance = shouldSkipToInsurance; + vm.offerOem = offerOem; + vm.alternateGlassPartsForOem = alternateGlassPartsForOem; // oemParts if (revalidatePromoResponse) { const revalidateAlerts = buildToastMessagesFromRevalidateOrValidatePromoResponse( @@ -577,6 +606,8 @@ export default { availableLineItems: null, lineItems: [], addableVaps: [], + offerOem: null, + alternateGlassPartsForOem: null, servicePackage: null, holdParentAccountNumber: null, holdBillToAccountNumber: null, @@ -586,6 +617,7 @@ export default { packageNumber: null, skipToInsurance: null, servicePackageSelected: null, + isOemGlassSelected: false, }; }, async mounted() { @@ -788,6 +820,11 @@ export default { }, false ); + this.dispatchStoreAction( + this.storeActions.SAVE_IS_OEM_GLASS_SELECTED, + this.isOemGlassSelected, + false + ); await savePageData( this.pageName, @@ -922,6 +959,7 @@ export default { recalDisclaimer, saveProgressModalQuestion, saveProgressPopupQuestion, + oemGlassQuestion, }, }; From 9fad67319b925da03b42c8b3ede8135b46bf7871 Mon Sep 17 00:00:00 2001 From: Chris Redelinghuys Date: Fri, 9 Jan 2026 15:50:54 -0500 Subject: [PATCH 078/196] CASH-2025: Swap OEM glass order item --- .../oem-glass-question/oem-glass-question.vue | 5 +-- src/layouts/quote/quote.spec.js | 3 ++ src/layouts/quote/quote.vue | 44 +++++++++++++------ 3 files changed, 36 insertions(+), 16 deletions(-) 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 b1b4b4e48..e1fdc2508 100644 --- a/src/layouts/quote/oem-glass-question/oem-glass-question.vue +++ b/src/layouts/quote/oem-glass-question/oem-glass-question.vue @@ -1,7 +1,5 @@