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); } }