private async Task <bool> AddToInventory(Order order, UpdateOrderStatus updateOrderStatus)
        {
            if (updateOrderStatus.OrderStatus != OrderStatus.Draft.ToString())
            {
                return(true);
            }
            var date = TimeZoneInfo.ConvertTimeBySystemTimeZoneId(DateTime.UtcNow, "Pacific Standard Time");

            foreach (var item in order.OrderDetail)
            {
                var productInventory = await _context.ProductInventory.FirstOrDefaultAsync(m =>
                                                                                           m.ProductId == item.ProductId &&
                                                                                           m.LocationId == order.LocationId);

                if (productInventory != null)
                {
                    productInventory.Balance      = productInventory.Balance + item.Amount;
                    productInventory.ModifiedDate = date;
                }
            }
            return(true);
        }
        public async Task <IActionResult> PutOrder([FromRoute] int id, [FromBody] UpdateOrderStatus updateOrderStatus)
        {
            if (!ModelState.IsValid)
            {
                return(BadRequest(ModelState));
            }

            if (updateOrderStatus == null || string.IsNullOrEmpty(updateOrderStatus.OrderStatus))
            {
                return(BadRequest());
            }
            var date  = TimeZoneInfo.ConvertTimeBySystemTimeZoneId(DateTime.UtcNow, "Pacific Standard Time");
            var order = await _context.Order.SingleOrDefaultAsync(m => m.OrderId == id);

            if (updateOrderStatus.OrderStatus.Equals(OrderStatus.Paid.ToString(), StringComparison.InvariantCultureIgnoreCase))
            {
                System.Security.Claims.ClaimsPrincipal currentUser = this.User;
                var userId = _userManager.GetUserId(User);
                order.OrderPayment.Add(
                    new OrderPayment
                {
                    CreatedByUserId = userId,
                    CreatedDate     = date,
                    PaymentAmount   = order.Total,
                    PaymentDate     = date,
                    PaymentTypeId   = updateOrderStatus.PaymentTypeId
                }
                    );
            }

            // When order is marked as Draft from OnHold we should add them to inventory
            if (updateOrderStatus.OrderStatus == OrderStatus.Draft.ToString() &&
                order.Status == OrderStatus.OnHold.ToString())
            {
                var done = await AddToInventory(order, updateOrderStatus);
            }
            else
            {
                var done = await UpdateInventory(order);
            }

            order.Status = updateOrderStatus.OrderStatus;

            try
            {
                await _context.SaveChangesAsync();
            }
            catch (DbUpdateConcurrencyException)
            {
                if (!OrderExists(id))
                {
                    return(NotFound());
                }
                else
                {
                    throw;
                }
            }

            return(Ok(order));
        }