public static void CambiarEstructuraAProyecto(SqlTransaction tr, int t305_idproyectosubnodo, int t303_idnodo_origen, int t303_idnodo_destino, bool bMantenerResponsables)
        {
            string sTipoReplicaDestino = "";
            int    idPSNReplicaDestino = 0;

            SqlDataReader dr = CAMBIOESTRUCTURAPSN.Paso00(tr, t305_idproyectosubnodo, t303_idnodo_destino);

            if (dr.Read())
            {
                idPSNReplicaDestino = (int)dr["t305_idproyectosubnodo"];
                sTipoReplicaDestino = dr["t305_cualidad"].ToString();
            }
            dr.Close();
            dr.Dispose();

            switch (sTipoReplicaDestino)
            {
            case "":    //CASO A. 3.1.- Instancia contratante se mueve a destino sin instancia replicada
                CAMBIOESTRUCTURAPSN.CambioEstructuraCasoA(tr, t305_idproyectosubnodo, t303_idnodo_origen, t303_idnodo_destino, bMantenerResponsables);
                break;

            case "J":    //CASO B. 3.2.- Instancia contratante se mueve a destino con instancia replicada sin gestión
                CAMBIOESTRUCTURAPSN.CambioEstructuraCasoB(tr, t305_idproyectosubnodo, t303_idnodo_destino, idPSNReplicaDestino);
                CAMBIOESTRUCTURAPSN.CambioEstructuraCasoA(tr, t305_idproyectosubnodo, t303_idnodo_origen, t303_idnodo_destino, bMantenerResponsables);
                break;

            case "P":    //CASO C. 3.3.- Instancia contratante se mueve a destino con instancia replicada con gestión
                CAMBIOESTRUCTURAPSN.CambioEstructuraCasoC(tr, t305_idproyectosubnodo, t303_idnodo_destino, idPSNReplicaDestino);
                CAMBIOESTRUCTURAPSN.CambioEstructuraCasoA(tr, t305_idproyectosubnodo, t303_idnodo_origen, t303_idnodo_destino, bMantenerResponsables);
                break;
            }
        }
        public static void CambioEstructuraCasoB(SqlTransaction tr, int t305_idproyectosubnodo_contratante, int t303_idnodo_destino, int t305_idproyectosubnodo_replicaSG)
        {
            int     nSMPSN_contratante = 0;
            string  sEstadoMes         = "";
            DataSet dsDatoEco          = CAMBIOESTRUCTURAPSN.Paso08(tr, t305_idproyectosubnodo_replicaSG);

            foreach (DataRow oDE in dsDatoEco.Tables[0].Rows)
            {
                //2ºComprobar si existe mes para el nodo destino
                nSMPSN_contratante = SEGMESPROYECTOSUBNODO.ExisteSegMesProy(tr, t305_idproyectosubnodo_contratante, (int)oDE["t325_anomes"]);
                if (nSMPSN_contratante == 0)
                {
                    sEstadoMes         = SEGMESPROYECTOSUBNODO.EstadoMesACrear(tr, t305_idproyectosubnodo_contratante, (int)oDE["t325_anomes"]);
                    nSMPSN_contratante = SEGMESPROYECTOSUBNODO.Insert(tr, t305_idproyectosubnodo_contratante, (int)oDE["t325_anomes"], sEstadoMes, 0, 0, false, 0, 0);
                }
                CAMBIOESTRUCTURAPSN.Paso09(tr, (int)oDE["t376_iddatoeco"], nSMPSN_contratante, (decimal)oDE["t376_importe_mb"]);
                //CAMBIOESTRUCTURAPSN.Paso10(tr, t305_idproyectosubnodo_contratante, t303_idnodo_destino);
            }
            dsDatoEco.Dispose();
            CAMBIOESTRUCTURAPSN.Paso10(tr, t305_idproyectosubnodo_contratante, t303_idnodo_destino);
            PROYECTOSUBNODO.Delete(tr, t305_idproyectosubnodo_replicaSG);
        }
        public static void CambioEstructuraCasoC(SqlTransaction tr, int t305_idproyectosubnodo_contratante, int t303_idnodo_destino, int t305_idproyectosubnodo_replicaCG)
        {
            int    nSMPSN_contratante = 0;
            string sEstadoMes         = "";

            // Aplica la moneda del contratante al presupuesto de la estructura técnica. Aplica el PSN del contratante a los proyectos técnicos
            CAMBIOESTRUCTURAPSN.Paso11(tr, t305_idproyectosubnodo_contratante, t305_idproyectosubnodo_replicaCG);
            //Coge los consumos de la replica
            DataSet dsDatoEco = CAMBIOESTRUCTURAPSN.Paso08(tr, t305_idproyectosubnodo_replicaCG);

            foreach (DataRow oDE in dsDatoEco.Tables[0].Rows)
            {
                //2ºComprobar si existe mes para el nodo destino
                nSMPSN_contratante = SEGMESPROYECTOSUBNODO.ExisteSegMesProy(tr, t305_idproyectosubnodo_contratante, (int)oDE["t325_anomes"]);
                if (nSMPSN_contratante == 0)
                {
                    sEstadoMes         = SEGMESPROYECTOSUBNODO.EstadoMesACrear(tr, t305_idproyectosubnodo_contratante, (int)oDE["t325_anomes"]);
                    nSMPSN_contratante = SEGMESPROYECTOSUBNODO.Insert(tr, t305_idproyectosubnodo_contratante, (int)oDE["t325_anomes"], sEstadoMes, 0, 0, false, 0, 0);
                }
                //Actualiza el importe por si ha habido cambio de moneda
                CAMBIOESTRUCTURAPSN.Paso09(tr, (int)oDE["t376_iddatoeco"], nSMPSN_contratante, (decimal)oDE["t376_importe_mb"]);
                //CAMBIOESTRUCTURAPSN.Paso10(tr, t305_idproyectosubnodo_contratante, t303_idnodo_destino);
            }
            dsDatoEco.Dispose();
            //Borra los consumos de la contratante en el CR de destino
            CAMBIOESTRUCTURAPSN.Paso10(tr, t305_idproyectosubnodo_contratante, t303_idnodo_destino);
            //Reasigno las notas GASVI
            CAMBIOESTRUCTURAPSN.Paso17(tr, t305_idproyectosubnodo_contratante, t305_idproyectosubnodo_replicaCG);

            //Guardamos en una lista los usuarios asignados a la replica con gestion
            List <USUARIOPROYECTOSUBNODO> lUsusariosReplica = CAMBIOESTRUCTURAPSN.Paso12(tr, t305_idproyectosubnodo_contratante, t305_idproyectosubnodo_replicaCG);
            //Guardo en un dataset los consumos de la replicada
            DataSet dsCPMCE = CAMBIOESTRUCTURAPSN.Paso13(tr, t305_idproyectosubnodo_replicaCG);

            //Borro rl proyecto replicado
            PROYECTOSUBNODO.Delete(tr, t305_idproyectosubnodo_replicaCG);
            //Recojo los usuarios del proyecto replicado con gestión que he almacenado previamente y los inserto en la contratante
            //Es necesario hacerlo así porque mientras exista la instancia replicada no permite insertar usuarios en la contratante
            CAMBIOESTRUCTURAPSN.Paso16(tr, t305_idproyectosubnodo_contratante, lUsusariosReplica);
            //Una vez que tengo asignados los usuarios a la contratante ya puedo pasar los consumos
            int?t303_idnodo_usuariomes = null;
            int?t313_idempresa_nodomes = null;

            foreach (DataRow oCPM in dsCPMCE.Tables[0].Rows)
            {
                nSMPSN_contratante = SEGMESPROYECTOSUBNODO.ExisteSegMesProy(tr, t305_idproyectosubnodo_contratante, (int)oCPM["t325_anomes"]);
                if (nSMPSN_contratante == 0)
                {
                    sEstadoMes         = SEGMESPROYECTOSUBNODO.EstadoMesACrear(tr, t305_idproyectosubnodo_contratante, (int)oCPM["t325_anomes"]);
                    nSMPSN_contratante = SEGMESPROYECTOSUBNODO.Insert(tr, t305_idproyectosubnodo_contratante, (int)oCPM["t325_anomes"], sEstadoMes, 0, 0, false, 0, 0);
                }
                decimal dAux = decimal.Parse(oCPM["t378_costeunitariorep_mb"].ToString());
                if (oCPM["t303_idnodo_usuariomes"].ToString() != "")
                {
                    t303_idnodo_usuariomes = (int)oCPM["t303_idnodo_usuariomes"];
                }
                else
                {
                    t303_idnodo_usuariomes = null;
                }
                if (oCPM["t313_idempresa_nodomes"].ToString() != "")
                {
                    t313_idempresa_nodomes = (int)oCPM["t313_idempresa_nodomes"];
                }
                else
                {
                    t313_idempresa_nodomes = null;
                }

                //CAMBIOESTRUCTURAPSN.Paso15(tr, (int)oCPM["t325_idsegmesproy"], (int)oCPM["t314_idusuario"], nSMPSN_contratante, dAux, dAux,
                //                            float.Parse(oCPM["t378_unidades"].ToString()), (int)oCPM["t303_idnodo_usuariomes"], (int)oCPM["t313_idempresa_nodomes"]);
                CAMBIOESTRUCTURAPSN.Paso15(tr, (int)oCPM["t314_idusuario"], nSMPSN_contratante, dAux, dAux,
                                           float.Parse(oCPM["t378_unidades"].ToString()), t303_idnodo_usuariomes, t313_idempresa_nodomes);
            }
            dsCPMCE.Dispose();
        }
        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);
        }