diff --git a/src/mixins/analytics-mixin.js b/src/mixins/analytics-mixin.js index 2330dde9..0da2a43d 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,19 @@ export default { const issConfig = store.issConfig; const applicationUser = store.applicationUser; + // Bailout info for analytics. We use combined string to send to analytics - BailoutCode_BailoutString - ex: 15_ApiError + const bailoutCode = store.bailoutCode; + let bailoutCombinedString = ""; + + 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(); @@ -563,6 +577,8 @@ export default { sessionData.userAgent = navigator.userAgent; + sessionData.bailoutCodeValue = bailoutCombinedString; + store.logIssSessionData(sessionData); }, 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(); diff --git a/src/store/index.js b/src/store/index.js index 5ed92898..eef5e5d6 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -2819,6 +2819,7 @@ export const useMainStore = defineStore({ totalPrice, userAgent, cashPriceSubTotal, + bailoutCodeValue, } ) { var payload = { @@ -2870,6 +2871,7 @@ export const useMainStore = defineStore({ userAgent: userAgent, cashPriceSubTotal: cashPriceSubTotal, billToAccountNumber: billToAccountNumber, + bailoutCode: bailoutCodeValue, }; return globalMethods.callHttpClient({