private void RecallOrderItem(RecallRequestViewModel request, OrderDetail orderDetail, Order order)
        {
            var orderItemprice = orderDetail.Price ?? 0;

            var singleItemPrice = orderItemprice / orderDetail.Quantiy.Value;

            orderDetail.Quantiy -= request.quantity;

            var newOrderItemPrice = orderDetail.Quantiy * singleItemPrice;

            var priceDiff = orderDetail.Price - newOrderItemPrice;

            orderDetail.Price = newOrderItemPrice;

            var discountedPriceToRemove = orderDetail.Discount > 0
                ? ApplyDiscountAmount(orderDetail.Discount.Value, priceDiff.Value)
                : priceDiff;

            order.Total        -= discountedPriceToRemove;
            order.ModifiedOnUtc = DateTime.Now;

            order.Remark      = "One or more item was recalled.";
            order.OrderStatus = (int)OrderStatus.RECALL;

            var currentUserId = User.Identity.GetUserId <int>();

            order.ModifiedBy_Id       = currentUserId;
            orderDetail.ModifiedBy_Id = currentUserId;
            order.ModifiedOnUtc       = DateTime.Now;
            orderDetail.ModifiedOnUtc = DateTime.Now;
            if (orderDetail.Quantiy <= 0)
            {
                orderDetail.Discount = 0;
            }
        }
        public HttpResponseMessage RecallOrder(RecallRequestViewModel request)
        {
            var response = new ApiResultViewModel <OrderDetailViewModel>();

            try
            {
                if (request == null || Guid.Empty.Equals(request.itemId))
                {
                    response.errorStatus  = true;
                    response.errorMessage = "Invalid request. Please confirm and try again.";
                    return(Request.CreateResponse(response));
                }

                if (request.quantity <= 0 & request.price <= 0)
                {
                    response.errorStatus  = true;
                    response.errorMessage = "Please enter a valid quantity and price to complete recall action.";
                    return(Request.CreateResponse(response));
                }

                var orderDetail = _orderDetailSvc.GetOrderDetailByUId(request.itemId);

                if (orderDetail == null)
                {
                    response.errorStatus  = true;
                    response.errorMessage = "Transaction record not found.";
                    return(Request.CreateResponse(response));
                }

                if (request.quantity > orderDetail.Quantiy)
                {
                    response.errorStatus  = true;
                    response.errorMessage = String.Format("Stock quantity supplied cannot exceed {0}.", orderDetail.Quantiy);
                    return(Request.CreateResponse(response));
                }

                if (request.price > orderDetail.Price)
                {
                    response.errorStatus  = true;
                    response.errorMessage = String.Format("Stock price supplied cannot exceed N {0}.", orderDetail.Price);
                    return(Request.CreateResponse(response));
                }

                //var order = _orderSvc.GetOrderByUId(orderDetail.Order_UId);

                //if ((orderDetail == null || orderDetail.IsDeleted) || (order == null || order.IsDeleted))
                //{
                //    response.errorStatus = true;
                //    response.errorMessage = "Order not found.";
                //    return Request.CreateResponse(response);
                //}

                //if (orderDetail.Quantiy < request.quantity)
                //{
                //    response.errorStatus = true;
                //    response.errorMessage = "Quantity exceeds Order item quantity.";
                //    return Request.CreateResponse(response);
                //}

                //RecallOrderItem(request, orderDetail, order);

                var stockRecalled = _productSvc.GetProductById(orderDetail.Product_Id.Value);

                OrderDetail newOrderDt = new OrderDetail();
                newOrderDt.OrderDetailUId = Guid.NewGuid();

                Order newOrder = new Order();
                newOrder.OrderUId      = Guid.NewGuid();
                newOrder.EntryDate     = DateTime.Now;
                newOrder.OrderStatus   = (Int32)OrderStatus.RECALL;
                newOrder.Total         = (request.quantity * -request.price);
                newOrder.User_Id       = IposMembershipService.GetUserId(User.Identity.Name);
                newOrder.IsDiscounted  = request.price < orderDetail.Price ? true : false;
                newOrder.CreatedBy_Id  = User.Identity.GetUserId <Int32>();
                newOrder.PaymentMethod = (Int32)PaymentMethod.CASH;

                newOrderDt.EntryDate    = newOrder.EntryDate;
                newOrderDt.Order_UId    = newOrder.OrderUId;
                newOrderDt.Price        = -request.price;
                newOrderDt.Product_Id   = orderDetail.Product_Id;
                newOrderDt.CostPrice    = orderDetail.CostPrice;
                newOrderDt.CreatedBy_Id = User.Identity.GetUserId <int>();
                newOrderDt.Discount     = 0; //(Double?)(orderDetail.Price - request.price);
                newOrderDt.Quantiy      = orderDetail.Quantiy;

                stockRecalled.Quantity += request.quantity;

                newOrder.Remark = String.Format("Recall of {0} price was update to {1} and quantity to {2} reason being {0}"
                                                , stockRecalled.Name + " " + stockRecalled.Description, request.price, stockRecalled.Quantity, request.comment);

                using (var uow = _orderDetailSvc.UnitOfWork)
                {
                    _productSvc.Update(stockRecalled);
                    _orderSvc.Add(newOrder);
                    _orderDetailSvc.Add(newOrderDt);
                    uow.SaveChanges();
                }

                //response.result = Mapper.Map<OrderDetailViewModel>(orderDetail);
                response.message = "Recall action on stock item was successful.";
            }
            catch (Exception e)
            {
                _logger.Log(e);
#if DEBUG
                response.errorMessage = e.Message;
                response.errorStatus  = true;
#else
                response.errorMessage = "Error occured, please contact admin.";
                response.errorStatus  = true;
#endif
            }
            return(Request.CreateResponse(response));
        }