public async Task <Dal.Entities.Delivery> UpdateDelivery(Dal.Entities.Delivery delivery)
        {
            var currentDelivery = await GetDeliveryById(delivery.Id);

            if (currentDelivery.DeliveryStatus != DeliveryStatus.Pending)
            {
                throw new ServiceException(new ErrorMessage[]
                {
                    new ErrorMessage()
                    {
                        Message = "Unable update the delivery"
                    }
                });
            }

            var mapper = ServiceMapper.GetMapper();

            mapper.Map(delivery, currentDelivery);

            currentDelivery.DeliveryDate = delivery.DeliveryDate.Date;
            currentDelivery.Updated      = DateTimeOffset.UtcNow;

            await _unitOfWork.SaveChanges();

            return(currentDelivery);
        }
        public async Task <Dal.Entities.Delivery> CreateDelivery(Dal.Entities.Delivery delivery)
        {
            delivery.DeliveryStatus = DeliveryStatus.Pending;
            delivery.Created        = DateTimeOffset.UtcNow;
            delivery.DeliveryDate   = delivery.DeliveryDate.Date;
            _unitOfWork.DeliveryRepository.Insert(delivery);
            await _unitOfWork.SaveChanges();

            return(delivery);
        }
        public async Task <Dal.Entities.Delivery> MapDeliveryProduct(Dal.Entities.Delivery delivery)
        {
            var currentDelivery = await GetDeliveryById(delivery.Id);

            var updatedDeliveryTrackingItems =
                delivery.DeliveryTrackings.SelectMany(t => t.DeliveryTrackingItems).ToList();

            foreach (var currentDeliveryDeliveryItem in currentDelivery.DeliveryItems)
            {
                if (currentDeliveryDeliveryItem.Quantity !=
                    updatedDeliveryTrackingItems.Where(i => i.ProductId == currentDeliveryDeliveryItem.ProductId)
                    .Sum(i => i.Quantity))
                {
                    var product = await _productService.GetProductById(currentDeliveryDeliveryItem.ProductId);

                    throw new ServiceException(new ErrorMessage[]
                    {
                        new ErrorMessage()
                        {
                            Message = $"{product.Name} quantity is invalid for mapping products to tracking numbers"
                        }
                    });
                }
            }

            currentDelivery.DeliveryTrackings.SelectMany(t => t.DeliveryTrackingItems).ToList()
            .ForEach(deliveryTrackingItem =>
            {
                var updatedDeliveryTrackingItem =
                    updatedDeliveryTrackingItems.FirstOrDefault(i => i.Id == deliveryTrackingItem.Id);

                if (updatedDeliveryTrackingItem != null)
                {
                    deliveryTrackingItem.Quantity = updatedDeliveryTrackingItem.Quantity;
                }
            });

            await _unitOfWork.SaveChanges();

            return(currentDelivery);
        }