diff --git a/src/kitUI/Cart/Cart.tsx b/src/kitUI/Cart/Cart.tsx index e72cfaa..918d493 100644 --- a/src/kitUI/Cart/Cart.tsx +++ b/src/kitUI/Cart/Cart.tsx @@ -6,7 +6,7 @@ import { useState } from "react"; import { GridSelectionModel } from "@mui/x-data-grid"; import { testUser } from "@root/stores/mocks/user"; import { useDiscountStore } from "@root/stores/discounts"; -import { calcCartData, createCartItem, findDiscountById, findDiscountFactor, formatDiscountFactor } from "./calc"; +import { calcCartData, createCartItem, findDiscountFactor, formatDiscountFactor } from "./calc"; import { useTariffStore } from "@root/stores/tariffs"; import { AnyDiscount, CartItemTotal } from "@root/model/cart"; @@ -30,21 +30,17 @@ export default function Cart({ selectedTariffs }: Props) { const envolvedDiscountsElement = ( - {cartItemTotal.envolvedDiscountIds.map((discountId, index, arr) => { - const discount = findDiscountById(discounts, discountId); - - return ( - - - {index < arr.length - (serviceDiscount ? 0 : 1) && - - } - - ); - })} + {cartItemTotal.envolvedDiscounts.map((discount, index, arr) => ( + + + {index < arr.length - (serviceDiscount ? 0 : 1) && + + } + + ))} {serviceDiscount && findDiscountById(discounts, discountId)); + const cartDiscounts = cartTotal?.envolvedCartDiscounts const cartDiscountsResultFactor = cartDiscounts && cartDiscounts.reduce((acc, discount) => acc * findDiscountFactor(discount), 1); const envolvedCartDiscountsElement = cartDiscounts && ( diff --git a/src/kitUI/Cart/calc.test.ts b/src/kitUI/Cart/calc.test.ts index 1451441..51c8652 100644 --- a/src/kitUI/Cart/calc.test.ts +++ b/src/kitUI/Cart/calc.test.ts @@ -13,9 +13,9 @@ describe("cart tests", () => { const testCase = prepareTestCase(exampleCartValues.testCases[0]); const cartTotal = calcCartData(testCase.user, testCase.cartItems, discounts) as CartTotal; - const allEnvolvedDiscounts: string[] = [...cartTotal.envolvedCartDiscountIds]; + const allEnvolvedDiscounts: string[] = [...cartTotal.envolvedCartDiscounts.map(discount => discount._id)]; cartTotal.items.forEach(cartItem => { - allEnvolvedDiscounts.push(...cartItem.envolvedDiscountIds); + allEnvolvedDiscounts.push(...cartItem.envolvedDiscounts.map(discount => discount._id)); }); SERVICE_LIST.map(service => service.serviceKey).forEach(service => { if (cartTotal.discountsByService[service]) allEnvolvedDiscounts.push(cartTotal.discountsByService[service]!._id); @@ -37,9 +37,9 @@ describe("cart tests", () => { }); const cartTotal = calcCartData(testCase.user, testCase.cartItems, discountsWithoutTemplategen) as CartTotal; - const allEnvolvedDiscounts: string[] = [...cartTotal.envolvedCartDiscountIds]; + const allEnvolvedDiscounts: string[] = [...cartTotal.envolvedCartDiscounts.map(discount => discount._id)]; cartTotal.items.forEach(cartItem => { - allEnvolvedDiscounts.push(...cartItem.envolvedDiscountIds); + allEnvolvedDiscounts.push(...cartItem.envolvedDiscounts.map(discount => discount._id)); }); SERVICE_LIST.map(service => service.serviceKey).forEach(service => { if (cartTotal.discountsByService[service]) allEnvolvedDiscounts.push(cartTotal.discountsByService[service]!._id); @@ -61,9 +61,9 @@ describe("cart tests", () => { }); const cartTotal = calcCartData(testCase.user, testCase.cartItems, discountsWithoutTemplategen) as CartTotal; - const allEnvolvedDiscounts: string[] = [...cartTotal.envolvedCartDiscountIds]; + const allEnvolvedDiscounts: string[] = [...cartTotal.envolvedCartDiscounts.map(discount => discount._id)]; cartTotal.items.forEach(cartItem => { - allEnvolvedDiscounts.push(...cartItem.envolvedDiscountIds); + allEnvolvedDiscounts.push(...cartItem.envolvedDiscounts.map(discount => discount._id)); }); SERVICE_LIST.map(service => service.serviceKey).forEach(service => { if (cartTotal.discountsByService[service]) allEnvolvedDiscounts.push(cartTotal.discountsByService[service]!._id); @@ -85,9 +85,9 @@ describe("cart tests", () => { }); const cartTotal = calcCartData(testCase.user, testCase.cartItems, discountsWithoutTemplategen) as CartTotal; - const allEnvolvedDiscounts: string[] = [...cartTotal.envolvedCartDiscountIds]; + const allEnvolvedDiscounts: string[] = [...cartTotal.envolvedCartDiscounts.map(discount => discount._id)]; cartTotal.items.forEach(cartItem => { - allEnvolvedDiscounts.push(...cartItem.envolvedDiscountIds); + allEnvolvedDiscounts.push(...cartItem.envolvedDiscounts.map(discount => discount._id)); }); SERVICE_LIST.map(service => service.serviceKey).forEach(service => { if (cartTotal.discountsByService[service]) allEnvolvedDiscounts.push(cartTotal.discountsByService[service]!._id); @@ -109,9 +109,9 @@ describe("cart tests", () => { }); const cartTotal = calcCartData(testCase.user, testCase.cartItems, discountsWithoutTemplategen) as CartTotal; - const allEnvolvedDiscounts: string[] = [...cartTotal.envolvedCartDiscountIds]; + const allEnvolvedDiscounts: string[] = [...cartTotal.envolvedCartDiscounts.map(discount => discount._id)]; cartTotal.items.forEach(cartItem => { - allEnvolvedDiscounts.push(...cartItem.envolvedDiscountIds); + allEnvolvedDiscounts.push(...cartItem.envolvedDiscounts.map(discount => discount._id)); }); SERVICE_LIST.map(service => service.serviceKey).forEach(service => { if (cartTotal.discountsByService[service]) allEnvolvedDiscounts.push(cartTotal.discountsByService[service]!._id); @@ -125,9 +125,9 @@ describe("cart tests", () => { const testCase = prepareTestCase(exampleCartValues.testCases[5]); const cartTotal = calcCartData(testCase.user, testCase.cartItems, discounts) as CartTotal; - const allEnvolvedDiscounts: string[] = [...cartTotal.envolvedCartDiscountIds]; + const allEnvolvedDiscounts: string[] = [...cartTotal.envolvedCartDiscounts.map(discount => discount._id)]; cartTotal.items.forEach(cartItem => { - allEnvolvedDiscounts.push(...cartItem.envolvedDiscountIds); + allEnvolvedDiscounts.push(...cartItem.envolvedDiscounts.map(discount => discount._id)); }); SERVICE_LIST.map(service => service.serviceKey).forEach(service => { if (cartTotal.discountsByService[service]) allEnvolvedDiscounts.push(cartTotal.discountsByService[service]!._id); @@ -141,9 +141,9 @@ describe("cart tests", () => { const testCase = prepareTestCase(exampleCartValues.testCases[6]); const cartTotal = calcCartData(testCase.user, testCase.cartItems, discounts) as CartTotal; - const allEnvolvedDiscounts: string[] = [...cartTotal.envolvedCartDiscountIds]; + const allEnvolvedDiscounts: string[] = [...cartTotal.envolvedCartDiscounts.map(discount => discount._id)]; cartTotal.items.forEach(cartItem => { - allEnvolvedDiscounts.push(...cartItem.envolvedDiscountIds); + allEnvolvedDiscounts.push(...cartItem.envolvedDiscounts.map(discount => discount._id)); }); SERVICE_LIST.map(service => service.serviceKey).forEach(service => { if (cartTotal.discountsByService[service]) allEnvolvedDiscounts.push(cartTotal.discountsByService[service]!._id); @@ -157,9 +157,9 @@ describe("cart tests", () => { const testCase = prepareTestCase(exampleCartValues.testCases[7]); const cartTotal = calcCartData(testCase.user, testCase.cartItems, discounts) as CartTotal; - const allEnvolvedDiscounts: string[] = [...cartTotal.envolvedCartDiscountIds]; + const allEnvolvedDiscounts: string[] = [...cartTotal.envolvedCartDiscounts.map(discount => discount._id)]; cartTotal.items.forEach(cartItem => { - allEnvolvedDiscounts.push(...cartItem.envolvedDiscountIds); + allEnvolvedDiscounts.push(...cartItem.envolvedDiscounts.map(discount => discount._id)); }); SERVICE_LIST.map(service => service.serviceKey).forEach(service => { if (cartTotal.discountsByService[service]) allEnvolvedDiscounts.push(cartTotal.discountsByService[service]!._id); @@ -173,9 +173,9 @@ describe("cart tests", () => { const testCase = prepareTestCase(exampleCartValues.testCases[8]); const cartTotal = calcCartData(testCase.user, testCase.cartItems, discounts) as CartTotal; - const allEnvolvedDiscounts: string[] = [...cartTotal.envolvedCartDiscountIds]; + const allEnvolvedDiscounts: string[] = [...cartTotal.envolvedCartDiscounts.map(discount => discount._id)]; cartTotal.items.forEach(cartItem => { - allEnvolvedDiscounts.push(...cartItem.envolvedDiscountIds); + allEnvolvedDiscounts.push(...cartItem.envolvedDiscounts.map(discount => discount._id)); }); SERVICE_LIST.map(service => service.serviceKey).forEach(service => { if (cartTotal.discountsByService[service]) allEnvolvedDiscounts.push(cartTotal.discountsByService[service]!._id); @@ -189,9 +189,9 @@ describe("cart tests", () => { const testCase = prepareTestCase(exampleCartValues.testCases[9]); const cartTotal = calcCartData(testCase.user, testCase.cartItems, discounts, "ABCD") as CartTotal; - const allEnvolvedDiscounts: string[] = [...cartTotal.envolvedCartDiscountIds]; + const allEnvolvedDiscounts: string[] = [...cartTotal.envolvedCartDiscounts.map(discount => discount._id)]; cartTotal.items.forEach(cartItem => { - allEnvolvedDiscounts.push(...cartItem.envolvedDiscountIds); + allEnvolvedDiscounts.push(...cartItem.envolvedDiscounts.map(discount => discount._id)); }); SERVICE_LIST.map(service => service.serviceKey).forEach(service => { if (cartTotal.discountsByService[service]) allEnvolvedDiscounts.push(cartTotal.discountsByService[service]!._id); @@ -205,9 +205,9 @@ describe("cart tests", () => { const testCase = prepareTestCase(exampleCartValues.testCases[10]); const cartTotal = calcCartData(testCase.user, testCase.cartItems, discounts) as CartTotal; - const allEnvolvedDiscounts: string[] = [...cartTotal.envolvedCartDiscountIds]; + const allEnvolvedDiscounts: string[] = [...cartTotal.envolvedCartDiscounts.map(discount => discount._id)]; cartTotal.items.forEach(cartItem => { - allEnvolvedDiscounts.push(...cartItem.envolvedDiscountIds); + allEnvolvedDiscounts.push(...cartItem.envolvedDiscounts.map(discount => discount._id)); }); SERVICE_LIST.map(service => service.serviceKey).forEach(service => { if (cartTotal.discountsByService[service]) allEnvolvedDiscounts.push(cartTotal.discountsByService[service]!._id); @@ -221,9 +221,9 @@ describe("cart tests", () => { const testCase = prepareTestCase(exampleCartValues.testCases[11]); const cartTotal = calcCartData(testCase.user, testCase.cartItems, discounts) as CartTotal; - const allEnvolvedDiscounts: string[] = [...cartTotal.envolvedCartDiscountIds]; + const allEnvolvedDiscounts: string[] = [...cartTotal.envolvedCartDiscounts.map(discount => discount._id)]; cartTotal.items.forEach(cartItem => { - allEnvolvedDiscounts.push(...cartItem.envolvedDiscountIds); + allEnvolvedDiscounts.push(...cartItem.envolvedDiscounts.map(discount => discount._id)); }); SERVICE_LIST.map(service => service.serviceKey).forEach(service => { if (cartTotal.discountsByService[service]) allEnvolvedDiscounts.push(cartTotal.discountsByService[service]!._id); diff --git a/src/kitUI/Cart/calc.ts b/src/kitUI/Cart/calc.ts index a74a48f..95eff40 100644 --- a/src/kitUI/Cart/calc.ts +++ b/src/kitUI/Cart/calc.ts @@ -43,7 +43,7 @@ export function calcCartData( squiz: null, dwarfener: null, }, - envolvedCartDiscountIds: [], + envolvedCartDiscounts: [], }; // layer 0 @@ -52,7 +52,7 @@ export function calcCartData( cartItems.forEach(cartItem => { cartTotal.items.push({ - envolvedDiscountIds: [], + envolvedDiscounts: [], tariff: cartItem.tariff, totalPrice: cartItem.price, }); @@ -62,7 +62,7 @@ export function calcCartData( }); cartTotal.totalPrice *= discount.target.factor; - cartTotal.envolvedCartDiscountIds.push(discount._id); + cartTotal.envolvedCartDiscounts.push(discount); return cartTotal; } @@ -73,7 +73,7 @@ export function calcCartData( for (const cartItem of cartItems) { const cartItemTotal: CartItemTotal = { tariff: cartItem.tariff, - envolvedDiscountIds: [], + envolvedDiscounts: [], totalPrice: cartItem.price, }; @@ -85,7 +85,7 @@ export function calcCartData( if (tariff.customPricePerUnit !== undefined && !couponDiscount.overwhelm) return; cartItemTotal.totalPrice *= product.factor; - cartItemTotal.envolvedDiscountIds.push(couponDiscount._id); + cartItemTotal.envolvedDiscounts.push(couponDiscount); privilegesAffectedByCoupon.push(product.privilegeId); }); @@ -97,7 +97,7 @@ export function calcCartData( if (privilegesAffectedByCoupon.includes(privilegeDiscount.condition.privilege.id)) return; cartItemTotal.totalPrice *= product.factor; - cartItemTotal.envolvedDiscountIds.push(privilegeDiscount._id); + cartItemTotal.envolvedDiscounts.push(privilegeDiscount); }); cartTotal.items.push(cartItemTotal); @@ -119,14 +119,14 @@ export function calcCartData( const cartPurchasesAmountDiscount = findMaxCartPurchasesAmountDiscount(discounts, cartTotal); if (cartPurchasesAmountDiscount) { cartTotal.totalPrice *= cartPurchasesAmountDiscount.factor; - cartTotal.envolvedCartDiscountIds.push(cartPurchasesAmountDiscount._id); + cartTotal.envolvedCartDiscounts.push(cartPurchasesAmountDiscount); } // layer 4 const totalPurchasesAmountDiscount = findMaxTotalPurchasesAmountDiscount(discounts, user); if (totalPurchasesAmountDiscount) { cartTotal.totalPrice *= totalPurchasesAmountDiscount.factor; - cartTotal.envolvedCartDiscountIds.push(totalPurchasesAmountDiscount._id); + cartTotal.envolvedCartDiscounts.push(totalPurchasesAmountDiscount); } return cartTotal; @@ -219,13 +219,6 @@ export function createCartItem(tariff: Tariff): CartItem { return { tariff, price, id: "someId" }; } -export function findDiscountById(discounts: AnyDiscount[], id: string) { - const discount = discounts.find(discount => discount._id === id); - if (!discount) throw new Error("Discount not found by id"); - - return discount; -} - export function findDiscountFactor(discount: AnyDiscount, privilegeId?: string) { switch (discount.conditionType) { case "cartPurchasesAmount": @@ -254,10 +247,3 @@ export function findDiscountFactor(discount: AnyDiscount, privilegeId?: string) export function formatDiscountFactor(factor: number): string { return `${((1 - factor) * 100).toFixed(1)}%`; } - -export const PositiveInput = (event: any) => { - const numberInput = parseInt(event.target.value); - if (isNaN(numberInput) || numberInput < 0) { - event.target.value = '0'; - } -}; diff --git a/src/model/cart.ts b/src/model/cart.ts index 29e2242..9c10e4a 100644 --- a/src/model/cart.ts +++ b/src/model/cart.ts @@ -119,7 +119,7 @@ export interface CartItem { /** Пункт корзины с уже примененными скидками */ export interface CartItemTotal { /** Массив с id примененных скидок */ - envolvedDiscountIds: string[]; // TODO заменить на ссылки на скидки + envolvedDiscounts: (PrivilegeDiscount | UserDiscount)[]; totalPrice: number; tariff: Tariff; } @@ -139,5 +139,5 @@ export interface CartTotal { /** Скидки по сервисам */ discountsByService: ServiceToDiscountMap; /** Учтенные скидки типов userType, cartPurchasesAmount, totalPurchasesAmount */ - envolvedCartDiscountIds: string[]; // TODO заменить на ссылки на скидки + envolvedCartDiscounts: (UserTypeDiscount | CartPurchasesAmountDiscount | PurchasesAmountDiscount)[]; } \ No newline at end of file