// actualiza clave
        public bool actualizaClave(string clave, int idUsuario, string usuario)
        {
            string sql = "update usuarios set clave = @clave where id_usuario = @idUsuario";

            bool result = true;

            int rows = 0;

            using (var conn = this._conexionMySQL.getConexionMySQL())
            {
                conn.Open();

                using (var cmd = new MySqlCommand())
                {
                    cmd.Connection = conn;

                    // define parametros
                    cmd.Parameters.AddWithValue("@clave", Utilerias.Base64Encode(clave));
                    cmd.Parameters.AddWithValue("@idUsuario", idUsuario);

                    ManejoSql_My res = Utilerias.EjecutaSQL(sql, ref rows, cmd);

                    if (!res.ok)
                    {
                        throw new Exception(res.numErr + ": " + res.descErr);
                    }
                }
            }

            return(result);
        }
        // inserta un nuevo usuario
        public bool insertaUsuario(string nombreCompleto, string correo, string usuario, string clave, string fecha)
        {
            MySqlTransaction trans;

            bool result = true;

            string sql = string.Empty;

            int rows = 0;

            string error = string.Empty;

            using (var conn = this._conexionMySQL.getConexionMySQL())
            {
                conn.Open();
                using (var cmd = new MySqlCommand())
                {
                    trans = conn.BeginTransaction();

                    try
                    {
                        cmd.Connection  = conn;
                        cmd.Transaction = trans;

                        // inserta actuaizacion
                        sql =
                            "INSERT INTO usuarios (nombre_completo, correo, fecha_creacion, usuario, clave, status) " +
                            "VALUES (@nombreCompleto, @correo, @fecha, @usuario, @clave, @status)";

                        string claveBase64 = Utilerias.Base64Encode(clave);

                        // define parametros
                        cmd.Parameters.AddWithValue("@nombreCompleto", nombreCompleto);
                        cmd.Parameters.AddWithValue("@correo", correo);
                        cmd.Parameters.AddWithValue("@usuario", usuario);
                        cmd.Parameters.AddWithValue("@clave", claveBase64);
                        cmd.Parameters.AddWithValue("@status", "A");
                        cmd.Parameters.AddWithValue("@fecha", fecha);

                        ManejoSql_My res = Utilerias.EjecutaSQL(sql, ref rows, cmd);

                        if (!res.ok)
                        {
                            throw new Exception(res.numErr + ": " + res.descErr);
                        }

                        trans.Commit();
                    }
                    catch (Exception e)
                    {
                        trans.Rollback();
                        throw new Exception(e.Message);
                    }
                }
            }

            return(result);
        }
        // valida que la clave es correcta
        public bool validaClave(string claveActual, int _idUsuario)
        {
            bool result = false;

            string sql = "select count(*) from usuarios where clave = @clave and id_usuario = @idUsuario";

            // define conexion con la cadena de conexion
            using (var conn = this._conexionMySQL.getConexionMySQL())
            {
                // abre la conexion
                conn.Open();

                using (var cmd = new MySqlCommand())
                {
                    cmd.Connection = conn;

                    // define parametros
                    cmd.Parameters.AddWithValue("@clave", Utilerias.Base64Encode(claveActual));
                    cmd.Parameters.AddWithValue("@idUsuario", _idUsuario);

                    ManejoSql_My res = Utilerias.EjecutaSQL(sql, cmd);

                    if (res.ok)
                    {
                        while (res.reader.Read())
                        {
                            int count = Convert.ToInt16(res.reader[0]);

                            if (count > 0)
                            {
                                result = true;
                            }
                        }
                    }
                    else
                    {
                        throw new Exception(res.numErr + ": " + res.descErr);
                    }

                    // cerrar el reader
                    res.reader.Close();
                }
            }

            return(result);
        }
        // obtiene siguiente bloque
        public int getSigBloque()
        {
            int result = 0;

            string sql = "select ifnull(max(num_bloque), 0) bloque from actualizacion";

            // define conexion con la cadena de conexion
            using (var conn = this._conexionMySQL.getConexionMySQL())
            {
                // abre la conexion
                conn.Open();

                using (var cmd = new MySqlCommand())
                {
                    cmd.Connection = conn;

                    ManejoSql_My res = Utilerias.EjecutaSQL(sql, cmd);

                    if (res.ok)
                    {
                        if (res.reader.HasRows)
                        {
                            while (res.reader.Read())
                            {
                                result = Convert.ToInt32(res.reader["bloque"]);
                            }
                        }
                        else
                        {
                            result = 0;
                        }
                    }
                    else
                    {
                        throw new Exception(res.numErr + ": " + res.descErr);
                    }

                    // cerrar el reader
                    res.reader.Close();
                }
            }

            return(result);
        }
        // obtiene los bloques dentro de un rango de fechas
        public List <int> obtieneBloques(string fechaIni, string fechaFin)
        {
            List <int> result = new List <int>();

            string sql =
                "select num_bloque from actualizacion " +
                "where fecha between @fechaIni and @fechaFin group by num_bloque";

            // define conexion con la cadena de conexion
            using (var conn = this._conexionMySQL.getConexionMySQL())
            {
                // abre la conexion
                conn.Open();

                using (var cmd = new MySqlCommand())
                {
                    cmd.Connection = conn;

                    // define parametros
                    cmd.Parameters.AddWithValue("@fechaIni", fechaIni);
                    cmd.Parameters.AddWithValue("@fechaFin", fechaFin);

                    ManejoSql_My res = Utilerias.EjecutaSQL(sql, cmd);

                    if (res.ok)
                    {
                        while (res.reader.Read())
                        {
                            result.Add(Convert.ToInt16(res.reader["num_bloque"]));
                        }
                    }
                    else
                    {
                        throw new Exception(res.numErr + ": " + res.descErr);
                    }

                    // cerrar el reader
                    res.reader.Close();
                }
            }

            return(result);
        }
        // regresa toda la informacion sobre los articulos a actualizar
        public List <Actualizacion> obtieneInformacion(string fechaIni, string fechaFin, int bloque, bool pendiente, bool realizado)
        {
            List <Actualizacion> result = new List <Actualizacion>();
            Actualizacion        ent;

            // string sql = "select idusuario, usuario from activos_usuarios where usuario = @usuario and clave = @clave";

            string sql =
                "select ac.id_actualizacion, ac.num_bloque, ac.fecha, ac.clave_articulo, a.nombre, " +
                "if(ac.fidel = 'P' , 'PENDIENTE', 'REALIZADO') as fidel, " +
                "if(ac.heroico = 'P' , 'PENDIENTE', 'REALIZADO') as heroico, " +
                "if(ac.libertad = 'P' , 'PENDIENTE', 'REALIZADO') as libertad, " +
                "if(ac.status = 'P' , 'PENDIENTE', 'REALIZADO') as status  " +
                "from actualizacion ac " +
                "left join articulos a on (ac.clave_articulo = a.clave) " +
                "where ac.fecha between @fechaIni and @fechaFin ";

            if (bloque > 0)
            {
                sql += "and ac.num_bloque = @bloque ";
            }

            if (pendiente)
            {
                if (realizado)
                {
                    sql += "and (ac.status = 'R' or ac.status = 'P')";
                }
                else
                {
                    sql += "and (ac.status = 'P')";
                }
            }
            else
            if (realizado)
            {
                sql += "and (ac.status = 'R')";
            }

            sql += " order by ac.num_bloque asc";

            // define conexion con la cadena de conexion
            using (var conn = this._conexionMySQL.getConexionMySQL())
            {
                // abre la conexion
                conn.Open();

                using (var cmd = new MySqlCommand())
                {
                    cmd.Connection = conn;

                    // define parametros
                    cmd.Parameters.AddWithValue("@fechaIni", fechaIni);
                    cmd.Parameters.AddWithValue("@fechaFin", fechaFin);

                    if (bloque > 0)
                    {
                        cmd.Parameters.AddWithValue("@bloque", bloque);
                    }

                    ManejoSql_My res = Utilerias.EjecutaSQL(sql, cmd);

                    if (res.ok)
                    {
                        while (res.reader.Read())
                        {
                            ent = new Modelos.Actualizacion();

                            ent.idActualizacion = Convert.ToInt16(res.reader["id_actualizacion"]);
                            ent.claveArticulo   = Convert.ToString(res.reader["clave_articulo"]);
                            ent.numBloque       = Convert.ToInt16(res.reader["num_bloque"]);

                            ent.fecha = Convert.ToString(res.reader["fecha"]);

                            ent.fidel    = Convert.ToString(res.reader["fidel"]);
                            ent.heroico  = Convert.ToString(res.reader["heroico"]);
                            ent.libertad = Convert.ToString(res.reader["libertad"]);

                            ent.status = Convert.ToString(res.reader["status"]);

                            ent.nombreArticulo = Convert.ToString(res.reader["nombre"]);

                            result.Add(ent);
                        }
                    }
                    else
                    {
                        throw new Exception(res.numErr + ": " + res.descErr);
                    }

                    // cerrar el reader
                    res.reader.Close();
                }
            }

            return(result);
        }
        // guarda actualizacion
        public bool guardaActualizacion(List <Articulos> seleccionados, int bloque, string fecha)
        {
            MySqlTransaction trans;

            bool result = true;

            string sql = string.Empty;

            long idInserted = 0;
            int  rows       = 0;

            string error = string.Empty;


            using (var conn = this._conexionMySQL.getConexionMySQL())
            {
                conn.Open();
                using (var cmd = new MySqlCommand())
                {
                    trans = conn.BeginTransaction();

                    try
                    {
                        cmd.Connection  = conn;
                        cmd.Transaction = trans;

                        cmd.Parameters.Clear();

                        foreach (Modelos.Articulos art in seleccionados)
                        {
                            // inserta actuaizacion
                            sql =
                                "INSERT INTO actualizacion (num_bloque, fecha, clave_articulo, fidel, heroico, libertad, status) " +
                                "VALUES (@numBloque, @fecha, @claveArticulo, @fidel, @heroico, @libertad, @status)";

                            // define parametros
                            cmd.Parameters.AddWithValue("@numBloque", bloque);
                            cmd.Parameters.AddWithValue("@claveArticulo", art.clave);
                            cmd.Parameters.AddWithValue("@fidel", "P");
                            cmd.Parameters.AddWithValue("@heroico", "P");
                            cmd.Parameters.AddWithValue("@libertad", "P");
                            cmd.Parameters.AddWithValue("@status", "P");
                            cmd.Parameters.AddWithValue("@fecha", fecha);

                            ManejoSql_My res = Utilerias.EjecutaSQL(sql, ref rows, cmd);

                            if (res.ok)
                            {
                                if (rows != 0)
                                {
                                    idInserted = cmd.LastInsertedId;
                                }
                            }
                            else
                            {
                                throw new Exception(res.numErr + ": " + res.descErr);
                            }

                            cmd.Parameters.Clear();

                            // inserta actualizacion_det
                            string sqlDet =
                                "INSERT INTO actualizacion_det (id_actualizacion, prec_lista, prec_minimo, prec_mayoreo, prec_filial, prec_imss, medio_mayoreo) " +
                                "VALUES (@idAct, @precLista, @precMinimo, @precMayo, @precFilial, @precImss, @medioMayo)";

                            // define parametros
                            cmd.Parameters.AddWithValue("@idAct", idInserted);
                            cmd.Parameters.AddWithValue("@precLista", art.precLista);
                            cmd.Parameters.AddWithValue("@precMinimo", art.precMinimo);
                            cmd.Parameters.AddWithValue("@precMayo", art.precMayoreo);
                            cmd.Parameters.AddWithValue("@precFilial", art.precFilial);
                            cmd.Parameters.AddWithValue("@precImss", art.precIMSS);
                            cmd.Parameters.AddWithValue("@medioMayo", art.medioMayoreo);

                            res = Utilerias.EjecutaSQL(sqlDet, ref rows, cmd);

                            if (!res.ok)
                            {
                                throw new Exception(res.numErr + ": " + res.descErr);
                            }

                            cmd.Parameters.Clear();
                        }

                        trans.Commit();
                    }
                    catch (Exception e)
                    {
                        trans.Rollback();
                        throw new Exception(e.Message);
                    }
                }
            }

            return(result);
        }