/// <summary>
        /// Agrega una columna a la tabla en base al turno pasado como parámetro
        /// </summary>
        /// <param name="turno">Turno registrado</param>
        private void agregarColumna(HorarioHabitualDTO turno)
        {
            //Obtengo la data table
            DataTable dt = (DataTable)asignadoTable.DataSource;

            //Pongo autozise para las columnas
            asignadoTable.ColumnHeadersHeightSizeMode =
                System.Windows.Forms.
                    DataGridViewColumnHeadersHeightSizeMode.AutoSize;

            //Creo las columnas si no hay tabla
            if (dt == null)
            {
                asignadoTable.DataSource = null;
                dt = new DataTable();
                //Area
                dt.Columns.Add("Área", typeof(string));
                dt.Columns[0].ReadOnly = true;
                //Dia
                dt.Columns.Add("Día", typeof(string));
                dt.Columns[1].ReadOnly = true;
                //Ingreso
                dt.Columns.Add("Ingreso", typeof(string));
                dt.Columns[2].ReadOnly = true;
                //Egreso
                dt.Columns.Add("Egreso", typeof(string));
                dt.Columns[3].ReadOnly = true;
                //Duraciòn
                dt.Columns.Add("Duración", typeof(string));
                dt.Columns[4].ReadOnly = true;
                //Confirmado
                dt.Columns.Add("Confirmado", typeof(string));
                dt.Columns[5].ReadOnly = true;
            }

            //Creo la fila
            DataRow fila = dt.NewRow();

            //Cargo los datos
            fila[0] = turno.Area;
            fila[1] = turno.Dia;
            fila[2] = turno.Ingreso;
            fila[3] = turno.Egreso;
            fila[4] = turno.Duracion;
            fila[5] = turno.Confirmado;

            //Otra forma de cargarlos seria hacer lo siguiente:
            //dt.Rows.Add("Sistemas", "Martes", "12:30","15:30", "03:00" ,"SI");

            dt.Rows.Add(fila);

            asignadoTable.DataSource = dt;
        }
        //************************************
        //***** Métodos de escritura *********
        //************************************
        /// <summary>
        /// Asigna el horario habitual pasado por paràmetro como no confirmado
        /// </summary>
        /// <param name="usuario">dni del usuario en formato string</param>
        /// <param name="turno">parametros del turno</param>
        public void crearHorarioHabitual(string usuario, HorarioHabitualDTO horarioHabitual)
        {
            //Abro conexión
            MySqlConnection conexionADO = new MySqlConnection();
            conexionADO.ConnectionString = conexionString;
            conexionADO.Open();

            //Necesito el ID de area para determinar el perìodo actual que le corresponde
            //Creo consulta
            MySqlDataReader data;
            MySqlCommand lectura = new MySqlCommand("SELECT idArea FROM area WHERE nombreArea = '" + horarioHabitual.Area + "';", conexionADO);
            data = lectura.ExecuteReader();
            int idArea = 0;

            if (data.Read())
                idArea = data.GetInt32("idArea");
            else
                throw new SQLErrorException("Área");

            data.Close();

            //Obtengo el perìodo actual
            MySqlDataReader data2;
            MySqlCommand lectura2 = new MySqlCommand("SELECT idPeriodo, nombre, area, inicio, fin, observaciones " +
            "FROM periodo " +
            "WHERE inicio < curdate() AND curdate() < fin AND area = " + idArea, conexionADO);
            data2 = lectura2.ExecuteReader();
            int idPeriodo = 0;

            if (data2.Read())
                idPeriodo = data2.GetInt32("idPeriodo");
            else
                throw new SQLErrorException("Periodo");

            data2.Close();

            // Ahora guardo el horario asignado habitual :D
            string myquerystring1 = "INSERT INTO horario_asignado_habitual (usuario, dia, ingreso, egreso, area, periodo, confirmado) " +
            "VALUES ('" + usuario + "'," + Fecha.getNumeroDia(horarioHabitual.Dia) + "," + horarioHabitual.Ingreso.getSQLFormat() + "," + horarioHabitual.Egreso.getSQLFormat() + "," + idArea +
                    "," + idPeriodo + "," + horarioHabitual.confirmadoForSQL() + ");";

            //Asigno y ejecuto
            MySqlCommand cmd = new MySqlCommand();
            cmd.Connection = conexionADO;
            cmd.CommandText = myquerystring1;
            cmd.ExecuteNonQuery();

            //Registro la solicitud
            this.registrarSolicitudNuevoHorario();
        }
        /// <summary>
        /// Establece como inactivo el turno pasado como parámetro.
        /// </summary>
        /// <param name="usuario"></param>
        /// <param name="turno"></param>
        public void eliminarHorariosHabitual(string usuario, HorarioHabitualDTO turno)
        {
            //Abro conexión
            MySqlConnection conexionADO = new MySqlConnection();
            conexionADO.ConnectionString = conexionString;
            conexionADO.Open();

            //Necesito el ID de area para poder eliminar
            MySqlDataReader data;
            MySqlCommand lectura = new MySqlCommand("SELECT idArea FROM area WHERE nombreArea = '" + turno.Area + "';", conexionADO);
            data = lectura.ExecuteReader();
            int idArea = 0;

            if (data.Read())
                idArea = data.GetInt32("idArea");
            else
                throw new SQLErrorException("Área");

            data.Close();

            //Obtengo el perìodo actual para eliminar el horario que
            //corresponde a este periodo
            MySqlDataReader data2;
            MySqlCommand lectura2 = new MySqlCommand("SELECT idPeriodo, nombre, area, inicio, fin, observaciones " +
            "FROM periodo " +
            "WHERE inicio < curdate() AND curdate() < fin AND area = " + idArea, conexionADO);
            data2 = lectura2.ExecuteReader();
            int idPeriodo = 0;

            if (data2.Read())
                idPeriodo = data2.GetInt32("idPeriodo");
            else
                throw new SQLErrorException("Periodo");

            data2.Close();

            // Ahora pongo como no activo el horario
            string myquerystring3 = "UPDATE horario_asignado_habitual " +
                "SET activo = 0 WHERE " +
                "area = " + idArea + " AND " +
                "usuario = '" + usuario + "' AND " +
                "dia = " + Fecha.getNumeroDia(turno.Dia) + " AND " +
                "periodo = " + idPeriodo + " AND " +
                "ingreso = " + turno.Ingreso.getSQLFormat() + " AND " +
                "egreso = " + turno.Egreso.getSQLFormat() + ";";

            //Asigno y ejecuto 3
            MySqlCommand cmd = new MySqlCommand();
            cmd.Connection = conexionADO;
            cmd.CommandText = myquerystring3;
            cmd.ExecuteNonQuery();

            //Obtengo el id del horario que di de baja.
            MySqlDataReader data4;
            MySqlCommand lectura4 = new MySqlCommand("SELECT * " +
            "FROM horario_asignado_habitual " +
            "WHERE " +
                "area = " + idArea + " AND " +
                "usuario = '" + usuario + "' AND " +
                "dia = " + Fecha.getNumeroDia(turno.Dia) + " AND " +
                "periodo = " + idPeriodo + " AND " +
                "ingreso = " + turno.Ingreso.getSQLFormat() + " AND " +
                "egreso = " + turno.Egreso.getSQLFormat() + ";"
            , conexionADO);
            data4 = lectura4.ExecuteReader();
            int idHorario = 0;

            if (data4.Read())
                idHorario = data4.GetInt32("idHorarioHabitual");
            else
                throw new SQLErrorException("ID");

            data4.Close();

            //Elimino la solicitud de asignaciòn para dicho horario.
            string myquerystring4 = "DELETE FROM nuevo_horario_habitual " +
                "WHERE " +
                "horarioHabitual = " + idHorario + ";";

            //Asigno y ejecuto 4
            MySqlCommand cmd1 = new MySqlCommand();
            cmd1.Connection = conexionADO;
            cmd1.CommandText = myquerystring4;
            cmd1.ExecuteNonQuery();
        }
        /// <summary>
        /// Crea una solicitud para los administradores para el cambio de horario
        /// </summary>
        /// <param name="usuario"></param>
        /// <param name="turno"></param>
        public void registrarSolicitudCambioHorario(string usuario, HorarioHabitualDTO turno)
        {
            /* Primero debo obtener el id del horario que se desea cambiar.
             *Para saber cual es el horario, ademas de el usuario y los datos
             *contenidos en el DTO, debo obtener el IDarea y el periodo actual
             */

            //Abro conexión
            MySqlConnection conexionADO = new MySqlConnection();
            conexionADO.ConnectionString = conexionString;
            conexionADO.Open();

            //Necesito el ID de area
            MySqlDataReader data;
            MySqlCommand lectura = new MySqlCommand("SELECT idArea FROM area WHERE nombreArea = '" + turno.Area + "';", conexionADO);
            data = lectura.ExecuteReader();
            int idArea = 0;

            if (data.Read())
                idArea = data.GetInt32("idArea");
            else
                throw new SQLErrorException("Área");

            data.Close();

            //Obtengo el perìodo actual
            MySqlDataReader data2;
            MySqlCommand lectura2 = new MySqlCommand("SELECT idPeriodo, nombre, area, inicio, fin, observaciones " +
            "FROM periodo " +
            "WHERE inicio < curdate() AND curdate() < fin AND area = " + idArea, conexionADO);
            data2 = lectura2.ExecuteReader();
            int idPeriodo = 0;

            if (data2.Read())
                idPeriodo = data2.GetInt32("idPeriodo");
            else
                throw new SQLErrorException("Periodo");

            data2.Close();

            //Ahora puedo obtener el id del horario con estos datos
            MySqlDataReader data3;
            string comando3 = "SELECT * " +
                "FROM horario_asignado_habitual WHERE " +
                "area = " + idArea + " AND " +
                "usuario = '" + usuario + "' AND " +
                "dia = " + Fecha.getNumeroDia(turno.Dia) + " AND " +
                "periodo = " + idPeriodo + " AND " +
                "ingreso = " + turno.Ingreso.getSQLFormat() + " AND " +
                "egreso = " + turno.Egreso.getSQLFormat() + ";";
            MySqlCommand lectura3 = new MySqlCommand(comando3, conexionADO);
            data3 = lectura3.ExecuteReader();
            int idHorario = 0;

            if (data3.Read())
                idHorario = data3.GetInt32("idHorarioHabitual");
            else
                throw new SQLErrorException("Horario Habitual");

            data3.Close();

            //Compruebo que no se haya solicitado con anterioridad dicho cambio
            //Obtengo el perìodo actual
            MySqlDataReader data4;
            MySqlCommand lectura4 = new MySqlCommand("SELECT * " +
            "FROM cambio_horario_habitual " +
            "WHERE horarioHabitual = " + idHorario + " AND activo = 1;", conexionADO);
            data4 = lectura4.ExecuteReader();

            if (data4.Read())
                throw new CambioHorarioInvalidoException();
            data4.Close();

            // Ahora guardo la solicitud
            string myquerystring1 = "INSERT INTO cambio_horario_habitual (horarioHabitual) " +
            "VALUES (" + idHorario.ToString() + ");";

            //Asigno y ejecuto
            MySqlCommand cmd = new MySqlCommand();
            cmd.Connection = conexionADO;
            cmd.CommandText = myquerystring1;
            cmd.ExecuteNonQuery();
        }
        //**********************************
        //***** Métodos de lectura *********
        //**********************************
        /// <summary>
        /// Obtiene los turnos registrados para un usuario... tanto si estan confirmados como si no lo están
        /// </summary>
        /// <param name="usuario"></param>
        /// <returns></returns>
        public List<HorarioHabitualDTO> horariosHabitualesRegistrados(string usuario)
        {
            //Abro conexión
            MySqlConnection conexionADO = new MySqlConnection();
            conexionADO.ConnectionString = conexionString;
            conexionADO.Open();

            //Creo lector =) y efectuo la consulta
            MySqlDataReader data;
            MySqlCommand lectura = new MySqlCommand("SELECT * FROM horario_asignado_habitual_duracion as h, area as a WHERE " +
                "h.usuario = '" + usuario + "' AND " +
                "h.area = a.idArea;", conexionADO);
            data = lectura.ExecuteReader();

            //armo la lista
            List<HorarioHabitualDTO> turnos = new List<HorarioHabitualDTO>();
            while (data.Read())
            {
                HorarioHabitualDTO t = new HorarioHabitualDTO();
                t.Area = data.GetString("nombreArea");
                t.Dia = Fecha.getDiaSemana(data.GetInt32("dia"));
                t.Ingreso = new Horario(data.GetString("ingreso"));
                t.Egreso = new Horario(data.GetString("egreso"));
                t.Duracion = new Horario(data.GetString("duracion"));

                int confirmacion = data.GetInt32("confirmado");
                if (confirmacion == 0)
                    t.Confirmado = "NO";
                else
                    t.Confirmado = "SI";

                turnos.Add(t);
            }

            data.Close();

            return turnos;
        }
        /// <summary>
        /// Valida el horario ingresado y lo guarda en la base de datos
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void guardarButton_Click(object sender, EventArgs e)
        {
            if(areaCombo.SelectedIndex == -1)
            {
                MessageBox.Show("No se seleccionó un área", "Error", MessageBoxButtons.OK , MessageBoxIcon.Error);
                return;
            }

            if (diaCombo.SelectedIndex == -1)
            {
                MessageBox.Show("No se seleccionó un día", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }

            try
            {
                //este constructor verifica la integridad
                Horario ingreso = new Horario(ingresoText.Text);
                Horario egreso = new Horario(egresoText.Text);

                //el constructor verifica la integridad
                RangoHorario rango = new RangoHorario(ingreso, egreso);

                //el tamaño minimo es 59 minutos
                if (rango.rangoMenor(0, 59))
                    throw new RangoMinimoException();

                //armo la entidad turno DTO
                HorarioHabitualDTO turno = new HorarioHabitualDTO();
                turno.Area = areaCombo.Text;
                turno.Dia = diaCombo.Text;
                turno.Ingreso = ingreso;
                turno.Egreso = egreso;
                turno.Duracion = rango.getDuracion();
                turno.Confirmado = "NO";

                //hay que validar que no se superponga a otros horarios

                foreach (HorarioHabitualDTO t in turnos)
                {
                    if (Fecha.getNumeroDia(t.Dia) == Fecha.getNumeroDia(turno.Dia))
                    {
                        RangoHorario r1 = new RangoHorario(t.Ingreso, t.Egreso);

                        if (r1.rangoSuperpuesto(rango))
                            throw new TurnoSuperpuestoException();

                    }
                }

                //y finalmente guardo el horario
                GestorHorarios gestor = new GestorHorarios();
                gestor.crearHorarioHabitual(this.usuario, turno);

                // y si anda todo bien agrego la columna a la tabla
                this.agregarColumna(turno);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
        /// <summary>
        /// Elimina el horario seleccionado solo si no esta confirmado
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void eliminarButton_Click(object sender, EventArgs e)
        {
            try
            {
                if (asignadoTable.SelectedRows.Count == 0)
                    throw new NoSeleccionoFilaException();

                //Obtengo las celdas de la fila seleccionada
                DataGridViewCellCollection celdas = asignadoTable.SelectedRows[0].Cells;

                //La quinta celda corresponde al valor de confirmacion
                if (celdas[5].Value.ToString().Equals("SI"))
                    throw new EliminacionInvalidaException();

                //Si esta NO confiramda procedo a armar el turnoDTO
                HorarioHabitualDTO turno = new HorarioHabitualDTO();
                turno.Area = celdas[0].Value.ToString();
                turno.Dia = celdas[1].Value.ToString();
                turno.Ingreso = new Horario(celdas[2].Value.ToString());
                turno.Egreso = new Horario(celdas[3].Value.ToString());
                turno.Duracion = new Horario(celdas[4].Value.ToString());
                turno.Confirmado = celdas[5].Value.ToString();

                //Elimino el horario de la BD
                GestorHorarios turnoDAO = new GestorHorarios();
                turnoDAO.eliminarHorariosHabitual(usuario, turno);

                //Carga los horarios restantes en la tabla
                turnos = turnoDAO.horariosHabitualesRegistrados(this.usuario);
                asignadoTable.DataSource = null;
                foreach (HorarioHabitualDTO t in turnos)
                {
                    this.agregarColumna(t);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
        /// <summary>
        /// Para cuando se hace click en cambiar horario 
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void cambiarHorarioButton_Click(object sender, EventArgs e)
        {
            try
            {
                if (asignadoTable.SelectedRows.Count == 0)
                    throw new NoSeleccionoFilaException();

                //Obtengo las celdas de la fila seleccionada
                DataGridViewCellCollection celdas = asignadoTable.SelectedRows[0].Cells;

                //La quinta celda corresponde al valor de confirmacion
                if (celdas[5].Value.ToString().Equals("NO"))
                    throw new CambioHorarioInvalidoException();

                //Procedo a armar el turnoDTO
                HorarioHabitualDTO turno = new HorarioHabitualDTO();
                turno.Area = celdas[0].Value.ToString();
                turno.Dia = celdas[1].Value.ToString();
                turno.Ingreso = new Horario(celdas[2].Value.ToString());
                turno.Egreso = new Horario(celdas[3].Value.ToString());
                turno.Duracion = new Horario(celdas[4].Value.ToString());
                turno.Confirmado = celdas[5].Value.ToString();

                //Registro la solicitud para el admin
                GestorHorarios horarioDAO = new GestorHorarios();
                horarioDAO.registrarSolicitudCambioHorario(this.usuario, turno);

                //Mensajito
                MessageBox.Show("Solicitud de cambio registrada con éxito.", "Éxito",
                    MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            catch (CambioHorarioInvalidoException ex)
            {
                MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            catch (NoSeleccionoFilaException ex)
            {
                MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }