public static void CambioEstructuraCasoA(SqlTransaction tr, int t305_idproyectosubnodo, int t303_idnodo_origen, int t303_idnodo_destino, bool bMantenerResponsables)
        {
            #region Obtención de subnodo para crear el proyectosubnodo
            int nCount = 0;
            int nCountManiobraTipo2  = 0;
            int idSubNodoAuxDestino  = 0;
            int idSubNodoAuxManiobra = 0;
            int idSubNodoGrabar      = 0;

            int    nCountSubnodosNoManiobra = 0;
            int    nResponsableSubNodo      = 0;
            string sDenominacionNodo        = "";

            DataSet dsSubNodos = SUBNODO.CatalogoActivos(tr, t303_idnodo_destino, true);
            foreach (DataRow oSN in dsSubNodos.Tables[0].Rows)
            {
                if ((byte)oSN["t304_maniobra"] == 1)
                {
                    nCount++;
                    idSubNodoAuxManiobra = (int)oSN["t304_idsubnodo"];
                    nResponsableSubNodo  = (int)oSN["t314_idusuario_responsable"];
                    sDenominacionNodo    = oSN["t303_denominacion"].ToString();
                }
                else if ((byte)oSN["t304_maniobra"] == 0)
                {
                    idSubNodoAuxDestino = (int)oSN["t304_idsubnodo"];
                    nCountSubnodosNoManiobra++;
                    nResponsableSubNodo = (int)oSN["t314_idusuario_responsable"];
                    sDenominacionNodo   = oSN["t303_denominacion"].ToString();
                }
                else
                {
                    nCountManiobraTipo2++;
                }
            }
            if (nCountSubnodosNoManiobra == 1) //si solo hay un subnodo en el nodo, que la réplica se haga a ese subnodo.
            {
                idSubNodoGrabar = idSubNodoAuxDestino;
            }
            else
            {
                if (nCount == 0)
                {
                    NODO oNodo = NODO.Select(tr, t303_idnodo_destino);
                    //crear subnodo maniobra
                    idSubNodoGrabar     = SUBNODO.Insert(tr, "Proyectos a reasignar", t303_idnodo_destino, 0, true, 1, oNodo.t314_idusuario_responsable, null);//
                    nResponsableSubNodo = oNodo.t314_idusuario_responsable;
                }
                else
                {
                    if (nCount > 1)
                    {
                        dsSubNodos.Dispose();
                        throw (new Exception("El número de subnodos de maniobra es " + nCount.ToString() + " en el nodo " + sDenominacionNodo + ". Por favor avise al administrador."));
                    }

                    if (dsSubNodos.Tables[0].Rows.Count - 1 - nCountManiobraTipo2 > 1 || dsSubNodos.Tables[0].Rows.Count - 1 - nCountManiobraTipo2 == 0)
                    {
                        idSubNodoGrabar = idSubNodoAuxManiobra;
                    }
                    else
                    {
                        idSubNodoGrabar = idSubNodoAuxDestino;
                    }
                }
            }
            dsSubNodos.Dispose();
            #endregion

            CAMBIOESTRUCTURAPSN.Paso01(tr, t305_idproyectosubnodo, idSubNodoGrabar, (bMantenerResponsables)? null:(int?)nResponsableSubNodo);
            CAMBIOESTRUCTURAPSN.Paso02(tr, t305_idproyectosubnodo, t303_idnodo_origen);
            CAMBIOESTRUCTURAPSN.Paso03(tr, t305_idproyectosubnodo, t303_idnodo_origen);
            CAMBIOESTRUCTURAPSN.Paso04(tr, t305_idproyectosubnodo, t303_idnodo_destino);
            CAMBIOESTRUCTURAPSN.Paso05(tr, t305_idproyectosubnodo, t303_idnodo_destino);
            CAMBIOESTRUCTURAPSN.Paso06(tr, t305_idproyectosubnodo, t303_idnodo_origen, t303_idnodo_destino);
            CAMBIOESTRUCTURAPSN.Paso07(tr, t305_idproyectosubnodo, t303_idnodo_origen, t303_idnodo_destino);
        }
        /// <summary>
        /// Obtiene el subnodo por defecto de un nodo para crear un PE.
        /// Si no existe, crea uno de maniobra
        /// </summary>
        /// <param name="t303_idnodo"></param>
        /// <returns></returns>
        public static int GetSubNodoDefecto(int t303_idnodo)
        {
            #region Obtención de subnodo para crear el proyectosubnodo
            int nCount = 0;
            int nCountManiobraTipo2  = 0;
            int idSubNodoAuxDestino  = 0;
            int idSubNodoAuxManiobra = 0;
            int idSubNodoGrabar      = 0;

            int     nCountSubnodosNoManiobra = 0;
            int     nResponsableSubNodo      = 0;
            string  sDenominacionNodo        = "";
            DataSet dsSubNodos = null;

            try
            {
                dsSubNodos = SUBNODO.CatalogoActivos(null, t303_idnodo, true);
                foreach (DataRow oSN in dsSubNodos.Tables[0].Rows)
                {
                    if ((byte)oSN["t304_maniobra"] == 1)
                    {
                        nCount++;
                        idSubNodoAuxManiobra = (int)oSN["t304_idsubnodo"];
                        nResponsableSubNodo  = (int)oSN["t314_idusuario_responsable"];
                        sDenominacionNodo    = oSN["t303_denominacion"].ToString();
                    }
                    else if ((byte)oSN["t304_maniobra"] == 0)
                    {
                        idSubNodoAuxDestino = (int)oSN["t304_idsubnodo"];
                        nCountSubnodosNoManiobra++;
                        nResponsableSubNodo = (int)oSN["t314_idusuario_responsable"];
                        sDenominacionNodo   = oSN["t303_denominacion"].ToString();
                    }
                    else
                    {
                        nCountManiobraTipo2++;
                    }
                }
                if (nCountSubnodosNoManiobra == 1) //si solo hay un subnodo en el nodo, que la réplica se haga a ese subnodo.
                {
                    idSubNodoGrabar = idSubNodoAuxDestino;
                }
                else
                {
                    if (nCount == 0)
                    {
                        NODO oNodo = NODO.Select(null, t303_idnodo);
                        //crear subnodo maniobra
                        idSubNodoGrabar     = SUBNODO.Insert(null, "Proyectos a reasignar", t303_idnodo, 0, true, 1, oNodo.t314_idusuario_responsable, null);
                        nResponsableSubNodo = oNodo.t314_idusuario_responsable;
                    }
                    else
                    {
                        //if (nCount > 1)
                        //{
                        //    dsSubNodos.Dispose();
                        //    throw (new Exception("El número de subnodos de maniobra es " + nCount.ToString() + " en el nodo " + sDenominacionNodo + ". Por favor avise al administrador."));
                        //}

                        if (dsSubNodos.Tables[0].Rows.Count - 1 - nCountManiobraTipo2 > 1 || dsSubNodos.Tables[0].Rows.Count - 1 - nCountManiobraTipo2 == 0)
                        {
                            idSubNodoGrabar = idSubNodoAuxManiobra;
                        }
                        else
                        {
                            idSubNodoGrabar = idSubNodoAuxDestino;
                        }
                    }
                }
                dsSubNodos.Dispose();
                #endregion
                return(idSubNodoGrabar);
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                if (dsSubNodos != null)
                {
                    dsSubNodos.Dispose();
                }
            }
        }