UIKit/src/utils/cart/privilegeDiscount.ts

43 lines
1.4 KiB
TypeScript
Raw Normal View History

2023-07-13 13:45:38 +00:00
import { CartData, Discount } from "../../model";
export function applyPrivilegeDiscount(
cartData: CartData,
discounts: Discount[],
) {
cartData.services.forEach(service => {
service.privileges.forEach(privilege => {
const privilegeDiscount = findPrivilegeDiscount(privilege.privilegeId, privilege.price, discounts);
if (privilegeDiscount) privilege.price *= privilegeDiscount.factor;
2023-07-13 13:45:38 +00:00
});
});
}
export function findPrivilegeDiscount(
privilegeId: string,
privilegePrice: number,
discounts: Discount[],
): {
discount: Discount | null,
factor: number,
} {
2023-07-13 13:45:38 +00:00
const applicableDiscounts = discounts.filter(discount => {
const conditionMinPrice = parseFloat(discount.Condition.Term);
if (!isFinite(conditionMinPrice)) throw new Error(`Couldn't parse Discount.Condition.Term: ${discount.Condition.Term}`);
return (
discount.Layer === 1 &&
privilegeId === discount.Condition.Product &&
privilegePrice >= conditionMinPrice
);
});
if (!applicableDiscounts.length) return { discount: null, factor: 1 };
2023-07-13 13:45:38 +00:00
const maxValueDiscount = applicableDiscounts.reduce((prev, current) =>
parseFloat(current.Condition.Term) > parseFloat(prev.Condition.Term) ? current : prev
);
return { discount: maxValueDiscount, factor: maxValueDiscount.Target.Products[0].Factor };
2023-07-13 13:45:38 +00:00
}