112 lines
4.4 KiB
JavaScript
112 lines
4.4 KiB
JavaScript
import { defineStore } from 'pinia';
|
|
import { endpoints } from '@/constants/endpoints';
|
|
import globalMethods from '@/global-methods';
|
|
import applicationConfig from '@/constants/application-config';
|
|
import coverageStatuses from '@/constants/coverage-statuses';
|
|
import { useMainStore } from '@/store';
|
|
|
|
const paymentStoreId = 'payment';
|
|
|
|
function getLineItemQueryStringForPricing(lineItems) {
|
|
return lineItems.map((lineItem, index) => {
|
|
let queryStringSnippet = `&LineItems[${index}].partNumber=${lineItem.partNumber}`;
|
|
if (lineItem.childParts) {
|
|
queryStringSnippet += getLineItemQueryStringForPricing(lineItem.childParts);
|
|
}
|
|
|
|
return queryStringSnippet;
|
|
}).join('');
|
|
}
|
|
|
|
function addPricesToLineItems(lineItems, pricingLineItems) {
|
|
return lineItems.map((lineItem) => {
|
|
const updatedLineItem = lineItem;
|
|
updatedLineItem.childParts = lineItem.childParts.map((childItem) => addPricesToLineItems(childItem, pricingLineItems));
|
|
|
|
const lineItemIndex = pricingLineItems.findIndex((pricingLineItem) => pricingLineItem.partNumber === lineItem.partNumber);
|
|
|
|
if (lineItemIndex > -1) {
|
|
const pricedLineItem = pricingLineItems[lineItemIndex];
|
|
updatedLineItem.laborAmount = pricedLineItem.laborAmount;
|
|
updatedLineItem.sellingPrice = pricedLineItem.sellingPrice;
|
|
updatedLineItem.kitPrice = pricedLineItem.kitPrice;
|
|
}
|
|
return updatedLineItem;
|
|
});
|
|
}
|
|
|
|
const usePaymentStore = defineStore({
|
|
id: paymentStoreId,
|
|
state: () => ({
|
|
deductible: null,
|
|
coverageStatus: coverageStatuses.PENDING,
|
|
isITAC: false,
|
|
isNoComp: false,
|
|
baseServiceLineItems: null,
|
|
supportingItems: null
|
|
}),
|
|
getters: {},
|
|
actions: {
|
|
setBaseServiceLineItems() {
|
|
this.baseServiceLineItems = [];
|
|
},
|
|
async getPriceOrderItems(availableLineItems) {
|
|
const zipCodeToUse = this.order.serviceLocation.zipCode;
|
|
if (!this.order.serviceLocation.zipCodeCtu) {
|
|
const zipInfo = await this.validateZip({ zip: zipCodeToUse });
|
|
this.order.serviceLocation.zipCodeCtu = zipInfo.data.zipCodeCtu;
|
|
}
|
|
const ctuToUse = this.order.serviceLocation.zipCodeCtu;
|
|
const availableLineItemsFormattedForRequest = getLineItemQueryStringForPricing(availableLineItems);
|
|
const deductibleToUse = this.order.currentDeductible ?? 0;
|
|
|
|
let queryString =
|
|
`ParentAccountNumber=${this.order.accountNumber}`
|
|
+ `&CTU=${ctuToUse}`
|
|
+ `&Deductible=${deductibleToUse}`
|
|
+ `&ZipCode=${zipCodeToUse}`
|
|
+ `${availableLineItemsFormattedForRequest}`;
|
|
|
|
const lineItemServerData = this.order.lineItems?.serverData;
|
|
if (lineItemServerData) {
|
|
queryString += `&ServerData=${encodeURIComponent(lineItemServerData)}`;
|
|
}
|
|
|
|
const response = await globalMethods
|
|
.callHttpClient({
|
|
method: endpoints.GetInsurancePriceOrderItems.method,
|
|
endpoint: `${endpoints.GetInsurancePriceOrderItems.url}?${queryString}`
|
|
}).catch((error) => {
|
|
console.error(error);
|
|
throw error;
|
|
});
|
|
|
|
if (response.data?.lineItems) {
|
|
const retAvailableLineItems = addPricesToLineItems(availableLineItems, response.data.lineItems);
|
|
return retAvailableLineItems;
|
|
}
|
|
return availableLineItems;
|
|
},
|
|
async setSupportingItems() {
|
|
const glassPartsArray = useMainStore().lineItems.glassParts ?? [];
|
|
const { carId } = useMainStore().vehicle;
|
|
const { isRepair, numberOfChips } = useMainStore().damage;
|
|
|
|
this.supportingItems = await globalMethods
|
|
.callHttpClient({
|
|
method: endpoints.GetSupportingItems.method,
|
|
endpoint: endpoints.GetSupportingItems.url,
|
|
payload: {
|
|
carId,
|
|
damageType: isRepair ? 'Repair' : 'Replace',
|
|
parentAccountNumber: applicationConfig.CASH_PARENT_ACCOUNT_NUMBER,
|
|
parts: glassPartsArray,
|
|
numberOfRepairChips: isRepair ? numberOfChips : 0
|
|
}
|
|
});
|
|
}
|
|
},
|
|
persist: true
|
|
});
|
|
|
|
export { usePaymentStore };
|