From 81414dfa4ea1414d7254f796f9ba801b7b44476a Mon Sep 17 00:00:00 2001 From: Bill Richardson Date: Tue, 15 Oct 2024 09:40:45 -0400 Subject: [PATCH 1/9] Temp fix Until conversation --- src/layouts/vehicle-damage/vehicle-damage.vue | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/layouts/vehicle-damage/vehicle-damage.vue b/src/layouts/vehicle-damage/vehicle-damage.vue index 1561a3bd..b2394b82 100644 --- a/src/layouts/vehicle-damage/vehicle-damage.vue +++ b/src/layouts/vehicle-damage/vehicle-damage.vue @@ -417,6 +417,8 @@ export default { const results = await Promise.allSettled([useMainStore().getSupportingItems(), useMainStore().getRecalParts()]); const supportingItems = results[0]; useMainStore().updateSupportingItems(supportingItems.data); + } else { + useMainStore().updateSupportingItems([]); } if (this.mainStore.damage.isRepair) { From 01d3afb21aeb2a0f7a8dac08b36e1d08ae46ff96 Mon Sep 17 00:00:00 2001 From: Bill Richardson Date: Tue, 15 Oct 2024 11:08:35 -0400 Subject: [PATCH 2/9] we also clear it further down the line. --- src/store/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/store/index.js b/src/store/index.js index c4c3b903..f9eb378d 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -1841,7 +1841,7 @@ export const useMainStore = defineStore({ }, updateSupportingItems(partsData) { if (partsData == null) { - this.order.lineItems.supportingItems = null; + this.order.lineItems.supportingItems = []; return; } From 0307427ba6993e28883acb4db1b606d1ecf3d389 Mon Sep 17 00:00:00 2001 From: Bill Richardson Date: Tue, 15 Oct 2024 11:30:24 -0400 Subject: [PATCH 3/9] only make call if availableLineItems length is greater than 0 --- src/store/index.js | 78 ++++++++++++++++++++++++---------------------- 1 file changed, 41 insertions(+), 37 deletions(-) diff --git a/src/store/index.js b/src/store/index.js index f9eb378d..810def62 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -1205,49 +1205,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() { From d885f2f1b567230eff116fd6e8b0e5e731a23402 Mon Sep 17 00:00:00 2001 From: Bill Richardson Date: Tue, 15 Oct 2024 12:20:53 -0400 Subject: [PATCH 4/9] one more place --- src/store/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/store/index.js b/src/store/index.js index 810def62..d0542ae7 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -2055,7 +2055,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; From 90c7c459a76f220f385d1d9727d0870124b60921 Mon Sep 17 00:00:00 2001 From: Bill Richardson Date: Tue, 15 Oct 2024 15:24:52 -0400 Subject: [PATCH 5/9] Fix for no supporting items on repair --- src/layouts/coverage-statement/coverage-statement.vue | 5 +++-- src/layouts/vehicle-damage/vehicle-damage.vue | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) 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/vehicle-damage/vehicle-damage.vue b/src/layouts/vehicle-damage/vehicle-damage.vue index b2394b82..a86fe4ca 100644 --- a/src/layouts/vehicle-damage/vehicle-damage.vue +++ b/src/layouts/vehicle-damage/vehicle-damage.vue @@ -415,7 +415,7 @@ 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([]); From edd1dcc4f8a9d2dcc36826623cafe0d46aaf9d51 Mon Sep 17 00:00:00 2001 From: Josh Dassinger Date: Wed, 16 Oct 2024 11:54:09 -0500 Subject: [PATCH 6/9] SSR-1632 Update getServiceabilityDetails for API Changes --- src/helpers/querystring-helper.js | 21 +++++++++++++++++++++ src/store/index.js | 22 +++++++++++++++------- 2 files changed, 36 insertions(+), 7 deletions(-) diff --git a/src/helpers/querystring-helper.js b/src/helpers/querystring-helper.js index b827441a..3572916c 100644 --- a/src/helpers/querystring-helper.js +++ b/src/helpers/querystring-helper.js @@ -43,3 +43,24 @@ 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 (Array.isArray(value)) { + value.forEach((arrayValue, index) => { + if (typeof value === 'object') { + Object.entries(arrayValue).forEach(([objectKey, objectValue]) => { + params.append(`${key}[${index}].${objectKey}`, `${objectValue}`); + }); + } else { + params.append(`${key}[${index}]`, `${value}`); + } + }); + } else { + params.append(key, `${value}`); + } + }); + + return params; +} diff --git a/src/store/index.js b/src/store/index.js index d0542ae7..826062f2 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 @@ -1276,18 +1276,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) { From 5b72a3fddda5766f2857e9e7eecf3c38ca4bd378 Mon Sep 17 00:00:00 2001 From: Josh Dassinger Date: Wed, 16 Oct 2024 13:37:04 -0500 Subject: [PATCH 7/9] SSR-1632 Don't pass null values --- src/helpers/querystring-helper.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/helpers/querystring-helper.js b/src/helpers/querystring-helper.js index 3572916c..11dcdb48 100644 --- a/src/helpers/querystring-helper.js +++ b/src/helpers/querystring-helper.js @@ -47,11 +47,16 @@ export function getTaxLineItemQueryString(lineItems, parameterName) { 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]) => { - params.append(`${key}[${index}].${objectKey}`, `${objectValue}`); + if (objectValue != null) { + params.append(`${key}[${index}].${objectKey}`, `${objectValue}`); + } }); } else { params.append(`${key}[${index}]`, `${value}`); From 2f816c8ec1aca974cbd84a224882267bca9741ab Mon Sep 17 00:00:00 2001 From: Josh Dassinger Date: Wed, 16 Oct 2024 15:06:55 -0500 Subject: [PATCH 8/9] SSR-1483 Don't show cart if we fail to settle PIA Implement create WO for PIA Implement settledTenderAmount & lockToken --- src/helpers/order-helper.js | 10 ++++---- .../order-confirmation.spec.js | 23 +++++++++++++++++++ .../order-confirmation/order-confirmation.vue | 14 +++++++++++ src/layouts/payment-method/payment-method.vue | 12 ++++++++-- src/store/index.js | 10 +++++++- 5 files changed, 61 insertions(+), 8 deletions(-) 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/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/store/index.js b/src/store/index.js index 826062f2..1d831100 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -214,6 +214,8 @@ export const getDefaultState = () => ({ eon: null, workOrderId: null, workOrderNumber: null, + settledTenderAmount: null, + lockToken: null, customerPortalLoginToken: null, originalDeductible: null, currentDeductible: null, @@ -1330,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; @@ -1475,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 }; @@ -1989,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; From 65be039010f837c9c27d2a52b9709ebeb25a327b Mon Sep 17 00:00:00 2001 From: Josh Dassinger Date: Thu, 17 Oct 2024 09:16:03 -0500 Subject: [PATCH 9/9] SSR-1632 Handle null line items --- src/store/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/store/index.js b/src/store/index.js index 826062f2..f0f767db 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -1279,7 +1279,7 @@ export const useMainStore = defineStore({ const { vehicle, damage, parentAccountNumber, referralSequenceNumber, lineItems } = this.order; const { carId } = vehicle; const glassArray = convertGlassPieceNamingForApi(damage.glassToReplace); - const lineItemParts = [...lineItems.glassParts, ...lineItems.supportingItems].map((part) => ({ + const lineItemParts = [...(lineItems.glassParts || []), ...(lineItems.supportingItems || [])].map((part) => ({ partNumber: part.partNumber, recalibrationType: part.recalibrationType }));