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); } }
public async Task <GetOrderDetailsResponse> Handle(GetOrderDetailsRequest request, CancellationToken cancellationToken = default) { try { var orderNumber = request.OrderNumber; var order = await _orderRepository.GetByOrderNumberAsync(orderNumber, cancellationToken); var requiredBinWidth = await _packageService.CalculateRequiredBinWidthByOrderAsync(order, cancellationToken); var productItemsFromRepository = await _productItemRepository.GetListByIdsAsync(order.OrderItems.Select(x => x.ProductId), cancellationToken); var productItems = new List <ProductItemDetailsResponse>(); foreach (var item in order.GetOrderItemsGroupedByProductId()) { var productItem = productItemsFromRepository.FirstOrDefault(x => x.Id == item.ProductId); var productNumber = productItem.ProductNumber; var width = productItem.ProductType.Width; var maxStackQuantity = productItem.ProductType.MaxStackQuantity; var type = productItem.ProductType.Type; var quantity = item.Quantity; productItems.Add(new ProductItemDetailsResponse(productNumber, width, maxStackQuantity, quantity, type)); } return(new GetOrderDetailsResponse(requiredBinWidth, orderNumber, productItems)); } catch (OrderNotFoundRepositoryException ex) { throw new EntityNotFoundServiceException($"Order {request.OrderNumber} not found"); } }