/// <summary>
        /// Create the model
        /// </summary>
        /// <param name="ps">portfolio service</param>
        /// <param name="sr"></param>
        /// <param name="nextState"></param>
        /// <param name="userId"></param>
        /// <param name="serviceRequestId"></param>
        /// <returns></returns>
        public static ServiceRequestStateChangeModel CreateStateChangeModel(IPortfolioService ps, IServiceRequestController sr,
                                                                            ServiceRequestState nextState, int userId, int serviceRequestId)
        {
            var model = new ServiceRequestStateChangeModel
            {
                NextState           = nextState,
                ServiceRequestModel = new ServiceRequestModel(),
                ConfirmNextState    = true
            };

            return(AddModelData(model, ps, sr, userId, serviceRequestId));
        }
        /// <summary>
        /// Show a single SR summary with all available next actions
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        public ActionResult ShowServiceRequest(int id)
        {
            ServiceRequestStateChangeModel model = ServiceRequestSummaryHelper.CreateStateChangeModel(_portfolioService, UserId, _serviceRequestController, id);

            if (model.ServiceRequestModel == null)
            {
                return(View("ConfirmServiceRequestStateChange", model));
            }

            //check for an sr approval
            IApprovalController approvalController = new ApprovalController();

            try
            {
                model.ServiceRequestModel.Approval = approvalController.GetApprovalForServiceRequest(UserId, id);
            }
            catch (Exception) { }
            //resolve display names to Guids
            //requestees
            if (model.ServiceRequestModel.ServiceRequest.RequestedForGuids != null)
            {
                List <string> displayNames = new List <string>();
                foreach (var userGuidstring in model.ServiceRequestModel.ServiceRequest.RequestedForGuids.Split(','))
                {
                    if (userGuidstring != "")                       //get names from ad
                    {
                        try
                        {
                            displayNames.Add(_userManager.GetDisplayName(Guid.Parse(userGuidstring)));
                        }
                        catch (Exception)
                        {
                            displayNames.Add("Name not found");
                        }
                    }
                }
                model.ServiceRequestModel.RequesteeDisplayNames = displayNames.OrderBy(x => x);
            }
            //requestor
            try
            {
                model.ServiceRequestModel.RequestorDisplayName = _userManager.GetDisplayName(_userManager.GetUser(UserId, model.ServiceRequestModel.Requestor).AdGuid);
            }
            catch (Exception)
            {
                model.ServiceRequestModel.RequestorDisplayName = "Name not found";
            }
            // business logic
            model.CanEditServiceRequest = _requestManager.UserCanEditRequest(UserId, model.ServiceRequestModel.ServiceRequest.Id);
            model.CanEditServiceRequest = _requestManager.UserCanEditRequest(UserId, model.ServiceRequestModel.ServiceRequest.Id);
            model.AvailableStates       = _requestManager.ValidStates(UserId, id);
            return(View("ConfirmServiceRequestStateChange", model));
        }
        /// <summary>
        /// Data to show a state change of SR
        /// </summary>
        /// <param name="ps"></param>
        /// <param name="userId"></param>
        /// <param name="sr"></param>
        /// <param name="serviceRequestId"></param>
        /// <returns></returns>
        public static ServiceRequestStateChangeModel CreateStateChangeModel(IPortfolioService ps, int userId, IServiceRequestController sr,
                                                                            int serviceRequestId)
        {
            var model = new ServiceRequestStateChangeModel
            {
                ServiceRequestModel = new ServiceRequestModel(),
                ConfirmNextState    = false
            };

            model.ServiceRequestModel.ServiceRequest = sr.GetServiceRequest(userId, serviceRequestId);

            List <DisplayListOption> displayList = new List <DisplayListOption>();

            foreach (var serviceRequestOption in model.ServiceRequestModel.ServiceRequest.ServiceRequestOptions)                //add the option name
            {
                var listOption = new DisplayListOption
                {
                    ServiceRequestOption = serviceRequestOption,
                    UserInputs           = new List <DisplayListUserInput>(),
                    ServiceOption        = ps.GetServiceOption(userId, serviceRequestOption.ServiceOptionId)
                };

                var userInputs = ps.GetInputsForServiceOptions(userId,
                                                               new IServiceOptionDto[1] {
                    new ServiceOptionDto {
                        Id = serviceRequestOption.ServiceOptionId
                    }
                });                                                                                                                      //get user inputs
                if (userInputs != null)
                {
                    foreach (var userData in model.ServiceRequestModel.ServiceRequest.ServiceRequestUserInputs)
                    {
                        if (userData.UserInputType == UserInputType.Text)
                        {
                            foreach (var userInput in userInputs.TextInputs)
                            {
                                if (userInput.Id == userData.InputId)
                                {
                                    var displayUserInput = new DisplayListUserInput {
                                        DisplayName = userInput.DisplayName
                                    };
                                    displayUserInput.ServiceRequestUserInput = userData;
                                    listOption.UserInputs.Add(displayUserInput);
                                }
                            }
                        }
                        else if (userData.UserInputType == UserInputType.Selection)
                        {
                            foreach (var userInput in userInputs.SelectionInputs)
                            {
                                if (userInput.Id == userData.InputId)
                                {
                                    var displayUserInput = new DisplayListUserInput {
                                        DisplayName = userInput.DisplayName
                                    };
                                    displayUserInput.ServiceRequestUserInput = userData;
                                    listOption.UserInputs.Add(displayUserInput);
                                }
                            }
                        }
                        else if (userData.UserInputType == UserInputType.ScriptedSelection)
                        {
                            foreach (var userInput in userInputs.ScriptedSelectionInputs)
                            {
                                if (userInput.Id == userData.InputId)
                                {
                                    var displayUserInput = new DisplayListUserInput {
                                        DisplayName = userInput.DisplayName
                                    };
                                    displayUserInput.ServiceRequestUserInput = userData;
                                    listOption.UserInputs.Add(displayUserInput);
                                }
                            }
                        }
                    }
                    displayList.Add(listOption);
                }
            }
            model.DisplayList = displayList;
            return(model);
        }