/// <summary>
        /// Get the list of business applications and roles by each business applications
        /// </summary>
        /// <returns></returns>
        public static PaginatedList<PermissionGridModel> GetPermissionListByUser(ParameterSearchPermission parameters)
        {
            PaginatedList<PermissionGridModel> result = new PaginatedList<PermissionGridModel>();
            List<PermissionGridModel> tempResult = new List<PermissionGridModel>();
            PermissionGridModel itemGrid = null;
            string rolesObtaines = string.Empty;
            string prefix = "_";
            int currentIndex = (parameters.SelectedPage - 1) * parameters.PageSize;
            List<Guid?> businessAppAdminLocal = null;
            using (VestalisEntities context = new VestalisEntities())
            {
                string[] rolesForUser = Roles.GetRolesForUser(parameters.LoginName);
                if (!parameters.IsGlobalAdmin)
                    businessAppAdminLocal = GetBusinessAppLocalAdminLogged(parameters.LoggedUserName,context).Select(data => data.BusinessApplicationId).Cast<Guid?>().ToList();
                List<VestalisUserApplication> businessAppListByUser = null;

                if (parameters.IsGlobalAdmin)
                {
                    businessAppListByUser = (from userApp in context.VestalisUserApplications.Include("BusinessApplication")
                                             where userApp.IsDeleted == false && userApp.UserName == parameters.LoginName
                                             select userApp).Distinct().ToList();
                }
                else
                {
                    businessAppListByUser = (from userApp in context.VestalisUserApplications.Include("BusinessApplication")
                                             where userApp.IsDeleted == false && userApp.UserName == parameters.LoginName
                                             && businessAppAdminLocal.Contains(userApp.BusinessApplicationId)
                                             select userApp).Distinct().ToList();
                }

                if (businessAppListByUser != null)
                {
                    foreach (var item in businessAppListByUser)
                    {

                        prefix += context.BusinessApplications.FirstOrDefault(data => data.BusinessApplicationId == item.BusinessApplicationId.Value).Prefix;

                        var rolesByBusinessApp = (from role in context.aspnet_Roles
                                                  where role.RoleName.Contains(prefix)
                                                  select role.RoleName).ToList();

                        if (rolesByBusinessApp != null)
                        {

                            var finalRoles = rolesByBusinessApp.Where(data => rolesForUser.Contains(data)).ToList();
                            if (finalRoles.Count > 0)
                            {
                                if (rolesForUser.Contains("ApplicationAdministrator" + prefix))
                                {
                                    rolesObtaines += LanguageResource.ApplicationAdministrator;
                                    finalRoles.Remove("ApplicationAdministrator" + prefix);
                                }
                                foreach (var role in finalRoles)
                                {
                                    rolesObtaines += ", " + role.Replace(prefix, "");
                                }
                                if (rolesObtaines.First() == ',')
                                {
                                    rolesObtaines = rolesObtaines.Remove(0, 2);
                                }
                            }
                            else if (finalRoles.Count == 0 && rolesForUser.Count() > 0)
                            {
                                foreach (var role in rolesForUser)
                                {
                                    if (role == "Client")
                                    {
                                        Guid? businessAppId = GetClientIdByBusinnessApplication(item.BusinessApplication.BusinessApplicationId, parameters.LoginName);
                                        string clientName = CatalogueBusiness.GetCatalogueValue(businessAppId.GetValueOrDefault()).CatalogueValueData;
                                        rolesObtaines += string.Format("{0} ({1})", role, clientName);
                                    }
                                    else
                                        rolesObtaines += role;
                                }
                            }
                            itemGrid = new PermissionGridModel
                            {
                                BusinessApplication = item.BusinessApplication.BusinessApplicationName,
                                BusinessApplictionId = item.BusinessApplication.BusinessApplicationId,
                                Roles = rolesObtaines,
                            };
                            tempResult.Add(itemGrid);
                            rolesObtaines = string.Empty;
                            prefix = "_";
                        }
                    }
                }

                if (tempResult.Count > 0)
                {

                    result.SortDirection = parameters.SortDirection;
                    result.SortedColumn = parameters.SortedColumn;

                    //order the result
                    tempResult = (parameters.SortDirection == SortDirection.Ascending
                                           ? tempResult.OrderBy(ExtensionMethods.GetField<PermissionGridModel>(parameters.SortedColumn))
                                           : tempResult.OrderByDescending(ExtensionMethods.GetField<PermissionGridModel>(parameters.SortedColumn))).ToList();

                    //set the paginated colletion
                    if (!parameters.IsExport)
                        result.Collection = tempResult.Skip(currentIndex).Take(parameters.PageSize).ToList();
                    else
                        result.Collection = tempResult;

                    //set the quantity of elements without pagination
                    result.TotalCount = tempResult.Count;
                    //set the number of pages
                    result.NumberOfPages = (int)Math.Ceiling((double)result.TotalCount / (double)parameters.PageSize);
                    //set the current page
                    result.Page = parameters.SelectedPage;
                    //set the page size
                    result.PageSize = parameters.PageSize;
                }

            }
            return result;
        }
        /// <summary>
        /// Search all permissions for the selected user
        /// </summary>
        public void SearchPermissionExcel(string userName, int userType)
        {
            Session.Add("userNameAccess", userName);
            Session.Add("userTypeAccess", userType);

            ParameterSearchPermission parameters = new ParameterSearchPermission()
            {
                PageSize = 0,
                SelectedPage = 0,
                SortedColumn = "BusinessApplication",
                SortDirection = SortDirection.Ascending,
                LoginName = userName,
                IsExport = true,
                IsGlobalAdmin = IsGlobalAdmin,
                LoggedUserName = UserName
            };

            PaginatedList<PermissionGridModel> model = AuthorizationBusiness.GetPermissionListByUser(parameters);
            Session.Add("SearchPermissionExcel", model);
        }
        /// <summary>
        /// Perform the search with pagination
        /// </summary>
        /// <param name="sortedColumn">Sorted column</param>
        /// <param name="page">Page</param>
        /// <param name="sortDirection">Sort direction</param>
        /// <returns>PartialViewResult</returns>
        public PartialViewResult SearchPermisssions(SortDirection? sortDirection, string sortedColumn, int? page)
        {
            UserModel userModel = Session["UserModel"] as UserModel;
            int pageSize = Cotecna.Vestalis.Web.Properties.Settings.Default.PageSize;
            if (string.IsNullOrEmpty(sortedColumn))
                sortedColumn = "BusinessApplication";
            if (page == null) page = 1;
            if (sortDirection == null) sortDirection = SortDirection.Ascending;

            ParameterSearchPermission parameters = new ParameterSearchPermission()
            {
                PageSize = pageSize,
                SelectedPage = page.GetValueOrDefault(),
                SortedColumn = sortedColumn,
                SortDirection = sortDirection.GetValueOrDefault(),
                LoginName = userModel.Email,
                IsGlobalAdmin = IsGlobalAdmin,
                LoggedUserName = UserName
            };

            PaginatedList<PermissionGridModel> model = AuthorizationBusiness.GetPermissionListByUser(parameters);
            return PartialView("_PermissionGrid", model);
        }
        /// <summary>
        /// Open the screen User in Edit modes
        /// </summary>
        /// <param name="userNameEdit">User for editing</param>
        /// <returns></returns>
        public ActionResult EditUser(string userNameEdit)
        {
            int userType = int.Parse(AuthorizationBusiness.GetUserParameter(userNameEdit, "UserType"));
            UserModel model = new UserModel();
            model.UserTypes = UserTypes;
            model.OpenMode = (int)ScreenOpenMode.Edit;
            model.SelectedUserType = userType;
            MembershipUser user = Membership.GetUser(userNameEdit);
            model.Email = user.UserName;
            model.BusinessApplications = RetrieveBusinessApplications();
            int pageSize = Cotecna.Vestalis.Web.Properties.Settings.Default.PageSize;

            ParameterSearchPermission parameters = new ParameterSearchPermission()
            {
                PageSize = pageSize,
                SelectedPage = 1,
                SortedColumn = "BusinessApplication",
                SortDirection = SortDirection.Ascending,
                LoginName = userNameEdit,
                IsGlobalAdmin = IsGlobalAdmin,
                LoggedUserName = UserName
            };

            model.PermissionList = AuthorizationBusiness.GetPermissionListByUser(parameters);
            Session.Add("UserModel", model);
            return View("User", model);
        }