From b2b38cb1c78a8dfa593525f4251c7b5ec9e60cd5 Mon Sep 17 00:00:00 2001 From: nflnkr Date: Fri, 13 Oct 2023 22:36:28 +0300 Subject: [PATCH 1/3] fix nko discounts --- src/stores/cart.ts | 8 +-- src/utils/calcCart/calcCart.ts | 32 +++++++-- src/utils/hooks/useCart.ts | 125 +++++++++++++++++---------------- 3 files changed, 96 insertions(+), 69 deletions(-) diff --git a/src/stores/cart.ts b/src/stores/cart.ts index 0e78688..ffaac5e 100644 --- a/src/stores/cart.ts +++ b/src/stores/cart.ts @@ -47,7 +47,7 @@ export const setCartTariffStatus = (tariffId: string, status: "loading" | "not f } ); -export const addCartTariffs = (tariffs: Tariff[], discounts: Discount[], purchasesAmount: number) => +export const addCartTariffs = (tariffs: Tariff[], discounts: Discount[], purchasesAmount: number, isUserNko: boolean) => useCartStore.setState( produce((state) => { tariffs.forEach((tariff) => { @@ -60,7 +60,7 @@ export const addCartTariffs = (tariffs: Tariff[], discounts: Discount[], purchas const cartTariffs = Object.values(state.cartTariffMap).filter( (tariff): tariff is Tariff => typeof tariff === "object" ); - state.cart = calcCart(cartTariffs, discounts, purchasesAmount); + state.cart = calcCart(cartTariffs, discounts, purchasesAmount, isUserNko); }), false, { @@ -69,7 +69,7 @@ export const addCartTariffs = (tariffs: Tariff[], discounts: Discount[], purchas } ); -export const removeMissingCartTariffs = (tariffIds: string[], discounts: Discount[], purchasesAmount: number) => +export const removeMissingCartTariffs = (tariffIds: string[], discounts: Discount[], purchasesAmount: number, isUserNko: boolean) => useCartStore.setState( produce((state) => { for (const key in state.cartTariffMap) { @@ -78,7 +78,7 @@ export const removeMissingCartTariffs = (tariffIds: string[], discounts: Discoun const cartTariffs = Object.values(state.cartTariffMap).filter( (tariff): tariff is Tariff => typeof tariff === "object" ); - state.cart = calcCart(cartTariffs, discounts, purchasesAmount); + state.cart = calcCart(cartTariffs, discounts, purchasesAmount, isUserNko); }), false, { diff --git a/src/utils/calcCart/calcCart.ts b/src/utils/calcCart/calcCart.ts index 8c1d7f5..989d3c1 100644 --- a/src/utils/calcCart/calcCart.ts +++ b/src/utils/calcCart/calcCart.ts @@ -1,7 +1,7 @@ import { CartData, Discount, PrivilegeCartData, Tariff, TariffCartData, applyCartDiscount, applyLoyaltyDiscount, applyPrivilegeDiscounts, applyServiceDiscounts } from "@frontend/kitui"; -export function calcCart(tariffs: Tariff[], discounts: Discount[], purchasesAmount: number): CartData { +export function calcCart(tariffs: Tariff[], discounts: Discount[], purchasesAmount: number, isUserNko?: boolean): CartData { const cartData: CartData = { services: [], priceBeforeDiscounts: 0, @@ -55,12 +55,34 @@ export function calcCart(tariffs: Tariff[], discounts: Discount[], purchasesAmou serviceData.price += tariffCartData.price; }); - applyPrivilegeDiscounts(cartData, discounts); - applyServiceDiscounts(cartData, discounts); - applyCartDiscount(cartData, discounts); - applyLoyaltyDiscount(cartData, discounts, purchasesAmount); + 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); +} + +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/utils/hooks/useCart.ts b/src/utils/hooks/useCart.ts index 8b37bd3..3326030 100644 --- a/src/utils/hooks/useCart.ts +++ b/src/utils/hooks/useCart.ts @@ -1,82 +1,87 @@ import { Tariff, devlog } from "@frontend/kitui"; import { getTariffById } from "@root/api/tariff"; +import { VerificationStatus } from "@root/model/account"; +import { + addCartTariffs, + removeMissingCartTariffs, + setCartTariffStatus, + useCartStore, +} from "@root/stores/cart"; +import { useDiscountStore } from "@root/stores/discounts"; import { useTariffStore } from "@root/stores/tariffs"; import { removeTariffFromCart, useUserStore } from "@root/stores/user"; import { useEffect } from "react"; -import { - addCartTariffs, - removeMissingCartTariffs, - setCartTariffStatus, - useCartStore, -} from "@root/stores/cart"; -import { isAxiosError } from "axios"; -import { useDiscountStore } from "@root/stores/discounts"; + export function useCart() { - const tariffs = useTariffStore((state) => state.tariffs); - const cartTariffMap = useCartStore((state) => state.cartTariffMap); - const cartTariffIds = useUserStore((state) => state.userAccount?.cart); - const cart = useCartStore((state) => state.cart); - const discounts = useDiscountStore((state) => state.discounts); - const purchasesAmount = - useUserStore((state) => state.userAccount?.wallet.purchasesAmount) ?? 0; + const tariffs = useTariffStore((state) => state.tariffs); + const cartTariffMap = useCartStore((state) => state.cartTariffMap); + const cartTariffIds = useUserStore((state) => state.userAccount?.cart); + const cart = useCartStore((state) => state.cart); + const discounts = useDiscountStore((state) => state.discounts); + const purchasesAmount = + useUserStore((state) => state.userAccount?.wallet.purchasesAmount) ?? 0; + const verificationStatus = useUserStore((state) => state.verificationStatus); + const verificationType = useUserStore((state) => state.verificationType); - useEffect(() => { - function addTariffsToCart() { - const knownTariffs: Tariff[] = []; + const isUserNko = verificationStatus === VerificationStatus.VERIFICATED && verificationType === "nko"; - console.log(cartTariffIds) - cartTariffIds?.forEach(async (tariffId) => { - if (typeof cartTariffMap[tariffId] === "object") return; + useEffect(() => { + function addTariffsToCart() { + const knownTariffs: Tariff[] = []; - const tariff = tariffs.find((tariff) => tariff._id === tariffId); - if (tariff) return knownTariffs.push(tariff); + console.log(cartTariffIds) + cartTariffIds?.forEach(async (tariffId) => { + if (typeof cartTariffMap[tariffId] === "object") return; - if (!cartTariffMap[tariffId]) { - setCartTariffStatus(tariffId, "loading"); + const tariff = tariffs.find((tariff) => tariff._id === tariffId); + if (tariff) return knownTariffs.push(tariff); - const [tariffByIdResponse, tariffByIdError, tariffByIdStatus] = - await getTariffById(tariffId); + if (!cartTariffMap[tariffId]) { + setCartTariffStatus(tariffId, "loading"); - if (tariffByIdError) { - devlog(tariffByIdError); - setCartTariffStatus(tariffId, "not found"); + const [tariffByIdResponse, tariffByIdError, tariffByIdStatus] = + await getTariffById(tariffId); - if (tariffByIdStatus === 404) { - try { - await removeTariffFromCart(tariffId); + if (tariffByIdError) { + devlog(tariffByIdError); + setCartTariffStatus(tariffId, "not found"); - devlog( - `Unexistant tariff with id ${tariffId} deleted from cart` - ); - } catch (error) { - devlog("Error deleting unexistant tariff from cart", error); - } - } + if (tariffByIdStatus === 404) { + try { + await removeTariffFromCart(tariffId); - return; - } + devlog( + `Unexistant tariff with id ${tariffId} deleted from cart` + ); + } catch (error) { + devlog("Error deleting unexistant tariff from cart", error); + } + } - if (tariffByIdResponse) { - addCartTariffs([tariffByIdResponse], discounts, purchasesAmount); - } + return; + } + + if (tariffByIdResponse) { + addCartTariffs([tariffByIdResponse], discounts, purchasesAmount, isUserNko); + } + } + }); + + if (knownTariffs.length > 0) + addCartTariffs(knownTariffs, discounts, purchasesAmount, isUserNko); } - }); - if (knownTariffs.length > 0) - addCartTariffs(knownTariffs, discounts, purchasesAmount); - } + addTariffsToCart(); + }, [cartTariffIds, cartTariffMap, discounts, isUserNko, purchasesAmount, tariffs]); - addTariffsToCart(); - }, [cartTariffIds, cartTariffMap, discounts, purchasesAmount, tariffs]); + useEffect( + function cleanUpCart() { + if (cartTariffIds) + removeMissingCartTariffs(cartTariffIds, discounts, purchasesAmount, isUserNko); + }, + [cartTariffIds, discounts, isUserNko, purchasesAmount] + ); - useEffect( - function cleanUpCart() { - if (cartTariffIds) - removeMissingCartTariffs(cartTariffIds, discounts, purchasesAmount); - }, - [cartTariffIds, discounts, purchasesAmount] - ); - - return cart; + return cart; } From dbc15ecd699f1ab4123742b568c55d53d2cc82bf Mon Sep 17 00:00:00 2001 From: nflnkr Date: Sat, 14 Oct 2023 00:33:20 +0300 Subject: [PATCH 2/3] fix nko discount --- src/utils/calcCart/calcCart.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils/calcCart/calcCart.ts b/src/utils/calcCart/calcCart.ts index 989d3c1..3cf37db 100644 --- a/src/utils/calcCart/calcCart.ts +++ b/src/utils/calcCart/calcCart.ts @@ -76,7 +76,7 @@ function applyNkoDiscount(cartData: CartData, discount: Discount) { } function findNkoDiscount(discounts: Discount[]): Discount | null { - const applicableDiscounts = discounts.filter(discount => discount.Condition.UserType === "NKO"); + const applicableDiscounts = discounts.filter(discount => discount.Condition.UserType === "nko"); if (!applicableDiscounts.length) return null; From bd8511fe978816c4ba50fc91c28f0e399f181b8e Mon Sep 17 00:00:00 2001 From: nflnkr Date: Sat, 14 Oct 2023 13:19:43 +0300 Subject: [PATCH 3/3] fix nko discount applying --- package.json | 2 +- src/pages/Tariffs/TariffsPage.tsx | 4 +++- src/utils/calcTariffPrices.ts | 5 +++-- src/utils/hooks/useCart.ts | 6 +----- yarn.lock | 8 ++++---- 5 files changed, 12 insertions(+), 13 deletions(-) diff --git a/package.json b/package.json index a3489bc..d15dabb 100644 --- a/package.json +++ b/package.json @@ -14,7 +14,7 @@ "dependencies": { "@emotion/react": "^11.10.5", "@emotion/styled": "^11.10.5", - "@frontend/kitui": "1.0.52", + "@frontend/kitui": "1.0.53", "@mui/icons-material": "^5.10.14", "@mui/material": "^5.10.14", "@popperjs/core": "^2.11.8", diff --git a/src/pages/Tariffs/TariffsPage.tsx b/src/pages/Tariffs/TariffsPage.tsx index 6d97409..43374cf 100644 --- a/src/pages/Tariffs/TariffsPage.tsx +++ b/src/pages/Tariffs/TariffsPage.tsx @@ -37,6 +37,7 @@ export default function TariffPage() { const discounts = useDiscountStore((state) => state.discounts); const purchasesAmount = useUserStore((state) => state.userAccount?.wallet.purchasesAmount) ?? 0; const cartTariffMap = useCartStore((state) => state.cartTariffMap); + const isUserNko = useUserStore(state => state.userAccount?.status) === "nko"; const handleCustomBackNavigation = usePrevLocation(location); @@ -82,7 +83,8 @@ export default function TariffPage() { tariff, discounts, purchasesAmount, - currentTariffs + currentTariffs, + isUserNko, ); return ( diff --git a/src/utils/calcTariffPrices.ts b/src/utils/calcTariffPrices.ts index 702a4e2..83e0dab 100644 --- a/src/utils/calcTariffPrices.ts +++ b/src/utils/calcTariffPrices.ts @@ -5,7 +5,8 @@ export function calcIndividualTariffPrices( tariff: Tariff, discounts: Discount[], purchasesAmount: number, - currentTariffs: Tariff[] + currentTariffs: Tariff[], + isUserNko?: boolean, ): { priceBeforeDiscounts: number; priceAfterDiscounts: number; @@ -14,7 +15,7 @@ export function calcIndividualTariffPrices( tariff.price || tariff.privileges.reduce((sum, privilege) => sum + privilege.amount * privilege.price, 0); let priceAfterDiscounts = priceBeforeDiscounts; - const cart = calcCart([...currentTariffs, tariff], discounts, purchasesAmount); + const cart = calcCart([...currentTariffs, tariff], discounts, purchasesAmount, isUserNko); cart.allAppliedDiscounts.forEach((discount) => { priceAfterDiscounts *= findDiscountFactor(discount); diff --git a/src/utils/hooks/useCart.ts b/src/utils/hooks/useCart.ts index 3326030..b5d8fb0 100644 --- a/src/utils/hooks/useCart.ts +++ b/src/utils/hooks/useCart.ts @@ -1,6 +1,5 @@ import { Tariff, devlog } from "@frontend/kitui"; import { getTariffById } from "@root/api/tariff"; -import { VerificationStatus } from "@root/model/account"; import { addCartTariffs, removeMissingCartTariffs, @@ -21,10 +20,7 @@ export function useCart() { const discounts = useDiscountStore((state) => state.discounts); const purchasesAmount = useUserStore((state) => state.userAccount?.wallet.purchasesAmount) ?? 0; - const verificationStatus = useUserStore((state) => state.verificationStatus); - const verificationType = useUserStore((state) => state.verificationType); - - const isUserNko = verificationStatus === VerificationStatus.VERIFICATED && verificationType === "nko"; + const isUserNko = useUserStore(state => state.userAccount?.status) === "nko"; useEffect(() => { function addTariffsToCart() { diff --git a/yarn.lock b/yarn.lock index 9efaaf8..8217f37 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1532,10 +1532,10 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" -"@frontend/kitui@1.0.52": - version "1.0.52" - resolved "https://penahub.gitlab.yandexcloud.net/api/v4/projects/21/packages/npm/@frontend/kitui/-/@frontend/kitui-1.0.52.tgz#3b1c28f889da80ab325ab2b511108632fa925f1c" - integrity sha1-Oxwo+InagKsyWrK1ERCGMvqSXxw= +"@frontend/kitui@1.0.53": + version "1.0.53" + resolved "https://penahub.gitlab.yandexcloud.net/api/v4/projects/21/packages/npm/@frontend/kitui/-/@frontend/kitui-1.0.53.tgz#a663052d300b9e3c588346c646f276c9aec7de5d" + integrity sha1-pmMFLTALnjxYg0bGRvJ2ya7H3l0= dependencies: immer "^10.0.2" reconnecting-eventsource "^1.6.2"