/// <summary>
        /// Initializes the returns model.
        /// </summary>
        /// <param name="order">The order.</param>
        /// <param name="model">The model.</param>
        /// <returns>OrderReturns.</returns>
        private OrderReturns InitReturnsModel(Order order, OrderReturns model = null)
        {
            model = model ?? new OrderReturns();

            model.OrderId = order.OrderGroupId;
            var rmaLis =
                order.RmaRequests.SelectMany(r => r.RmaReturnItems).SelectMany(r => r.RmaLineItems).ToList();

            if (model.OrderReturnItems.Count == 0)
            {
                foreach (var ori in from li in order.OrderForms.SelectMany(of => of.LineItems)
                                    let item = _catalogClient.GetItem(li.CatalogItemId)
                                    let parentItem = _catalogClient.GetItem(li.ParentCatalogItemId)
                                    where item != null && rmaLis.All(r => r.LineItemId != li.LineItemId)
                                    select new OrderReturnItem(new LineItemModel(li, item, parentItem, order.BillingCurrency)))
                {
                    model.OrderReturnItems.Add(ori);
                }
            }
            else
            {
                foreach (var returnItem in model.OrderReturnItems)
                {
                    var li =
                        order.OrderForms.SelectMany(of => of.LineItems)
                             .First(l => l.LineItemId == returnItem.LineItemId);

                    //Filter already returned items
                    if (rmaLis.Any(r => r.LineItemId == li.LineItemId))
                    {
                        continue;
                    }

                    var item = _catalogClient.GetItem(li.CatalogItemId);
                    var parentItem = _catalogClient.GetItem(li.ParentCatalogItemId);
                    returnItem.LineItemModel = new LineItemModel(li, item, parentItem, order.BillingCurrency);
                }
            }

            //Fill return Reasons
            if (OrderReturns.ReturnReasons == null || OrderReturns.ReturnReasons.Count == 0)
            {
                OrderReturns.ReturnReasons = _settingsClient.GetSettings("ReturnReasons")
                                                            .Select(r => new SelectListItem
                                                            {
                                                                Value = r.ToString(),
                                                                Text = r.ToString()
                                                            }).ToList();
            }

            //Fill address book
            model.Addresses = UserHelper.GetAllCustomerAddresses()
                                        .Select(addr => new SelectListItem
                                        {
                                            Text = addr.ToString(),
                                            Value = addr.AddressId
                                        }).ToList();

            return model;
        }
        public ActionResult OrderReturn(OrderReturns model)
        {
            var order = _orderClient.GetCustomerOrder(UserHelper.CustomerSession.CustomerId, model.OrderId);

            if (order == null || String.IsNullOrEmpty(order.CustomerId))
            {
                throw new UnauthorizedAccessException();
            }

            InitReturnsModel(order, model);

            //Filter validation only for selected items
            var selectedReturnItems = new List<OrderReturnItem>();
            for (var i = 0; i < model.OrderReturnItems.Count; i++)
            {
                if (model.OrderReturnItems[i].IsSelected)
                {
                    selectedReturnItems.Add(model.OrderReturnItems[i]);
                    continue;
                }
                var i1 = i;
                foreach (var k in ModelState.Keys.Where(k => k.StartsWith(string.Format("OrderReturnItems[{0}]", i1))).ToArray())
                {
                    ModelState.Remove(k);
                }
            }

            //No items to return
            if (selectedReturnItems.Count == 0)
            {
                ModelState.AddModelError("", @"Select at least one item to return");
            }

            //If Validation passed create RmaReturns
            if (ModelState.IsValid)
            {
                var request = new RmaRequest
                {
                    Comment = model.Comment,
                    OrderId = model.OrderId,
                    Status = RmaRequestStatus.AwaitingStockReturn.ToString(),
                    ReturnFromAddressId = model.ReturnFromAddressId
                };
                request.AuthorizationCode = request.RmaRequestId;

                foreach (var item in selectedReturnItems)
                {
                    var rmali = new RmaLineItem
                    {
                        LineItemId = item.LineItemId,
                        LineItem = order.OrderForms.SelectMany(of => of.LineItems).Single(li => li.LineItemId == item.LineItemId),
                        ReturnQuantity = item.Quantity
                    };

                    var rmaritem = new RmaReturnItem
                    {
                        ItemState = RmaLineItemState.AwaitingReturn.ToString(),
                        ReturnReason = item.ReturnReason,
                        //ReturnAmount = item.LineItemModel.LineItem.ListPrice
                    };

                    rmaritem.RmaLineItems.Add(rmali);
                    request.RmaReturnItems.Add(rmaritem);
                }

                order.RmaRequests.Add(request);

                //Calculate return totals
                _orderService.ExecuteWorkflow("CalculateReturnTotalsWorkflow", order);
                //Save changes
                _orderClient.SaveChanges();

                return RedirectToAction("RmaReturns", new { orderId = model.OrderId });
            }

            return View(model);
        }