DigitalConsumer.ISS/src/store/paymentStore.js
Michaela Brydon 152a799caa Partial
2024-03-01 13:50:50 -05:00

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