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

Volver a la búsqueda anterior