Ejemplo n.º 1
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);
            }
        }