Hola gente! Interesante post... sólo que no consigo que me funcione la emisión de un Tique-Factura. Les comento mi problema:
Soy de Argentina y estoy desarrollando una aplicación en Visual Studio 2012 con C#. La misma consiste en un sistema de ventas de productos de un comercio, el cual debe permitir la emisión de comprobantes fiscales a través de una controladora fiscal EPSON TM-u220 AFII.
El detalle de una venta es registrado en la base de datos y se muestra a través de un DataGridView (grdDetalleVenta) presente en un formulario (frmDetalleVenta).
Al finalizar la carga del detalle de una determinada venta, la aplicación permite seleccionar el tipo de comprobante que se precisa emitir utilizando la controladora fiscal, a saber:
1. El vendedor puede elegir emitir un TIQUE (el cual consiste en una "Factura B" dirigido a algún "Consumidor Final")
2. El vendedor también podría elegir emitir un TIQUE FACTURA (el cual consiste en una "Factura A" dirigido a algún Responsable Inscripto).
En el proyecto he incorporado la referencia correspondiente del control IFEpson (EPSON_Impresora_Fiscal) y he arrastrado dicho control (de nombre axPrinterFiscal2) al formulario desde el cual deseo emitir los tique (tanto el "B" como el "A").
Ahora bien, para el primer caso, donde debo emitir un tique "B", no tengo inconvenientes en generar el comprobante de pago e imprimirlo desde la controladora Fiscal, para ello, el código utilizado es el siguiente:
if (Convert.ToInt16(cboTipoComprobante.SelectedValue) == 2) //TIQUE B
{
iva = "2100";
venta = "M";
bultos = "0";
ImpuestosInternos = "0";
printer = "P";
texto = "SUB";
pago = "Efectivo";
calculoMonto = Convert.ToDouble(txtTotal.Text); //TextBox que tiene el Total de la Venta
calculoMonto = calculoMonto * 100;
monto = (calculoMonto).ToString();
descripcion = "T";
//Incorporo en el formulario un control IFEpson Fiscal, llamado "axPrinterFiscal2" (El cual esta disponible luego de agregar a mi proyecto el OCX Epson Fiscal)
axPrinterFiscal2.PortNumber = 3; //Numero de Puerto al cual se encuentra conectado la controladora fiscal a mi PC
axPrinterFiscal2.BaudRate = "9600";
axPrinterFiscal2.OpenTicket(); //Abro un Tique, ya que el comprobante, para este caso, será del tipo "B"
//Recorro el DataGridView que contiene el detalle de la venta (Cantidad, Descripcion, Precio Unitario y Subtotal) para ir enviando los ítems de la venta al ticket (mediante la función axPrinterFiscal2.SendTicketItem)
for (int i = 0; i < grdDetalleVenta.Rows.Count; i++)
{
string sqlArticulo = "SELECT ISNULL(P.codigo + ' - ' + PE.nombre,'') FROM Producto P, Peso PE, DetalleVenta DV WHERE DV.idProducto=P.idProducto AND P.idPeso=PE.idPeso AND DV.idDetalleVenta=" + Convert.ToInt64(grdDetalleVenta.Rows[ i ].Cells[0].Value);
string articulo = producto.conocerCampoRegistro(cadena.cadenaConexion.ToString(), sqlArticulo, "Error al conocer el nombre del Artículo");
string sqlCantidad = "SELECT ISNULL(DV.cantidad,'') FROM DetalleVenta DV WHERE DV.idDetalleVenta=" + Convert.ToInt64(grdDetalleVenta.Rows[ i ].Cells[0].Value);
string cantidad = (Convert.ToDouble(producto.conocerCampoRegistro(cadena.cadenaConexion.ToString(), sqlCantidad, "Error al conocer el nombre del Artículo")) * 1000).ToString();
string sqlPrecioUnitario = "SELECT ISNULL(DV.precioUnitario,'') FROM DetalleVenta DV WHERE DV.idDetalleVenta=" + Convert.ToInt64(grdDetalleVenta.Rows[ i ].Cells[0].Value);
string precioUnitario = (Convert.ToDouble(producto.conocerCampoRegistro(cadena.cadenaConexion.ToString(), sqlPrecioUnitario, "Error al conocer el precio unitario del Artículo")) * 100).ToString();
string sqlSubtotal = "SELECT ISNULL(DV.subtotal,'') FROM DetalleVenta DV WHERE DV.idDetalleVenta=" + Convert.ToInt64(grdDetalleVenta.Rows[ i ].Cells[0].Value);
string subtotal = (Convert.ToDouble(producto.conocerCampoRegistro(cadena.cadenaConexion.ToString(), sqlSubtotal, "Error al conocer el subtotal del Detalle")) * 100).ToString();
axPrinterFiscal2.SendTicketItem(ref articulo, ref cantidad, ref precioUnitario, ref iva, ref venta, ref bultos, ref ImpuestosInternos);
}
//Una vez cargados todos los ítem que conforman la VENTA, agrego los subtotales del Tique y cierro el mismo
axPrinterFiscal2.GetTicketSubtotal(ref printer, ref texto);
axPrinterFiscal2.SendTicketPayment(ref pago, ref monto, ref descripcion);
axPrinterFiscal2.CloseTicket();
}
Para el segundo caso, donde debo emitir un tique factura "A", he intentado con el siguiente código, pero no consigo que la controladora imprima el tique factura:
//Declaro las variables que luego pasaré por referencia a las funciones de la Controladora Fiscal
iva = "2100";
venta = "M";
bultos = "0";
ImpuestosInternos = "0";
printer = "P";
texto = "SUB";
pago = "PAGO";
calculoMonto = Convert.ToDouble(txtTotal.Text);
calculoMonto = calculoMonto * 100;
monto = (calculoMonto).ToString();
descripcion = "T";
string tipoDocumentoFiscal = "T";
string salidaImpresora = "C";
string letraFactura = "A";
string cantidadCopias = "1";
string tipoFormulario = "P";
string tipoLetra = "12";
string IVA_Emisor = "I";
string IVA_Comprador = "F";
string nombreCliente1 = nombreCliente; //Variable que contiene el nombre del cliente
string nombreCliente2 = razonSocialCliente; //Variable que contiene la razon social del cliente
string tipoDocumento = "CUIT";
string numeroDocumento = ClienteCUIT; //Variable que contiene el CUIT del cliente
string bienDeUso = "N";
string domicilioComprador1 = domicilioCliente; //Variable que contiene el Domicilio del cliente
string domicilioComprador2 = "";
string domicilioComprador3 = "";
string remito1 = "REM 1";
string remito2 = "REM 2";
string tipoTablaItem = "C";
axPrinterFiscal2.PortNumber = 2; //Nuevamente, el numero de puerto al cual se encuentra conectada la Controladora Fiscal
axPrinterFiscal2.BaudRate = "9600";
//Función que debería dar apertura a una factura A, la cual recibe los siguientes parámetros por referencia
axPrinterFiscal2.OpenInvoice(ref tipoDocumentoFiscal, ref salidaImpresora, ref letraFactura, ref cantidadCopias, ref tipoFormulario, ref tipoLetra, ref IVA_Emisor, ref IVA_Comprador, ref nombreCliente1, ref nombreCliente2, ref tipoDocumento, ref numeroDocumento, ref bienDeUso, ref domicilioComprador1, ref domicilioComprador2, ref domicilioComprador3, ref remito1, ref remito2, ref tipoTablaItem);
//LUEGO DE ESTA INSTRUCCIÓN NO HAY ACTIVDAD EN LA CONTROLADORA FISCAL
Alguna observación para hacerme y/o sugerencia acerca de cuál puede ser el error? O bien, alguna mejor forma de hacer lo que necesito? Entiendo que el numero de puerto indicado para la impresión del comprobante "A" es correcto, ya que utilizo el mismo para la impresión de los comprobantes "B", por lo que la comunicación con la Controladora Fiscal se realiza correctamente!
Desde ya, muchísimas gracias por su tiempo!!