UIKit/lib/utils/cart/serviceDiscount.ts

49 lines
1.6 KiB
TypeScript
Raw Normal View History

2023-07-13 13:45:38 +00:00
import { CartData, Discount } from "../../model";
2023-08-12 16:17:29 +00:00
import { findDiscountFactor } from "./findDiscountFactor";
2023-07-13 13:45:38 +00:00
2023-07-14 16:13:24 +00:00
export function applyServiceDiscounts(
2023-07-13 13:45:38 +00:00
cartData: CartData,
discounts: Discount[],
) {
cartData.services.forEach(service => {
2023-08-12 16:17:29 +00:00
service.tariffs.map(tariff => {
tariff.privileges.forEach(privilege => {
const privilegeDiscount = findServiceDiscount(privilege.serviceKey, privilege.price, discounts);
if (!privilegeDiscount) return;
const discountAmount = privilege.price * (1 - findDiscountFactor(privilegeDiscount));
privilege.price -= discountAmount;
cartData.allAppliedDiscounts.push(privilegeDiscount);
service.appliedServiceDiscount = privilegeDiscount;
2023-07-22 14:02:07 +00:00
2023-08-12 16:17:29 +00:00
tariff.price -= discountAmount;
service.price -= discountAmount;
cartData.priceAfterDiscounts -= discountAmount;
});
});
2023-07-13 13:45:38 +00:00
});
}
export function findServiceDiscount(
serviceKey: string,
currentPrice: number,
discounts: Discount[],
2023-08-12 16:17:29 +00:00
): Discount | null {
2023-07-13 13:45:38 +00:00
const applicableDiscounts = discounts.filter(discount => {
return (
discount.Layer === 2 &&
discount.Condition.Group === serviceKey &&
currentPrice >= discount.Condition.PriceFrom
);
});
2023-08-12 16:17:29 +00:00
if (!applicableDiscounts.length) return null;
2023-07-13 13:45:38 +00:00
const maxValueDiscount = applicableDiscounts.reduce((prev, current) => {
return current.Condition.PriceFrom > prev.Condition.PriceFrom ? current : prev;
});
2023-08-12 16:17:29 +00:00
return maxValueDiscount;
2023-07-13 13:45:38 +00:00
}