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 string Procesar(string sRegistros, string strDatos)
        {
            string  sResul = "", sEstadoMes = "";
            int     nPSN_C = 0, nPSN_J = 0, nPSN_P = 0, nSegMesProy = 0;
            int     nIDEmpresaNodoProyecto_C = 0;
            int     nNodoUsuario = 0, nEmpresaNodoUsuario = 0, nNodo_C = 0, nNodo_J = 0, nNodo_P = 0;
            decimal nTipoCambio_C = 0, nTipoCambio_J = 0, nTipoCambio_P = 0;

            SqlConnection  oConn            = null;
            SqlTransaction tr               = null;
            bool           bErrorControlado = false;

            string[] aIncentivos = Regex.Split(strDatos, "#reg#");

            #region Abrir conexión y transacción
            try
            {
                oConn = Conexion.Abrir();
                tr    = Conexion.AbrirTransaccionSerializable(oConn);
            }
            catch
            {
                if (oConn.State == ConnectionState.Open)
                {
                    Conexion.Cerrar(oConn);
                }
                throw (new Exception("Error al abrir la conexión."));
            }
            #endregion

            try
            {
                //inserto los registros seleccionados en la T726_INCENTIVOSPRODUCTIVIDAD
                Capa_Datos.INCENTIVOSPRODUCTIVIDAD.Insertar(tr, sRegistros);

                //Trato los registros seleccionados
                int i = 0;
                foreach (string oIncentivo in aIncentivos)
                {
                    i++;
                    if (oIncentivo == "")
                    {
                        continue;
                    }
                    string[] aDatos = Regex.Split(oIncentivo, "#sep#");

                    #region Datos Incentivo
                    //aDatos[0] = id incentivo //0
                    //aDatos[1] = idusuario //1
                    //aDatos[2] = idnodo_usuario //2
                    //aDatos[3] = importe //3
                    //aDatos[4] = idproyecto //4
                    //aDatos[5] = anomes //5
                    //aDatos[6] = Profesional //6
                    //aDatos[7] = Denominación proyecto //7
                    //aDatos[8] = importe SS //8
                    #endregion

                    #region inicializar variables
                    nPSN_C      = 0;
                    nPSN_J      = 0;
                    nPSN_P      = 0;
                    nSegMesProy = 0;
                    nIDEmpresaNodoProyecto_C = 0;
                    nNodoUsuario             = 0;
                    nEmpresaNodoUsuario      = 0;
                    nNodo_C       = 0;
                    nNodo_J       = 0;
                    nNodo_P       = 0;
                    nTipoCambio_C = 0;
                    nTipoCambio_J = 0;
                    nTipoCambio_P = 0;
                    #endregion

                    DataSet ds = Capa_Datos.INCENTIVOSPRODUCTIVIDAD.ObtenerInstanciasProyecto(tr, int.Parse(aDatos[4]), int.Parse(aDatos[1]), int.Parse(aDatos[5]));
                    foreach (DataRow oFila in ds.Tables[0].Rows)
                    {
                        switch (oFila["t305_cualidad"].ToString())
                        {
                        case "C":
                            nPSN_C  = (int)oFila["t305_idproyectosubnodo"];
                            nNodo_C = (int)oFila["t303_idnodo"];
                            nIDEmpresaNodoProyecto_C = (int)oFila["t313_idempresa_nodo"];
                            nTipoCambio_C            = decimal.Parse(oFila["t699_tipocambio"].ToString());
                            break;

                        case "J":
                            nPSN_J        = (int)oFila["t305_idproyectosubnodo"];
                            nNodo_J       = (int)oFila["t303_idnodo"];
                            nTipoCambio_J = decimal.Parse(oFila["t699_tipocambio"].ToString());
                            break;

                        case "P":
                            nPSN_P        = (int)oFila["t305_idproyectosubnodo"];
                            nNodo_P       = (int)oFila["t303_idnodo"];
                            nTipoCambio_P = decimal.Parse(oFila["t699_tipocambio"].ToString());
                            break;
                        }
                        if (nNodoUsuario == 0)
                        {
                            nNodoUsuario = (int)oFila["t303_idnodo_usuario"];
                        }
                        if (nEmpresaNodoUsuario == 0)
                        {
                            nEmpresaNodoUsuario = (int)oFila["t313_idempresa_nodousuario"];
                        }
                    }

                    if (nPSN_C == 0)
                    {
                        sResul           = "Instancia contratante del proyecto económico no existente";
                        bErrorControlado = true;
                        throw (new Exception(sResul));
                    }

                    if (nPSN_P != 0) //Réplica con gestión
                    {
                        nSegMesProy = SEGMESPROYECTOSUBNODO.ExisteSegMesProy(tr, nPSN_P, int.Parse(aDatos[5]));
                        if (nSegMesProy == 0)
                        {
                            sEstadoMes  = SEGMESPROYECTOSUBNODO.EstadoMesACrear(tr, nPSN_P, int.Parse(aDatos[5]));
                            nSegMesProy = SEGMESPROYECTOSUBNODO.Insert(tr, nPSN_P, int.Parse(aDatos[5]), sEstadoMes, 0, 0, false, 0, 0);
                        }
                        DATOECO.Insert(tr, nSegMesProy, Constantes.nIdClaseProductividad, Utilidades.unescape(aDatos[6]), decimal.Parse(aDatos[3]) * nTipoCambio_P, null, null, 4);
                        DATOECO.Insert(tr, nSegMesProy, Constantes.nIdClaseProductividadSS, Utilidades.unescape(aDatos[6]), decimal.Parse(aDatos[8]) * nTipoCambio_P, null, null, 4);
                    }
                    else if (nNodo_C == nNodoUsuario) //El usuario pertenece a la Contratante
                    {
                        nSegMesProy = SEGMESPROYECTOSUBNODO.ExisteSegMesProy(tr, nPSN_C, int.Parse(aDatos[5]));
                        if (nSegMesProy == 0)
                        {
                            sEstadoMes  = SEGMESPROYECTOSUBNODO.EstadoMesACrear(tr, nPSN_C, int.Parse(aDatos[5]));
                            nSegMesProy = SEGMESPROYECTOSUBNODO.Insert(tr, nPSN_C, int.Parse(aDatos[5]), sEstadoMes, 0, 0, false, 0, 0);
                        }
                        DATOECO.Insert(tr, nSegMesProy, Constantes.nIdClaseProductividad, Utilidades.unescape(aDatos[6]), decimal.Parse(aDatos[3]) * nTipoCambio_C, null, null, 4);
                        DATOECO.Insert(tr, nSegMesProy, Constantes.nIdClaseProductividadSS, Utilidades.unescape(aDatos[6]), decimal.Parse(aDatos[8]) * nTipoCambio_C, null, null, 4);
                    }
                    else //Réplica sin gestión
                    {
                        //Para la réplica sin gestión
                        if (nNodo_J == 0) //no existe la réplica sin gestión, por lo que hay que crearla.
                        {
                            #region Creación de la instancia de proyecto
                            int     nCountManiobraTipo1 = 0, idNodoAuxManiobra = 0, nCountSubnodosNoManiobra = 0, idNodoAuxDestino = 0, idSubNodoGrabar = 0;
                            int     nResponsablePSN = 0;
                            DataSet dsSubnodos      = PROYECTOSUBNODO.ObtenerSubnodosParaReplicar(tr, nNodoUsuario);
                            foreach (DataRow oFila in dsSubnodos.Tables[0].Rows)
                            {
                                if ((byte)oFila["t304_maniobra"] == 1)
                                {
                                    nCountManiobraTipo1++;
                                    idNodoAuxManiobra = (int)oFila["t304_idsubnodo"];
                                }
                                else
                                {
                                    nCountSubnodosNoManiobra++;
                                    idNodoAuxDestino = (int)oFila["t304_idsubnodo"];
                                }
                            }

                            if (nCountSubnodosNoManiobra == 1) //si solo hay un subnodo en el nodo, que la réplica se haga a ese subnodo.
                            {
                                idSubNodoGrabar = idNodoAuxDestino;
                            }
                            else
                            {
                                if (nCountManiobraTipo1 == 0)
                                {
                                    NODO oNodo2 = NODO.SelectEnTransaccion(tr, nNodoUsuario);
                                    nResponsablePSN = oNodo2.t314_idusuario_responsable;
                                    //crear subnodo maniobra
                                    idSubNodoGrabar = SUBNODO.Insert(tr, "Proyectos a reasignar", nNodoUsuario, 0, true, 1, oNodo2.t314_idusuario_responsable, null);
                                }
                                else
                                {
                                    if (nCountManiobraTipo1 > 1)
                                    {
                                        ds.Dispose();
                                        throw (new Exception("El número de subnodos de maniobra es " + nCountManiobraTipo1.ToString() + " en el nodo " + nNodoUsuario.ToString() + ". Por favor avise al administrador."));
                                    }

                                    if (ds.Tables[0].Rows.Count - 1 > 1 || ds.Tables[0].Rows.Count - 1 == 0)
                                    {
                                        idSubNodoGrabar = idNodoAuxManiobra;
                                    }
                                    else
                                    {
                                        idSubNodoGrabar = idNodoAuxDestino;
                                    }
                                }
                            }
                            ds.Dispose();

                            if (nResponsablePSN == 0)
                            {
                                NODO oNodo3 = NODO.SelectEnTransaccion(tr, nNodoUsuario);
                                nResponsablePSN = oNodo3.t314_idusuario_responsable;
                            }
                            if (nTipoCambio_J == 0)
                            {
                                //hay que obtener el tipo de cambio de la moneda por defecto del nodo en el mes del incentivo.
                                nTipoCambio_J = NODO.getTipocambioMonedaNodoMes(tr, nNodoUsuario, int.Parse(aDatos[5]));
                            }
                            nPSN_J = PROYECTOSUBNODO.Insert(tr, int.Parse(aDatos[4]), idSubNodoGrabar, false, "J",
                                                            false, nResponsablePSN, Utilidades.unescape(aDatos[7]), "X", "X",
                                                            false, false, false, false, false, "", "",
                                                            "", null, null, null, null, null, null, false, 0);
                            #endregion
                        }

                        nSegMesProy = SEGMESPROYECTOSUBNODO.ExisteSegMesProy(tr, nPSN_J, int.Parse(aDatos[5]));
                        if (nSegMesProy == 0)
                        {
                            sEstadoMes  = SEGMESPROYECTOSUBNODO.EstadoMesACrear(tr, nPSN_J, int.Parse(aDatos[5]));
                            nSegMesProy = SEGMESPROYECTOSUBNODO.Insert(tr, nPSN_J, int.Parse(aDatos[5]), sEstadoMes, 0, 0, false, 0, 0);
                        }

                        DATOECO.Insert(tr, nSegMesProy, Constantes.nIdClaseProductividad, Utilidades.unescape(aDatos[6]), decimal.Parse(aDatos[3]) * nTipoCambio_J, null, null, 4);
                        DATOECO.Insert(tr, nSegMesProy, Constantes.nIdClaseProductividadSS, Utilidades.unescape(aDatos[6]), decimal.Parse(aDatos[8]) * nTipoCambio_J, null, null, 4);


                        //Para la contratante (se añade el nodo destino)
                        nSegMesProy = SEGMESPROYECTOSUBNODO.ExisteSegMesProy(tr, nPSN_C, int.Parse(aDatos[5]));
                        if (nSegMesProy == 0)
                        {
                            sEstadoMes  = SEGMESPROYECTOSUBNODO.EstadoMesACrear(tr, nPSN_C, int.Parse(aDatos[5]));
                            nSegMesProy = SEGMESPROYECTOSUBNODO.Insert(tr, nPSN_C, int.Parse(aDatos[5]), sEstadoMes, 0, 0, false, 0, 0);
                        }
                        DATOECO.Insert(tr, nSegMesProy, (nIDEmpresaNodoProyecto_C == nEmpresaNodoUsuario) ? 4 : 6, Utilidades.unescape(aDatos[6]), (decimal.Parse(aDatos[3]) + decimal.Parse(aDatos[8])) * nTipoCambio_C, nNodoUsuario, null, 4);
                    }

                    Capa_Datos.INCENTIVOSPRODUCTIVIDAD.Registrar(tr, int.Parse(aDatos[0]));
                }

                Conexion.CommitTransaccion(tr);
            }
            catch (Exception ex)
            {
                Conexion.CerrarTransaccion(tr);
                if (bErrorControlado)
                {
                    sResul = ex.Message;
                }
                else
                {
                    sResul = Errores.mostrarError("Error al procesar.", ex);
                }
            }
            finally
            {
                Conexion.Cerrar(oConn);
                if (sResul != "")
                {
                    if (bErrorControlado)
                    {
                        sResul = "ErrorControlado##EC##" + sResul;
                    }
                    throw (new Exception(sResul));
                }
            }

            return("");
        }
        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();
        }