Sistema de Gestión de Negocios "Hexa"
Base de datos de conocimiento.
| Doc. Ref. 29069 Título: Impresión de ticket TPV POS Autor: Soltec Última actualización: 01/11/2025#terminal #punto #venta #ticket #impresora |
Impresión de ticket TPV POS
Normalmente, en la actualidad, para la impresión de tickets de un TPV, se utiliza en modo gráfico un formato "Crystal Reports". Pero si el punto de venta sólo dispone de imoresoras antiguas de texto, Hexa dispone de la posibilidad de hacerlo en modo texto en formato "POS" que es habitual en muchas impresoras, especialmente loas de la marca EPSON.
Para utilizad este sistema es necesario crear un script con el nombre "EjeTPV.ImprimeTicket" que lo haga. Si existe, el proceso que ejecute este script reemplazará al envío estandar. Este evento no sólo sirve para la impresión POS que es la finalidad de este ejemplo. También serviría para otros métodos de impresión programando la lógica que correspondiera.
Function Main (Criterio, Orden, Opciones)
'Averiguar prefijo y número del ticket, así como los datos que necesitaremos para la impresión
Prefijo = BD.Cmp ("Factura", "Prefijo", Criterio, False)
Numero = BD.Cmp ("Factura", "Numero", Criterio, False)
Cliente = BD.Cmp ("Factura", "Cliente", Criterio, False)
Fecha = BD.Cmp ("Factura", "Fecha", Criterio, False)
Total = BD.Cmp ("Factura", "Total", Criterio, False)
FormaPago = BD.Cmp ("Factura", "FormaPago", Criterio, False)
Entregado = Total 'Por defecto se supone que el cliente ha entregado el total
'Obtención de bases, ivas, totales, cantidad entregada / cambio si el pago es en efectivo
B00=0 : B04=0 : B10=0 : B21=0 : I04=0 : I10=0 : I21=0
'En los pagos en efectivo sale lo entregado, estilo "Efectivo 10"
If LCase (Left (FormaPago,8)) = "efectivo" Then Entregado = Fpc.Vac (Right (FormaPago, Len (FormaPago)-9))
'Para la generación de líneas
Linea = "------------------------------------------------" '48 caracteres de ancho
'Obtención de las líneas del ticket
Campos = "Codigo,Articulo,Denominacion,Cantidad,Precio,Descuento,TipoIVA,Base"
BD.Rs.Consulta = "SELECT " & Campos & " FROM Movimiento WHERE FacturaPrefijo=" & fpc.SQLT (Prefijo) & " AND FacturaNumero=" & Numero & " ORDER BY Codigo" : BD.Rs.Abrir (false)
'La variable "T" irá acumulando el texto del ticket
T = Chr(27) & "a" & Chr(1) & "NOBRE DEL COMERCIO / EMPRESA" & VbCrLf 'Centrado
'Cabecera
T = T & Chr(27) & "a" & Chr(0) & "NIF: A12345678" & VbCrLf 'Centrado
T = T & Chr(27) & "a" & Chr(0) & "Calle de la direccion, 99" & VbCrLf 'Centrado
T = T & Chr(27) & "a" & Chr(0) & "01234 POBLACION" & VbCrLf 'Centrado
T = T & Chr(27) & "a" & Chr(0) & "FS Num: " & Prefijo & "-" & Numero & " " & "Fecha: " & Fecha & VbCrLf 'Alineado izquierda
'Si es un ticket con los datos del cliente...
If Cliente <> Bd.Cnf ("ClienteAnonimo", BD.UsuarioActual, BD.EquipoActual) Then
T = T & Linea & VbCrLf
T = T & Cliente & " - " & Trim (BD.Cmp ("Factura", "NombrePila + ' ' + Nombre + ' ' + Nombre2", Criterio, False)) & VbCrLf
T = T & Trim (BD.Cmp ("Factura", "Direccion", Criterio, False)) & VbCrLf
T = T & Trim (BD.Cmp ("Factura", "CP + ' ' + Poblacion", Criterio, False)) & VbCrLf
T = T & "NIF: " & Trim (BD.Cmp ("Factura", "Nif", Criterio, False)) & VbCrLf
End If
T = T & Linea & VbCrLf
Q = 0
'Impresión de las líneas
Do While Not BD.Rs.Fin
T = T & Chr(27) & "a" & Chr(0) & Left (BD.Rs.Campo ("Denominacion") & " ", 30) 'Alineado a la izquierda
PVP = Round (Fpc.Vac (BD.Rs.Campo ("Precio")) * (1 + Fpc.Vac (BD.Rs.Campo ("TipoIVA"))), 2) 'Precio con IVA
T = T & Chr(27) & "a" & Chr(2) & Right (" " & FormatNumber(PVP, 2), 6) & " X " & Right (" " & BD.Rs.Campo ("Cantidad"),2) & " " & Right (" " & FormatNumber(PVP * fpc.Vac(BD.Rs.Campo ("Cantidad")), 2), 6) & VbCrLf 'Alineado a la derecha
If Fpc.Vac (BD.Rs.Campo ("TipoIVA")) = 0 Then B00 = B00 & Fpc.Vac (BD.Rs.Campo ("Precio")) * Fpc.Vac (BD.Rs.Campo ("Cantidad"))
If Fpc.Vac (BD.Rs.Campo ("TipoIVA")) = 0.04 Then B04 = B04 + Fpc.Vac (BD.Rs.Campo ("Precio")) * Fpc.Vac (BD.Rs.Campo ("Cantidad")) : I04 = I04 + Fpc.Vac (BD.Rs.Campo ("Precio")) * Fpc.Vac (BD.Rs.Campo ("Cantidad")) * 0.04
If Fpc.Vac (BD.Rs.Campo ("TipoIVA")) = 0.10 Then B10 = B10 + Fpc.Vac (BD.Rs.Campo ("Precio")) * Fpc.Vac (BD.Rs.Campo ("Cantidad")) : I10 = I10 + Fpc.Vac (BD.Rs.Campo ("Precio")) * Fpc.Vac (BD.Rs.Campo ("Cantidad")) * 0.10
If Fpc.Vac (BD.Rs.Campo ("TipoIVA")) = 0.21 Then B21 = B21 + Fpc.Vac (BD.Rs.Campo ("Precio")) * Fpc.Vac (BD.Rs.Campo ("Cantidad")) : I21 = I21 + Fpc.Vac (BD.Rs.Campo ("Precio")) * Fpc.Vac (BD.Rs.Campo ("Cantidad")) * 0.21
Q = Q + 1 : BD.Rs.Siguiente
Loop
T = T & Linea & VbCrLf
'Impresión de los totales
T = T & Chr(27) & "a" & Chr(0) & "TOTAL IVA Incl." & Chr(27) & "a" & Chr(2) & "EUR " & FormatNumber (Total, 2) & VbCrLf
T = T & Linea & VbCrLf
T = T & Chr(27) & "a" & Chr(1) & Chr(27) & "-" & Chr(1) & "IMPORTES SUJETOS A IVA" & Chr(27) & "-" & Chr(0) & VbCrLf 'Centrado y subrayado
T = T & Chr(27) & "a" & Chr(0) 'Alineación izquierda
If B00 <> 0 Then T = T & "Base sin IVA: " & Right (" " & FormatNumber (Round (B00,2), 2), 6) & VbCrLf
If B04 <> 0 Then T = T & "Base IVA 4%: " & Right (" " & FormatNumber (Round (B04,2), 2), 6) & " IVA: " & Right (" " & FormatNumber (Round (I04,2), 2), 5) & VbCrLf
If B10 <> 0 Then T = T & "Base IVA 10%: " & Right (" " & FormatNumber (Round (B10,2), 2), 6) & " IVA: " & Right (" " & FormatNumber (Round (I10,2), 2), 5) & VbCrLf
If B21 <> 0 Then T = T & "Base IVA 21%: " & Right (" " & FormatNumber (Round (B21,2), 2), 6) & " IVA: " & Right (" " & FormatNumber (Round (I21,2), 2), 5) & VbCrLf
T = T & Linea & VbCrLf
'Impresión de la cantidad a pagar, forma de pago, entregada, cambio
T = T & Chr(29) & "!" & Chr(16) & "A PAGAR:" & Chr(27) & "a" & Chr(2) & " EUR " & FormatNumber (Total, 2) & Chr(29) & "!" & Chr(0) & VbCrLf 'Tamaño grande e importe alineado a la derecha
If LCase (Left (FormaPago,8)) = "efectivo" Then
T = T & Chr(27) & "a" & Chr(0) & "ENTREGADO: " & FormatNumber (Entregado, 2) & VbCrLf
End If
FP = FormaPago
T = T & Chr(27) & "a" & Chr(0) 'Alineación izquierda
T = T & FP & " EUR " & FormatNumber (Total, 2) & VbCrLf
T = T & Linea & VbCrLf
T = T & "Caja " & BD.EquipoActual & " " & Chr(27) & "a" & Chr(2) & Q & " Articulo/s" & VbCrLf 'la cantidad de artículos alineada a la derecha
T = T & Linea & VbCrLf
'Otras frases
T = T & Chr(27) & "a" & Chr(1) & "GRACIAS POR SU VISITA. HASTA PRONTO!" & VbCrLf 'centrado
T = T & Chr(27) & "a" & Chr(0) 'dejarlo centrado a la izquierda
T = T & VbCrLf & VbCrLf & VbCrLf & VbCrLf & VbCrLf & VbCrLf & VbCrLf
'Corte de papel
T = T & Chr(29) & "V" & Chr(0) 'Corte completo del papel (si la impresora tiene esta prestación)
T = T & Chr(12) 'Form Feed
'Envío del ticket a la impresora
I = Impr.ImpPred () 'Buscar la impresora predeterminada
'Para pruebas
'fpc.Wfil "c:\temp\ticket.txt", T
Impr.ImprRAW T, I
End Function
