/// <summary>
        ///     Creates the user.
        /// </summary>
        /// <param name="user">The user.</param>
        /// <param name="password">The password.</param>
        /// <param name="roles">The roles.</param>
        /// <exception cref="System.ArgumentNullException">
        ///     user
        ///     or
        ///     password
        /// </exception>
        /// <exception cref="System.Exception">
        ///     Already exists a user with this name.
        ///     or
        ///     The roles for the user are not valid.
        ///     or
        /// </exception>
        public static void CreateUser(User user, string password, HealthRolesEnum roles) {
            if (user == null) throw new ArgumentNullException("user");
            if (string.IsNullOrEmpty(password)) throw new ArgumentNullException("password");
            //
            // no existe el usuario?
            if (ExistUser(user.UserName)) throw new Exception("Already exists a user with this name.");
            //
            // es un rol válido?}
            if (!IsValidRol(roles)) throw new Exception("The roles for the user are not valid.");

            try{
                // iniciar transacción
                UnitOfWork.BeginTransaction(IsolationLevel.ReadCommitted);
                //
                // ajustar propiedades base del usuario
                user.UserStateId = SettingAppService.GetSettingValue<int>("ActiveUserState");
                user.Salt = GenerateSalt();
                user.Password = GetHashForPassword(password, ConfigurationManager.AppSettings["Health:EncriptionKey"], user.Salt);
                //
                // adicionar el usuario al contexto
                user.ObjectState = ObjectState.Added;
                UserServiceClient.AddUser(user);
                //
                // guardar los cambios
                UnitOfWork.SaveChanges();
                //
                // asignar los roles al usuario
                AssignRol(user.UserName, roles);
                //
                // confirmar transacción
                UnitOfWork.Commit();
            } catch (Exception ex){
                UnitOfWork.Rollback();
                throw new Exception(string.Format("Cannot create the user '{0}'.", user.UserName), ex);
            }
        }
        //public static void ActivateUser(string userName)
        //{
        //    SetUserState(userName, GetValueFromSetting<int>("ActiveStateId"));
        //}

        /// <summary>
        ///     Assigns the rol.
        /// </summary>
        /// <param name="userName">Name of the user.</param>
        /// <param name="roles">The roles.</param>
        /// <exception cref="System.ArgumentNullException">userName</exception>
        /// <exception cref="System.Exception"></exception>
        /// <exception cref="System.ArgumentException">userName</exception>
        public static void AssignRol(string userName, HealthRolesEnum roles) {
            if (string.IsNullOrEmpty(userName)) throw new ArgumentNullException("userName");
            //if (IsValidRol(roles)) throw new ArgumentException("The rol is not valid.");
            //
            // buscar el usuario
            var user = GetUser(userName);

            try{
                // la variable "rol" puede tener varios roles, así que obtener los valores de cada rol en un arreglo
                var valuesOfRoles = (from int v in Enum.GetValues(GeoRolesEnumType) where ((int)roles & v) != 0 select v).ToList();
                //
                // determinar cuáles son los nuevos roles asignados al usuario
                var newRolValues = (from vr in valuesOfRoles where user.UserRoles.Any(ucr => ucr.RoleId != vr) select vr);
                //
                // iterar los nuevos roles para cargarlos a la tabla
                foreach (var newUserRole in newRolValues.Select(
                        rolValue => new UserRole{
                            RoleId = rolValue,
                            ObjectState = ObjectState.Added
                        })) user.UserRoles.Add(newUserRole);
                //
                // guardar cambios
                UnitOfWork.SaveChanges();
            } catch (Exception ex){
                throw new Exception(string.Format("Cannot assign the roles to the user '{0}'.", userName), ex);
            }
        }
        /// <summary>
        ///     Determines whether [is valid rol] [the specified rol].
        /// </summary>
        /// <param name="rol">The rol.</param>
        /// <returns><c>true</c> if [is valid rol] [the specified rol]; otherwise, <c>false</c>.</returns>
        private static bool IsValidRol(HealthRolesEnum rol) {
            // convertir el valor de la enumeración a un número
            var rolValue = (int)rol;
            //
            // si no hay un rol salir
            if (rolValue == 0) return false;
            //
            // a continuación testearemos los 32 bits del valor del rol (rolValue)
            // 1- crear un valor entero con valor inicial 1
            // 2- testear el bit del valor de la enumeración (rolValue)
            // 3- desplazar el bit hacia la izquierda para testear el siguiente bit
            for (var i = 1; i > 0; i <<= 1){
                // bit activo?
                if ((rolValue & i) == 0) continue;
                //
                // verificar que el valor sea un rol válido
                if (!Enum.IsDefined(GeoRolesEnumType, i)) return false;
            }

            return true;
        }
 /// <summary>
 ///     Determines whether [is unique role] [the specified rol].
 /// </summary>
 /// <param name="rol">The rol.</param>
 /// <returns><c>true</c> if [is unique role] [the specified rol]; otherwise, <c>false</c>.</returns>
 private static bool IsUniqueRole(HealthRolesEnum rol) {
     return Enum.IsDefined(GeoRolesEnumType, rol);
 }
 // ReSharper disable once UnusedMember.Local
 /// <summary>
 ///     Gets the rol names.
 /// </summary>
 /// <param name="rol">The rol.</param>
 /// <returns>IEnumerable{System.String}.</returns>
 private static IEnumerable<string> GetRolNames(HealthRolesEnum rol) {
     return
             (from HealthRolesEnum v in Enum.GetValues(GeoRolesEnumType)
                 where ((int)rol & (int)v) != 0
                 select Enum.GetName(GeoRolesEnumType, v)).ToArray();
 }
 /// <summary>
 ///     Gets the name of the rol.
 /// </summary>
 /// <param name="rol">The rol.</param>
 /// <returns>System.String.</returns>
 private static string GetRolName(HealthRolesEnum rol) {
     return IsUniqueRole(rol) ? Enum.GetName(GeoRolesEnumType, rol) : null;
 }