public async void Handle_ShouldReturnCreatedOrder()
        {
            A.CallTo(() => _orderRepository.AddAsync(A <Order> ._)).Returns(new Order {
                CustomerFullName = "Bruce Wayne"
            });

            var result = await _testee.Handle(new CreateOrderCommand(), default);

            result.Should().BeOfType <Order>();
            result.CustomerFullName.Should().Be("Bruce Wayne");
        }
예제 #2
0
        public async Task TestAddAsync()
        {
            Guid id    = Guid.NewGuid();
            var  order = new Order(id)
            {
                Name = "Name", Code = "Code"
            };
            await _orderRepository.AddAsync(order);

            await _unitOfWork.CommitAsync();

            var result = await _orderRepository.SingleAsync(t => t.Id == id);

            Assert.Equal(id, result.Id);
        }
        public async Task <Unit> Handle(CreateNewOrderCommand request, CancellationToken cancellationToken)
        {
            var order = Order.Create(request.OrderName);
            await _orderRepository.AddAsync(order);

            return(Unit.Value);
        }
예제 #4
0
        public async Task AddOrderAsync(AddOrderRequest request)
        {
            var user = userRepository.GetById(request.UserId);

            if (user == null)
            {
                throw new Exception(ErrorMessage.UserNotFound);
            }

            var productsList = productRepository.GetProducts(request.Products.Select(p => p.ProductId));

            if (productsList == null ||
                productsList.Count() == 0 ||
                request.Products.Any(p => !productsList.Any(pl => pl.Id == p.ProductId)))
            {
                throw new Exception(ErrorMessage.ProductsNotFound);
            }

            var order = mapper.Map <Order>(request);

            order.CreationDate = DateTime.Now;

            foreach (var product in order.Products)
            {
                var actualProduct = productsList.First(p => p.Id == product.ProductId);
                product.UnityPrice = actualProduct.Price;
            }

            await orderRepository.AddAsync(order);
        }
예제 #5
0
        public async Task AddOrUpdateAsync(OrderDto order, bool isUpdate = false)
        {
            if (order == null)
            {
                throw new ArgumentNullException(nameof(order));
            }
            if (order.UserId <= 0)
            {
                throw new ArgumentNullException(nameof(order.UserId));
            }
            if (order.ProductItems == null)
            {
                throw new ArgumentNullException(nameof(order.ProductItems));
            }
            var domainOrder = _mapper.Map <OrderDto, Order>(order);
            Dictionary <int, int> productItems = new Dictionary <int, int>();

            foreach (var item in order.ProductItems)
            {
                productItems.Add(item.ProductId, item.Amount);
            }
            if (isUpdate)
            {
                await _orderRepository.UpdateAsync(domainOrder, productItems);

                return;
            }
            await _orderRepository.AddAsync(domainOrder, productItems);
        }
예제 #6
0
        public async Task <ReadOrderModel> AddOrderAsync(CreateOrderModel model, CancellationToken cancellationToken)
        {
            var order = _mapper.Map <Order>(model);

            order.IconId = await _fileService.AddOrUpdateFileByIdAsync(model.Icon, order.IconId, cancellationToken);

            foreach (var categoryId in model.CategoryIds)
            {
                var category = await _categoryRepository.GetByIdAsync(categoryId, cancellationToken);

                var orderCategory = new OrderCategory
                {
                    Order    = order,
                    Category = category
                };

                order.Categories.Add(orderCategory);
            }

            await _orderRepository.AddAsync(order, cancellationToken);

            await _unitOfWork.SaveChangesAsync(cancellationToken);

            return(_mapper.Map <ReadOrderModel>(order));
        }
예제 #7
0
        public async Task <CreateOrderResponse> Handle(CreateOrderRequest request, CancellationToken cancellationToken = default)
        {
            try
            {
                var orderNumber = request.OrderNumber;
                var productItemsFromRepository = await _productItemRepository
                                                 .GetListByProductNumberAsync(request.Items.Select(x => x.ItemNumber), cancellationToken);

                var orderItems = new List <OrderItem>();
                foreach (var item in request.Items)
                {
                    var productItem = productItemsFromRepository.FirstOrDefault(x => x.ProductNumber == item.ItemNumber);
                    orderItems.Add(new OrderItem(productItem.Id, item.Quantity));
                }

                var order = new Order(orderNumber, orderItems);

                await _orderRepository.AddAsync(order);

                var requiredBinWidth = await _packageService.CalculateRequiredBinWidthByOrderAsync(order, cancellationToken);

                return(new CreateOrderResponse(requiredBinWidth));
            }
            catch (OrderNumberAlreadyExistRepositoryException ex)
            {
                throw new OrderNumberAlreadyExistServiceException($"Order {request.OrderNumber} already exist.");
            }
            catch (ProductItemFoundRepositoryException ex)
            {
                throw new EntityNotFoundServiceException(ex.Message, ex);
            }
        }
예제 #8
0
        protected async Task <List <Order> > CreateSomeOrdersAsync(List <Customer> customers, List <Product> products)
        {
            var customerId = customers[1].Id;
            var productId1 = products[1].Id;
            var productId2 = products[2].Id;

            var orders = new List <Order>();

            for (var i = 0; i < 10; i++)
            {
                var orderItem1 = _orderFactory.CreateNewOrderItem(productId1, 56.92m, 40);
                var orderItem2 = _orderFactory.CreateNewOrderItem(productId2, 72.46m, 50);

                var orderItems = new List <OrderItem>
                {
                    orderItem1,
                    orderItem2,
                };

                var order = _orderFactory.CreateNewOrder(customerId, orderItems);

                await _orderRepository.AddAsync(order);
            }

            return(orders);
        }
예제 #9
0
        public async Task <GenericResponse <Order> > SaveAsync(int userId, IEnumerable <OrderItemResource> saveOrderItems)
        {
            var existingUser = await _userRepository.FindByIdAsync(userId);

            var items = await _shoppingCartService.GetItemsListAsync(saveOrderItems);

            if (items.Count == 0)
            {
                return(new GenericResponse <Order>("No items made"));
            }

            if (existingUser == null)
            {
                return(new GenericResponse <Order>("No user found"));
            }

            try
            {
                var order = new Order {
                    Created = DateTime.Now, Items = items
                };
                existingUser.Orders.Add(order);

                _userRepository.Update(existingUser);
                await _orderRepository.AddAsync(order);

                await _unitOfWork.CompleteAsync();

                return(new GenericResponse <Order>(order));
            }
            catch (Exception ex)
            {
                return(new GenericResponse <Order>($"An error occurred saving the order: {ex.Message}"));
            }
        }
예제 #10
0
        private async Task <Domain.Aggregates.OrderAggregate.Order> AddOrderRepository(PeriodType periodType, IEnumerable <int> dishes)
        {
            var order = new Domain.Aggregates.OrderAggregate.Order(periodType, dishes.ToString());
            await _orderRepository.AddAsync(order);

            return(order);
        }
예제 #11
0
        public async Task <IActionResult> Index([FromForm] Order order)
        {
            var userID = _userManager.GetUserId(User);
            var data   = new
            {
                status     = 1,
                siteID     = order.SiteID,
                productID  = order.ProductID,
                quantity   = order.Quantity,
                customerID = order.CustomerCID,
                message    = "",
            };

            if (ModelState.IsValid)
            {
                CustomResponse response = await _orderRepository.AddAsync(order);

                if (response.Status == 1)
                {
                    TempData["SuccessMessage"] = "Order placed successfylly.";
                    return(RedirectToAction(nameof(Index), new { status = 0, customerID = "" }));
                }
                TempData["ResponseMessage"] = response.Message;
                return(RedirectToAction(nameof(Index), data));
            }
            return(RedirectToAction(nameof(Index), data));
        }
예제 #12
0
        public async Task ProcessAsync(Order order, string baseUrl)
        {
            await orderRepository.AddAsync(order);

            await SendNewOrderEmailAsync(order, baseUrl);
            await SavePendingRatesAsync(order);
        }
예제 #13
0
        public async Task CreateOrder(OrderDto orderDto)
        {
            Order order = CreateOrderFromDto(orderDto);
            await _orderRepository.AddAsync(order);

            await Clients.Others.SendAsync(OrderReceived, order);
        }
        public async Task <OrderResponse> Handle(CheckoutOrderCommand request, CancellationToken cancellationToken)
        {
            // var orderEntity = OrderMapper.Mapper.Map<Order>(request);

            var orderEntity = new Order
            {
                AddressLine   = request.AddressLine,
                CVV           = request.CVV,
                CardName      = request.CardName,
                CardNumber    = request.CardNumber,
                Country       = request.Country,
                EmailAddress  = request.EmailAddress,
                Expiration    = request.Expiration,
                FirstName     = request.FirstName,
                LastName      = request.LastName,
                PaymentMethod = request.PaymentMethod,
                State         = request.State,
                TotalPrice    = request.TotalPrice,
                UserName      = request.UserName,
                ZipCode       = request.ZipCode
            };

            if (orderEntity == null)
            {
                throw new ApplicationException("Not Mapped");
            }

            var newOrder = await _orderRepository.AddAsync(orderEntity);

            var orderResponse = OrderMapper.Mapper.Map <OrderResponse>(newOrder);

            return(orderResponse);
        }
예제 #15
0
        public async Task InitializeAsync()
        {
            if (!_applicationOptions.Value.SeedData)
            {
                _logger.LogInformation("Data initialization skipped.");

                return;
            }

            _logger.LogInformation("Initializing data...");

            var customers = GetCustomers().ToList();
            var products  = GetProducts().ToList();

            foreach (var customer in customers)
            {
                await _customerRepository.AddAsync(customer);
            }

            foreach (var product in products)
            {
                await _productRepository.AddAsync(product);
            }

            var orders = GetOrders(customers, products).ToList();

            foreach (var order in orders)
            {
                await _orderRepository.AddAsync(order);
            }

            _logger.LogInformation("Data initialized.");
        }
        public async Task <IActionResult> CreateOrder([FromBody] SaveOrderResource orderResource)
        {
            if (!ModelState.IsValid)
            {
                return(BadRequest(ModelState));
            }

            // check whether current user sent a request
            var currentUser = await userRepository.GetCurrentUser();

            if (currentUser.Id != orderResource.IdentityId)
            {
                return(NotFound());
            }

            var order = await repository.GetAsync(orderResource.IdentityId, (int)orderResource.VehicleId);

            if (order != null)
            {
                return(BadRequest(ModelState.AddError("invalid_request", "Order is already done")));
            }

            order = mapper.Map <Order>(orderResource);

            await repository.AddAsync(order);

            await uow.CommitAsync();

            order = await repository.GetAsync(orderResource.IdentityId, (int)orderResource.VehicleId);

            var result = mapper.Map <PlainOrderResource>(order);

            return(Ok(result));
        }
예제 #17
0
        /// <summary>
        /// Creert een order uit het gegeven viewmodel
        /// </summary>
        /// <param name="dto">Viewmodel met de nodige data voor het aanmaken van een nieuw order</param>
        /// <returns>Nieuw aangemaakt order</returns>
        /// <exception cref="EntityNotFoundException">Wordt gegooid wanneer een persoon in het order of in een orderline niet gevonden werd.</exception>
        public async Task <Order> CreateOrder(CreateOrderDTO dto, string userEmail)
        {
            var orderedBy = await _leidingRepository.FindByEmailAsync(userEmail);

            if (orderedBy == null)
            {
                throw new EntityNotFoundException($"Besteller '{userEmail}' werd niet gevonden.");
            }

            var newOrder = Order.Create(orderedBy);

            await _orderRepository.AddAsync(newOrder);

            foreach (var lineModel in dto.Orderlines)
            {
                var drank = await _drankRepository.FindByIdAsync(lineModel.DrankId);

                if (drank == null)
                {
                    throw new EntityNotFoundException($"Drank met id {lineModel.DrankId} werd niet gevonden");
                }

                var orderedFor = await _leidingRepository.FindByIdAsync(lineModel.OrderedForId);

                if (orderedFor == null)
                {
                    throw new EntityNotFoundException($"Persoon met id {lineModel.OrderedForId} werd niet gevonden.");
                }

                var personCanOrder = orderedFor.Tak.TabIsAllowed;

                if (!personCanOrder)
                {
                    throw new InvalidOperationException($"Leden van {orderedFor.Tak.Naam} kunnen geen gebruik maken van de Poef.");
                }

                var orderline = Orderline.Create(drank, orderedFor, newOrder, lineModel.Quantity);


                await _orderlineRepository.AddAsync(orderline);

                //Create a transaction for the submitted order
                var amount = orderline.DrinkPrice * orderline.Quantity;
                amount = -amount;
                var transaction = new Transaction(amount, $"{orderline.Quantity}x {orderline.Drank.Naam}");

                var account = await _accountRepository.FindAccountAsync(orderedFor.Id, AccountType.Tab);

                if (account == null)
                {
                    account = await _accountService.CreateAccountAsync(orderedFor.Id);
                }

                account.AddTransaction(transaction);
            }

            await _orderRepository.SaveChangesAsync();

            return(newOrder);
        }
예제 #18
0
        public async Task <IServiceResult> CreateAsync(SavedOrderDto orderDto)
        {
            try
            {
                var order = _mapper.Map <SavedOrderDto, Order>(orderDto);

                await _repository.AddAsync(order);

                foreach (var orderItem in orderDto.OrderedItems)
                {
                    order.AddItem(orderItem.ProductId, orderItem.Quantity);
                    _logger.LogError($"Added product with id {orderItem.ProductId} to order with id {order.Id}.");
                }

                if (!await _unitOfWork.CompleteAsync())
                {
                    throw new SaveFailedException(nameof(order));
                }
                _logger.LogInformation($"Added new {nameof(order)} with id: {order.Id}.");

                var result = await GetSingleAsync(order.Id.ToString());

                return(new ServiceResult(payload: result.Payload));
            }
            catch (Exception e)
            {
                _logger.LogError($"Adding new order failed. {e.Message}");

                return(new ServiceResult(false, e.Message));
            }
        }
예제 #19
0
        public async Task <int> PlaceOrder(ShoppingCart carts, OrderVM order, string userEmail)
        {
            var orderToAdd = _mapper.Map <OrderVM, Order>(order);

            orderToAdd.PaymentStatus = false;
            orderToAdd.CreatedDate   = DateTime.Now;
            orderToAdd.CreatedBy     = "admin";
            orderToAdd.Status        = OrderStatus.Waiting;

            if (!string.IsNullOrEmpty(userEmail))
            {
                var user = _applicationUserRepository.GetUserByUserName(userEmail);
                orderToAdd.User = user;
            }

            if (!string.IsNullOrEmpty(carts.CartPromoCode))
            {
                var discount = await _discountRepository.GetDiscountByPromoCode(carts.CartPromoCode);

                orderToAdd.Discount = discount;
            }
            else
            {
                var discount = await _discountRepository.GetDiscountById(1);

                orderToAdd.Discount = discount;
            }

            await _orderRepository.AddAsync(orderToAdd);

            foreach (var item in carts.Cart)
            {
                var product = await _productRepository.GetSingleByIDAsync(item.Product.ProductId);

                if (product.AvailableQuantity >= item.Quantity)
                {
                    var orderDetail = new OrderDetail()
                    {
                        OrderId = orderToAdd.OrderId, ProductId = item.Product.ProductId, Quantity = item.Quantity
                    };
                    await _orderDetailRepository.AddAsync(orderDetail);

                    //Update product sold
                    var rank = await _productRankRepository.GetSingleByIDAsync(item.Product.ProductId);

                    rank.Sold += item.Quantity;
                    await _productRankRepository.UpdateAsync(rank);

                    product.AvailableQuantity -= item.Quantity;
                    await _productRepository.UpdateAsync(product);
                }
                else
                {
                    return(0);
                }
            }

            return(await _unitOfWork.SaveAsync());
        }
예제 #20
0
        public virtual async Task <ApiResult <Order> > CreateOrder(OrderDto orderDto, CancellationToken cancellationToken)
        {
            //var order = Mapper.Map<Order>(orderDto);
            var order = orderDto.ToEntity();
            await orderRepository.AddAsync(order, cancellationToken);

            return(order);
        }
        public async Task HandleAsync(AddClientOrder command)
        {
            var order = _mapper.Map <Order>(command.Order);

            order.OrderID = Guid.NewGuid();
            order.UserID  = Guid.Parse(command.User.FindFirst(ClaimTypes.NameIdentifier).Value);
            await _orderRepository.AddAsync(order);
        }
예제 #22
0
        /// <summary>
        /// Добавить заказ
        /// </summary>
        /// <param name="dto"></param>
        /// <returns></returns>
        public async Task <OrderDto> MakeOrderAsync(NewOrderDto dto)
        {
            var order = await _orderRepository.AddAsync(_mapper.Map <Order>(dto));

            await _orderRepository.SaveChangesAsync();

            return(_mapper.Map <OrderDto>(order));
        }
        public async Task HandleAsync(CreateOrder command)
        {
            var order = new Order(command.Id, command.CustomerId, OrderStatus.New, _dateTimeProvider.Now);
            await _orderRepository.AddAsync(order);

            var events = _eventMapper.MapAll(order.Events);
            await _messageBroker.PublishAsync(events.ToArray());
        }
예제 #24
0
        public async Task <IActionResult> Post([FromBody] AddShoppingCartModel model)
        {
            if (string.IsNullOrEmpty(model.UserID) ||
                Guid.Empty == model.ProductID || 0 >= model.Amount)
            {
                return(ResponseHelper.NotAcceptable());
            }
            var product = await _productRepository.GetAsync(model.ProductID);

            if (null == product)
            {
                return(NotFound());
            }

            List <ShipAddress> addressList = await _shipAddressRepository.GetAddressAsync(model.UserID, 50, 0);

            Order order = new Order()
            {
                Address     = addressList.Count > 0 ? addressList[0].ToString() + "(mobile)" : string.Empty + "(mobile)",
                OrderID     = Guid.NewGuid(),
                OrderDate   = DateTime.Now,
                OrderStatus = OrderStatus.PendingPayment,
                UserID      = model.UserID,
            };

            OrderDetail orderDetail = new OrderDetail()
            {
                OrderID        = order.OrderID,
                PlaceDate      = DateTime.Now,
                ProductName    = product.ProductName,
                ProductID      = product.ProductID,
                ThumbImagePath = product.ThumbnailImage,
                UnitPrice      = product.UnitPrice,
                Quantity       = model.Amount,
                SubTotal       = product.UnitPrice * model.Amount
            };

            order.TotalPrice = orderDetail.SubTotal;

            Guid orderID = await _orderRepository.AddAsync(order);

            // Add order failed.
            if (orderID == Guid.Empty)
            {
                return(ResponseHelper.InternalServerError());
            }

            int count = await _orderDetailRepository.AddAsync(orderDetail);

            if (0 < count)
            {
                return(Ok());
            }
            else
            {
                return(ResponseHelper.InternalServerError());
            }
        }
예제 #25
0
        public override async Task <Result> Handler(CreateOrder message)
        {
            var order = new Order(message.FirstName, message.LastName, message.Email, message.IsActive);
            await _OrderRepository.AddAsync(order);

            await _OrderRepository.SaveEntitiesAsync();

            return(new Result());
        }
        public async Task <int> Handle(CheckoutOrderCommand request, CancellationToken cancellationToken)
        {
            var orderEntity = _mapper.Map <Order>(request);
            var newOrder    = await _orderRepository.AddAsync(orderEntity);

            await SendEmail(newOrder);

            return(newOrder.Id);
        }
예제 #27
0
        public async Task <OrderDto> AddAsync(int userId, OrderDto dto)
        {
            var model    = OrderMapper.Map(dto);
            var newModel = await _orderRepository.AddAsync(userId, model);

            var result = OrderDtoMapper.Map(newModel);

            return(result);
        }
        /// <summary>
        /// 添加
        /// </summary>
        /// <param name="request"></param>
        /// <param name="cancellationToken"></param>
        /// <returns></returns>
        public async Task <Unit> Handle(CreateCommand request, CancellationToken cancellationToken)
        {
            var result = _mapper.Map <Core.Domain.Order>(request);
            await _orderRepository.AddAsync(result);

            await _orderRepository.UnitOfWork.SaveEntitiesAsync(cancellationToken);

            return(new Unit());
        }
        public async Task <OrderId> Handle(CreateOrderCommand request, CancellationToken cancellationToken)
        {
            IOrderRepository orderRepository = _orderDbContext.OrderRepository;

            Order order = Order.Create(request.AccountId, request.OrderItems);
            await orderRepository.AddAsync(order, cancellationToken);

            return(order.Id);
        }
예제 #30
0
        public async Task <OrderDto> Handle(CreateOrderCommand request, CancellationToken cancellationToken)
        {
            var orderDto = request.OrderDto;

            var details = await _detailsRepository.GetAsync(orderDto.ShippingDetailsId);

            if (details == null)
            {
                throw new NotValidException(nameof(orderDto.ShippingDetailsId),
                                            $"ShippingDetails with id ({orderDto.ShippingDetailsId}) doesn't exist");
            }

            var order = _mapper.Map <Order>(orderDto);

            order.OrderStatus = OrderStatus.Pending;
            order.DateOrdered = DateTime.UtcNow;

            foreach (var orderItem in order.OrderItems)
            {
                var product = await _productRepository.GetAsync(orderItem.ProductId);

                if (product == null || product.SoftDeleted)
                {
                    throw new NotValidException(nameof(orderItem.ProductId),
                                                $"Product with id ({orderItem.ProductId}) does not exist");
                }

                if (!product.IsAvailable)
                {
                    throw new NotValidException(nameof(orderItem),
                                                $"Product with id ({orderItem.ProductId}) is not available");
                }

                if (product.PromotionEndDate < DateTime.UtcNow && product.PromotionPrice.HasValue)
                {
                    orderItem.PricePerUnit = product.PromotionPrice.Value;
                }
                else
                {
                    orderItem.PricePerUnit = product.Price;
                }
            }

            if (order.TotalSum < 1)
            {
                throw new NotValidException(nameof(Order.TotalSum), "Order total sum should be greater than 1");
            }

            await _orderRepository.AddAsync(order);

            await _orderRepository.UnitOfWork.SaveChangesAsync();

            var result = _mapper.Map <OrderDto>(order);

            return(result);
        }