diff --git a/src/kitUI/Cart/Cart.tsx b/src/kitUI/Cart/Cart.tsx index 4abf479..6e00f2e 100644 --- a/src/kitUI/Cart/Cart.tsx +++ b/src/kitUI/Cart/Cart.tsx @@ -21,6 +21,7 @@ export default function Cart({ selectedTariffs }: Props) { const cartTotal = useCartStore(state => state.cartTotal); const setCartTotal = useCartStore(store => store.setCartTotal); const [couponField, setCouponField] = useState(""); + const [loyaltyField, setLoyaltyField] = useState(""); const [errorMessage, setErrorMessage] = useState(null); const [isNonCommercial, setIsNonCommercial] = useState(false); @@ -89,7 +90,22 @@ export default function Cart({ selectedTariffs }: Props) { function handleCalcCartClick() { const cartTariffs = tariffs.filter(tariff => selectedTariffs.includes(tariff.id)); const cartItems = cartTariffs.map(tariff => createCartItem(tariff)); - const cartData = calcCartData(testUser, cartItems, discounts, isNonCommercial, couponField); + + const loyaltyValue = parseInt(loyaltyField); + + if (!isFinite(loyaltyValue)) { + setErrorMessage("Лояльность не число"); + return; + } + + const cartData = calcCartData({ + user: testUser, + purchasesAmount: loyaltyValue, + cartItems, + discounts, + isNonCommercial, + coupon: couponField, + }); if (cartData instanceof Error) { setErrorMessage(cartData.message); @@ -173,7 +189,35 @@ export default function Cart({ selectedTariffs }: Props) { : Подходящий купон не найден! )} - + + setLoyaltyField(e.target.value)} + InputProps={{ + style: { + backgroundColor: theme.palette.content.main, + color: theme.palette.secondary.main, + } + }} + InputLabelProps={{ + style: { + 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 d53ff4e..c6803c9 100644 --- a/src/kitUI/Cart/calc.test.ts +++ b/src/kitUI/Cart/calc.test.ts @@ -12,7 +12,12 @@ describe("cart tests", () => { it("без скидок", () => { const testCase = prepareTestCase(exampleCartValues.testCases[0]); - const cartTotal = calcCartData(testCase.user, testCase.cartItems, discounts) as CartTotal; + const cartTotal = calcCartData({ + user: testCase.user, + purchasesAmount: testCase.user.PurchasesAmount, + cartItems: testCase.cartItems, + discounts, + }) as CartTotal; const allEnvolvedDiscounts: string[] = [...cartTotal.envolvedCartDiscounts.map(discount => discount._id)]; cartTotal.items.forEach(cartItem => { allEnvolvedDiscounts.push(...cartItem.envolvedDiscounts.map(discount => discount._id)); @@ -36,7 +41,12 @@ describe("cart tests", () => { ); }); - const cartTotal = calcCartData(testCase.user, testCase.cartItems, discountsWithoutTemplategen) as CartTotal; + const cartTotal = calcCartData({ + user: testCase.user, + purchasesAmount: testCase.user.PurchasesAmount, + cartItems: testCase.cartItems, + discounts: discountsWithoutTemplategen, + }) as CartTotal; const allEnvolvedDiscounts: string[] = [...cartTotal.envolvedCartDiscounts.map(discount => discount._id)]; cartTotal.items.forEach(cartItem => { allEnvolvedDiscounts.push(...cartItem.envolvedDiscounts.map(discount => discount._id)); @@ -60,7 +70,12 @@ describe("cart tests", () => { ); }); - const cartTotal = calcCartData(testCase.user, testCase.cartItems, discountsWithoutTemplategen) as CartTotal; + const cartTotal = calcCartData({ + user: testCase.user, + purchasesAmount: testCase.user.PurchasesAmount, + cartItems: testCase.cartItems, + discounts: discountsWithoutTemplategen, + }) as CartTotal; const allEnvolvedDiscounts: string[] = [...cartTotal.envolvedCartDiscounts.map(discount => discount._id)]; cartTotal.items.forEach(cartItem => { allEnvolvedDiscounts.push(...cartItem.envolvedDiscounts.map(discount => discount._id)); @@ -84,7 +99,12 @@ describe("cart tests", () => { ); }); - const cartTotal = calcCartData(testCase.user, testCase.cartItems, discountsWithoutTemplategen) as CartTotal; + const cartTotal = calcCartData({ + user: testCase.user, + purchasesAmount: testCase.user.PurchasesAmount, + cartItems: testCase.cartItems, + discounts: discountsWithoutTemplategen, + }) as CartTotal; const allEnvolvedDiscounts: string[] = [...cartTotal.envolvedCartDiscounts.map(discount => discount._id)]; cartTotal.items.forEach(cartItem => { allEnvolvedDiscounts.push(...cartItem.envolvedDiscounts.map(discount => discount._id)); @@ -108,7 +128,12 @@ describe("cart tests", () => { ); }); - const cartTotal = calcCartData(testCase.user, testCase.cartItems, discountsWithoutTemplategen) as CartTotal; + const cartTotal = calcCartData({ + user: testCase.user, + purchasesAmount: testCase.user.PurchasesAmount, + cartItems: testCase.cartItems, + discounts: discountsWithoutTemplategen, + }) as CartTotal; const allEnvolvedDiscounts: string[] = [...cartTotal.envolvedCartDiscounts.map(discount => discount._id)]; cartTotal.items.forEach(cartItem => { allEnvolvedDiscounts.push(...cartItem.envolvedDiscounts.map(discount => discount._id)); @@ -124,7 +149,12 @@ describe("cart tests", () => { it("история про то, как скидки за привилегии помешали получить скидку за сервис", () => { const testCase = prepareTestCase(exampleCartValues.testCases[5]); - const cartTotal = calcCartData(testCase.user, testCase.cartItems, discounts) as CartTotal; + const cartTotal = calcCartData({ + user: testCase.user, + purchasesAmount: testCase.user.PurchasesAmount, + cartItems: testCase.cartItems, + discounts, + }) as CartTotal; const allEnvolvedDiscounts: string[] = [...cartTotal.envolvedCartDiscounts.map(discount => discount._id)]; cartTotal.items.forEach(cartItem => { allEnvolvedDiscounts.push(...cartItem.envolvedDiscounts.map(discount => discount._id)); @@ -140,7 +170,12 @@ describe("cart tests", () => { it("то же что и выше, но без лояльности", () => { const testCase = prepareTestCase(exampleCartValues.testCases[6]); - const cartTotal = calcCartData(testCase.user, testCase.cartItems, discounts) as CartTotal; + const cartTotal = calcCartData({ + user: testCase.user, + purchasesAmount: testCase.user.PurchasesAmount, + cartItems: testCase.cartItems, + discounts, + }) as CartTotal; const allEnvolvedDiscounts: string[] = [...cartTotal.envolvedCartDiscounts.map(discount => discount._id)]; cartTotal.items.forEach(cartItem => { allEnvolvedDiscounts.push(...cartItem.envolvedDiscounts.map(discount => discount._id)); @@ -156,7 +191,12 @@ describe("cart tests", () => { it("история про то, как получилось получить скидку за сервис", () => { const testCase = prepareTestCase(exampleCartValues.testCases[7]); - const cartTotal = calcCartData(testCase.user, testCase.cartItems, discounts) as CartTotal; + const cartTotal = calcCartData({ + user: testCase.user, + purchasesAmount: testCase.user.PurchasesAmount, + cartItems: testCase.cartItems, + discounts, + }) as CartTotal; const allEnvolvedDiscounts: string[] = [...cartTotal.envolvedCartDiscounts.map(discount => discount._id)]; cartTotal.items.forEach(cartItem => { allEnvolvedDiscounts.push(...cartItem.envolvedDiscounts.map(discount => discount._id)); @@ -172,7 +212,12 @@ describe("cart tests", () => { it("две скидки за сервис", () => { const testCase = prepareTestCase(exampleCartValues.testCases[8]); - const cartTotal = calcCartData(testCase.user, testCase.cartItems, discounts) as CartTotal; + const cartTotal = calcCartData({ + user: testCase.user, + purchasesAmount: testCase.user.PurchasesAmount, + cartItems: testCase.cartItems, + discounts, + }) as CartTotal; const allEnvolvedDiscounts: string[] = [...cartTotal.envolvedCartDiscounts.map(discount => discount._id)]; cartTotal.items.forEach(cartItem => { allEnvolvedDiscounts.push(...cartItem.envolvedDiscounts.map(discount => discount._id)); @@ -188,7 +233,14 @@ describe("cart tests", () => { it("юзер использовал промокод id33. он заменяет скидку на p6 собой. в один момент времени может быть активирован только 1 промокод, т.е. после активации следующего, предыдущий заменяется. но в промокоде может быть несколько скидок. промокоды имеют скидки только на привелеги", () => { const testCase = prepareTestCase(exampleCartValues.testCases[9]); - const cartTotal = calcCartData(testCase.user, testCase.cartItems, discounts, false, "ABCD") as CartTotal; + const cartTotal = calcCartData({ + user: testCase.user, + purchasesAmount: testCase.user.PurchasesAmount, + cartItems: testCase.cartItems, + discounts, + isNonCommercial: false, + coupon: "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 +256,13 @@ describe("cart tests", () => { it("юзер подтвердил свой статус НКО, поэтому, не смотря на то что он достиг по лояльности уровня скидки id2, она не применилась, а применилась id32", () => { const testCase = prepareTestCase(exampleCartValues.testCases[10]); - const cartTotal = calcCartData(testCase.user, testCase.cartItems, discounts, true) as CartTotal; + const cartTotal = calcCartData({ + user: testCase.user, + purchasesAmount: testCase.user.PurchasesAmount, + cartItems: testCase.cartItems, + discounts, + isNonCommercial: true, + }) as CartTotal; const allEnvolvedDiscounts: string[] = [...cartTotal.envolvedCartDiscounts.map(discount => discount._id)]; cartTotal.items.forEach(cartItem => { allEnvolvedDiscounts.push(...cartItem.envolvedDiscounts.map(discount => discount._id)); @@ -220,7 +278,12 @@ describe("cart tests", () => { it("case 12", () => { const testCase = prepareTestCase(exampleCartValues.testCases[11]); - const cartTotal = calcCartData(testCase.user, testCase.cartItems, discounts) as CartTotal; + const cartTotal = calcCartData({ + user: testCase.user, + purchasesAmount: testCase.user.PurchasesAmount, + cartItems: testCase.cartItems, + discounts, + }) 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 160cf6f..5e94f8a 100644 --- a/src/kitUI/Cart/calc.ts +++ b/src/kitUI/Cart/calc.ts @@ -3,13 +3,14 @@ import { ServiceType, SERVICE_LIST, Tariff } from "../../model/tariff"; import { User } from "../../model/user"; -export function calcCartData( - user: User, - cartItems: CartItem[], - discounts: AnyDiscount[], - isNonCommercial: boolean = false, - coupon?: string, -): CartTotal | Error | null { +export function calcCartData({ user, purchasesAmount, cartItems, discounts, isNonCommercial = false, coupon }: { + user: User; + purchasesAmount: number; + cartItems: CartItem[]; + discounts: AnyDiscount[]; + isNonCommercial?: boolean; + coupon?: string; +}): CartTotal | Error | null { let isIncompatibleTariffs = false; const defaultTariffTypePresent: { [Key in ServiceType]: boolean } = { @@ -126,7 +127,7 @@ export function calcCartData( } // layer 4 - const totalPurchasesAmountDiscount = findMaxTotalPurchasesAmountDiscount(discounts, user.PurchasesAmount); + const totalPurchasesAmountDiscount = findMaxTotalPurchasesAmountDiscount(discounts, purchasesAmount); if (totalPurchasesAmountDiscount) { cartTotal.totalPrice *= totalPurchasesAmountDiscount.factor; cartTotal.envolvedCartDiscounts.push(totalPurchasesAmountDiscount);