front-hub/src/utils/calcTariffPrices.ts

69 lines
2.4 KiB
TypeScript
Raw Normal View History

2023-06-16 20:09:56 +00:00
import { Tariff } from "@root/model/tariff";
import { mockDiscounts } from "../__mocks__/discounts";
import { PrivilegeWithAmount } from "@root/model/privilege";
import { PrivilegeDiscount, ServiceDiscount } from "../model/discount";
export function calcTariffPrices(tariff: Tariff): {
price: number | undefined;
priceWithDiscounts: number | undefined;
} {
let price = tariff.price ?? tariff.privilegies.reduce((sum, privilege) => sum + privilege.amount * privilege.price / 100, 0);
const priceWithDiscounts = tariff.privilegies.reduce((sum, privilege) => {
let privilegePrice = privilege.amount * privilege.price / 100;
const privilegeDiscount = findPrivilegeDiscount(privilege);
if (privilegeDiscount) privilegePrice *= privilegeDiscount.target.products[0].factor;
const serviceDiscount = findServiceDiscount(privilege.serviceKey, privilegePrice);
if (serviceDiscount) privilegePrice *= serviceDiscount.target.factor;
return sum + privilegePrice;
}, 0);
return {
price,
priceWithDiscounts,
};
}
function findPrivilegeDiscount(privilege: PrivilegeWithAmount): PrivilegeDiscount | null {
const applicableDiscounts = mockDiscounts.filter((discount): discount is PrivilegeDiscount => {
return (
discount.conditionType === "privilege" &&
privilege.privilegeId === discount.condition.privilege.id &&
privilege.amount >= discount.condition.privilege.value
);
});
if (!applicableDiscounts.length) return null;
const maxValueDiscount = applicableDiscounts.reduce((prev, current) =>
current.condition.privilege.value > prev.condition.privilege.value ? current : prev
);
return maxValueDiscount;
}
function findServiceDiscount(
serviceKey: string,
currentPrice: number,
): ServiceDiscount | null {
const discountsForTariffService = mockDiscounts.filter((discount): discount is ServiceDiscount => {
return (
discount.conditionType === "service" &&
discount.condition.service.id === serviceKey &&
currentPrice >= discount.condition.service.value
);
});
if (!discountsForTariffService.length) return null;
const maxValueDiscount = discountsForTariffService.reduce((prev, current) => {
return current.condition.service.value > prev.condition.service.value ? current : prev;
});
return maxValueDiscount;
}