Merge pull request #1302 from Safelite/feature/humphries/INSR-523

INSR-523: If flag is on, includes memberNumber in all coverage requests
This commit is contained in:
AHumphriesSL 2026-07-15 12:13:13 -04:00 committed by GitHub
commit 8c65680c44
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 232 additions and 87 deletions

View file

@ -226,6 +226,10 @@ export default {
this.mainStore.issConfig.hiddenFields.phoneNumber = true;
}
}
if (clientFlags.CallClaimRegistrationAtEnd) {
this.mainStore.issConfig.callClaimRegistrationAtEnd = true;
}
}
},
combineClientParameters(configParams, queryStringParams) {

View file

@ -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 coverage related 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;
@ -742,32 +747,38 @@ export const useMainStore = defineStore({
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.
},

View file

@ -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({ data: { claimNumber: 'CLM123', isSuccess: true } }));
// 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', () => {
@ -1929,6 +1969,95 @@ describe('Store', () => {
bailoutOnError: false
}));
});
it('includes memberNumber when flag is set', async () => {
// 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
await 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: currentDeductible,
currentReplaceDeductible: currentDeductible,
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 = {