diff --git a/package.json b/package.json index 7126f652..75592eed 100755 --- a/package.json +++ b/package.json @@ -6,7 +6,7 @@ "@craco/craco": "^7.0.0", "@emotion/react": "^11.10.5", "@emotion/styled": "^11.10.5", - "@frontend/kitui": "^1.0.63", + "@frontend/kitui": "^1.0.74", "@frontend/squzanswerer": "^1.0.6", "@mui/icons-material": "^5.10.14", "@mui/material": "^5.10.14", diff --git a/src/model/privilege.ts b/src/model/privilege.ts index 2df7f763..23bd1725 100644 --- a/src/model/privilege.ts +++ b/src/model/privilege.ts @@ -1,5 +1,5 @@ -import { Privilege, PrivilegeWithAmount } from "@frontend/kitui"; +import { Privilege } from "@frontend/kitui"; export type ServiceKeyToPrivilegesMap = Record; -export type PrivilegeWithoutPrice = Omit; +export type PrivilegeWithoutPrice = Omit; diff --git a/src/pages/Tariffs/tariffsUtils/calcCart.ts b/src/pages/Tariffs/tariffsUtils/calcCart.ts deleted file mode 100644 index ec1612d8..00000000 --- a/src/pages/Tariffs/tariffsUtils/calcCart.ts +++ /dev/null @@ -1,249 +0,0 @@ -import { - CartData, - Discount, - PrivilegeCartData, - Tariff, - TariffCartData, - findPrivilegeDiscount, - findDiscountFactor, - applyLoyaltyDiscount, -} from "@frontend/kitui"; - -function applyPrivilegeDiscounts(cartData: CartData, discounts: Discount[]) { - cartData.services.forEach((service) => { - const privMap = new Map(); - service.tariffs.forEach((tariff) => - tariff.privileges.forEach((p) => { - privMap.set( - p.privilegeId, - p.amount + (privMap.get(p.privilegeId) || 0), - ); - }), - ); - - service.tariffs.forEach((tariff) => { - tariff.privileges.forEach((privilege) => { - const privilegeDiscount = findPrivilegeDiscount( - privilege.privilegeId, - privMap.get(privilege.privilegeId) || 0, - discounts, - ); - if (!privilegeDiscount) return; - - const discountAmount = - privilege.price * (1 - findDiscountFactor(privilegeDiscount)); - privilege.price -= discountAmount; - cartData.allAppliedDiscounts.push(privilegeDiscount); - privilege.appliedPrivilegeDiscount = privilegeDiscount; - - tariff.price -= discountAmount; - service.price -= discountAmount; - cartData.priceAfterDiscounts -= discountAmount; - }); - }); - }); -} -function findServiceDiscount( - serviceKey: string, - currentPrice: number, - discounts: Discount[], -): Discount | null { - const applicableDiscounts = discounts.filter((discount) => { - return ( - discount.Layer === 2 && - discount.Condition.Group === serviceKey && - currentPrice >= Number(discount.Condition.PriceFrom) - ); - }); - - if (!applicableDiscounts.length) return null; - - const maxValueDiscount = applicableDiscounts.reduce((prev, current) => { - return Number(current.Condition.PriceFrom) > - Number(prev.Condition.PriceFrom) - ? current - : prev; - }); - - return maxValueDiscount; -} - -function findCartDiscount( - cartPurchasesAmount: number, - discounts: Discount[], -): Discount | null { - const applicableDiscounts = discounts.filter((discount) => { - return ( - discount.Layer === 3 && - cartPurchasesAmount >= Number(discount.Condition.CartPurchasesAmount) - ); - }); - - if (!applicableDiscounts.length) return null; - - const maxValueDiscount = applicableDiscounts.reduce((prev, current) => { - return Number(current.Condition.CartPurchasesAmount) > - Number(prev.Condition.CartPurchasesAmount) - ? current - : prev; - }); - - return maxValueDiscount; -} - -function applyCartDiscount(cartData: CartData, discounts: Discount[]) { - const cartDiscount = findCartDiscount( - cartData.priceAfterDiscounts, - discounts, - ); - if (!cartDiscount) return; - - cartData.priceAfterDiscounts *= findDiscountFactor(cartDiscount); - cartData.allAppliedDiscounts.push(cartDiscount); - cartData.appliedCartPurchasesDiscount = cartDiscount; -} - -function applyServiceDiscounts(cartData: CartData, discounts: Discount[]) { - const privMap = new Map(); - cartData.services.forEach((service) => { - service.tariffs.forEach((tariff) => - tariff.privileges.forEach((p) => { - privMap.set(p.serviceKey, p.price + (privMap.get(p.serviceKey) || 0)); - }), - ); - }); - - cartData.services.forEach((service) => { - service.tariffs.map((tariff) => { - tariff.privileges.forEach((privilege) => { - const privilegeDiscount = findServiceDiscount( - privilege.serviceKey, - privMap.get(privilege.serviceKey), - discounts, - ); - if (!privilegeDiscount) return; - - const discountAmount = - privilege.price * (1 - findDiscountFactor(privilegeDiscount)); - privilege.price -= discountAmount; - cartData.allAppliedDiscounts.push(privilegeDiscount); - service.appliedServiceDiscount = privilegeDiscount; - - tariff.price -= discountAmount; - service.price -= discountAmount; - cartData.priceAfterDiscounts -= discountAmount; - }); - }); - }); -} - -export function calcCart( - tariffs: Tariff[], - discounts: Discount[], - purchasesAmount: number, - isUserNko?: boolean, -): CartData { - const cartData: CartData = { - services: [], - priceBeforeDiscounts: 0, - priceAfterDiscounts: 0, - itemCount: 0, - appliedCartPurchasesDiscount: null, - appliedLoyaltyDiscount: null, - allAppliedDiscounts: [], - }; - - tariffs.forEach((tariff) => { - if (tariff.price !== undefined && tariff.privileges.length !== 1) - throw new Error("Price is defined for tariff with several"); - - let serviceData = cartData.services.find( - (service) => service.serviceKey === "custom" && tariff.isCustom, - ); - if (!serviceData && !tariff.isCustom) - serviceData = cartData.services.find( - (service) => service.serviceKey === tariff.privileges[0].serviceKey, - ); - - if (!serviceData) { - serviceData = { - serviceKey: tariff.isCustom - ? "custom" - : 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) => { - let privilegePrice = privilege.amount * privilege.price; - if (!tariff.price) tariffCartData.price += privilegePrice; - else privilegePrice = tariff.price; - - const privilegeCartData: PrivilegeCartData = { - serviceKey: privilege.serviceKey, - privilegeId: privilege.privilegeId, - description: privilege.description, - price: privilegePrice, - amount: privilege.amount, - appliedPrivilegeDiscount: null, - }; - - tariffCartData.privileges.push(privilegeCartData); - cartData.priceAfterDiscounts += privilegePrice; - cartData.itemCount++; - }); - - cartData.priceBeforeDiscounts += tariffCartData.price; - serviceData.price += tariffCartData.price; - }); - - const nkoDiscount = findNkoDiscount(discounts); - if (isUserNko && nkoDiscount) { - applyNkoDiscount(cartData, nkoDiscount); - } else { - applyPrivilegeDiscounts(cartData, discounts); - applyServiceDiscounts(cartData, discounts); - applyCartDiscount(cartData, discounts); - applyLoyaltyDiscount(cartData, discounts, purchasesAmount); - } - - cartData.allAppliedDiscounts = Array.from( - new Set(cartData.allAppliedDiscounts), - ); - - return cartData; -} - -function applyNkoDiscount(cartData: CartData, discount: Discount) { - cartData.priceAfterDiscounts *= discount.Target.Factor; - cartData.allAppliedDiscounts.push(discount); -} - -export function findNkoDiscount(discounts: Discount[]): Discount | null { - const applicableDiscounts = discounts.filter( - (discount) => discount.Condition.UserType === "nko", - ); - - if (!applicableDiscounts.length) return null; - - const maxValueDiscount = applicableDiscounts.reduce((prev, current) => { - return current.Condition.CartPurchasesAmount > - prev.Condition.CartPurchasesAmount - ? current - : prev; - }); - - return maxValueDiscount; -} diff --git a/src/pages/Tariffs/tariffsUtils/calcTariffPrices.ts b/src/pages/Tariffs/tariffsUtils/calcTariffPrices.ts deleted file mode 100644 index 23e5b460..00000000 --- a/src/pages/Tariffs/tariffsUtils/calcTariffPrices.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { Discount, Tariff, findDiscountFactor } from "@frontend/kitui"; -import { calcCart } from "./calcCart"; - -export function calcIndividualTariffPrices( - tariff: Tariff, - discounts: Discount[], - purchasesAmount: number, - currentTariffs: Tariff[], - isUserNko?: boolean, -): { - priceBeforeDiscounts: number; - priceAfterDiscounts: number; -} { - console.log("MAGIC", purchasesAmount); - const priceBeforeDiscounts = - tariff.price || - tariff.privileges.reduce( - (sum, privilege) => sum + privilege.amount * privilege.price, - 0, - ); - let priceAfterDiscounts = 0; - - const cart = calcCart( - [...currentTariffs, tariff], - discounts, - purchasesAmount, - isUserNko, - ); - if (cart.allAppliedDiscounts[0]?.Target.Overhelm) - return { - priceBeforeDiscounts: priceBeforeDiscounts, - priceAfterDiscounts: - priceBeforeDiscounts * cart.allAppliedDiscounts[0].Target.Factor, - }; - cart.services.forEach((s) => { - if (s.serviceKey === tariff.privileges[0].serviceKey) { - let processed = false; - s.tariffs.forEach((t) => { - if (t.id === tariff._id && !processed) { - processed = true; - t.privileges.forEach((p) => (priceAfterDiscounts += p.price)); - } - }); - priceAfterDiscounts *= findDiscountFactor(s.appliedServiceDiscount); - } - }); - priceAfterDiscounts *= findDiscountFactor(cart.appliedLoyaltyDiscount); - priceAfterDiscounts *= findDiscountFactor(cart.appliedCartPurchasesDiscount); - - console.log("OLOLOLOLO", cart, discounts, purchasesAmount, tariff); - // cart.allAppliedDiscounts.forEach((discount) => { - // priceAfterDiscounts *= findDiscountFactor(discount) - // }) - //priceAfterDiscounts = cart.priceAfterDiscounts - return { priceBeforeDiscounts, priceAfterDiscounts }; -} diff --git a/src/pages/Tariffs/tariffsUtils/createTariffElements.tsx b/src/pages/Tariffs/tariffsUtils/createTariffElements.tsx index a6d7959d..12fc3315 100644 --- a/src/pages/Tariffs/tariffsUtils/createTariffElements.tsx +++ b/src/pages/Tariffs/tariffsUtils/createTariffElements.tsx @@ -1,7 +1,6 @@ -import { Tariff } from "@frontend/kitui"; +import { Tariff, calcTariffPrice } from "@frontend/kitui"; import TariffCard from "./TariffCard"; import NumberIcon from "@icons/NumberIcon"; -import { calcIndividualTariffPrices } from "./calcTariffPrices"; import { currencyFormatter } from "./currencyFormatter"; import FreeTariffCard from "./FreeTariffCard"; import { Typography } from "@mui/material"; @@ -17,14 +16,14 @@ export const createTariffElements = ( .filter((tariff) => tariff.privileges.length > 0) .map((tariff, index) => { console.log("USSSSSES", user); - const { priceBeforeDiscounts, priceAfterDiscounts } = - calcIndividualTariffPrices( - tariff, - discounts, - user.wallet.spent, - [], - user.isUserNko, - ); + const { priceBeforeDiscounts, priceAfterDiscounts } = calcTariffPrice( + tariff, + discounts, + user.wallet.spent, + [], + user.isUserNko, + user.id, + ); return (