From be6e5c6c85a7bf2f64186072db47a4426abe1862 Mon Sep 17 00:00:00 2001 From: Jeremy-Z Date: Fri, 10 Jul 2026 09:26:23 -0400 Subject: [PATCH 1/9] WIP on develop Added combined bailout string to digitalconsumer-logging call. --- src/mixins/analytics-mixin.js | 17 +++++++++++++++++ src/store/index.js | 2 ++ 2 files changed, 19 insertions(+) diff --git a/src/mixins/analytics-mixin.js b/src/mixins/analytics-mixin.js index 2330dde9..ccb0051e 100644 --- a/src/mixins/analytics-mixin.js +++ b/src/mixins/analytics-mixin.js @@ -28,6 +28,7 @@ import coverageStatuses from '@/constants/coverage-statuses'; import coverageType from '@/constants/coverage-type'; import { AppointmentTypeStrings } from '@/constants/schedule-constants'; import { useMainStore } from '@/store'; +import BailoutCode from '@/constants/bailoutCode'; function pushToDataLayerIfDefined(data) { if (window.dataLayer !== undefined) { @@ -448,6 +449,20 @@ export default { const issConfig = store.issConfig; const applicationUser = store.applicationUser; + // Bailout info for analytics. We use combined string to send to analytics. + const bailoutCode = store.bailoutCode; + let bailoutString = ""; + let bailoutCombinedString = ""; + + try + { + bailoutString = bailoutCode ? Object.keys(BailoutCode).find(key => BailoutCode[key] === bailoutCode) : ""; + bailoutCombinedString = bailoutCode ? `${bailoutCode}_${bailoutString}` : ""; + } + catch (error) { + // Do not let error here stop logging. + } + // Use parentaccount on order, use parentaccount on issconfig as fallback. const parentAccountNumber = (order.parentAccountNumber ?? issConfig.parentAccountNumber).toString(); @@ -563,6 +578,8 @@ export default { sessionData.userAgent = navigator.userAgent; + sessionData.bailoutCode = bailoutCombinedString; + store.logIssSessionData(sessionData); }, diff --git a/src/store/index.js b/src/store/index.js index 091ffec1..8badd298 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -2813,6 +2813,7 @@ export const useMainStore = defineStore({ totalPrice, userAgent, cashPriceSubTotal, + bailoutCode, } ) { var payload = { @@ -2864,6 +2865,7 @@ export const useMainStore = defineStore({ userAgent: userAgent, cashPriceSubTotal: cashPriceSubTotal, billToAccountNumber: billToAccountNumber, + bailoutCode: bailoutCode, }; return globalMethods.callHttpClient({ From 9d52d843e207eaceeb99eaacf9860f93f8d03a22 Mon Sep 17 00:00:00 2001 From: Jeremy-Z Date: Fri, 10 Jul 2026 09:31:33 -0400 Subject: [PATCH 2/9] Updated comment. --- src/mixins/analytics-mixin.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mixins/analytics-mixin.js b/src/mixins/analytics-mixin.js index ccb0051e..1a5fb3e0 100644 --- a/src/mixins/analytics-mixin.js +++ b/src/mixins/analytics-mixin.js @@ -449,7 +449,7 @@ export default { const issConfig = store.issConfig; const applicationUser = store.applicationUser; - // Bailout info for analytics. We use combined string to send to analytics. + // Bailout info for analytics. We use combined string to send to analytics - BailoutCode_BailoutString - ex: 15_ApiError const bailoutCode = store.bailoutCode; let bailoutString = ""; let bailoutCombinedString = ""; From 9f13d4b97cef7818c14b0edd03e98cf93aea2c7c Mon Sep 17 00:00:00 2001 From: Jeremy-Z Date: Fri, 10 Jul 2026 09:41:27 -0400 Subject: [PATCH 3/9] Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- src/mixins/analytics-mixin.js | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/src/mixins/analytics-mixin.js b/src/mixins/analytics-mixin.js index 1a5fb3e0..e16ae65d 100644 --- a/src/mixins/analytics-mixin.js +++ b/src/mixins/analytics-mixin.js @@ -451,18 +451,17 @@ export default { // Bailout info for analytics. We use combined string to send to analytics - BailoutCode_BailoutString - ex: 15_ApiError const bailoutCode = store.bailoutCode; - let bailoutString = ""; let bailoutCombinedString = ""; - try - { - bailoutString = bailoutCode ? Object.keys(BailoutCode).find(key => BailoutCode[key] === bailoutCode) : ""; - bailoutCombinedString = bailoutCode ? `${bailoutCode}_${bailoutString}` : ""; - } - catch (error) { + try { + if (bailoutCode !== null && bailoutCode !== undefined) { + const bailoutString = + Object.keys(BailoutCode).find((key) => BailoutCode[key] === bailoutCode) ?? ""; + bailoutCombinedString = bailoutString ? `${bailoutCode}_${bailoutString}` : `${bailoutCode}`; + } + } catch (error) { // Do not let error here stop logging. } - // Use parentaccount on order, use parentaccount on issconfig as fallback. const parentAccountNumber = (order.parentAccountNumber ?? issConfig.parentAccountNumber).toString(); From 05a6c469c3fa67aae7dd71278984bb4fa472d103 Mon Sep 17 00:00:00 2001 From: Jeremy-Z Date: Fri, 10 Jul 2026 09:51:00 -0400 Subject: [PATCH 4/9] Added unit test. --- src/mixins/analytics-mixin.spec.js | 92 ++++++++++++++++++++++++++++++ 1 file changed, 92 insertions(+) diff --git a/src/mixins/analytics-mixin.spec.js b/src/mixins/analytics-mixin.spec.js index a13806c1..ecce169d 100644 --- a/src/mixins/analytics-mixin.spec.js +++ b/src/mixins/analytics-mixin.spec.js @@ -105,6 +105,98 @@ describe('analyticsMixin.js', () => { expect(expectedDataLayer).toEqual(expect.arrayContaining(window.dataLayer)); }); + test('pushIssSessionData: logs session payload to store', () => { + // Arrange + const store = useMainStore(); + const testCookieValue = { + sid: '10000000-0000-0000-0000-000000000001', + skey: '12345' + }; + setupCookies({ ISSCookieValue: JSON.stringify(testCookieValue) }); + + store.bailoutCode = 15; + store.applicationUser.savedSessionId = 'saved-session-id'; + store.applicationUser.pageData = { + quote: { + servicePackageSelected: 'BASIC_PACKAGE' + } + }; + store.order.parentAccountNumber = 11111111; + store.order.vehicle = { + carId: 'CAR123', + year: '2020', + make: 'Toyota', + model: 'Camry', + style: 'SE', + vin: '1ABCDEFGH12345678' + }; + store.order.damage = { + isRepair: false, + glassToReplace: [{ glassLocation: 'Windshield', glassName: 'Front' }] + }; + store.order.lineItems = { + glassParts: [{ partNumber: 'GP1', partType: 'Glass', childParts: [] }], + supportingItems: [{ partNumber: 'SUP1', partType: 'Adas' }], + vaps: [{ partNumber: 'VAP1', partType: 'Vap' }] + }; + store.order.schedule = { date: '2026-01-01', startTime: '09:00' }; + store.order.serviceLocation = { + appointmentType: 'Mobile', + provider: { + address: { + zipCode: '43081', + zipCodeCtu: '43081' + } + }, + zipCode: '43081', + zipCodeCtu: '43081' + }; + store.order.contactInfo = { + notesForTechnician: 'note', + requestTextUpdates: true + }; + store.order.payment = { + paymentMethod: 'Card', + nextGenSettledAmount: 100 + }; + store.order.insuranceCoverage = { + coverageStatus: 3, + coverageType: 1 + }; + store.order.eon = 'EON123'; + store.order.referralNumber = 'R123'; + store.order.referralSequenceNumber = '1'; + store.order.referralDate = '2026-01-01'; + store.order.workOrderNumber = 'WO123'; + store.order.workOrderId = 'WOID123'; + store.issConfig.parentAccountNumber = 99999999; + store.issConfig.billToAccountNumber = 'BILL123'; + store.issConfig.clientName = 'Test Insurance'; + store.currentDeductible = 250; + store.isVerified = true; + store.isNoComp = false; + store.isITAC = false; + + const context = { + getPageNameByQueryString: jest.fn().mockReturnValue('duplicate-check') + }; + + // Act + analyticsMixin.methods.pushIssSessionData.call(context); + + // Assert + expect(store.logIssSessionData).toHaveBeenCalledTimes(1); + expect(store.logIssSessionData).toHaveBeenCalledWith(expect.objectContaining({ + currentPage: 'duplicate-check', + referralNumber: 'R123', + issSessionId: 'saved-session-id', + parentAccountNumber: '11111111', + hasVin: true, + damageType: 'Replace', + productType: expect.arrayContaining(['GP1-Glass', 'SUP1-Adas', 'VAP1-Vap', 'BASIC_PACKAGE']) + })); + }); + test('Experiments, should push to dataLayer with default Google Custom Dimension Index', () => { // Arrange const store = useMainStore(); From 7bb40a4b9a9e7a96f51ab25f978075a97ffe53aa Mon Sep 17 00:00:00 2001 From: Jeremy-Z Date: Fri, 10 Jul 2026 09:55:29 -0400 Subject: [PATCH 5/9] Refactoring some variable names to reduce confusion. --- src/mixins/analytics-mixin.js | 2 +- src/store/index.js | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/mixins/analytics-mixin.js b/src/mixins/analytics-mixin.js index e16ae65d..0da2a43d 100644 --- a/src/mixins/analytics-mixin.js +++ b/src/mixins/analytics-mixin.js @@ -577,7 +577,7 @@ export default { sessionData.userAgent = navigator.userAgent; - sessionData.bailoutCode = bailoutCombinedString; + sessionData.bailoutCodeValue = bailoutCombinedString; store.logIssSessionData(sessionData); }, diff --git a/src/store/index.js b/src/store/index.js index 8badd298..58477dc7 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -2813,7 +2813,7 @@ export const useMainStore = defineStore({ totalPrice, userAgent, cashPriceSubTotal, - bailoutCode, + bailoutCodeValue, } ) { var payload = { @@ -2865,7 +2865,7 @@ export const useMainStore = defineStore({ userAgent: userAgent, cashPriceSubTotal: cashPriceSubTotal, billToAccountNumber: billToAccountNumber, - bailoutCode: bailoutCode, + bailoutCode: bailoutCodeValue, }; return globalMethods.callHttpClient({ From fc201cbf758608a90ecb7218de18ab8534e7fe77 Mon Sep 17 00:00:00 2001 From: Bill Richardson Date: Mon, 13 Jul 2026 13:09:35 -0400 Subject: [PATCH 6/9] Wire up experiment Happens on Page-Entry at vehicle-damage --- src/constants/experiments.js | 10 ++++++-- .../address-lookup/address-lookup.spec.js | 25 ++++++++++++++++++- src/layouts/address-lookup/address-lookup.vue | 4 ++- .../address-vehicles/address-vehicles.spec.js | 10 +++++++- .../address-vehicles/address-vehicles.vue | 4 ++- .../license-plate-lookup.vue | 4 ++- src/layouts/vin-lookup/vin-lookup.spec.js | 10 +++++++- src/layouts/vin-lookup/vin-lookup.vue | 4 ++- 8 files changed, 62 insertions(+), 9 deletions(-) diff --git a/src/constants/experiments.js b/src/constants/experiments.js index 41a51f84..0d85e49b 100644 --- a/src/constants/experiments.js +++ b/src/constants/experiments.js @@ -3,6 +3,7 @@ const experimentUniverses = Object.freeze({ ISS_FEATURETOGGLE_AREFEES_HIDDEN: 'NextGenISS_FeatureToggle_AreFeesHidden', ISS_FEATURETOGGLE_AREFEES_OVERRIDDEN: 'NextGenISS_FeatureToggle_AreFeesOverridden', ISS_MOBILE_FIRST_APPOINTMENTS: 'ISS_Mobile_First_Appointments', + ISS_YMM_NOT_FOUND: 'ISS_Nextgen_YMM_Not_Found', ADYEN_PAYMENT_TEST: 'NextGenAdyenPaymentTest' }); @@ -17,16 +18,21 @@ const experimentSettings = Object.freeze({ ISS_MOBILE_FIRST_MAX_PM_MOBILE_DAYS: 'MaxPmMobileDays', ISS_MOBILE_FIRST_SHOW_FIRST_MOBILE_APPOINTMENT: 'ShowMobileFirstAppointment', ISS_ENABLE_ADYEN_V1: 'ISS_Enable_Adyen_V1', + ISS_YMMS_VIN_REQUIRED_BAILOUT_ENABLED: 'IssEnableVinRequiredBailout', + ISS_YMMS_VIN_REQUIRED_PAGE_ENABLED: 'IssEnableVinRequiredPage', MSR_SPLIT_PAY_ENABLED: 'EnableMSRSplitPay' }); const experimentTest = Object.freeze({ - ISS_MOBILE_FIRST_POPUP_V3: 'ISS_Mobile_First_Popup_V3' + ISS_MOBILE_FIRST_POPUP_V3: 'ISS_Mobile_First_Popup_V3', + ISS_YMMS_V1: 'ISS_Nextgen_YMM_V1', }); const experimentVariation = Object.freeze({ ISS_MOBILE_FIRST_CONTROL_V3: 'NoShowMobileFirstPopUp_V3_CONTROL', - ISS_MOBILE_FIRST_TEST_V3: 'YesShowMobileFirstPopUp_V3_TEST' + ISS_MOBILE_FIRST_TEST_V3: 'YesShowMobileFirstPopUp_V3_TEST', + ISS_YMMS_CONTROL: 'ISS_Nextgen_YMM_Control', + ISS_YMMS_TEST: 'ISS_Nextgen_YMM_Test', }); const experimentTriggers = Object.freeze({ diff --git a/src/layouts/address-lookup/address-lookup.spec.js b/src/layouts/address-lookup/address-lookup.spec.js index e7bc0b16..aead77c4 100644 --- a/src/layouts/address-lookup/address-lookup.spec.js +++ b/src/layouts/address-lookup/address-lookup.spec.js @@ -3,6 +3,7 @@ import addressLookup from '@/layouts/address-lookup/address-lookup.vue'; // Supporting Files import baseMixin from '@/mixins/base-mixin'; +import { experimentSettings } from '@/constants/experiments'; import settleAllPromises from '@/helpers/layout-helper.js'; import { shallowMount } from '@vue/test-utils'; import { getMountOptions } from '@/helpers/unit-test-helper.js'; @@ -69,8 +70,16 @@ function setupMocks({ zipCode: '11111' } } + }, + mixins: { + getSettingValue: jest.fn((settingName) => { + if (settingName === experimentSettings.ISS_YMMS_VIN_REQUIRED_BAILOUT_ENABLED) { + return 'true'; + } + + return 'false'; + }) } - }) ); @@ -422,6 +431,13 @@ describe('address-lookup.vue', () => { const { wrapper } = setupMocks({}, {}); wrapper.vm.navigateForwardWithSingleCarMatch = jest.fn(); + wrapper.vm.getSettingValue = jest.fn((settingName) => { + if (settingName === experimentSettings.ISS_YMMS_VIN_REQUIRED_BAILOUT_ENABLED) { + return 'true'; + } + + return 'false'; + }); useMainStore().order.vehicle.carId = 'C0000'; @@ -457,6 +473,13 @@ describe('address-lookup.vue', () => { const { wrapper } = setupMocks({}); wrapper.vm.navigateForwardWithSingleCarMatch = jest.fn(); + wrapper.vm.getSettingValue = jest.fn((settingName) => { + if (settingName === experimentSettings.ISS_YMMS_VIN_REQUIRED_BAILOUT_ENABLED) { + return 'true'; + } + + return 'false'; + }); useMainStore().order.vehicle.carId = 'CARID3'; diff --git a/src/layouts/address-lookup/address-lookup.vue b/src/layouts/address-lookup/address-lookup.vue index 52fe0050..bc61bb89 100644 --- a/src/layouts/address-lookup/address-lookup.vue +++ b/src/layouts/address-lookup/address-lookup.vue @@ -81,6 +81,7 @@ import alert from '@/ux-components/alert/alert.vue'; import { Form } from 'vee-validate'; // Supporting files +import { experimentSettings } from '@/constants/experiments'; import { fetchCmsContentForPage } from '@/helpers/cms-content-helper'; import settleAllPromises from '@/helpers/layout-helper'; import routerParams from '@/router/router-constants/router-params'; @@ -344,7 +345,8 @@ export default { { [routerParams.DISPLAY_VEHICLE_CHANGE_ALERT]: true } ); } else if (matchingCars.length === 1) { - if (this.mainStore.order.vehicle.vinRequired) { + const ymmsBailoutEnabled = this.getSettingValue(experimentSettings.ISS_YMMS_VIN_REQUIRED_BAILOUT_ENABLED); + if (ymmsBailoutEnabled && this.mainStore.order.vehicle.vinRequired) { this.mainStore.setBailout(bailoutMessage.YMMNotFound()); return this.$router.navigate( this.navigationScenarios.BAILOUT, diff --git a/src/layouts/address-vehicles/address-vehicles.spec.js b/src/layouts/address-vehicles/address-vehicles.spec.js index 141519cd..bb2c83f2 100644 --- a/src/layouts/address-vehicles/address-vehicles.spec.js +++ b/src/layouts/address-vehicles/address-vehicles.spec.js @@ -1,5 +1,6 @@ import addressVehicles from '@/layouts/address-vehicles/address-vehicles.vue'; import baseMixin from '@/mixins/base-mixin'; +import { experimentSettings } from '@/constants/experiments'; import settleAllPromises from '@/helpers/layout-helper.js'; import { shallowMount } from '@vue/test-utils'; import { getMountOptions } from '@/helpers/unit-test-helper.js'; @@ -104,7 +105,14 @@ function setupMocks({ return 'VehicleConfirmationQuestionTestReturn'; } return null; - }) + }), + getSettingValue: jest.fn((settingName) => { + if (settingName === experimentSettings.ISS_YMMS_VIN_REQUIRED_BAILOUT_ENABLED) { + return 'true'; + } + + return 'false'; + }), }, computed: { dynamicStrings() { diff --git a/src/layouts/address-vehicles/address-vehicles.vue b/src/layouts/address-vehicles/address-vehicles.vue index 7b651e7b..84bea124 100644 --- a/src/layouts/address-vehicles/address-vehicles.vue +++ b/src/layouts/address-vehicles/address-vehicles.vue @@ -72,6 +72,7 @@ import settleAllPromises from '@/helpers/layout-helper'; import { useMainStore } from '@/store'; import issPageValues from '@/router/router-constants/issPage-values'; import errorMessages from '@/constants/error-messages'; +import { experimentSettings } from '@/constants/experiments'; import { required } from '@/helpers/validation-rules'; import { Form, defineRule } from 'vee-validate'; import { isGlassAvailableForCarId } from '@/helpers/damage-helper'; @@ -256,7 +257,8 @@ export default { false ); - if (this.mainStore.order.vehicle.vinRequired) { + const ymmsBailoutEnabled = this.getSettingValue(experimentSettings.ISS_YMMS_VIN_REQUIRED_BAILOUT_ENABLED); + if (ymmsBailoutEnabled && this.mainStore.order.vehicle.vinRequired) { this.mainStore.setBailout(bailoutMessage.YMMNotFound()); return this.$router.navigate( this.navigationScenarios.BAILOUT, diff --git a/src/layouts/license-plate-lookup/license-plate-lookup.vue b/src/layouts/license-plate-lookup/license-plate-lookup.vue index d70c7b39..a86995c8 100644 --- a/src/layouts/license-plate-lookup/license-plate-lookup.vue +++ b/src/layouts/license-plate-lookup/license-plate-lookup.vue @@ -78,6 +78,7 @@ import settleAllPromises from '@/helpers/layout-helper'; import { useMainStore } from '@/store'; import bailoutMessage from '@/constants/bailoutMessage'; import errorMessages from '@/constants/error-messages'; +import { experimentSettings } from '@/constants/experiments'; import { required } from '@/helpers/validation-rules'; import { defineRule, Form } from 'vee-validate'; import { @@ -304,7 +305,8 @@ export default { } }); - if (this.mainStore.order.vehicle.vinRequired) { + const ymmsBailoutEnabled = this.getSettingValue(experimentSettings.ISS_YMMS_VIN_REQUIRED_BAILOUT_ENABLED); + if (ymmsBailoutEnabled && this.mainStore.order.vehicle.vinRequired) { this.mainStore.setBailout(bailoutMessage.YMMNotFound()); return this.$router.navigate( this.navigationScenarios.BAILOUT, diff --git a/src/layouts/vin-lookup/vin-lookup.spec.js b/src/layouts/vin-lookup/vin-lookup.spec.js index 820d2820..b5e9efe6 100644 --- a/src/layouts/vin-lookup/vin-lookup.spec.js +++ b/src/layouts/vin-lookup/vin-lookup.spec.js @@ -5,6 +5,7 @@ import baseMixin from '@/mixins/base-mixin'; import { createTestingPinia } from '@pinia/testing'; import userEvent from '@testing-library/user-event'; import errorMessages from '@/constants/error-messages'; +import { experimentSettings } from '@/constants/experiments'; import issPageValues from '@/router/router-constants/issPage-values'; import queryStrings from '@/constants/query-strings'; import { GaActions } from '@/constants/analytics'; @@ -172,7 +173,14 @@ const mountOptions = { getFooterInfoBoxHeight: jest.fn(() => 80), cssClassNameForCmsWidget: jest.fn(() => 'widget-name-mock-class'), getPageNameByQueryString: jest.fn(() => ''), - pushEventToGA: jest.fn() + pushEventToGA: jest.fn(), + getSettingValue: jest.fn((settingName) => { + if (settingName === experimentSettings.ISS_YMMS_VIN_REQUIRED_BAILOUT_ENABLED) { + return 'true'; + } + + return 'false'; + }) }, computed: { GaActions() { diff --git a/src/layouts/vin-lookup/vin-lookup.vue b/src/layouts/vin-lookup/vin-lookup.vue index 1729c3c7..ca20daf0 100644 --- a/src/layouts/vin-lookup/vin-lookup.vue +++ b/src/layouts/vin-lookup/vin-lookup.vue @@ -42,6 +42,7 @@