diff --git a/src/kitUI/Cart/Cart.tsx b/src/kitUI/Cart/Cart.tsx index 918d493..5d29002 100644 --- a/src/kitUI/Cart/Cart.tsx +++ b/src/kitUI/Cart/Cart.tsx @@ -1,5 +1,5 @@ import theme from "@theme"; -import { Button, Paper, Box, Typography, TableHead, TableRow, TableCell, TableBody, Table, Tooltip, Alert } from "@mui/material"; +import { Button, Paper, Box, Typography, TableHead, TableRow, TableCell, TableBody, Table, Tooltip, Alert, Checkbox, FormControlLabel } from "@mui/material"; import Input from "@kitUI/input"; import { useCartStore } from "@root/stores/cart"; import { useState } from "react"; @@ -22,6 +22,7 @@ export default function Cart({ selectedTariffs }: Props) { const setCartTotal = useCartStore(store => store.setCartTotal); const [couponField, setCouponField] = useState(""); const [errorMessage, setErrorMessage] = useState(null); + const [isNonCommercial, setIsNonCommercial] = useState(false); // const [coupon, setCoupon] = useState(); const cartRows = cartTotal?.items.map(cartItemTotal => { @@ -63,8 +64,8 @@ export default function Cart({ selectedTariffs }: Props) { }; }); - const cartDiscounts = cartTotal?.envolvedCartDiscounts - const cartDiscountsResultFactor = cartDiscounts && cartDiscounts.reduce((acc, discount) => acc * findDiscountFactor(discount), 1); + const cartDiscounts = cartTotal?.envolvedCartDiscounts; + const cartDiscountsResultFactor = cartDiscounts && cartDiscounts?.length > 1 && cartDiscounts.reduce((acc, discount) => acc * findDiscountFactor(discount), 1); const envolvedCartDiscountsElement = cartDiscounts && ( selectedTariffs.includes(tariff.id)); const cartItems = cartTariffs.map(tariff => createCartItem(tariff)); - const cartData = calcCartData(testUser, cartItems, discounts, couponField); + const cartData = calcCartData(testUser, cartItems, discounts, isNonCommercial, couponField); if (cartData instanceof Error) { setErrorMessage(cartData.message); @@ -118,7 +119,12 @@ export default function Cart({ selectedTariffs }: Props) { setCoupon(couponField)} >применить промокод */} - + setIsNonCommercial(checked)} + control={} + label="НКО" + sx={{ + color: theme.palette.secondary.main, + }} + /> + {cartTotal?.items && cartTotal.items.length > 0 && diff --git a/src/kitUI/Cart/calc.test.ts b/src/kitUI/Cart/calc.test.ts index 51c8652..d53ff4e 100644 --- a/src/kitUI/Cart/calc.test.ts +++ b/src/kitUI/Cart/calc.test.ts @@ -188,7 +188,7 @@ describe("cart tests", () => { it("юзер использовал промокод id33. он заменяет скидку на p6 собой. в один момент времени может быть активирован только 1 промокод, т.е. после активации следующего, предыдущий заменяется. но в промокоде может быть несколько скидок. промокоды имеют скидки только на привелеги", () => { const testCase = prepareTestCase(exampleCartValues.testCases[9]); - const cartTotal = calcCartData(testCase.user, testCase.cartItems, discounts, "ABCD") as CartTotal; + const cartTotal = calcCartData(testCase.user, testCase.cartItems, discounts, false, "ABCD") as CartTotal; const allEnvolvedDiscounts: string[] = [...cartTotal.envolvedCartDiscounts.map(discount => discount._id)]; cartTotal.items.forEach(cartItem => { allEnvolvedDiscounts.push(...cartItem.envolvedDiscounts.map(discount => discount._id)); @@ -204,7 +204,7 @@ describe("cart tests", () => { it("юзер подтвердил свой статус НКО, поэтому, не смотря на то что он достиг по лояльности уровня скидки id2, она не применилась, а применилась id32", () => { const testCase = prepareTestCase(exampleCartValues.testCases[10]); - const cartTotal = calcCartData(testCase.user, testCase.cartItems, discounts) as CartTotal; + const cartTotal = calcCartData(testCase.user, testCase.cartItems, discounts, true) as CartTotal; const allEnvolvedDiscounts: string[] = [...cartTotal.envolvedCartDiscounts.map(discount => discount._id)]; cartTotal.items.forEach(cartItem => { allEnvolvedDiscounts.push(...cartItem.envolvedDiscounts.map(discount => discount._id)); diff --git a/src/kitUI/Cart/calc.ts b/src/kitUI/Cart/calc.ts index 95eff40..0a62624 100644 --- a/src/kitUI/Cart/calc.ts +++ b/src/kitUI/Cart/calc.ts @@ -7,6 +7,7 @@ export function calcCartData( user: User, cartItems: CartItem[], discounts: AnyDiscount[], + isNonCommercial: boolean = false, coupon?: string, ): CartTotal | Error | null { let isIncompatibleTariffs = false; @@ -48,7 +49,7 @@ export function calcCartData( // layer 0 for (const discount of discounts) { - if (discount.conditionType !== "userType" || discount.condition.userType !== user.Type) continue; + if (discount.conditionType !== "userType" || !isNonCommercial) continue; cartItems.forEach(cartItem => { cartTotal.items.push({ @@ -123,7 +124,7 @@ export function calcCartData( } // layer 4 - const totalPurchasesAmountDiscount = findMaxTotalPurchasesAmountDiscount(discounts, user); + const totalPurchasesAmountDiscount = findMaxTotalPurchasesAmountDiscount(discounts, user.PurchasesAmount); if (totalPurchasesAmountDiscount) { cartTotal.totalPrice *= totalPurchasesAmountDiscount.factor; cartTotal.envolvedCartDiscounts.push(totalPurchasesAmountDiscount); @@ -164,9 +165,9 @@ function findMaxCartPurchasesAmountDiscount(discounts: AnyDiscount[], cartTotal: return maxValueDiscount; } -function findMaxTotalPurchasesAmountDiscount(discounts: AnyDiscount[], user: User): PurchasesAmountDiscount | null { +function findMaxTotalPurchasesAmountDiscount(discounts: AnyDiscount[], purchasesAmount: number): PurchasesAmountDiscount | null { const applicableDiscounts = discounts.filter((discount): discount is PurchasesAmountDiscount => { - return discount.conditionType === "purchasesAmount" && user.PurchasesAmount >= discount.condition.purchasesAmount; + return discount.conditionType === "purchasesAmount" && purchasesAmount >= discount.condition.purchasesAmount; }); if (!applicableDiscounts.length) return null;