diff --git a/src/helpers/order-helper.js b/src/helpers/order-helper.js index 58d8bc38..3190e7f7 100644 --- a/src/helpers/order-helper.js +++ b/src/helpers/order-helper.js @@ -4,8 +4,8 @@ import submitType from '@/constants/submit-type'; /* Encapsulates asynchronous Save Session logic inside a promise to allow for Save Session queuing */ -async function saveSessionHelper(store, { submitAfterSave }) { - const savedSessionInfo = await store.saveSession({ submitAfterSave }); +async function saveSessionHelper(store, { submitAfterSave, createWorkOrderNumberForPIA }) { + const savedSessionInfo = await store.saveSession({ submitAfterSave, createWorkOrderNumberForPIA }); if (savedSessionInfo) { store.setSaveSessionInfo(savedSessionInfo.data); } @@ -16,11 +16,11 @@ async function saveSessionHelper(store, { submitAfterSave }) { This will also set Referral information in the store after saving, and then update the cookie. To force synchronous behavior pass in 'true' for shouldAwaitSaveSessionQueue */ -export async function saveSession({ shouldAwaitSaveSessionQueue = false, submitAfterSave = false }) { +export async function saveSession({ shouldAwaitSaveSessionQueue = false, submitAfterSave = false, createWorkOrderNumberForPIA = false }) { const store = useMainStore(); const saveSessionPromise = store.applicationUser.saveSessionPromise - ? store.applicationUser.saveSessionPromise.then(() => saveSessionHelper(store, { submitAfterSave })) - : saveSessionHelper(store, { submitAfterSave }); + ? store.applicationUser.saveSessionPromise.then(() => saveSessionHelper(store, { submitAfterSave, createWorkOrderNumberForPIA })) + : saveSessionHelper(store, { submitAfterSave, createWorkOrderNumberForPIA }); store.setSaveSessionPromise(saveSessionPromise); diff --git a/src/helpers/querystring-helper.js b/src/helpers/querystring-helper.js index b827441a..11dcdb48 100644 --- a/src/helpers/querystring-helper.js +++ b/src/helpers/querystring-helper.js @@ -43,3 +43,29 @@ export function getTaxLineItemQueryString(lineItems, parameterName) { + `&${parameterName}[${index}].kitPrice=${lineItem.kitPrice}`).join('&'); return queryString.length !== 0 ? `&${queryString}` : ''; } + +export function buildURLSearchParams(data) { + const params = new URLSearchParams(); + Object.entries(data).forEach(([key, value]) => { + if (value == null) { + return; + } + if (Array.isArray(value)) { + value.forEach((arrayValue, index) => { + if (typeof value === 'object') { + Object.entries(arrayValue).forEach(([objectKey, objectValue]) => { + if (objectValue != null) { + params.append(`${key}[${index}].${objectKey}`, `${objectValue}`); + } + }); + } else { + params.append(`${key}[${index}]`, `${value}`); + } + }); + } else { + params.append(key, `${value}`); + } + }); + + return params; +} diff --git a/src/layouts/coverage-statement/coverage-statement.vue b/src/layouts/coverage-statement/coverage-statement.vue index 42c5bb20..ac0751e8 100644 --- a/src/layouts/coverage-statement/coverage-statement.vue +++ b/src/layouts/coverage-statement/coverage-statement.vue @@ -395,9 +395,10 @@ export default { showIssLoadingModal(false); }, async getPricedParts() { - const { glassParts } = this.mainStore.order.lineItems; + const { glassParts, supportingItems } = this.mainStore.order.lineItems; const availableLineItems = [ - ...(glassParts ?? []) + ...(glassParts ?? []), + ...(supportingItems ?? []) ]; // We only call the ITAC pricing endpoint if we are not repair or we are NoComp diff --git a/src/layouts/order-confirmation/order-confirmation.spec.js b/src/layouts/order-confirmation/order-confirmation.spec.js index e0f651c6..dfb9a45a 100644 --- a/src/layouts/order-confirmation/order-confirmation.spec.js +++ b/src/layouts/order-confirmation/order-confirmation.spec.js @@ -920,6 +920,29 @@ describe('OrderConfirmation.vue', () => { // Act const testValue = wrapper.vm.isDropOffAppointment; + // Assert + expect(testValue).toBe(expected); + }); + }); + describe('showCart', () => { + test.each([ + [true, true, 100], + [true, false, 100], + [false, true, 0], + [false, true, null] + ])('showCart is %p when is PIA is %p and settledTenderAmount is %p', (expected, isPia, settledTenderAmount) => { + // Arrange + const order = deepClone(sessionStorage); + order.payment.isPayInAdvance = isPia; + order.settledTenderAmount = settledTenderAmount; + const mockStoreActions = () => { + useMainStore().getSubmittedOrder = jest.fn().mockImplementation(() => order); + }; + const { wrapper } = getMountedComponent({}, {}, mockStoreActions); + + // Act + const testValue = wrapper.vm.showCart; + // Assert expect(testValue).toBe(expected); }); diff --git a/src/layouts/order-confirmation/order-confirmation.vue b/src/layouts/order-confirmation/order-confirmation.vue index e33a5e08..4f649c88 100644 --- a/src/layouts/order-confirmation/order-confirmation.vue +++ b/src/layouts/order-confirmation/order-confirmation.vue @@ -56,6 +56,7 @@
0) { + return true; + } + + // settleTenderAmount always shows 0 via localhost or dev. + // Temporarily set return true to see cart in localhost or dev environment + return false; } }, mounted() { diff --git a/src/layouts/payment-method/payment-method.vue b/src/layouts/payment-method/payment-method.vue index 832e2d9a..cd16dac3 100644 --- a/src/layouts/payment-method/payment-method.vue +++ b/src/layouts/payment-method/payment-method.vue @@ -89,9 +89,10 @@ import issPageValues from '@/router/router-constants/issPage-values'; import bailoutMessage from '@/constants/bailoutMessage'; import { AppointmentTypeStrings } from '@/constants/schedule-constants'; import VehicleBanner from '@/iss-components/vehicle-banner/vehicle-banner.vue'; -import { submitWorkOrder } from '@/helpers/order-helper.js'; +import { saveSession, submitWorkOrder } from '@/helpers/order-helper.js'; import { experimentSettings } from '@/constants/experiments'; import submitType from '@/constants/submit-type'; +import routerParams from '@/router/router-constants/router-params'; export default { name: 'payment-method', @@ -284,9 +285,16 @@ export default { console.error(`error: response from submit work order:${error.message}`); } } else { + await saveSession({ + createWorkOrderNumberForPIA: true, + shouldAwaitSaveSessionQueue: true + }); + this.$router.navigate( this.navigationScenarios.CLICKED_PAY_NOW, - this.$route + this.$route, + {}, + { [routerParams.SKIP_SAVE_SESSION]: true } ); } } diff --git a/src/layouts/vehicle-damage/vehicle-damage.vue b/src/layouts/vehicle-damage/vehicle-damage.vue index 1561a3bd..a86fe4ca 100644 --- a/src/layouts/vehicle-damage/vehicle-damage.vue +++ b/src/layouts/vehicle-damage/vehicle-damage.vue @@ -415,8 +415,10 @@ export default { if (this.isWindshieldRepair) { const results = await Promise.allSettled([useMainStore().getSupportingItems(), useMainStore().getRecalParts()]); - const supportingItems = results[0]; + const supportingItems = results[0].value; useMainStore().updateSupportingItems(supportingItems.data); + } else { + useMainStore().updateSupportingItems([]); } if (this.mainStore.damage.isRepair) { diff --git a/src/store/index.js b/src/store/index.js index c4c3b903..a9a3f253 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -26,7 +26,7 @@ import bailoutCode from '@/constants/bailoutCode'; import partNumberStrings from '@/constants/part-number-strings'; import { findLineItemIndex, getLineItemsFlattened } from '@/helpers/line-items-helper'; import { - buildQueryStringParameterFromArrayOfComplexObjects, + buildQueryStringParameterFromArrayOfComplexObjects, buildURLSearchParams, getLineItemQueryString, getPartNumbersListForQueryString, getTaxLineItemQueryString @@ -214,6 +214,8 @@ export const getDefaultState = () => ({ eon: null, workOrderId: null, workOrderNumber: null, + settledTenderAmount: null, + lockToken: null, customerPortalLoginToken: null, originalDeductible: null, currentDeductible: null, @@ -1205,49 +1207,53 @@ export const useMainStore = defineStore({ }, async getCombinedQuote(availableLineItems) { - const { vehicle, serviceLocation, policy, eon, referralNumber, referralDate, referralSequenceNumber, lineItems } = this.order; + if (availableLineItems && availableLineItems.length > 0) { + const { vehicle, serviceLocation, policy, eon, referralNumber, referralDate, referralSequenceNumber, lineItems } = this.order; - const payload = { - ParentAccountNumber: this.order.parentAccountNumber, - BillToAccountNumber: this.billToAccountNumber, - ProviderNumber: this.providerNumber, - CarId: vehicle.carId, - Make: vehicle.make, - Model: vehicle.model, - Year: vehicle.year, - EON: eon, - ZipCode: policy.policyZipCode, - State: policy.damageState, - ReferralNumber: referralNumber, - ReferralDate: referralDate, - ReferralSequenceNumber: referralSequenceNumber, - ServiceZipCode: serviceLocation.zipCode, - IsReplacement: !this.isRepair, - ServerData: lineItems.serverData, - LineItems: getLineItemsFlattened(availableLineItems) - }; + const payload = { + ParentAccountNumber: this.order.parentAccountNumber, + BillToAccountNumber: this.billToAccountNumber, + ProviderNumber: this.providerNumber, + CarId: vehicle.carId, + Make: vehicle.make, + Model: vehicle.model, + Year: vehicle.year, + EON: eon, + ZipCode: policy.policyZipCode, + State: policy.damageState, + ReferralNumber: referralNumber, + ReferralDate: referralDate, + ReferralSequenceNumber: referralSequenceNumber, + ServiceZipCode: serviceLocation.zipCode, + IsReplacement: !this.isRepair, + ServerData: lineItems.serverData, + LineItems: getLineItemsFlattened(availableLineItems) + }; - const response = await globalMethods - .callHttpClient({ - method: endpoints.GetCombinedQuote.method, - endpoint: endpoints.GetCombinedQuote.url, - payload - }) - .catch((error) => { - console.error(error); - return []; - }); + const response = await globalMethods + .callHttpClient({ + method: endpoints.GetCombinedQuote.method, + endpoint: endpoints.GetCombinedQuote.url, + payload + }) + .catch((error) => { + console.error(error); + return []; + }); - const { lineItems: pricedLinedItems, serverData } = response.data; + const { lineItems: pricedLinedItems, serverData } = response.data; - if (serverData) { - this.order.lineItems.serverData = serverData; + if (serverData) { + this.order.lineItems.serverData = serverData; + } + + if (pricedLinedItems) { + return addPricesToLineItems(availableLineItems, pricedLinedItems); + } + return availableLineItems; } - if (pricedLinedItems) { - return addPricesToLineItems(availableLineItems, pricedLinedItems); - } - return availableLineItems; + return []; }, getMobileFeePart() { @@ -1272,18 +1278,26 @@ export const useMainStore = defineStore({ }, getServiceabilityDetails({ serviceZipCode }) { - const lineItems = getLineItemQueryString(this.order.lineItems.supportingItems, 'lineItems'); - - const { vehicle } = this.order; + const { vehicle, damage, parentAccountNumber, referralSequenceNumber, lineItems } = this.order; const { carId } = vehicle; - const { damage } = this.order; const glassArray = convertGlassPieceNamingForApi(damage.glassToReplace); + const lineItemParts = [...(lineItems.glassParts || []), ...(lineItems.supportingItems || [])].map((part) => ({ + partNumber: part.partNumber, + recalibrationType: part.recalibrationType + })); - const glassPieces = buildQueryStringParameterFromArrayOfComplexObjects(glassArray, 'glassPieces'); + const params = buildURLSearchParams({ + parentAccountNumber, + referralSequenceNumber, + zip: serviceZipCode, + carId, + glassPieces: glassArray, + lineItems: lineItemParts + }); return globalMethods.callHttpClient({ method: endpoints.GetServiceabilityDetails.method, - endpoint: `${endpoints.GetServiceabilityDetails.url}?zip=${serviceZipCode}&carId=${carId}${lineItems}&${glassPieces}` + endpoint: `${endpoints.GetServiceabilityDetails.url}?${params.toString()}` }); }, lookupVehicleByVin(vin) { @@ -1318,12 +1332,14 @@ export const useMainStore = defineStore({ this.order.referralCorrelationId = response.referralCorrelationId; this.order.eon = response.eon; this.order.workOrderNumber = response.workOrderNumber; + this.order.settledTenderAmount = response.settledTenderAmount; + this.order.lockToken = response.lockToken; this.order.customerPortalLoginToken = response.customerPortalLoginToken; this.applicationUser.savedSessionId = response.savedSessionId; this.applicationUser.crmCustomerId = response.crmCustomerId.toString(); }, - saveSession({ submitAfterSave }) { + saveSession({ submitAfterSave, createWorkOrderNumberForPIA }) { const { vehicle, damage, policy, customer, contactInfo, payment, lineItems, serviceLocation, schedule, insuranceCoverage } = this.order; @@ -1463,6 +1479,8 @@ export const useMainStore = defineStore({ referralSequenceNumber: this.order.referralSequenceNumber, eon: this.order.eon, submitToMainframe: !!this.order.referralNumber, + createWorkOrderNumberForPIA: createWorkOrderNumberForPIA, + lockToken: this.order.lockToken, loadedFromDupeCheck, submitAfterSave: !!submitAfterSave }; @@ -1841,7 +1859,7 @@ export const useMainStore = defineStore({ }, updateSupportingItems(partsData) { if (partsData == null) { - this.order.lineItems.supportingItems = null; + this.order.lineItems.supportingItems = []; return; } @@ -1977,6 +1995,8 @@ export const useMainStore = defineStore({ this.order.referralSequenceNumber = null; this.order.workOrderId = null; this.order.workOrderNumber = null; + this.order.settledTenderAmount = null; + this.order.lockToken = null; this.order.eon = null; this.order.originalDeductible = null; this.order.currentDeductible = null; @@ -2051,7 +2071,7 @@ export const useMainStore = defineStore({ resetGlassPartsState() { this.order.lineItems.glassParts = null; - this.order.lineItems.supportingItems = null; + this.order.lineItems.supportingItems = []; this.order.lineItems.vaps = null; this.order.lineItems.feeItems = []; this.order.lineItems.serverData = null;