/// <summary>
        /// Esta funcion se encarga de generar un arbol de las celulas disponibles para dicho usuario, incluidas a las cuales es lider, lider del lider y la misma que el usuario mismo asiste
        /// </summary>
        /// <param name="usuarioId"></param>
        /// <param name="mostrarCheckboxes"></param>
        /// <returns></returns>
        public Ext.Net.TreeNode GenerarArbolDeCelulas(int usuarioId, ThreeStateBool mostrarCheckboxes, bool expandido)
        {
            ManejadorDeCelulas manejadorCelulas = new ManejadorDeCelulas();

            List <Celula> celulasPermitidas = manejadorCelulas.ObtenerCelulasPermitidasPorMiembroComoCelulas(usuarioId);

            TreeData.TreeDataTableDataTable dt = new TreeData.TreeDataTableDataTable();

            //Agregamos la celula a la que el miembro asiste, aun y cuando sera de solo lectura; solamente si no existia ya en la lista de celulas permitidas (es decir, asiste y es lider a la vez)
            Miembro miembro = (from o in SesionActual.Instance.getContexto <IglesiaEntities>().Miembro where o.MiembroId == usuarioId select o).SingleOrDefault();

            if (!(celulasPermitidas.Any(o => o.CelulaId == miembro.CelulaId)))
            {
                dt.AddTreeDataTableRow(miembro.CelulaId.ToString(), string.Empty, miembro.Celula.Descripcion, atributoDeSoloLectura);
            }

            string celulaId;
            string miembroCelulaId;
            string atributoExtra;

            foreach (Celula c in celulasPermitidas)
            {
                celulaId = c.CelulaId.ToString();
                if (c.CelulaLider.Count > 0)
                {
                    CelulaLider celulaLider = c.CelulaLider.FirstOrDefault(o => o.Borrado == false && o.Miembro.Borrado == false);
                    if (celulaLider != null)
                    {
                        miembroCelulaId = celulaLider.Miembro.CelulaId.ToString();
                        miembroCelulaId = (celulaId.Equals(miembroCelulaId)) ? string.Empty : miembroCelulaId; //Evitamos un loop infinito al momento en que el miembro sea lider de la celula a la que asiste
                        atributoExtra   = (string.IsNullOrEmpty(miembroCelulaId)) ? atributoDeSoloLectura : string.Empty;
                        dt.AddTreeDataTableRow(celulaId, miembroCelulaId, c.Descripcion, atributoExtra);
                    }
                }
            }

            //Obtenemos las celulas sin "lideres"
            List <Celula> celulasSinLider = manejadorCelulas.ObtenerCelulasSinLideresComoCelulas();

            if (celulasSinLider.Count > 0)
            {
                int idNodoCelulasSinLideres = 9999999;
                dt.AddTreeDataTableRow(idNodoCelulasSinLideres.ToString(), miembro.CelulaId.ToString(), "Celulas sin Asignacion de Lider", atributoDeSoloLectura);
                foreach (Celula c in celulasSinLider)
                {
                    dt.AddTreeDataTableRow(c.CelulaId.ToString(), idNodoCelulasSinLideres.ToString(), c.Descripcion, string.Empty);
                }
            }

            Ext.Net.TreeNode navegacion = new Ext.Net.TreeNode("Celulas");
            navegacion.Expanded = expandido;
            if ((celulasPermitidas != null) && (celulasPermitidas.Count > 0))
            {
                generarNodos(navegacion, TreeBuilder.GenerateTree(miembro.CelulaId.ToString(), dt), mostrarCheckboxes, expandido); //La celula inicial es la celula a la que el usuario asiste
            }

            return(navegacion);
        }
        public bool GuardarLiderzagoDeCelulas(int miembroId, RegistrosHelper.RegistrosDeDatos celulasNuevasYEliminadas)
        {
            bool rtn = false;

            if (miembroId > 0 && (celulasNuevasYEliminadas.RegistrosNuevosId.Count > 0 || celulasNuevasYEliminadas.RegistrosEliminadosId.Count > 0))
            {
                Miembro     miembro = (from o in SesionActual.Instance.getContexto <IglesiaEntities>().Miembro where o.MiembroId == miembroId select o).FirstOrDefault();
                CelulaLider celulaLider;

                if (miembro == null)
                {
                    throw new ExcepcionReglaNegocio(Literales.RegistroInexistente);
                }

                //Agregamos las nuevas celulas (siempre y cuando no existan previamente...)
                foreach (int celulaId in celulasNuevasYEliminadas.RegistrosNuevosId)
                {
                    if (!miembro.CelulaLider.Any(o => o.CelulaId == celulaId && o.Borrado == false))
                    {
                        celulaLider           = new CelulaLider();
                        celulaLider.MiembroId = miembroId;
                        celulaLider.CelulaId  = celulaId;
                        miembro.CelulaLider.Add(celulaLider);
                    }
                }

                //Guardamos los cambios, antes de eliminar registros
                miembro.Guardar(SesionActual.Instance.getContexto <IglesiaEntities>());

                //Eliminamos las celulas
                foreach (int celulaId in celulasNuevasYEliminadas.RegistrosEliminadosId)
                {
                    celulaLider = (from o in SesionActual.Instance.getContexto <IglesiaEntities>().CelulaLider where o.CelulaId == celulaId && o.MiembroId == miembroId && o.Borrado == false orderby o.CelulaLiderId descending select o).FirstOrDefault();
                    if (celulaLider != null)
                    {
                        celulaLider.Borrar(SesionActual.Instance.getContexto <IglesiaEntities>());
                    }
                }
            }

            return(rtn);
        }