From d6c1e7cd06c35f3608bcf3381829f227fafa9a81 Mon Sep 17 00:00:00 2001 From: Alex Humphries Date: Wed, 15 Jul 2026 10:48:12 -0400 Subject: [PATCH 1/5] INSR-523: If flag is on, includes memberNumber in all coverage requests Also adds new (currently unused) flag to move claim registration to end of flow --- src/layouts/entry-page/entry-page.vue | 4 + src/store/index.js | 186 ++++++++++++++------------ src/store/store.spec.js | 40 ++++++ 3 files changed, 143 insertions(+), 87 deletions(-) diff --git a/src/layouts/entry-page/entry-page.vue b/src/layouts/entry-page/entry-page.vue index 9cea64bc..f177cd53 100644 --- a/src/layouts/entry-page/entry-page.vue +++ b/src/layouts/entry-page/entry-page.vue @@ -226,6 +226,10 @@ export default { this.mainStore.issConfig.hiddenFields.phoneNumber = true; } } + + if (clientFlags.CallClaimRegistrationAtEnd) { + this.mainStore.issConfig.callClaimRegistrationAtEnd = true; + } } }, combineClientParameters(configParams, queryStringParams) { diff --git a/src/store/index.js b/src/store/index.js index eef5e5d6..3da801c2 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -279,7 +279,8 @@ export const getDefaultState = () => ({ buildInfo: (typeof __BUILD_INFO__ !== 'undefined') ? __BUILD_INFO__ : null, // Contains the build info for the website, set during the build process. Version, Time, Git info etc.... siteType: null, // SiteType / SubType the site is set to (Essential/Advanced). enableNoCompQuote: false, - useMemberNumber: false // Indicates if member number should be included for policy lookup purposes + useMemberNumber: false, // Indicates if member number should be included for policy lookup purposes + callClaimRegistrationAtEnd: false, // Indicates if claim registration should be called at the end of the flow. } }); @@ -646,72 +647,76 @@ export const useMainStore = defineStore({ const { isITAC } = this; try { + const payload = { + referralCorrelationId: this.order.referralCorrelationId, + referralDate: this.order.referralDate, + referralNumber: this.order.referralNumber, + accountNumber: this.order.parentAccountNumber?.toString() ?? '', + policyData: this.order.policy.policyData, + // TODO: Remove this isRepair flag from the payload after coverage service updates are deployed. + // This is here in case we have to deploy site for other fixes before coverage service gets updated. + isRepair: this.order.damage.isRepair, + isItac: isITAC, + sourceSystem: applicationConfig.APPLICATION_NAME, + insured: { + firstName: this.order.customer.firstName, + lastName: this.order.customer.lastName, + address: { + addressLine1: this.order.customer.address.streetAddress, + addressLine2: this.order.customer.address.streetAddress2, + city: this.order.customer.address.city, + state: this.order.customer.address.state, + zipCode: this.order.customer.address.zipCode, + country: 'US' // TODO set from store + }, + homePhone: { + number: this.contactInfo.homePhone?.replaceAll(nonNumberCharRegex, '') ?? '' + } + }, + driver: { + firstName: this.order.customer.firstName, + lastName: this.order.customer.lastName + }, + caller: { + homePhone: {} + }, + policyInfo: { + policyNumber: this.order.policy.policyNumber, + safelitePolicy: { + policies: [] + }, + actualDeductible: this.currentDeductible.toString() ?? '', + currentRepairDeductible: this.order.currentDeductible.repair, + currentReplaceDeductible: this.order.currentDeductible.replace, + company: this.order.customer.companyCode + }, + lossInfo: { + dateOfLoss: this.order.policy.dateOfLoss, + isRepair: this.order.damage.isRepair, + location: { + city: this.order.policy.damageCity, + state: this.order.policy.damageState, + country: 'US' // TODO set from store + }, + vehicle: { + id: this.order.vehicle.policyVehicleId?.toString() ?? '', + year: this.order.vehicle.year?.toString() ?? '', + make: this.order.vehicle.make, + model: this.order.vehicle.model, + vin: this.order.vehicle.vin + }, + cause: this.order.policy.damageCause, + damageDescription: this.order.policy.damageCause + } + }; + // Clients (i.e. USAA) may sometimes use member number, which is just policy number by a different name + if (this.issConfig.useMemberNumber) { + payload.memberNumber = this.order.policy.policyNumber; + } const response = await globalMethods.callHttpClient({ method: endpoints.RegisterClaim.method, endpoint: endpoints.RegisterClaim.url, - payload: - { - referralCorrelationId: this.order.referralCorrelationId, - referralDate: this.order.referralDate, - referralNumber: this.order.referralNumber, - accountNumber: this.order.parentAccountNumber?.toString() ?? '', - policyData: this.order.policy.policyData, - // TODO: Remove this isRepair flag from the payload after coverage service updates are deployed. - // This is here in case we have to deploy site for other fixes before coverage service gets updated. - isRepair: this.order.damage.isRepair, - isItac: isITAC, - sourceSystem: applicationConfig.APPLICATION_NAME, - insured: { - firstName: this.order.customer.firstName, - lastName: this.order.customer.lastName, - address: { - addressLine1: this.order.customer.address.streetAddress, - addressLine2: this.order.customer.address.streetAddress2, - city: this.order.customer.address.city, - state: this.order.customer.address.state, - zipCode: this.order.customer.address.zipCode, - country: 'US' // TODO set from store - }, - homePhone: { - number: this.contactInfo.homePhone?.replaceAll(nonNumberCharRegex, '') ?? '' - } - }, - driver: { - firstName: this.order.customer.firstName, - lastName: this.order.customer.lastName - }, - caller: { - homePhone: {} - }, - policyInfo: { - policyNumber: this.order.policy.policyNumber, - safelitePolicy: { - policies: [] - }, - actualDeductible: this.currentDeductible.toString() ?? '', - currentRepairDeductible: this.order.currentDeductible.repair, - currentReplaceDeductible: this.order.currentDeductible.replace, - company: this.order.customer.companyCode - }, - lossInfo: { - dateOfLoss: this.order.policy.dateOfLoss, - isRepair: this.order.damage.isRepair, - location: { - city: this.order.policy.damageCity, - state: this.order.policy.damageState, - country: 'US' // TODO set from store - }, - vehicle: { - id: this.order.vehicle.policyVehicleId?.toString() ?? '', - year: this.order.vehicle.year?.toString() ?? '', - make: this.order.vehicle.make, - model: this.order.vehicle.model, - vin: this.order.vehicle.vin - }, - cause: this.order.policy.damageCause, - damageDescription: this.order.policy.damageCause - } - }, + payload, bailoutOnError: false }); this.order.insuranceCoverage.claimNumber = response.data.claimNumber; @@ -741,33 +746,39 @@ export const useMainStore = defineStore({ glassInformation?.forEach((glassPiece) => { manualGlassNamesArray.push(glassPiece?.glassLocation?.toUpperCase()); }); - + + const payload = { + referralCorrelationId: this.order.referralCorrelationId, + accountNumber: this.order.parentAccountNumber?.toString() ?? '', + endorsements: endorsementAnswersForPayload, + manualGlassNames: manualGlassNamesArray, + policyState: this.order.customer.address.state, + status: this.order.policy.status, + originalDeductible: this.originalDeductible, + currentDeductible: this.currentDeductible, + currentRepairDeductible: this.order.currentDeductible.repair, + currentReplaceDeductible: this.order.currentDeductible.replace, + noCoverage: false, + isRepair: this.order.damage.isRepair, + policyNumber: this.order.policy.policyNumber, + insuredFirstName: this.order.customer.firstName, + insuredLastName: this.order.customer.lastName, + insuredZipCode: this.order.customer.address.zipCode, + policyVehicleId: this.order.vehicle.policyVehicleId?.toString() ?? '', + vehicleVin: this.order.vehicle.vin, + policyData: this.order.policy.policyData, + isItac: this.isITAC + } + // Clients (i.e. USAA) may sometimes use member number, which is just policy number by a different name + if (this.issConfig.useMemberNumber) { + payload.memberNumber = this.order.policy.policyNumber; + } + try { const r = await globalMethods.callHttpClient({ method: endpoints.FinalDeductible.method, endpoint: endpoints.FinalDeductible.url, - payload: { - referralCorrelationId: this.order.referralCorrelationId, - accountNumber: this.order.parentAccountNumber?.toString() ?? '', - endorsements: endorsementAnswersForPayload, - manualGlassNames: manualGlassNamesArray, - policyState: this.order.customer.address.state, - status: this.order.policy.status, - originalDeductible: this.originalDeductible, - currentDeductible: this.currentDeductible, - currentRepairDeductible: this.order.currentDeductible.repair, - currentReplaceDeductible: this.order.currentDeductible.replace, - noCoverage: false, - isRepair: this.order.damage.isRepair, - policyNumber: this.order.policy.policyNumber, - insuredFirstName: this.order.customer.firstName, - insuredLastName: this.order.customer.lastName, - insuredZipCode: this.order.customer.address.zipCode, - policyVehicleId: this.order.vehicle.policyVehicleId?.toString() ?? '', - vehicleVin: this.order.vehicle.vin, - policyData: this.order.policy.policyData, - isItac: this.isITAC - }, + payload, bailoutOnError: false }); this.order.policy.policyData = r.data.policyData; @@ -2308,6 +2319,7 @@ export const useMainStore = defineStore({ this.issConfig.enableNoCompQuote = false; this.issConfig.billToAccountNumber = null; this.issConfig.useMemberNumber = false; + this.issConfig.callClaimRegistrationAtEnd = false; // NOTE: Do not wipe out build info. }, diff --git a/src/store/store.spec.js b/src/store/store.spec.js index 61813d5c..0798bb36 100644 --- a/src/store/store.spec.js +++ b/src/store/store.spec.js @@ -518,6 +518,46 @@ describe('Store', () => { }) })); }); + + it('calls api with memberNumber when useMemberNumber is true', async () => { + // Arrange + store.issConfig.useMemberNumber = true; + const companyCode = getRandomString(6, 6); + const policyNumber = getRandomString(6, 6); + const originalDeductible = { + replace: 500, + repair: 0 + }; + const currentDeductible = { + replace: 500, + repair: 0 + }; + store.order.originalDeductible = { + replace: originalDeductible.replace, + repair: originalDeductible.repair + }; + store.order.currentDeductible = { + replace: currentDeductible.replace, + repair: currentDeductible.repair + }; + store.order.customer.companyCode = companyCode; + store.order.policy.policyNumber = policyNumber; + globalMethods.callHttpClient = jest.fn().mockReturnValue(Promise.resolve({})); + + // Act + await store.registerClaim(); + + // Asserts + expect(globalMethods.callHttpClient).toHaveBeenCalledWith(expect.objectContaining({ + payload: expect.objectContaining({ + sourceSystem: applicationConfig.APPLICATION_NAME, + memberNumber: policyNumber, + policyInfo: expect.objectContaining({ + company: companyCode + }) + }) + })); + }); }); describe('updateContactInfo method', () => { From b4b6009b68bc1c76d49089ebb8e32e6bf752da47 Mon Sep 17 00:00:00 2001 From: Alex Humphries Date: Wed, 15 Jul 2026 11:19:53 -0400 Subject: [PATCH 2/5] Update some formatting and tests --- src/store/index.js | 4 +- src/store/store.spec.js | 92 ++++++++++++++++++++++++++++++++++++++++- 2 files changed, 92 insertions(+), 4 deletions(-) diff --git a/src/store/index.js b/src/store/index.js index 3da801c2..b973ca25 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -279,7 +279,7 @@ export const getDefaultState = () => ({ buildInfo: (typeof __BUILD_INFO__ !== 'undefined') ? __BUILD_INFO__ : null, // Contains the build info for the website, set during the build process. Version, Time, Git info etc.... siteType: null, // SiteType / SubType the site is set to (Essential/Advanced). enableNoCompQuote: false, - useMemberNumber: false, // Indicates if member number should be included for policy lookup purposes + useMemberNumber: false, // Indicates if member number should be included for coverage related purposes callClaimRegistrationAtEnd: false, // Indicates if claim registration should be called at the end of the flow. } }); @@ -768,7 +768,7 @@ export const useMainStore = defineStore({ vehicleVin: this.order.vehicle.vin, policyData: this.order.policy.policyData, isItac: this.isITAC - } + }; // Clients (i.e. USAA) may sometimes use member number, which is just policy number by a different name if (this.issConfig.useMemberNumber) { payload.memberNumber = this.order.policy.policyNumber; diff --git a/src/store/store.spec.js b/src/store/store.spec.js index 0798bb36..a6f71db2 100644 --- a/src/store/store.spec.js +++ b/src/store/store.spec.js @@ -541,8 +541,7 @@ describe('Store', () => { repair: currentDeductible.repair }; store.order.customer.companyCode = companyCode; - store.order.policy.policyNumber = policyNumber; - globalMethods.callHttpClient = jest.fn().mockReturnValue(Promise.resolve({})); + store.order.policy.policyNumber = policyNumber;globalMethods.callHttpClient = jest.fn().mockReturnValue(Promise.resolve({ data: { claimNumber: 'CLM123', isSuccess: true } })); // Act await store.registerClaim(); @@ -1969,6 +1968,95 @@ describe('Store', () => { bailoutOnError: false })); }); + it('includes memberNumber wehn flag is set', () => { + // Arrange + const response = { + data: { + deductible: getRandomInt(0, 5000), + policyData: getRandomString(100, 200) + } + }; + + const location = getRandomString(10, 15).toUpperCase(); + store.order.damage.glassToReplace = [ + { + glassLocation: location + } + ]; + const referralCorrelationId = getRandomGuid(); + const parentAccountNumber = getRandomString(6, 6); + const endorsements = []; + const manualGlassNames = [location]; + const policyState = getRandomString(2, 2); + const status = getRandomString(6, 8); + const currentDeductible = 500; + const originalDeductible = 500; + const isRepair = getRandomBoolean(); + const policyNumber = getRandomString(10, 20); + const insuredFirstName = getRandomString(10, 20); + const insuredLastName = getRandomString(10, 20); + const insuredZipCode = getRandomInt(10000, 99999).toString(); + const policyVehicleId = getRandomInt(1, 2).toString(); + const vehicleVin = getRandomString(17, 17); + const policyData = getRandomString(100, 200); + + store.order.referralCorrelationId = referralCorrelationId; + store.order.parentAccountNumber = parentAccountNumber; + store.order.currentDeductible = { + replace: currentDeductible, + repair: currentDeductible + }; + store.order.originalDeductible = { + replace: originalDeductible, + repair: originalDeductible + }; + store.order.policy.status = status; + store.order.customer.address.state = policyState; + store.order.damage.isRepair = isRepair; + store.order.policy.policyNumber = policyNumber; + store.order.customer.firstName = insuredFirstName; + store.order.customer.lastName = insuredLastName; + store.order.customer.address.zipCode = insuredZipCode; + store.order.vehicle.policyVehicleId = policyVehicleId; + store.order.vehicle.vin = vehicleVin; + store.order.policy.policyData = policyData; + store.issConfig.useMemberNumber = true; + + globalMethods.callHttpClient = jest.fn().mockReturnValue(Promise.resolve(response)); + + // Act + store.getFinalDeductible(); + + // Assert + expect(globalMethods.callHttpClient).toHaveBeenCalledWith(({ + method: endpoints.FinalDeductible.method, + endpoint: endpoints.FinalDeductible.url, + payload: ({ + referralCorrelationId, + accountNumber: parentAccountNumber, + endorsements, + manualGlassNames, + policyState, + status, + currentDeductible, + originalDeductible, + currentRepairDeductible: store.order.currentDeductible.repair, + currentReplaceDeductible: store.order.currentDeductible.replace, + noCoverage: store.isNoComp, + isRepair, + policyNumber, + insuredFirstName, + insuredLastName, + insuredZipCode, + policyVehicleId, + vehicleVin, + policyData, + isItac: store.isITAC, + memberNumber: policyNumber + }), + bailoutOnError: false + })); + }); it('only "Yes" endorsement answers are added to payload', () => { // Arrange const response = { From acb1d53b046097bd8cb50c9ae6680805c90f8935 Mon Sep 17 00:00:00 2001 From: Alex Humphries Date: Wed, 15 Jul 2026 11:26:13 -0400 Subject: [PATCH 3/5] INSR-523: Fix some more test nitpicks --- src/store/store.spec.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/store/store.spec.js b/src/store/store.spec.js index a6f71db2..6c4ca152 100644 --- a/src/store/store.spec.js +++ b/src/store/store.spec.js @@ -541,7 +541,8 @@ describe('Store', () => { repair: currentDeductible.repair }; store.order.customer.companyCode = companyCode; - store.order.policy.policyNumber = policyNumber;globalMethods.callHttpClient = jest.fn().mockReturnValue(Promise.resolve({ data: { claimNumber: 'CLM123', isSuccess: true } })); + store.order.policy.policyNumber = policyNumber; + globalMethods.callHttpClient = jest.fn().mockReturnValue(Promise.resolve({ data: { claimNumber: 'CLM123', isSuccess: true } })); // Act await store.registerClaim(); @@ -1968,7 +1969,7 @@ describe('Store', () => { bailoutOnError: false })); }); - it('includes memberNumber wehn flag is set', () => { + it('includes memberNumber when flag is set', async () => { // Arrange const response = { data: { @@ -2025,7 +2026,7 @@ describe('Store', () => { globalMethods.callHttpClient = jest.fn().mockReturnValue(Promise.resolve(response)); // Act - store.getFinalDeductible(); + awaitstore.getFinalDeductible(); // Assert expect(globalMethods.callHttpClient).toHaveBeenCalledWith(({ From 459de70583655b9b2cf75d631418d988beceee45 Mon Sep 17 00:00:00 2001 From: Alex Humphries Date: Wed, 15 Jul 2026 11:30:05 -0400 Subject: [PATCH 4/5] INSR-523: Fix typo, fix potential bug with deductible on registerClaim --- src/store/index.js | 2 +- src/store/store.spec.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/store/index.js b/src/store/index.js index b973ca25..675618a2 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -685,7 +685,7 @@ export const useMainStore = defineStore({ safelitePolicy: { policies: [] }, - actualDeductible: this.currentDeductible.toString() ?? '', + actualDeductible: this.currentDeductible?.toString() ?? '', currentRepairDeductible: this.order.currentDeductible.repair, currentReplaceDeductible: this.order.currentDeductible.replace, company: this.order.customer.companyCode diff --git a/src/store/store.spec.js b/src/store/store.spec.js index 6c4ca152..a87a4917 100644 --- a/src/store/store.spec.js +++ b/src/store/store.spec.js @@ -2026,7 +2026,7 @@ describe('Store', () => { globalMethods.callHttpClient = jest.fn().mockReturnValue(Promise.resolve(response)); // Act - awaitstore.getFinalDeductible(); + await store.getFinalDeductible(); // Assert expect(globalMethods.callHttpClient).toHaveBeenCalledWith(({ From eea66c47c71a6a77d7fc39c9399cfc77dc8ae346 Mon Sep 17 00:00:00 2001 From: Alex Humphries Date: Wed, 15 Jul 2026 11:48:49 -0400 Subject: [PATCH 5/5] INSR-523: Fix failing test --- src/store/store.spec.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/store/store.spec.js b/src/store/store.spec.js index a87a4917..f8467737 100644 --- a/src/store/store.spec.js +++ b/src/store/store.spec.js @@ -2041,8 +2041,8 @@ describe('Store', () => { status, currentDeductible, originalDeductible, - currentRepairDeductible: store.order.currentDeductible.repair, - currentReplaceDeductible: store.order.currentDeductible.replace, + currentRepairDeductible: currentDeductible, + currentReplaceDeductible: currentDeductible, noCoverage: store.isNoComp, isRepair, policyNumber,