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;