private async Task <bool> IsProductAlreadyOrdered(OrderServiceModel orderService)
        {
            var allOrders = await GetAll().ToListAsync();

            var ordaredOrder = new OrderServiceModel();
            var result       = num;

            foreach (var currOrder in allOrders)
            {
                if (currOrder.ProductId == orderService.ProductId)
                {
                    ordaredOrder = currOrder;

                    var orderAlreadyOrdered = await this.context.Orders
                                              .SingleOrDefaultAsync(or => or.Id == ordaredOrder.Id);

                    orderAlreadyOrdered.Quantity++;

                    await Task.Run(() => this.context.Orders.Update(orderAlreadyOrdered));

                    result = await this.context.SaveChangesAsync();

                    return(result > num);
                }
            }

            return(result > num);
        }
        public void GetOrderByIdAndUserId_WithExistentId_ShouldReturnCorrectResults()
        {
            string errorMessagePrefix = "OrdersService GetOrderByIdAndUserId() method does not work properly.";

            var context = UniShopDbContextInMemoryFactory.InitializeContext();

            this.SeedData(context);

            ShoppingCartsService shoppingCartsService = new ShoppingCartsService(context, new UniShopUsersService(context),
                                                                                 new ProductsService(context, new ChildCategoriesService(context, new ParentCategoriesService(context))));

            this.orderService = new OrdersService(context, new UniShopUsersService(context), shoppingCartsService, new SuppliersService(context),
                                                  new ProductsService(context, new ChildCategoriesService(context, new ParentCategoriesService(context))));

            UniShopUser user = context.Users.First();

            Order order = new Order
            {
                OrderStatus   = OrderStatus.Processed,
                UniShopUserId = user.Id,
            };

            context.Add(order);
            context.SaveChanges();

            OrderServiceModel expectedResults = user.Orders.First().To <OrderServiceModel>();
            OrderServiceModel actualResults   = this.orderService.GetOrderByIdAndUserId(expectedResults.Id, user.Id);


            Assert.True(expectedResults.Id == actualResults.Id, errorMessagePrefix + " " + "Id is not returned properly.");
            Assert.True(expectedResults.OrderStatus == actualResults.OrderStatus, errorMessagePrefix + " " + "OrderStatus is not returned properly.");
            Assert.True(expectedResults.UniShopUserId == actualResults.UniShopUserId, errorMessagePrefix + " " + "UniShopUserId Count is not returned properly.");
        }
示例#3
0
        protected async Task <bool> AddOrderProduct(OrderServiceModel order, List <ProductDTO> products, int orderId)
        {
            var productIds = order.OrderProducts.Select(x => x.ProductId).ToList();

            for (var i = 0; i < productIds.Count; i++)
            {
                var productId     = productIds[i];
                var product       = products.FirstOrDefault(x => x.Id == productId && x.IsAvailable);
                var orderQuantity = order.OrderProducts.Single(x => x.ProductId == productId).Quantity;

                if (!IsValidProduct(product, orderQuantity, i))
                {
                    continue;
                }

                product.AvailableCount -= orderQuantity;

                if (product.AvailableCount == 0)
                {
                    product.IsAvailable = false;
                }

                await _unitOfWork.OrderProductRepository.InsertAsync(new OrderProductDTO { OrderId = orderId, ProductId = productId, Quantity = orderQuantity });
            }


            return(_validationDictionary.IsValid);
        }
示例#4
0
        public async Task ReduceQuantity_WithExistentId_ShouldSuccessfullyReduceQuantity()
        {
            string errorMessagePrefix = "OrderService ReduceQuantity() method does not work properly.";

            var context = ContextFactory.Initializer();

            await SeedData(context);

            this.orderService = new OrderService(context);

            OrderServiceModel testOrder = context.Orders.First().To <OrderServiceModel>();

            await this.orderService.ReduceQuantity(testOrder.Id);

            int actualQuantity   = 0;
            int expectedQuantity = 0;

            if (testOrder.Quantity >= 1)
            {
                expectedQuantity = testOrder.Quantity - 1;
            }
            else
            {
                actualQuantity = context.Orders.First().Quantity;
            }

            Assert.True(expectedQuantity == actualQuantity, errorMessagePrefix);
        }
        public void GetOrderByIdAndUserId_WithNonCorrectData_ShouldReturnNull()
        {
            string errorMessagePrefix = "OrdersService GetOrderByIdAndUserId() method does not work properly.";

            var context = UniShopDbContextInMemoryFactory.InitializeContext();

            this.SeedData(context);

            string userId = context.Users.First().Id;

            string nonExistentUserId = userId + new Guid();

            Order order = new Order
            {
                OrderStatus   = OrderStatus.Processed,
                UniShopUserId = userId,
            };

            context.Add(order);
            context.SaveChanges();

            ShoppingCartsService shoppingCartsService = new ShoppingCartsService(context, new UniShopUsersService(context),
                                                                                 new ProductsService(context, new ChildCategoriesService(context, new ParentCategoriesService(context))));

            this.orderService = new OrdersService(context, new UniShopUsersService(context), shoppingCartsService, new SuppliersService(context),
                                                  new ProductsService(context, new ChildCategoriesService(context, new ParentCategoriesService(context))));

            OrderServiceModel actualResults = this.orderService.GetOrderByIdAndUserId(order.Id, nonExistentUserId);


            Assert.True(actualResults == null, errorMessagePrefix);
        }
        public async Task Create_WithNonExistentEvent_ShouldNotChangeAnything()
        {
            // Arrange
            var context = new EventuresDbContext(new DbContextOptionsBuilder <EventuresDbContext>()
                                                 .UseInMemoryDatabase(Guid.NewGuid().ToString())
                                                 .Options);
            var ordersService = new OrdersService(context);

            var user = new EventuresUser
            {
                UserName = "******"
            };
            await context.Users.AddAsync(user);

            await context.SaveChangesAsync();

            var model = new OrderServiceModel
            {
                EventId      = Guid.NewGuid().ToString(),
                TicketsCount = 2
            };

            // Act
            var result = await ordersService.Create(model, user.UserName);

            // Assert
            Assert.False(result);

            var count = await context.Orders.CountAsync();

            Assert.Equal(0, count);
        }
        public async Task <bool> Create(OrderServiceModel orderService)
        {
            //IsProductAlreadyOrderedResult to increase quantity
            var IsProductAlreadyOrderedResult = await IsProductAlreadyOrdered(orderService);

            if (IsProductAlreadyOrderedResult)
            {
                return(true);
            }

            Order order = orderService.To <Order>();

            var issuedOn = DateTime.UtcNow;

            order.Quantity = orderQuantity;
            order.IssuedOn = DateTime.UtcNow;

            order.OrderStatus = await this.context.OrderStatuses
                                .SingleOrDefaultAsync(os => os.Name == ServicesGlobalConstants.OrderStatusActive);

            await this.context.Orders.AddAsync(order);

            var result = await this.context.SaveChangesAsync();

            return(result > num);
        }
        public async Task <bool> Create(OrderServiceModel model, string userName)
        {
            if (!this.IsEntityStateValid(model))
            {
                return(false);
            }

            var user = await this.context.Users.SingleOrDefaultAsync(u => u.UserName == userName);

            var ev = await this.context.Events.SingleOrDefaultAsync(e => e.Id == model.EventId);

            if (user == null || ev == null || ev.TotalTickets < model.TicketsCount)
            {
                return(false);
            }

            var order = Mapper.Map <Order>(model);

            order.User = user;

            ev.TotalTickets -= model.TicketsCount;

            this.context.Events.Update(ev);

            await this.context.Orders.AddAsync(order);

            await this.context.SaveChangesAsync();

            return(true);
        }
示例#9
0
        /// <summary>
        /// Update Orders's information in DB
        /// </summary>
        /// <param name="order"></param>
        /// <returns>result status</returns>
        public async Task <bool> UpdateAsync(OrderServiceModel order)
        {
            var oldOrder = await this.GetOrderFromDBAsync(order.Id);

            var updatedOrder = order.UpdateProperties(oldOrder);

            return(await this.orderRepository.UpdateAsync(updatedOrder));
        }
        public async Task <OrderServiceModel> CreateAsync(OrderServiceModel orderServiceModel, string username, decimal deliveryPrice)
        {
            var shoppingCartProducts = this.shoppingCartService
                                       .GetAllShoppingCartProducts(username)
                                       .ToList();

            if (shoppingCartProducts.Count == 0)
            {
                throw new ArgumentNullException(nameof(shoppingCartProducts));
            }

            var user     = this.userService.GetUserByUsername(username);
            var supplier = this.supplierService.GetSupplierById(orderServiceModel.SupplierId);

            Order order = orderServiceModel.To <Order>();

            foreach (var shoppingCartProduct in shoppingCartProducts)
            {
                order.OrderProducts.Add(new OrderProduct
                {
                    Order     = order,
                    ProductId = shoppingCartProduct.ProductId,
                    Price     = shoppingCartProduct.Product.Price,
                    Quantity  = shoppingCartProduct.Quantity
                });

                await this.productService.DecreaseQuantityInStock(shoppingCartProduct.ProductId,
                                                                  shoppingCartProduct.Quantity);
            }

            order.OrderProducts = shoppingCartProducts
                                  .Select(scp => new OrderProduct
            {
                Order     = order,
                ProductId = scp.ProductId,
                Price     = scp.Product.Price,
                Quantity  = scp.Quantity
            })
                                  .ToList();

            await this.shoppingCartService.RemoveAllProductFromShoppingCart(username);

            OrderStatus   orderStatus   = this.context.OrderStatuses.FirstOrDefault(x => x.Name == GlobalConstants.Unprocessed) ?? throw new ArgumentNullException(nameof(orderStatus));
            PaymentStatus paymentStatus = this.context.PaymentStatuses.FirstOrDefault(x => x.Name == GlobalConstants.Unpaid) ?? throw new ArgumentNullException(nameof(paymentStatus));

            order.DeliveryPrice        = deliveryPrice;
            order.OrderDate            = DateTime.UtcNow;
            order.UserId               = user.Id;
            order.OrderStatusId        = orderStatus.Id;
            order.PaymentStatusId      = paymentStatus.Id;
            order.TotalPrice           = order.OrderProducts.Sum(product => product.Price * product.Quantity);
            order.ExpectedDeliveryDate = DateTime.UtcNow.AddDays(supplier.DeliveryTimeInDays);

            this.context.Orders.Add(order);
            this.context.SaveChanges();

            return(order.To <OrderServiceModel>());
        }
示例#11
0
        public async Task <IActionResult> Order(ProductOrderInputModel productOrderInputModel)
        {
            OrderServiceModel orderServiceModel = productOrderInputModel.To <OrderServiceModel>();

            orderServiceModel.IssuerId = this.User.FindFirst(ClaimTypes.NameIdentifier).Value;

            await this.orderService.CreateOrder(orderServiceModel);

            return(this.Redirect("/"));
        }
示例#12
0
        public IActionResult Create(OrderCreateInputModel orderCreateInputModel)
        {
            string userId = this.User.FindFirst(ClaimTypes.NameIdentifier).Value;

            OrderServiceModel orderServiceModel = AutoMapper.Mapper.Map <OrderServiceModel>(orderCreateInputModel);

            this.orderService.Create(orderServiceModel, userId);

            return(Redirect("/Order/Details"));
        }
示例#13
0
        /// <summary>
        /// Verfiying and placing of Order object into the database
        /// </summary>
        /// <param name="order">Partially assembled Order object</param>
        /// <param name="customerId">Cutomer ID of customer placing order</param>
        /// <returns>Bool verifying Save, if false, save did not occur and Amount cannot be 0</returns>
        public bool PlaceOrder(Order order, int customerId)
        {
            Customer          customer = CustomerRepository.Load(customerId);
            OrderServiceModel result   = OrderVerification(order, customer);

            if (result.Result)
            {
                orderRepository.Save(result.Order);
            }
            return(result.Result);
        }
示例#14
0
        /// <summary>
        /// Add new Order to DB
        /// </summary>
        /// <param name="order"></param>
        /// <returns>new Orders's id</returns>
        public async Task <Guid> SaveAsync(OrderServiceModel order)
        {
            var repositoryOrder = new Order
            {
                Id         = order.Id,
                AddressId  = order.AddressId,
                CustomerId = order.CustomerId
            };

            return(await this.orderRepository.InsertAsync(repositoryOrder));
        }
示例#15
0
        public async Task <IActionResult> Order(ProductOrderInputModel inputModel)
        {
            OrderServiceModel orderServiceModel = inputModel.To <OrderServiceModel>();

            //orderServiceModel.IssuerId = this.User.Identity.Name;
            //note: това търси този, който го е създал, а не този, който купува!!!! ?????

            orderServiceModel.IssuerId = this.User.FindFirst(ClaimTypes.NameIdentifier).Value;
            await this.orderService.CreateOrder(orderServiceModel);


            return(this.Redirect("/Home/Index"));
        }
示例#16
0
        public async Task <bool> CreateOrder(OrderServiceModel orderServiceModel)
        {
            Order order = orderServiceModel.To <Order>();

            order.OrderStatus = await this.context.OrderStatuses.SingleOrDefaultAsync(orderStatus => orderStatus.Name == GlobalConstants.OrderStatusActive);

            order.CreatedOn = DateTime.UtcNow;

            this.context.Orders.Add(order);
            int result = await this.context.SaveChangesAsync();

            return(result > 0);
        }
示例#17
0
        public async Task <IActionResult> Order(string id)
        //TODO: add quantity in details view
        {
            var inputModel = new  OrderServiceModel();
            OrderServiceModel orderServiceModel = inputModel.To <OrderServiceModel>();

            orderServiceModel.IssuerId = await Task.Run(() => this.User.FindFirst(ClaimTypes.NameIdentifier).Value);

            orderServiceModel.ProductId = id;
            await this.ordersService.Create(orderServiceModel);

            return(this.RedirectToAction("Cart", "Orders"));
        }
示例#18
0
        public async Task <bool> Create(OrderServiceModel orderServiceModel)
        {
            Order order = new Order
            {
                Status     = OrderStatus.Active,
                DatePlaced = DateTime.UtcNow,
                Quantity   = orderServiceModel.Quantity
            };

            this.dbContext.Orders.Add(order);
            int result = await this.dbContext.SaveChangesAsync();

            return(result > 0);
        }
        public async Task Create_WithValidModel_ShouldWorkCorrectly()
        {
            // Arrange
            const int ticketsCount = 10;

            var context = new EventuresDbContext(new DbContextOptionsBuilder <EventuresDbContext>()
                                                 .UseInMemoryDatabase(Guid.NewGuid().ToString())
                                                 .Options);
            var ordersService = new OrdersService(context);

            var user = new EventuresUser
            {
                UserName = "******"
            };
            await context.Users.AddAsync(user);

            var eventModel = new EventuresEvent
            {
                Name         = "TestEvent",
                TotalTickets = ticketsCount
            };
            await context.Events.AddAsync(eventModel);

            await context.SaveChangesAsync();

            var model = new OrderServiceModel
            {
                OrderedOn    = DateTime.UtcNow,
                EventId      = eventModel.Id,
                TicketsCount = 2
            };

            // Act
            var result = await ordersService.Create(model, user.UserName);

            // Assert
            Assert.True(result);

            var remainingTickets = (await context.Events.SingleAsync()).TotalTickets;

            Assert.Equal(ticketsCount - model.TicketsCount, remainingTickets);

            var count = await context.Orders.CountAsync();

            Assert.Equal(1, count);

            var orderUserId = (await context.Orders.SingleAsync()).UserId;

            Assert.Equal(user.Id, orderUserId);
        }
示例#20
0
        public async Task <bool> CreateOrderAsync(OrderServiceModel orderServiceModel)
        {
            Order order = orderServiceModel.To <Order>();

            order.Status = await finalWebProjectDbContext.OrderStatuses
                           .SingleOrDefaultAsync(orderStatus => orderStatus.Name == "Active");

            order.IssuedOn = DateTime.UtcNow;

            this.finalWebProjectDbContext.Orders.Add(order);
            int result = await this.finalWebProjectDbContext.SaveChangesAsync();

            return(result > 0);
        }
示例#21
0
        public async Task <IActionResult> Order(ProductOrderInputModel productOrderInputModel)
        {
            var orderServiceModel = new OrderServiceModel
            {
                ProductId = productOrderInputModel.ProductId,
                Quantity  = productOrderInputModel.Quantity,
            };

            orderServiceModel.IssuerId = this.User.FindFirst(ClaimTypes.NameIdentifier).Value;

            await this.orderService.CreateOrder(orderServiceModel);

            return(this.Redirect("/"));
        }
        public OrderServiceModel GetOrderById(int orderId)
        {
            OrderServiceModel orderFromDb = this.context.Orders
                                            .Include(x => x.OrderProducts)
                                            .ThenInclude(x => x.Product.Images)
                                            .To <OrderServiceModel>()
                                            .SingleOrDefault(x => x.Id == orderId);

            if (orderFromDb == null)
            {
                throw new ArgumentNullException(nameof(orderFromDb));
            }

            return(orderFromDb);
        }
示例#23
0
        public async Task <bool> CreateOrder(OrderServiceModel orderServiceModel)
        {
            var order = orderServiceModel.To <Order>();

            order.Id     = Guid.NewGuid().ToString();
            order.Status = await this.context.OrderStatuses.FirstOrDefaultAsync(status => status.Name == "Active");

            order.IssuedOn = DateTime.UtcNow;

            await this.context.Orders.AddAsync(order);

            var result = await this.context.SaveChangesAsync();

            return(result > 0);
        }
示例#24
0
        public async Task CreateOrder_WithCorrectData_ShouldSuccessfullyCreateOrder()
        {
            string errorMessagePrefix = "OrderService Create() method does not work properly.";

            var context = ContextFactory.Initializer();

            await SeedData(context);

            this.orderService = new OrderService(context);

            OrderServiceModel testReceipt = new OrderServiceModel();

            bool actualResult = await this.orderService.CreateOrderAsync(testReceipt);

            Assert.True(actualResult, errorMessagePrefix);
        }
示例#25
0
        public async Task <IActionResult> Order(WineOrderInputModel wineOrderInputModel)
        {
            OrderServiceModel orderServiceModel = new OrderServiceModel
            {
                WineId   = wineOrderInputModel.WineId,
                Quantity = wineOrderInputModel.Quantity
            };


            orderServiceModel.IssuerId = this.User.FindFirst(ClaimTypes.NameIdentifier).Value;

            await this.ordersService.CreateOrder(orderServiceModel);


            return(Redirect("/Wines/All"));
        }
        public async Task Create_WithNotEnoughAvailableTickets_ShouldNotAddToDatabase()
        {
            // Arrange
            const int ticketsCount = 10;

            var context = new ApplicationDbContext(new DbContextOptionsBuilder <ApplicationDbContext>()
                                                   .UseInMemoryDatabase(Guid.NewGuid().ToString())
                                                   .Options);
            var ordersService = new OrdersService(context);

            var user = new EventuresUser
            {
                UserName = "******"
            };
            await context.Users.AddAsync(user);

            var eventModel = new Event
            {
                Name         = "TestEvent123",
                TotalTickets = ticketsCount
            };
            await context.Events.AddAsync(eventModel);

            await context.SaveChangesAsync();

            var model = new OrderServiceModel
            {
                OrderedOn    = DateTime.UtcNow,
                EventId      = eventModel.Id,
                TicketsCount = 20
            };

            // Act
            var result = await ordersService.Create(model, user.UserName);

            // Assert
            Assert.False(result);

            var remainingTickets = (await context.Events.SingleAsync()).TotalTickets;

            Assert.Equal(ticketsCount, remainingTickets);

            var count = await context.Orders.CountAsync();

            Assert.Equal(0, count);
        }
示例#27
0
        public async Task ReduceQuantity_WithExistentIdAndOneQuantity_ShouldNotReduceQuantity()
        {
            string errorMessagePrefix = "OrderService ReduceQuantity() method does not work properly.";

            var context = StopifyDbContextInMemoryFactory.InitializeContext();

            await SeedData(context);

            this.orderService = new OrderService(context);

            OrderServiceModel testOrder = context.Orders.First(order => order.Quantity == 1).To <OrderServiceModel>();

            await this.orderService.ReduceQuantity(testOrder.Id);

            int expectedQuantity = 1;
            int actualQuantity   = context.Orders.First(order => order.Id == testOrder.Id).Quantity;

            Assert.True(expectedQuantity == actualQuantity, errorMessagePrefix);
        }
示例#28
0
        public async Task <bool> InsertOrderAsync(OrderServiceModel order)
        {
            try
            {
                await _unitOfWork.BeginTransactionAsync();

                var products = await _unitOfWork.ProductRepository.GetAllAsyncWithTracking();

                var users = await _unitOfWork.UserRepository.GetAllAsyncWithNoTracking();

                var user = users.FirstOrDefault(x => x.Id == order.UserId);

                if (user == null)
                {
                    _validationDictionary.AddError("UserId", "შეყვანილი იუზერი არ არსებობს!");
                    return(false);
                }

                var newOrder = new OrderDTO {
                    UserId = order.UserId,
                };
                await _unitOfWork.OrderRepository.InsertAsync(newOrder);

                if (!await AddOrderProduct(order, products.ToList(), newOrder.Id))
                {
                    await _unitOfWork.RollbackAsync();

                    return(false);
                }

                await _unitOfWork.SaveChangesAsync();

                await _unitOfWork.CommitAsync();

                return(true);
            }
            catch (Exception)
            {
                await _unitOfWork.RollbackAsync();

                throw;
            }
        }
示例#29
0
        public async Task <string> CreateAsync(OrderServiceModel input)
        {
            var billingFrequency = input.ServiceFrequency == ServiceFrequency.Once ? BillingFrequency.Once : BillingFrequency.Monthly;

            var teamId = this.teamsService
                         .GetFreeTeams <TeamServiceModel>(input.AppointmentDate, input.AppointmentDate.AddHours(input.ServiceDuration), input.CityId, input.ServiceId, input.ServiceFrequency)
                         .OrderBy(t => this.GetTotalMonthJobsTime(input.ServiceId, input.AppointmentDate, t.Id))
                         .FirstOrDefault().Id;

            var order = new Order()
            {
                ServiceId        = input.ServiceId,
                Status           = OrderStatus.Pending,
                ClientId         = input.ClientId,
                AddresId         = input.AddressId,
                BillingFrequency = billingFrequency,
                ServiceFrequency = input.ServiceFrequency,
                TeamId           = teamId,
            };

            await this.ordersRepository.AddAsync(order);

            await this.ordersRepository.SaveChangesAsync();

            var appointment = await this.appointmentsService.CreateAsync(input.AppointmentDate, input.ServiceDuration, order.Id);

            order.AppointmetnId = appointment.Id;

            await this.jobsService.CreateAsync(order.Id, order.ServiceFrequency, appointment.StartDate, appointment.EndDate);

            if (!input.IsRecurrent || order.BillingFrequency == BillingFrequency.Once)
            {
                var jobsCount = this.ordersRepository.All()
                                .Where(o => o.Id == order.Id)
                                .SelectMany(o => o.Jobs)
                                .Where(j => j.JobStatus == JobStatus.InProgress)
                                .Count();
                await this.invoicesService.CreateAsync(order.Id, order.ClientId, order.ServiceId, order.ServiceFrequency, order.AddresId, jobsCount);
            }

            return(order.Id);
        }
示例#30
0
        public async Task Create(OrderServiceModel order)
        {
            var actionItem = await _actionItemRepository.Get(order.ActionItemId);

            if (actionItem == null)
            {
                throw new EntryNotFoundException($"The entry with id '{order.ActionItemId}' was not found");
            }

            var newOrder = new Order()
            {
                ActionItem = actionItem,
                Customer   = order.Customer,
                Tickets    = order.Tickets
            };

            _ordersRepository.Create(newOrder);

            await _ordersRepository.SaveChanges();
        }