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);
|
2023-07-13 14:14:59 +00:00
|
|
|
if (privilegeDiscount) privilege.price *= privilegeDiscount.factor;
|
2023-07-13 13:45:38 +00:00
|
|
|
});
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
export function findPrivilegeDiscount(
|
|
|
|
privilegeId: string,
|
|
|
|
privilegePrice: number,
|
|
|
|
discounts: Discount[],
|
2023-07-13 14:14:59 +00:00
|
|
|
): {
|
|
|
|
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
|
|
|
|
);
|
|
|
|
});
|
|
|
|
|
2023-07-13 14:14:59 +00:00
|
|
|
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
|
|
|
|
);
|
|
|
|
|
2023-07-13 14:14:59 +00:00
|
|
|
return { discount: maxValueDiscount, factor: maxValueDiscount.Target.Products[0].Factor };
|
2023-07-13 13:45:38 +00:00
|
|
|
}
|