import { CartData, Discount, PrivilegeCartData, Tariff, TariffCartData, applyCartDiscount, applyLoyaltyDiscount, applyPrivilegeDiscounts, applyServiceDiscounts } from "@frontend/kitui"; export function calcCart( tariffs: Tariff[], discounts: Discount[], purchasesAmount: number, coupon?: string, ): CartData { const cartData: CartData = { services: [], priceBeforeDiscounts: 0, priceAfterDiscounts: 0, itemCount: 0, appliedCartPurchasesDiscount: null, appliedLoyaltyDiscount: null, allAppliedDiscounts: [], }; const serviceTariffType: Record = {}; tariffs.forEach(tariff => { let serviceData = cartData.services.find(service => service.serviceKey === tariff.privileges[0].serviceKey); if (!serviceData) { serviceData = { serviceKey: tariff.privileges[0].serviceKey, tariffs: [], price: 0, appliedServiceDiscount: null, }; cartData.services.push(serviceData); } const tariffCartData: TariffCartData = { price: tariff.price ?? 0, isCustom: tariff.isCustom, privileges: [], id: tariff._id, name: tariff.name, }; serviceData.tariffs.push(tariffCartData); tariff.privileges.forEach(privilege => { serviceTariffType[privilege.serviceKey] ??= +tariff.isCustom; const isIncompatibleTariffs = serviceTariffType[privilege.serviceKey] ^ +tariff.isCustom; if (isIncompatibleTariffs) throw new Error("Если взят готовый тариф, то кастомный на этот сервис сделать уже нельзя"); const privilegePrice = privilege.amount * privilege.price; if (!tariff.price) tariffCartData.price += privilegePrice; const privilegeCartData: PrivilegeCartData = { serviceKey: privilege.serviceKey, amount: privilege.amount, privilegeId: privilege.privilegeId, description: privilege.description, price: privilegePrice, appliedPrivilegeDiscount: null, }; tariffCartData.privileges.push(privilegeCartData); cartData.priceAfterDiscounts += privilegePrice; cartData.itemCount++; }); cartData.priceBeforeDiscounts += tariffCartData.price; serviceData.price += tariffCartData.price; }); applyPrivilegeDiscounts(cartData, discounts); applyServiceDiscounts(cartData, discounts); applyCartDiscount(cartData, discounts); applyLoyaltyDiscount(cartData, discounts, purchasesAmount); cartData.allAppliedDiscounts = Array.from(new Set(cartData.allAppliedDiscounts)); return cartData; } export function formatDiscountFactor(factor: number): string { return `${((1 - factor) * 100).toFixed(1)}%`; }