Example #1
0
        //One Thing to consider , If for example basket contains StockQty that is bigger then What Db contains and when new StockQty is Adding then the line 31 will restart previos StockQty for basket (I should think if i want that things to happen)
        public void Do(ISession session, StockOnHold stockToUpdate)
        {
            var basketJson = session.GetString("Basket");
            var basket     = new List <ProductFromBasketCookieDto>();

            if (!string.IsNullOrEmpty(basketJson))
            {
                basket = JsonConvert.DeserializeObject <List <ProductFromBasketCookieDto> >(basketJson);
            }
            if (basket.Any(x => x.StockId == stockToUpdate.StockId))
            {
                basket.FirstOrDefault(x => x.StockId == stockToUpdate.StockId).StockQty = stockToUpdate.StockQty;
            }
            else
            {
                var basketInfoForProduct = new ProductFromBasketCookieDto
                {
                    StockId = stockToUpdate.StockId,
                    //In The Future Remove That ProductId
                    ProductId = stockToUpdate.ProductId,
                    StockQty  = stockToUpdate.StockQty
                };
                basket.Add(basketInfoForProduct);
            }

            basketJson = JsonConvert.SerializeObject(basket);
            session.SetString("Basket", basketJson);
        }
Example #2
0
        public void SavesStockOnHoldToDatabase()
        {
            //Arrange
            var product = new Product
            {
                Name        = "ProductName",
                Description = "ProductDescription",
                Value       = 100,
                Stock       = null
            };

            var stock = new Stock
            {
                Description = "Description",
                Product     = product,
                ProductID   = 1,
                OrderStocks = null,
                Qty         = 1
            };

            var stockOnHold = new StockOnHold
            {
                Stock      = stock,
                StockID    = 1,
                Qty        = 1,
                SessionID  = "123",
                ExpiryDate = DateTime.Now.AddDays(1)
            };

            //Act
            using (var ctx = CreateDbContext(nameof(SavesStockOnHoldToDatabase)))
            {
                ctx.StockOnHolds.Add(stockOnHold);
                ctx.SaveChanges();
            }

            //Assert
            using (var ctx = CreateDbContext(nameof(SavesStockOnHoldToDatabase)))
            {
                var savedStockOnHold = ctx.StockOnHolds.Single();
                Assert.Equal(stockOnHold.SessionID, savedStockOnHold.SessionID);
            }
        }
        //ToDO: Reduce amount of parameters, split logic repsonsible for increasing ExpireTime for already placed products in basket
        //ToDO: refactor , to many ifs
        //TODO: refactor , enums , for example TransferStockToStockOnHoldTypeEnum.One is not used
        //Consider not returning StockOnHold, because i do not want to do antything with that Stock, and also It can produce some issuse,
        //because someone could add that Stock to Db that is already added in that method (line: 66)
        //Instead consider return bool,void(with Error/Status prop in class) or Dto but NO REAL STOCKONHOLD which is used by EF
        public async Task <StockOnHold> Do(TransferStockToStockOnHoldTypeEnum transferType, ISession session, Stock stockToSubtract, int stockQty)
        {
            if (stockToSubtract == null)
            {
                return(null);
            }

            if (stockToSubtract.Quantity < stockQty)
            {
                return(null);
            }

            await ChangeExpireTimeForExistingStocksOnHold(transferType, session);

            var stockOnHoldToBeAdded = await _unitOfWork.StockOnHold.FindAsync(s => s.SessionId == session.Id && s.StockId == stockToSubtract.Id);

            if (stockOnHoldToBeAdded != null)
            {
                stockOnHoldToBeAdded.StockQty += stockQty;
            }
            else
            {
                stockOnHoldToBeAdded = new StockOnHold()
                {
                    SessionId  = session.Id,
                    StockId    = stockToSubtract.Id,
                    ExpireTime = DateTime.Now.AddMinutes(_basketOptions.Value.StockOnHoldExpireMinutes),
                    StockQty   = stockQty,
                    //In The Future Remove That ProductId
                    ProductId = stockToSubtract.ProductId
                };

                _unitOfWork.StockOnHold.Add(stockOnHoldToBeAdded);
            }
            stockToSubtract.Quantity -= stockQty;

            return(stockOnHoldToBeAdded);
        }