DigitalConsumer.ISS/src/helpers/cart-helper.js

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