예제 #1
0
        public void PlaceOrder(int userId)
        {
            var balance = _userRepository.GetBalance(userId);

            var cartItems = _cartRepository.GetCartItems(userId);

            var totalAmount = cartItems.Sum(x => x.Price * x.Quantity);

            balance = balance - totalAmount;

            if (balance < 0)
            {
                throw new BgsException((int)WebApiErrorCodes.NotEnoughBalance);
            }

            using (var transaction = new BgsTransactionScope())
            {
                _userRepository.UpdateBalance(userId, balance);

                foreach (var item in cartItems)
                {
                    var blocked = (int)_productRepository.GetBlockedProductQuantity(item.ProductId);
                    _productRepository.UpdateBlockedProductQuantity(item.ProductId, blocked - item.Quantity);

                    var stock = _productRepository.GetProductStock(item.ProductId) ?? 0;

                    if ((stock - item.Quantity) < 0)
                    {
                        throw new BgsException((int)WebApiErrorCodes.OutOfStock);
                    }


                    _productRepository.UpdateProductStock(item.ProductId, stock - item.Quantity);
                }

                _transactionRepository.AddTransaction((int)TransactionType.Payment, userId, DateTime.Now, totalAmount);

                _cartRepository.DeleteCartItems(userId);

                var orderId = _orderRepository.AddOrder(userId, (int)OrderStatus.Pending, totalAmount, DateTime.Now, DateTime.Now);

                foreach (var item in cartItems)
                {
                    var amount = item.Price * item.Quantity;
                    _orderRepository.AddOrderItem(orderId, item.ProductId, item.Quantity, item.Price, amount);
                }

                transaction.Complete();
            }
        }
예제 #2
0
        public void CompleteOrder(CreateOrderViewModel viewModel, string userId)
        {
            var validatedOrderedItemList = _productService.ValidateStockAmounts(viewModel.OrderedItemList);

            double?totalPrice = GetOrderTotalPrice(validatedOrderedItemList, viewModel.PaymentMethod.Id, viewModel.DeliveryType.Id);

            var order = new Order
            {
                Name            = viewModel.UserContactDetails.Name,
                Surname         = viewModel.UserContactDetails.Surname,
                Email           = viewModel.UserContactDetails.Email,
                Address         = viewModel.UserContactDetails.Address,
                PostalCode      = viewModel.UserContactDetails.PostalCode,
                City            = viewModel.UserContactDetails.City,
                OrderDate       = DateTime.Now,
                CustomerId      = userId,
                PaymentMethodId = viewModel.PaymentMethod.Id,
                DeliveryTypeId  = viewModel.DeliveryType.Id,
                TotalPrice      = totalPrice,
            };

            order.Status = OrderStatus.Pending;

            _orderRepository.Add(order);
            _orderRepository.SaveChanges();

            foreach (var item in validatedOrderedItemList)
            {
                var orderItem = new OrderItem
                {
                    OrderId   = order.Id,
                    ProductId = item.Product.Id,
                    Quantity  = item.Quantity,
                    Price     = item.Product.Price,
                };
                _orderRepository.AddOrderItem(orderItem);
                _productService.RemoveFromStock(orderItem.ProductId, orderItem.Quantity);
            }

            _orderRepository.SaveChanges();
            SendEmailWithOrderStatus(order.Id);
        }
예제 #3
0
        public async Task <bool> Handle(AddOrderItemCommand request, CancellationToken cancellationToken)
        {
            if (!CheckCommand(request))
            {
                return(false);
            }

            var order = await _orderRepository.GetDraftOrderByClientId(request.ClientId);

            var orderItem = new OrderItem(request.ProductId, request.Name, request.Quantity, request.Value);

            if (order == null)
            {
                order = Order.OrderFactory.NewOrderDraft(request.ClientId);
                order.AddOrderItem(orderItem);

                _orderRepository.Add(order);
                order.AddEvent(new DraftOrderInitialEvent(request.ClientId, request.ProductId));
            }
            else
            {
                var existentOrderItem = order.OrderItemExistent(orderItem);
                order.AddOrderItem(orderItem);

                if (existentOrderItem)
                {
                    _orderRepository.UpdateOrderItem(order.OrderItems.FirstOrDefault(p => p.ProductId == orderItem.ProductId));
                }
                else
                {
                    _orderRepository.AddOrderItem(orderItem);
                }

                order.AddEvent(new OrderUpdatedEvent(order.ClientId, order.Id, order.TotalValue));
            }

            order.AddEvent(new OrderItemAddedEvent(order.ClientId, order.Id, request.ProductId, request.Value, request.Quantity));
            return(await _orderRepository.UnitOfWork.Commit());
        }
예제 #4
0
        public async Task <bool> Handle(AddOrderItemCommand message, CancellationToken cancellationToken)
        {
            if (!ValidateCommand(message))
            {
                return(false);
            }

            var order = await _orderRepository.GetDraftOrderByClientId(message.ClientId);

            var orderItem = new OrderItem(message.ProductId, message.Name, message.Quantity, message.UnitValue);

            if (order == null)
            {
                order = Order.OrderFactory.NewOrderDraft(message.ClientId);
                order.AddItem(orderItem);

                _orderRepository.AddOrder(order);
                order.AddEvent(new OrderDraftStartedEvent(message.ClientId, message.ProductId));
            }
            else
            {
                var orderItemExistent = order.OrderItemExist(orderItem);
                order.AddItem(orderItem);

                if (orderItemExistent)
                {
                    _orderRepository.UpdateOrderItem(order.OrderItem.FirstOrDefault(p => p.ProductId == orderItem.ProductId));
                }
                else
                {
                    _orderRepository.AddOrderItem(orderItem);
                }

                order.AddEvent(new OrderUpdatedEvent(order.ClientId, order.Id, order.TotalPrice));
            }
            order.AddEvent(new OrderItemAddedEvent(order.ClientId, order.Id, message.ProductId, message.Name, message.UnitValue, message.Quantity));
            return(await _orderRepository.UnitOfWork.Commit());
        }
예제 #5
0
        public async Task <bool> Handle(AddOrderItemCommand message, CancellationToken cancellationToken)
        {
            if (!await IsCommandValid(message, cancellationToken))
            {
                return(false);
            }

            var order = await _orderRepository.GetDraftOrderByClientId(message.ClientId);

            var item = new Item(message.ItemId, message.ItemName, message.ItemQuantity, message.ItemValue);

            if (order == null)
            {
                order = Order.OrderFactory.NewDraftOrder(message.ClientId);
                order.AddItem(item);
                _orderRepository.Add(order);
            }
            else
            {
                var existingItem = order.ItemExists(item);
                order.AddItem(item);

                if (existingItem)
                {
                    _orderRepository.UpdateOrderItem(order.Items.FirstOrDefault(i => i.Id == item.Id));
                }
                else
                {
                    _orderRepository.AddOrderItem(item);
                }
                _orderRepository.UpdateOrder(order);
            }

            order.AddEvent(new OrderItemAddedEvent(order.ClientId, order.Id, message.ItemId, message.ItemName, message.ItemQuantity, message.ItemValue));
            return(await _orderRepository.UnitOfWork.Commit());
        }
 private void PersistOrderItemAdded(Order draftOrder, Guid productId)
 {
     _orderRepository.AddOrderItem(draftOrder.GetOrderItemByProductId(productId));
 }