83 lines
2.9 KiB
TypeScript
83 lines
2.9 KiB
TypeScript
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<string, number> = {};
|
|
|
|
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)}%`;
|
|
}
|