internal void desasignarRecurso(EntidadRecursoH rec)
 {
     try
     {
         string consulta = "UPDATE Usuario SET idProy = null WHERE cedula = '" + rec.Cedula + "';";
         SqlDataReader reader = baseDatos.ejecutarConsulta(consulta);
         reader.Close();
     }
     catch (Exception ex)
     {
         throw ex;
     }
 }
        /** Descripcion: Devuelve los recursos disponibles
          *
          * REQ: N/A
          *
          * RET: List<EntidadRecursoH>
          */
        public List<EntidadRecursoH> getRecursosDisponibles()
        {
            SqlDataReader reader = null;
            List<EntidadRecursoH> recursos = new List<EntidadRecursoH>();

            string consulta = "SELECT cedula, pNombre, pApellido, sApellido, rol from Usuario WHERE not rol = 'Lider' AND not perfil = 'A' AND idProy IS NULL;";
            reader = baseDatos.ejecutarConsulta(consulta);

            try
            {
                while (reader.Read())
                {
                    int cedula = SafeGetInt32(reader, 0);
                    string nombre = SafeGetString(reader, 1);
                    string pApellido = SafeGetString(reader, 2);
                    string sApellido = SafeGetString(reader, 3);
                    string rol = SafeGetString(reader, 4);

                    EntidadRecursoH rh = new EntidadRecursoH(cedula, nombre, pApellido, sApellido, rol);
                    recursos.Add(rh);
                }
                reader.Close();
            }
            catch (SqlException ex)
            {
                throw ex;
            }

            return recursos;
        }
        internal void asignarRecurso(EntidadRecursoH rec, string p)
        {
            int idProy;
            try
            {
                string consulta = "SELECT id from Proyecto WHERE Nombre = '" + p + "'";
                SqlDataReader reader = baseDatos.ejecutarConsulta(consulta);
                reader.Read();
                idProy = reader.GetInt32(0);
                reader.Close();

                consulta = "UPDATE Usuario SET idProy = "+idProy.ToString()+" WHERE cedula = '" + rec.Cedula + "';";
                reader = baseDatos.ejecutarConsulta(consulta);
                reader.Close();
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        /**
         * Descripción: Realiza la consulta SQL de modificación de un recurso humano en la base de datos, modifica tablas Usuario y telefonoUsuario
         * Recibe una entidad recurso humano @rh con la informacón a actualizar
         * Devuelve un valor entero dependiendo del resultado de la consulta:
         * 0:  Actualización correcta de ambas tablas
         * -1: Error actualizando en tabla Usuario
         * -2: Error insertando en tabla telefonoUsuario
         * 2627: Error de atributo duplicado (cedula o nombre de usuario).
         */
        public int modificaRH(EntidadRecursoH rh)
        {
            //se crea la consulta como un string para luego utlizarla en el metodo ejecutaConsulta(string)
            string consulta = "UPDATE Usuario "
            + " SET pNombre=@0, pApellido=@1, sApellido=@2, correo=@3, nomUsuario=@4, contrasena=@5, perfil=@6, rol=@7, cedula=@8, fechaModif=@9"
            + " WHERE idRH=@10;";

            Object[] args = new Object[11];
            args[0] = rh.Nombre;
            args[1] = rh.PApellido;
            args[2] = rh.SApellido;
            args[3] = rh.Correo;
            args[4] = rh.NomUsuario;
            args[5] = rh.Contra;
            args[6] = rh.Perfil;
            args[7] = rh.Rol;
            args[8] = rh.Cedula;
            args[9] = rh.FechaModif;
            args[10] = rh.IdRH;
            int resultado = -1;

            try
            {
                SqlDataReader reader = baseDatos.ejecutarConsulta(consulta, args);
                if (reader.RecordsAffected > 0)
                {
                    reader.Close();
                    //Si se realiza la modificacion correcta del usuario se hace el cambio de los telefonos

                    string borraTel = " DELETE FROM  TelefonoUsuario WHERE cedula = " + rh.Cedula + "; ";
                    string insertaTel = "";
                    //Se revisan los casos para ver cual(es) telefono(s) insertar
                    if (rh.Telefono1 != -1 && rh.Telefono2 == -1)
                    {
                        insertaTel = " INSERT INTO TelefonoUsuario (cedula, numero) "
                        + " values (" + rh.Cedula + ", " + rh.Telefono1 + ");";
                    }
                    else if (rh.Telefono1 == -1 && rh.Telefono2 != -1)
                    {
                        insertaTel = " INSERT INTO TelefonoUsuario (cedula, numero) "
                        + " values (" + rh.Cedula + ", " + rh.Telefono2 + ");";
                    }
                    else if (rh.Telefono2 != -1 && rh.Telefono2 != -1)
                    {
                        insertaTel = " INSERT INTO TelefonoUsuario (cedula, numero) "
                        + " values (" + rh.Cedula + ", " + rh.Telefono1 + "), (" + rh.Cedula + ", " + rh.Telefono2 + "); ";
                    }
                    else
                    {
                        insertaTel = " DELETE FROM TelefonoUsuario WHERE cedula = "+rh.Cedula+"; ";
                    }

                    try
                    {
                        //Se borran todos los numeros relacionados a la persona, utlizando su numero de cedula
                        reader = baseDatos.ejecutarConsulta(borraTel);
                        reader.Close();

                        try
                        {
                            //Se insertan los nuevos numeros
                            reader = baseDatos.ejecutarConsulta(insertaTel);
                            if (reader.RecordsAffected > 0)
                            {
                                //Se devuelve 0 si tanto el usuario como los telefonos se modificaron correctamente
                                resultado = 0;
                            }
                            else
                            {
                                //No se modificaron los teléfonos
                                resultado = 1;
                            }
                            reader.Close();
                        }
                        catch (SqlException ex)
                        {
                            throw ex;
                        }

                    }

                    catch (SqlException ex)
                    {
                        throw ex;
                    }
                }
                //Si no se modificó el usuario correctamente se devuelve -1
                else
                {
                    resultado = -1;
                }

            }
            //En caso de una excepcion SQL se tira para tratarla en la capa superior
            catch (SqlException ex)
            {
                throw ex;
            }

            return resultado;
        }
        /** Descripcion: Devuelve los recursos asignados
          *
          * REQ: N/A
          *
          * RET: List<EntidadRecursoH>
          */
        public List<EntidadRecursoH> getRecursosAsignados(string nomP)
        {
            int idP = -1;
            SqlDataReader reader = null;
            string consulta = "SELECT id FROM Proyecto WHERE nombre = '" + nomP + "';";

            List<EntidadRecursoH> recursos = new List<EntidadRecursoH>();

            reader = baseDatos.ejecutarConsulta(consulta);
            while (reader.Read())
            {
                idP = reader.GetInt32(0);
            }
            reader.Close();

            consulta = "SELECT cedula, pNombre, pApellido, sApellido, rol from Usuario WHERE not rol = 'Lider' AND not perfil = 'A' And idProy = '" + idP + "';";
            reader = baseDatos.ejecutarConsulta(consulta);
            try
            {
                while (reader.Read())
                {
                    int cedula = SafeGetInt32(reader, 0);
                    String nombre = SafeGetString(reader, 1);
                    String pApellido = SafeGetString(reader, 2);
                    String sApellido = SafeGetString(reader, 3);
                    String rol = SafeGetString(reader, 4);

                    EntidadRecursoH rh = new EntidadRecursoH(cedula, nombre, pApellido, sApellido, rol);
                    recursos.Add(rh);
                }
                reader.Close();
            }
            catch (SqlException ex)
            {
                throw ex;
            }

            return recursos;
        }
        /**
         * Requiere: String nomUsuario
         * Retorna EntidadRecursoH.
         * Consulta en la BD en la tabla RRHH la fila con el nombre de usuario dado y la devuelve.
         */
        public EntidadRecursoH consultaRH(string nomUsuario)
        {
            //Consulta la tupla con el usuario seleccionado
            string consultaU = "SELECT cedula, pNombre, pApellido, sApellido, correo, nomUsuario, contrasena, perfil, idProy, rol, idrh, fechaModif"
                + " FROM Usuario u WHERE u.nomUsuario ='" + nomUsuario + "'; ";

            EntidadRecursoH rh = null;
            int cedula = -1;
            string nombre = "";
            string pApellido = "";
            string sApellido = "";
            string correo = "";
            string usuario = "";
            string contrasena = "";
            char perfil = ' ';
            int idProy = -1;
            string rol = "";
            int telefono1 = -1;
            int telefono2 = -1;
            int idrh = -1;
            DateTime fechaModif = DateTime.Now;
            try
            {
                SqlDataReader reader = baseDatos.ejecutarConsulta(consultaU);
                try
                {
                    //Si leyó, llene los campos
                    if (reader.Read()) {
                        cedula = SafeGetInt32(reader, 0);
                        nombre = SafeGetString(reader, 1);
                        pApellido = SafeGetString(reader, 2);
                        sApellido = SafeGetString(reader, 3);
                        correo = SafeGetString(reader, 4);
                        usuario = SafeGetString(reader, 5);
                        contrasena = SafeGetString(reader, 6);
                        perfil = SafeGetString(reader, 7).ElementAt(0);
                        idProy = SafeGetInt32(reader, 8);
                        rol = SafeGetString(reader, 9);
                        idrh = SafeGetInt32(reader, 10);
                        fechaModif = SafeGetDate(reader, 11);
                    }
                    reader.Close();
                }
                catch (SqlException ex)
                {
                    throw ex;
                }
                //Una vez consultada la información, uso la cédula obtenida para traer los números
                string consultaT = "SELECT numero "
                    + " FROM telefonoUsuario t WHERE t.cedula =" + cedula + "; ";
                SqlDataReader readerT = baseDatos.ejecutarConsulta(consultaT);
                try
                {
                    if (readerT.Read())
                    {
                        telefono1 = SafeGetInt32(readerT, 0);
                    }
                    if (readerT.Read())
                    {
                        telefono2 = SafeGetInt32(readerT, 0);
                    }
                    readerT.Close();
                }
                catch (SqlException ex)
                {
                    throw ex;
                }
                //Encapsulo los datos
                rh = new EntidadRecursoH(cedula, nombre, pApellido, sApellido, correo,
                        usuario, contrasena, perfil, idProy, rol, telefono1, telefono2, idrh, fechaModif);
            }
            catch (SqlException ex)
            {
                throw ex;
            }
            return rh;
        }
        /**
         * Descripción: Realiza la consulta SQL de inserción de un nuevo recurso humano a la base de datos, inserta en tablas Usuario y telefonoUsuario
         * Recibe una entidad recurso humano @rh con la informacón a insertar
         * Devuelve un valor entero dependiendo del resultado de la consulta:
         * 0: Inserción correcta en ambas tablas
         * -1: Error insertando en tabla Usuario
         * -2: Error insertando en tabla telefonoUsuario
         * 2627: Error de atributo duplicado (cedula o nombre de usuario).
         */
        public int insertaRH(EntidadRecursoH rh)
        {
            //Se crea la consulta como un string para luego utlizarla en el metodo ejecutaConsulta(string)
            string consulta = "INSERT INTO Usuario (cedula, pNombre, pApellido, sApellido, correo, nomUsuario, contrasena, perfil, rol, fechaModif)"
            + "values                              (@0,     @1,      @2,        @3,        @4,     @5,         @6,         @7,     @8,  @9);";
            Object[] args = new Object[10];
            args[0] = rh.Cedula;
            args[1] = rh.Nombre;
            args[2] = rh.PApellido;
            args[3] = rh.SApellido;
            args[4] = rh.Correo;
            args[5] = rh.NomUsuario;
            args[6] = rh.Contra;
            args[7] = rh.Perfil;
            args[8] = rh.Rol;
            args[9] = rh.FechaModif;
            int resultado = -1;
            try
            {
                SqlDataReader reader = baseDatos.ejecutarConsulta(consulta, args);
                //Si se hizo bien el insertar de usuario se hace el de telefono, de otro modo no se hace nada y se devuelve -1
                if (reader.RecordsAffected > 0)
                {
                    reader.Close();
                    string consultaTel = "";
                    //Si no hay telefonos que insertar se finaliza la insercion a la base
                    if (rh.Telefono1 == -1 && rh.Telefono2 == -1)
                    {
                        resultado = 0;
                    }
                    else
                    {   //Se revisan los casos de cuales telefonos hay que insertar
                        //Solo primer telefono válido
                        if (rh.Telefono2 == -1)
                        {
                            consultaTel = " INSERT INTO TelefonoUsuario (cedula, numero) "
                            + " values (" + rh.Cedula + ", " + rh.Telefono1 + ");";
                        }//Solo segundo telefono válido
                        else if (rh.Telefono1 == -1)
                        {
                            consultaTel = " INSERT INTO TelefonoUsuario (cedula, numero) "
                            + " values (" + rh.Cedula + ", " + rh.Telefono2 + ");";
                        }//Los dos telefonos válidos
                        else
                        {
                            consultaTel = " INSERT INTO TelefonoUsuario (cedula, numero) "
                            + " values (" + rh.Cedula + ", " + rh.Telefono1 + "), (" + rh.Cedula + ", " + rh.Telefono2 + "); ";
                        }

                        try
                        {//Se intenta insertar los telefonos a la tabla telefonoUsuario
                            reader = baseDatos.ejecutarConsulta(consultaTel);
                            if (reader.RecordsAffected > 0)
                            {
                                //Si se insertó correctamente se devuelve 0
                                resultado = 0;
                            }
                            else
                            {
                                //resultado = -2 indica que hubo error al insertar el o los telefonos
                                resultado = -2;
                            }
                            reader.Close();
                        }
                        catch (SqlException ex)
                        {
                            throw ex;
                        }
                    }

                }
                //Si no se insertó nada se devuelve -1
                else
                {
                    resultado = -1;
                }

            }
            catch (SqlException ex)
                //En caso de una excepcion SQL se tira a la capa superior para ser tratada
            {
                throw ex;
            }

            return resultado;
        }
 /* Descripcion: Asigna el proyecto al recurso asignado
 *
 * REQ: string, EntidadRecursoH
 *
 * RET: N/A
 */
 public void asignarProyectoAEmpleado(string nombreProyecto, EntidadRecursoH e)
 {
     controladoraBDProyecto.asignarProyectoAEmpleado(e.Cedula.ToString(), nombreProyecto);
 }
        /**
         * Requiere: int cedula
         * Retorna EntidadRecursoH.
         * Consulta en la BD en la tabla RRHH la fila con la llave primaria cedula y la devuelve.
         */
        public EntidadRecursoH consultaRH(int cedula)
        {
            //Hace la consulta de todos los campos
            string consultaU = "SELECT cedula, pNombre, pApellido, sApellido, correo, nomUsuario, contrasena, perfil, idProy, rol, idRH, fechaModif"
                + " FROM Usuario u WHERE u.cedula =" + cedula + "; ";
            string consultaT = "SELECT numero "
                + " FROM telefonoUsuario t WHERE t.cedula =" + cedula + "; ";
            //Inicialice variables locales
            EntidadRecursoH rh = null;
            string nombre = "";
            string pApellido = "";
            string sApellido = "";
            string correo = "";
            string usuario = "";
            string contrasena = "";
            char perfil = ' ';
            int idProy = -1;
            string rol = "";
            int telefono1 = -1;
            int telefono2 = -1;
            int idrh = -1;
            DateTime fechaModif = DateTime.Now;
            try
            {
                SqlDataReader reader = baseDatos.ejecutarConsulta(consultaU);
                try
                {
                    if(reader.Read())
                    {//Si pudo leer, obtenga los datos de forma segura
                        nombre = SafeGetString(reader, 1);
                        pApellido = SafeGetString(reader, 2);
                        sApellido = SafeGetString(reader, 3);
                        correo = SafeGetString(reader, 4);
                        usuario = SafeGetString(reader, 5);
                        contrasena = SafeGetString(reader, 6);
                        perfil = SafeGetString(reader, 7).ElementAt(0);
                        idProy = SafeGetInt32(reader, 8);
                        rol = SafeGetString(reader, 9);
                        idrh = SafeGetInt32(reader, 10);
                        fechaModif = SafeGetDate(reader, 11);
                    }
                    reader.Close();
                }
                catch (SqlException ex)
                {
                    throw ex;
                }

                //Consultamos los teléfonos
                SqlDataReader readerT = baseDatos.ejecutarConsulta(consultaT);
                try
                {
                    if (readerT.Read())
                    {
                        telefono1 = SafeGetInt32(readerT, 0);
                    }
                    if (readerT.Read())
                    {
                        telefono2 = SafeGetInt32(readerT, 0);
                    }
                    readerT.Close();
                }
                catch (SqlException ex)
                {
                    throw ex;
                }
                //Encapsulo los datos
                rh = new EntidadRecursoH(cedula, nombre, pApellido, sApellido, correo,
                        usuario, contrasena, perfil, idProy, rol, telefono1, telefono2, idrh, fechaModif);
            }
            catch (SqlException ex)
            {
                throw ex;
            }
            return rh;
        }
 internal void asignarRecurso(EntidadRecursoH rec, object p)
 {
     try
     {
         controladoraBDProyecto.asignarRecurso(rec, (string)p);
     }
     catch (SqlException ex)
     {
         throw ex;
     }
 }
 internal void desasignarRecurso(EntidadRecursoH rec)
 {
     try
     {
         controladoraBDProyecto.desasignarRecurso(rec);
     }
     catch (SqlException ex)
     {
         throw ex;
     }
 }
 /**
  * Descripción: Realiza la consulta SQL de modificación de un recurso humano en la base de datos, modifica tablas Usuario y telefonoUsuario
  * Recibe una entidad recurso humano @rh con la informacón a actualizar
  * Devuelve un valor entero dependiendo del resultado de la consulta:
  * 0:  Actualización correcta de ambas tablas
  * -1: Error actualizando en tabla Usuario
  * -2: Error insertando en tabla telefonoUsuario
  * 2627: Error de atributo duplicado (cedula o nombre de usuario).
  */
 public int modificaRH(int cedula, string nombre, string pApellido, string sApellido, string correo, string nomUsuario, string contra, char perfil, int idProy, string rol, int telefono1, int telefono2, int idrh, DateTime fecha)
 {
     EntidadRecursoH modRH = new EntidadRecursoH(cedula, nombre, pApellido, sApellido, correo, nomUsuario, contra, perfil, idProy, rol, telefono1, telefono2, idrh, fecha);
     try
     {
         return controlBD.modificaRH(modRH);
     }
     catch (SqlException ex)
     {
         //throw ex;
         return ex.Number;
     }
 }
 /* Descripcion: Despliega los recursos de forma Nombre,Apellido,Apellido y Rol
 *
 * REQ: EntidadRecursoH
 *
 * RET: String
 */
 protected string getNombreBonito(EntidadRecursoH e)
 {
     return e.Nombre + " " + e.PApellido + " " + e.SApellido + " - " + e.Rol;
 }
        /* Descripcion: Encargado de pasar los recursos asignados a recursos disponibles
        *
        * REQ: object, EventArgs
        *
        * RET: N/A
        */
        protected void btnIzquierda_Click(object sender, EventArgs e)
        {
            List<int> l = new List<int>();
            int cont = 0;
            foreach (ListItem item in AsignadosChkBox.Items)
            {
                if (item.Selected)
                {
                    l.Add(cont);
                }
                cont++;
            }

            l.Reverse();
            foreach (var i in l)
            {
                EntidadRecursoH ent = new EntidadRecursoH(recursosAsignados[i]);
                recursosDisponibles.Add(ent);
                recursosAsignados.RemoveAt(i);
            }

            actualizarViewState();
            actualizarCheckBoxList();
        }
 /**
  * Descripcion: llena los campos de texto y combobox con la informacion de un recurso hummno.
  * Recibe: Una entidad recurso humano @rec que contiene la información para llenar los campos.
  * No devuelve nada.
  */
 protected void llenaCampos(EntidadRecursoH rec)
 {
     //Se guarda el id del último usuario consultado
     ViewState["idrh"] = rec.IdRH;
     //Se llenan los campos
     int d1ced = rec.Cedula / 100000000;
     int d2_5ced = rec.Cedula / 10000-(d1ced*10000);
     string d2_5cedS = (d2_5ced < 1000) ? ((d2_5ced < 100) ? ((d2_5ced < 10) ? ("000" + d2_5ced) : ("00" + d2_5ced)) : ("0" + d2_5ced)) : ("" + d2_5ced);
     int d6_9ced = rec.Cedula % 10000;
     string d6_9cedS = (d6_9ced < 1000) ? ((d6_9ced < 100) ? ((d6_9ced < 10) ? ("000" + d6_9ced) : ("00" + d6_9ced)) : ("0" + d6_9ced)) : ("" + d6_9ced);
     cedula.Value = d1ced + "-" + d2_5cedS + "-" + d6_9cedS;
     nombre.Value = rec.Nombre;
     pApellido.Value = rec.PApellido;
     sApellido.Value = rec.SApellido;
     correo.Value = rec.Correo;
     usuario.Value = rec.NomUsuario;
     contrasena1.Value = rec.Contra;
     //Si no hay telefono asociado deja los campos en blanco
     int d1_4tel1 = rec.Telefono1 / 10000;
     int d5_8tel1 = rec.Telefono1 % 10000;
     string d1_4tel1S = (d1_4tel1 < 1000) ? ((d1_4tel1 < 100) ? ((d1_4tel1 < 10) ? ("000" + d1_4tel1) : ("00" + d1_4tel1)) : ("0" + d1_4tel1)) : ("" + d1_4tel1);
     string d5_8tel1S = (d5_8tel1 < 1000) ? ((d5_8tel1 < 100) ? ((d5_8tel1 < 10) ? ("000" + d5_8tel1) : ("00" + d5_8tel1)) : ("0" + d5_8tel1)) : ("" + d5_8tel1);
     telefono1.Value = (rec.Telefono1 != -1) ? (d1_4tel1S+"-"+ d5_8tel1S) : "";
     int d1_4tel2 = rec.Telefono1 / 10000;
     int d5_8tel2 = rec.Telefono2 % 10000;
     string d1_4tel2S = (d1_4tel2 < 1000) ? ((d1_4tel2 < 100) ? ((d1_4tel2 < 10) ? ("000" + d1_4tel2) : ("00" + d1_4tel2)) : ("0" + d1_4tel2)) : ("" + d1_4tel2);
     string d5_8tel2S = (d5_8tel2 < 1000) ? ((d5_8tel2 < 100) ? ((d5_8tel2 < 10) ? ("000" + d5_8tel2) : ("00" + d5_8tel2)) : ("0" + d5_8tel2)) : ("" + d5_8tel2);
     telefono2.Value = (rec.Telefono2 != -1) ? (d1_4tel2S + "-" + d5_8tel2S) : "";
     //Dependiendo del perfil selecciona una opcion del combobox perfil
     switch (rec.Perfil)
     {
         case ' ':
             //No se seleccionó perfil
             perfil.SelectedIndex = 0;
             break;
         case 'A':
             perfil.SelectedIndex = 1;
             break;
         case 'M':
             perfil.SelectedIndex = 2;
             break;
         default:
             perfil.SelectedIndex = 0;
             break;
     }
     //Dependiendo del rol selecciona una opcion del combobox rol
     switch (rec.Rol)
     {
         case "":
             //No se seleccionó rol
             rol.SelectedIndex = 0;
             break;
         case "Lider":
             rol.SelectedIndex = 1;
             break;
         case "Tester":
             rol.SelectedIndex = 2;
             break;
         case "Usuario":
             rol.SelectedIndex = 3;
             break;
         default:
             rol.SelectedIndex = 0;
             break;
     }
 }
 /*
  * Descripcion: Constructor de copia.
  * Recibe: La entidad a copiar
  * Devuelve la entidadRH construida
  */
 public EntidadRecursoH(EntidadRecursoH e)
 {
     this.idRH = e.IdRH;
     this.Cedula = e.cedula;
     this.Nombre = e.nombre;
     this.PApellido = e.pApellido;
     this.SApellido = e.sApellido;
     this.Correo = e.correo;
     this.NomUsuario = e.NomUsuario;
     this.Contra = e.Contra;
     this.Perfil = e.Perfil;
     this.IdProy = e.IdProy;
     this.Rol = e.rol;
     this.Telefono1 = e.Telefono1;
     this.Telefono2 = e.Telefono2;
     this.FechaModif = e.FechaModif;
 }