174 lines
No EOL
5.2 KiB
JavaScript
174 lines
No EOL
5.2 KiB
JavaScript
import { useMainStore } from '@/store';
|
|
import { getPriceOfLineItems, getTaxOfLineItems } from '@/helpers/price-calculator';
|
|
import partNumberStrings from '@/constants/part-number-strings';
|
|
import partTypeStrings from '@/constants/part-type-strings';
|
|
import coverageType from '@/constants/coverage-type';
|
|
|
|
/**
|
|
* Returns the lineItems object from the order
|
|
* @param {object} order order object
|
|
* @returns {object} lineItems object from the order
|
|
*/
|
|
export function getLineItems(order) {
|
|
return order.lineItems;
|
|
}
|
|
|
|
/**
|
|
* Returns an array containing only the service line items
|
|
* @param {object} order order object
|
|
* @returns {[]} array of service line items
|
|
*/
|
|
export function getServiceLineItems(order) {
|
|
const { supportingItems, glassParts, otherParts, feeItems } = getLineItems(order);
|
|
return [
|
|
...(supportingItems ?? []),
|
|
...(glassParts ?? []),
|
|
...(otherParts ?? []),
|
|
...(feeItems ?? [])
|
|
];
|
|
}
|
|
|
|
/**
|
|
* Returns an array containing only the
|
|
* @param {object} order order object
|
|
* @returns {[]} array of service line items
|
|
*/
|
|
export function getAvailableLineItems(order) {
|
|
const { glassParts, supportingItems } = getLineItems(order);
|
|
const availableLineItems = [
|
|
...(glassParts ?? []),
|
|
...(supportingItems ?? [])
|
|
];
|
|
return availableLineItems;
|
|
}
|
|
|
|
/**
|
|
* Returns an array containing only the non-service line items (Vaps and Fees)
|
|
* @param {object} order order object
|
|
* @returns {[]} array of non-service line items
|
|
*/
|
|
export function getNonServiceLineItems(order) {
|
|
const { vaps } = getLineItems(order);
|
|
return [
|
|
...(vaps ?? [])
|
|
];
|
|
}
|
|
|
|
/**
|
|
* Returns an array containing all line items
|
|
* @param {object} order order object
|
|
* @returns {[]} array of all line items
|
|
*/
|
|
export function getAllLineItems(order) {
|
|
return [
|
|
...getServiceLineItems(order),
|
|
...getNonServiceLineItems(order)
|
|
];
|
|
}
|
|
|
|
/**
|
|
* Returns the recycle fee line item if it exists on the order
|
|
* @param {object} order order object
|
|
* @returns {{}|undefined} recycle fee line item or undefined
|
|
*/
|
|
export function getRecycleFeeLineItem(order) {
|
|
return getLineItems(order).feeItems?.find((lineItem) => lineItem.partNumber === partNumberStrings.RECYCLE_FEE);
|
|
}
|
|
|
|
/**
|
|
* Returns the mobile fee line item if it exists on the order
|
|
* @param {object} order order object
|
|
* @returns {{}|undefined} mobile fee line item or undefined
|
|
*/
|
|
export function getMobileFeeLineItem(order) {
|
|
return getLineItems(order).feeItems?.find((lineItem) => lineItem.partType === partTypeStrings.MOBILE_FEE);
|
|
}
|
|
|
|
/**
|
|
* Returns the current deductible on the order
|
|
* @param {object} order order object
|
|
* @returns {number|undefined|null} current deductible
|
|
*/
|
|
export function getDeductible(order) {
|
|
return order.damage.isRepair ? order.currentDeductible.repair : order.currentDeductible.replace;
|
|
}
|
|
|
|
/**
|
|
* Returns if the order is unverified
|
|
* @param {object} order order object
|
|
* @returns {boolean} order unverified state
|
|
*/
|
|
export function isOrderUnverified(order) {
|
|
return order.isUnverified ?? useMainStore().isUnverified;
|
|
}
|
|
|
|
/**
|
|
* Returns if the order is NO COMP
|
|
* @param {object} order order object
|
|
* @returns {boolean} order NO COMP flag
|
|
*/
|
|
export function isOrderNoComp(order) {
|
|
return order.insuranceCoverage?.coverageType === coverageType.NO_COMP ?? false;
|
|
}
|
|
|
|
/**
|
|
* Returns if the order is ITAC
|
|
* @param {object} order order object
|
|
* @returns {boolean} order ITAC flag
|
|
*/
|
|
export function isOrderITAC(order) {
|
|
return order.insuranceCoverage?.coverageType === coverageType.ITAC ?? false;
|
|
}
|
|
|
|
/**
|
|
* Returns the subtotal for the order
|
|
* @param {object} order order object
|
|
* @returns {number} sub total for the order
|
|
*/
|
|
export function getSubtotal(order) {
|
|
if (!isOrderUnverified(order) && !isOrderNoComp(order) && !isOrderITAC(order)) {
|
|
return getDeductible(order) + getPriceOfLineItems(getNonServiceLineItems(order));
|
|
}
|
|
|
|
return getPriceOfLineItems(getAllLineItems(order));
|
|
}
|
|
|
|
/**
|
|
* Returns the sales tax for the order
|
|
* @param {object} order order object
|
|
* @returns {number} sales tax for the order
|
|
*/
|
|
export function getSalesTax(order) {
|
|
let tax = 0;
|
|
if (!isOrderUnverified(order) && (isOrderITAC(order) || isOrderNoComp(order))) {
|
|
tax += getTaxOfLineItems(getServiceLineItems(order));
|
|
}
|
|
|
|
tax += getTaxOfLineItems(getNonServiceLineItems(order));
|
|
return tax;
|
|
}
|
|
|
|
/**
|
|
* Returns the cart total rounded to two decimal places
|
|
* @param {object} order order object
|
|
* @returns {number} cart total for the order
|
|
*/
|
|
export function getCartTotal(order) {
|
|
return Math.round((getSubtotal(order) + getSalesTax(order)) * 100) / 100;
|
|
}
|
|
|
|
/**
|
|
* Returns the total price of all recal child parts on the order
|
|
* @param {object} order order object
|
|
* @returns {number} total price of all recal child parts on the order
|
|
*/
|
|
export function getRecalibrationTotal(order) {
|
|
const itemsWithRecalibration = getServiceLineItems(order)
|
|
.filter((item) => item.requiresRecalibration);
|
|
|
|
const recalibrationLineItems = itemsWithRecalibration.flatMap((item) => {
|
|
return item.childParts?.filter((child) => child.partType === partTypeStrings.RECALIBRATION || child.partType === partTypeStrings.ADAS_RECALIBRATION) ?? [];
|
|
});
|
|
|
|
return getPriceOfLineItems(recalibrationLineItems);
|
|
} |