//Constructor
 public Cuestionario(Candidato cand, string claveCuest = null, PuestoEvaluado pEv = null, int maxAccess = 0, int accesos = 0, Bloque bloq = null)
 {
     clave = claveCuest;
     nroAccesos = accesos;
     maxAccesos = maxAccess;
     candidatoAsociado = cand;
     puestoEvaluado = pEv;
     ultimoBloque = bloq;
 }
 /*
  * La mision que justifica la existencia de los gestores es hacer de "interfaz" entre las ENTIDADES y el resto del sistema
  * Por esto el gestor debe tener la responsabilidad de instanciar la/s que le corresponde gestionar
  */
 public Candidato instanciarCandidato(string nombre, string apellido, string tipo, string nroDocumento, int nroCandidato = 0, int nroEmpleado = 0)
 {
     Candidato nuevoCandidato = new Candidato(nombre, apellido, tipo, nroDocumento, nroCandidato, nroEmpleado);
     return nuevoCandidato;
 }
 /*
  * La mision que justifica la existencia de los gestores es hacer de "interfaz" entre las ENTIDADES y el resto del sistema
  * Por esto el gestor debe tener la responsabilidad de instanciar la/s que le corresponde gestionar
  */
 public Cuestionario instanciarCuestionario(Candidato canditoAsociado, string claveCuestionario, PuestoEvaluado puestoEvAsociado, int accesos = 0)
 {
     int maxAccesos = admBD.darAccesosMaximos();
     Cuestionario nuevoCuestionario = new Cuestionario(canditoAsociado, claveCuestionario, puestoEvAsociado, maxAccesos, accesos, null);
     return nuevoCuestionario;
 }
        //recupera el cuestionario activo, si lo tuviere, para el candidato pasado como parametro
        public Cuestionario cuestionarioAsociado(Candidato candidatoAsociado)
        {
            //Se solicita a la base de datos el retorno del cuestionario activo para el candidato que se pasa como parametro
            List<Cuestionario> nCuestionario = admBD.recuperarCuestionarioActivo(candidatoAsociado);
            //Transforma el retorno de la base de datos en un objeto del tipo cuestionario
            Cuestionario nuevoCuest = null;

            if (nCuestionario != null)
            {
                if (nCuestionario[nCuestionario.Count - 1].Clave != "NO POSEE")
                {
                    if (nCuestionario[nCuestionario.Count - 1].PuestoEvaluado.Codigo != "ELIMINADO")
                    {
                        if (nCuestionario[nCuestionario.Count - 1].Estado.Estado_ == "ACTIVO" || nCuestionario[nCuestionario.Count - 1].Estado.Estado_ == "EN PROCESO")
                        {
                            nuevoCuest = nCuestionario[nCuestionario.Count - 1];

                            if (nuevoCuest.PuestoEvaluado.Caracteristicas == null)
                            {
                                //Re-armamos las relaciones del cuestionario para tener todos los objetos en memoria
                                bool re_construido = admBD.reconstruirRelaciones(nuevoCuest);

                                if (re_construido == false)
                                {
                                    MessageBox.Show("\tNo se pudo recuperar TODOS los datos requeridos para mostrar su cuestionario", "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error);
                                    return null;
                                }
                            }
                        }
                        else
                        {
                            if (nCuestionario[nCuestionario.Count - 1].Estado.Estado_ == "COMPLETO")
                            {
                                MessageBox.Show("\tUSTED YA A COMPLETADO SU CUESTIONARIO PARA ESTA EVALUACION", "INFORMACION", MessageBoxButtons.OK, MessageBoxIcon.Information);
                                return null;
                            }
                            else if (nCuestionario[nCuestionario.Count - 1].Estado.Estado_ == "INCOMPLETO")
                            {
                                MessageBox.Show("\tSU CUESTIONARIO FUE PASADO AL ESTADO INCOMPLETO PARA ESTA EVALUACIÓN", "INFORMACION", MessageBoxButtons.OK, MessageBoxIcon.Information);
                                return null;
                            }
                            else
                            {
                                MessageBox.Show("\tSU CUESTIONARIO FUE PASADO AL ESTADO SIN CONTESTAR PARA ESTA EVALUACIÓN", "INFORMACION", MessageBoxButtons.OK, MessageBoxIcon.Information);
                                return null;
                            }
                        }
                    }
                    else
                    {
                        MessageBox.Show("EL PUESTO DE EVALUACION FUE ELIMINADO", "INFORMACION", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        return null;
                    }
                }
                else
                {
                    MessageBox.Show("NO POSEE UN CUESTIONARIO PARA SER EVALUADO", "INFORMACION", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    return null;
                }
            }

            return nuevoCuest;
        }
        /*
         * - RecuperarCuestionarioActivo tiene la misión de recuperar los datos del cuestionario activo (o en proceso) para un candidato
         */
        public List<Cuestionario> recuperarCuestionarioActivo(Candidato candidato)
        {
            bool conexionExitosa;
            GestorCuestionario gestorCuestionarios = new GestorCuestionario();
            List<Cuestionario> listaCuestionariosAsociados = new List<Cuestionario>(); //Esta es la lista que devuelve el metodo como resultado

            //Declaramos una lista de cuestionarios auxiliar para obtener el historial de cuestionarios del candidato
            List<Cuestionario> preSeleccionCuestionarios = new List<Cuestionario>();

            //Declaramos una lista auxiliar de enteros para almacenar los ID de PUESTOS EVALUADOS
            //con el fin de reconstruir las relaciones minimas en la instanciacion del cuestionario
            List<int> listaIdPuestos = new List<int>();

            //Otra lista auxiliar para guardar los números de bloque
            List<int> listaNroBloque = new List<int>();

            //llamamos al metodo "iniciar conexion"
            conexionExitosa = iniciarConexion();

            //Evaluamos si la conexion se realizo con exito
            if (!conexionExitosa)
            {
                MessageBox.Show("Fallo la conexion con la base de datos");
                terminarConexion();
                return null;
            }

            //Creamos un adaptador llamado "comando" para realizar la consultaSql que definimos abajo
            MySql.Data.MySqlClient.MySqlCommand comando;
            comando = ObjConexion.CreateCommand();

            string consultaSql = "SELECT DISTINCT `clave`, `Puesto Evaluado_idPuesto Evaluado` ,`nroaccesos`, `ultimoBloque` ";
            consultaSql += "FROM `cuestionario` cuest ";
            consultaSql += "JOIN `candidato` cand on (cand.`nro documento` = '" + candidato.NroDoc + "' AND cand.idCandidato = cuest.Candidato_idCandidato) ";
            consultaSql += "JOIN `cuestionario_estado` c_est on (cuest.idCuestionario = c_est.Cuestionario_idCuestionario);";

            //En el adaptador comando hacemos un asignacion en su atributo CommandText de la consultaSql
            comando.CommandText = consultaSql;

            //Se hace la ejecucion del comando con el metodo ExecuterReader
            //y se lo asigna a una variable reader que contendra los resultados de la busqueda en la base de datos
            MySqlDataReader reader = comando.ExecuteReader();

            if (!reader.HasRows)
            {
                //si el reader esta vacio, es qe no encontro a ese candidato
                terminarConexion();
                Cuestionario cues = gestorCuestionarios.instanciarCuestionario(candidato, "NO POSEE", null, 0);
                listaCuestionariosAsociados.Add(cues);
                return listaCuestionariosAsociados;
            }

            //Si el reader contiene datos, se realiza la lectura de todos los ellos.
            while (reader.Read())
            {
                string clave = reader["clave"].ToString();
                int accesos = Int32.Parse(reader["nroAccesos"].ToString());
                int idPuestoEv = Int32.Parse(reader["Puesto Evaluado_idPuesto Evaluado"].ToString());
                int nroBloque;

                if (reader["ultimoBloque"].ToString() == "")//Se contempla la posibilidad de que este número sea nulo
                    nroBloque = 0;//IMPLICA QUE EL CUESTIONARIO ESTA ACTIVO
                else
                    nroBloque = Int32.Parse(reader["ultimoBloque"].ToString());//IMPLICA QUE EL CUESTIONARIO ESTA EN PROCESO

                //Llamamos al gestor de cuestionarios para instanciar el cuestionario que se obtuvo de la base de datos
                Cuestionario cuesAsociado = gestorCuestionarios.instanciarCuestionario(candidato, clave, null, accesos);
                //Cargamos el cuestionario creado a la lista de preSeleccionados
                preSeleccionCuestionarios.Add(cuesAsociado);
                //Cargamos el ID del Puesto Evaludos para luego buscarlo en la base de datos
                listaIdPuestos.Add(idPuestoEv);
                //Cargamos el nroDeBloque
                listaNroBloque.Add(nroBloque);
            }

            /*
             * Como vamos a hacer una llamada a otro metodo que ejecuta una consulta sobre la base de datos
             * Terminamos la conexión antes de seguir adelante
            */
            terminarConexion();

            PuestoEvaluado PuestoEv;
            for (int i = 0; i < listaIdPuestos.Count; i++)
            {
                PuestoEv = this.recuperarPuestoEvaluado(listaIdPuestos[i]);

                List<Estado> listEstado = this.recuperarUltimoEstado(preSeleccionCuestionarios[i]);
                Estado estadoCuest = listEstado[0];

                if (estadoCuest.Estado_ == "ACTIVO" || estadoCuest.Estado_ == "EN PROCESO")
                {
                    //Agrego el puesto evaluado al cuestionario
                    preSeleccionCuestionarios[i].PuestoEvaluado = PuestoEv;
                    //Agrego el estado al cuestionario
                    preSeleccionCuestionarios[i].Estado = estadoCuest;

                    if (Equals(PuestoEv.Codigo, "ELIMINADO") == false)
                    {
                        if (listaNroBloque[i] != 0)//ESTA EN PROCESO
                        {
                            //Agrego el bloque al cuestionario
                            preSeleccionCuestionarios[i].UltimoBloque = this.retornarBloque(preSeleccionCuestionarios[i], listaNroBloque[i]);
                        }
                    }

                    //Luego de agregar el Estado, el bloque y el Puesto Evaluado, agregamos el cuestionario a la lista de retorno
                    listaCuestionariosAsociados.Add(preSeleccionCuestionarios[i]);
                }
                else
                {
                    //Agrego el puesto evaluado al cuestionario
                    preSeleccionCuestionarios[i].PuestoEvaluado = PuestoEv;
                    //Agrego el estado al cuestionario
                    preSeleccionCuestionarios[i].Estado = estadoCuest;
                    listaCuestionariosAsociados.Add(preSeleccionCuestionarios[i]);//Agregamos el error para controlarlo
                }
            }

            return listaCuestionariosAsociados;
        }