/// <summary>
        /// Nombre: Btn_Consultar_Click
        ///
        /// Descripción: Método que realiza la consulta de los grupos según los filtros seleccionados.
        ///
        /// Usuario Creo: Juan Alberto Hernández Negrete
        /// Fecha Creo: 22 Octubre 2013 18:07 p.m.
        /// Usuario Modifico: Roberto González Oseguera
        /// Fecha Modifico: 21-feb-2014
        /// Causa modificación: Se cambia <DateTime?> por <MySql.Data.Types.MySqlDateTime?> para recibir
        ///                     un campo fecha al utilizar una base de datos MySQL
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Btn_Consultar_Click(object sender, EventArgs e)
        {
            Cls_Ope_Grupos_Negocio Obj_Grupos = new Cls_Ope_Grupos_Negocio(); //Variable para realizar peticiones a la clase de negocios.
            DataTable Dt_Grupos = null;                                       //Variable que almacena los resultados de grupos segun los filtros seleccionados.

            try
            {
                //Establecer los filtros de la búsqueda de grupos.
                Grid_Grupos.DataSource              = new DataTable();
                Obj_Grupos.P_Persona_Tramita        = (string.IsNullOrEmpty(Txt_Persona_Tramita.Text)) ? string.Empty : Txt_Persona_Tramita.Text.Trim();
                Obj_Grupos.P_Empresa                = (string.IsNullOrEmpty(Txt_Empresa.Text)) ? string.Empty : Txt_Empresa.Text.Trim();
                Obj_Grupos.P_Fecha_Inicio_Vigencia  = Dtp_Fecha_Inicio.Value;
                Obj_Grupos.P_Fecha_Termino_Vigencia = Dtp_Fecha_Fin.Value;
                //Se realiza la consulta de grupos.
                Dt_Grupos = Obj_Grupos.Consultar_Grupos();

                //Cargamos la tabla con los resultados de la búsqueda de grupos.
                if (Dt_Grupos is DataTable)
                {
                    Grid_Grupos.DataSource = Dt_Grupos.AsEnumerable()
                                             .Select(grupo => new
                    {
                        NO_VENTA               = grupo.IsNull("No_Venta") ? string.Empty : grupo.Field <string>("No_Venta"),
                        FECHA_TRAMITE          = grupo.IsNull("Fecha_Tramite") ? null : grupo.Field <MySql.Data.Types.MySqlDateTime?>("Fecha_Tramite"),
                        PERSONA_TRAMITA        = grupo.IsNull("Persona_Tramita") ? string.Empty : grupo.Field <string>("Persona_Tramita"),
                        EMPRESA                = grupo.IsNull("Empresa") ? string.Empty : grupo.Field <string>("Empresa"),
                        FECHA_INICIO_VIGENCIA  = grupo.IsNull("Fecha_Tramite") ? null : grupo.Field <MySql.Data.Types.MySqlDateTime?>("Fecha_Inicio_Vigencia"),
                        FECHA_TERMINO_VIGENCIA = grupo.IsNull("Fecha_Tramite") ? null : grupo.Field <MySql.Data.Types.MySqlDateTime?>("Fecha_Fin_Vigencia"),
                        APLICA_DIAS_FESTIVOS   = grupo.IsNull("Aplican_Dias_Festivos") ? string.Empty : grupo.Field <string>("Aplican_Dias_Festivos"),
                        TOTAL   = grupo.IsNull(Ope_Ventas.Campo_Total) ? 0M : grupo.Field <decimal>(Ope_Ventas.Campo_Total),
                        ESTATUS = grupo.IsNull(Ope_Ventas.Campo_Estatus) ? string.Empty : grupo.Field <string>(Ope_Ventas.Campo_Estatus)
                    })
                                             .ToList();
                }

                Array.ForEach(Grid_Grupos.Columns.OfType <DataGridViewColumn>().ToArray(), columna => {
                    columna.Visible = false;

                    switch (columna.HeaderText)
                    {
                    case "FECHA_TRAMITE":
                        columna.Visible = true;
                        columna.Width   = 120;
                        break;

                    case "PERSONA_TRAMITA":
                        columna.Visible = true;
                        columna.Width   = 142;
                        break;

                    case "EMPRESA":
                        columna.Visible = true;
                        break;

                    case "ESTATUS":
                        columna.Visible = true;
                        break;

                    default:
                        break;
                    }
                    if (!string.IsNullOrEmpty(columna.HeaderText))
                    {
                        columna.HeaderText = columna.HeaderText.Replace("_", " ");
                    }
                });

                Array.ForEach(Grid_Grupos.Rows.OfType <DataGridViewRow>().ToArray(), fila =>
                {
                    Array.ForEach(fila.Cells.OfType <DataGridViewCell>().ToArray(), celda => { celda.Style.BackColor = Color.WhiteSmoke; celda.Style.Font = new Font("Tahoma", 9, FontStyle.Regular); });
                });
            }
            catch (Exception Ex)
            {
                MessageBox.Show(this, Ex.Message, "Error - Método:[Btn_Consultar_Click]", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
        ///*******************************************************************************************************
        ///NOMBRE_FUNCIÓN: Imprimir_Recibo
        ///DESCRIPCIÓN: Formar un string con la información del recibo de pago y anviar a la impresora
        ///PARÁMETROS:
        ///CREO: Roberto González Oseguera
        ///FECHA_CREO: 24-oct-2013
        ///MODIFICÓ:
        ///FECHA_MODIFICÓ:
        ///CAUSA_MODIFICACIÓN:
        ///*******************************************************************************************************
        private void Imprimir_Recibo()
        {
            StringBuilder Texto_Imprimir = new StringBuilder(120);
            // consultar parámetros
            var Obj_Parametros = new Cls_Apl_Parametros_Negocio();

            Obj_Parametros = Obj_Parametros.Obtener_Parametros();
            int     Cantidad_Producto;
            decimal Total_Producto;
            decimal Total_Pagado;
            Dictionary <string, string> Dic_Formas_Pago = Obtener_Formas_Pago();

            // validar que la tabla no sea nulo
            if (Dt_Datos_Pago != null && Dt_Datos_Pago.Columns.Contains("ACCESOS"))
            {
                // formar texto del recibo
                Texto_Imprimir.AppendLine(Obj_Parametros.P_Encabezado_Recibo + "\n");
                Texto_Imprimir.AppendLine("Fecha " + DateTime.Now.ToString("dd-MMM-yyyy HH:mm:ss").ToLower());
                // encabezado detalles:
                Texto_Imprimir.AppendLine("".PadLeft(40, '-') + "\n" + "  Producto                       Precio\n" + "".PadLeft(40, '-'));
                // recorrer la tabla
                foreach (DataRow Fila_Venta in Dt_Datos_Pago.Rows)
                {
                    // obtener la cantidad de productos y validar que sea mayor que cero
                    if (int.TryParse(Fila_Venta["CANTIDAD"].ToString(), out Cantidad_Producto) == true && Cantidad_Producto > 0)
                    {
                        // obtener el tipo de producto y recortar si excede la longitud
                        Tipo_Acceso = Fila_Venta["PRODUCTO"].ToString();
                        if (Tipo_Acceso.Length > 23)
                        {
                            Tipo_Acceso = Tipo_Acceso.Substring(0, 23);
                        }
                        decimal.TryParse(Fila_Venta["TOTAL"].ToString(), out Total_Producto);
                        // agregar línea producto
                        Texto_Imprimir.AppendLine(
                            Cantidad_Producto.ToString().PadLeft(4, '0') + " "
                            + Tipo_Acceso.PadRight(23) + " "
                            + Total_Producto.ToString("#,##0.00").PadLeft(10)
                            );
                        // si es un SERVICIO y se imprime, enviar impresión a la impresora de servicios
                        if (string.Compare(Fila_Venta["TIPO"].ToString(), "Servicio", true) == 0 && string.Compare(Fila_Venta["IMPRIMIR"].ToString(), "True", true) == 0 && !string.IsNullOrEmpty(Obj_Impresora_Caja.P_Impresora_Servicios))
                        {
                            string Imprimir_Servicio = Tipo_Acceso + "\n\n\n\n\n";
                            // enviar a imprimir productos
                            for (int i = 0; i < Cantidad_Producto; i++)
                            {
                                RawPrinterHelper.Enviar_Texto_Impresora(Obj_Impresora_Caja.P_Impresora_Servicios, Reemplazo_StringBuilder(new StringBuilder(Imprimir_Servicio)).ToString(), "Servicio " + i + 1 + No_Venta);
                            }
                        }
                    }
                }
                // separador y total
                Texto_Imprimir.AppendLine("".PadLeft(40, '-') + "\n" + "Subtotal".PadRight(24) + Subtotal_Pago.ToString("c").PadLeft(15));
                // si hay descuento: mostrar
                if (Descuento_Pago > 0)
                {
                    Texto_Imprimir.AppendLine(("Descuento " + Motivo_Descuento).PadRight(29) + Descuento_Pago.ToString("c").PadLeft(10));
                }
                Texto_Imprimir.AppendLine("Total".PadRight(24) + Total_Pago.ToString("c").PadLeft(15));
                // agregar forma de pago
                if (Dt_Formas_Pago != null)
                {
                    string Tarjeta = "";
                    string Str_Forma_Pago;
                    foreach (DataRow Fila in Dt_Formas_Pago.Rows)
                    {
                        Str_Forma_Pago = "";
                        if (Dic_Formas_Pago.ContainsKey(Fila["Forma_Id"].ToString()))
                        {
                            Str_Forma_Pago = Dic_Formas_Pago[Fila["Forma_Id"].ToString()];
                        }
                        decimal.TryParse(Fila["Monto_Pago"].ToString(), out Total_Pagado);
                        Texto_Imprimir.AppendLine(("Su pago " + Str_Forma_Pago).PadRight(24) + Total_Pagado.ToString("c").PadLeft(15));
                        Tarjeta = Fila["Numero_Tarjeta_Banco"].ToString().Trim();
                        // si hay un número de tarjeta, mostrar últimos 3 caracteres
                        if (!string.IsNullOrEmpty(Tarjeta))
                        {
                            Texto_Imprimir.AppendLine(Tarjeta.Substring(Tarjeta.Length - 3, 3).PadLeft(16, '*'));
                        }
                    }
                }

                // folio y cajero
                Texto_Imprimir.AppendLine("\nFolio: " + No_Venta);
                Texto_Imprimir.AppendLine("Cajero: Usuario Punto Venta Web");

                // obtener datos del grupo
                Cls_Ope_Grupos_Negocio Obj_Grupos_Negocio = new Cls_Ope_Grupos_Negocio();
                Obj_Grupos_Negocio.P_No_Venta = No_Venta;
                DataTable Dt_Grupos = Obj_Grupos_Negocio.Consultar_Grupos();
                if (Dt_Grupos != null && Dt_Grupos.Rows.Count > 0)
                {
                    // agregar datos del grupo
                    Texto_Imprimir.AppendLine("".PadLeft(40, '-') + "\n" + "Grupo " + Dt_Grupos.Rows[0][Ope_Ventas.Campo_Empresa].ToString());
                    Texto_Imprimir.AppendLine(Dt_Grupos.Rows[0][Ope_Ventas.Campo_Persona_Tramita].ToString());
                }

                // separador y mensaje del día
                Texto_Imprimir.AppendLine("\n" + Obj_Parametros.P_Mensaje_Dia_Recibo + "\n\n\n\n\n\n\n\n");

                //// enviar a la impresora
                RawPrinterHelper.Enviar_Texto_Impresora(Obj_Impresora_Caja.P_Impresora_Pago, Reemplazo_StringBuilder(Texto_Imprimir).ToString(), "Venta " + No_Venta);
                //RawPrinterHelper.Enviar_Texto_Impresora(Obj_Impresora_Caja.P_Impresora_Pago, Texto_Imprimir.ToString().Replace("ñ", "\x0A4").Replace("á", "\x0A0"), "Venta " + No_Venta);
            }
        }