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 };