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