ClearLight 
Sistema integrado para la Administración    

Descripcion Funcional
Preguntas y Respuestas
Recursos
Descargas
Vinculos
Precios
Distribuidores
Articulos Técnicos
Inicio
Claves de Activacion

 

Interfaz para las Impresoras Fiscales EPSON

Informacion sobre las Impresoras Fiscales EPSON (Venezuela)

    Tuve que escribir una interfaz para la impresora fiscal EPSON TM-U950FP (si se ignoran los comandos que usan el impresor de slips, tambien puede usarse para las TM-U3xxPF y TM-U2xxPF). Está basada en el manual de Protocolo de la TM-U950PF, publicado por EPSON Venezuela (vi un manual muy parecido en epson.com.ar) y probablemente pueda adaptarse a requerimientos específicos con muy poco trabajo. Si alguien no es capaz de adaptarla, probablemente debería pagar por ella.

    La última versión (2.1.4) puede descargar haciendo clic aquí.  Para instalar la DLL, cópiela al directorio que mejor le parezca (su ubicacion normal es %SysDrive%\Archivos de Programa\Archivos Comunes\VSL) y regístrela con el comando regsvr32 PrinterFiscal.dll.

NOTA: Todos los derechos sobre esta DLL están reservados. Se autoriza sin restricciones su uso en conjunción con el sistema integrado adiministrativo ClearLight o cualquiera de sus componente funcionales. Cualquier otro uso, sin una autorización expresa y por escrito del autor, viola nuestros derechos legales y podremos ejercer acciones contra los infractores.

    La interfaz puede ser utilizada tanto desde un programa compilado (es una DLL ActiveX generada con VB), como desde un script (JScript, VBScript, etc). Para permitir el uso desde lenguajes de scripting, se declararon como Variant todos los parámetros. Una especie de adaptación -inconsistentemente usada- de la notación húngara debe darle una idea de los tipos de parámetros. De cualquier manera, a continuación se exponen -comentados- los diferentes elementos de la interfaz.

    El archivo anexo incluye el programita factPosImprimir.vbs, empleado para generar las facturas desde la aplicación de punto de ventas de nuestro sistema Clear Light, como un ejemplo del uso de este componente.

Miembros

Identificacion: dwordPrinterStatus
Tipo: Variable
Declaración: Public dwordPrinterStatus As Long
Despues de la ejecución de cada comando, el status de la impresora queda almacenado en esta variable. Puede consultarse directamente, o a través de la función BitPrinter, descrita más abajo.

Identificacion: dwordStatusFiscal
Tipo: Variable
Declaración: Public dwordStatusFiscal As Long
Despues de la ejecución de cada comando, el status del controlador fiscal queda almacenado en esta variable. Puede consultarse directamente, o a través de la función BitFiscal, descrita más abajo.

Identificacion: nEnvironmentError
Tipo: Variable
Declaración: Public nEnvironmentError As Integer
Almacena el resultado de la última función ejecutada. Las funciones devuelven CERO cuando todo fue bien, o un entero diferente de cero si hubo algún problema. Incluso las funciones que devuelven valores no enteros (del tipo de GetDateTime, que devuelve una fecha, o SerialImpresora, que devuelve una cadena) condicionan esta variable. La función EnvironmentError(), efinida en esta interfaz, devuelve una cadena con la descripción del tipo de error.
Sus valores son los siguientes:
-1: Error en Dispositivo. Normalmente se produce cuando se detecta que el puerto de comunicación con el printer no ha sido abierto.
0: OK. El último comando se ejecutó correctamente
1: Agotado el tiempo de espera. La impresora no devolvió los resultados del último comando ejecutado. Es uno de los peores resultados posibles, ya que no indica si el útimo comando se ejecutó o no, sólo que no se sabe. Una manera de solucionar este tipo de error es recompilar la interfaz aumentando el valor de la constante "TimeOut"
2: Mensaje Inválido: La respuesta devuelta por la impresora no se adapta a las especificaciones del protocolo. Probablemente se deba a un error de comunicacion.
3: BCC inválido. La suma de comprobación del mensaje de respuesta devuelto por el printer no es correcta. Probablemente se deba a una falla de comunicacion.
4: Error de Secuencia: Inmediatamente despues de la ejecución de cada comando, la interfaz verifica su resultado. Esta condición se produce cuando el identificador de la secuencia el comando devuelto por la impresora es diferente del identificador de numero de secuencia del comando emitido. Ignoro bajo cuales condiciones podría producirse.
5: Error definido en la impresora: Esta condición indica que el comando no pudo ejecutarse por alguna razón. Para determinar esta razón, puede examinar las variables dwordPrinterStatus o dwordStatusFiscal, bien directamente, bien a través de las funciones BitPrinter o BitFiscal.

Identificacion: PrinterType
Tipo: Propiedad (sólo lectura)
Declaración: Public Property Get PrinterType() As String
Si todo va bien, cada vez más personas querrá usar nuestros programas, y la variedad de impresoras fiscales con las cuales habrá que lidiar será mayor. Esta propiedad permite a los scripts o programas conocer el tipo de impresora al cual corresponde la interfaz en uso.

Identificacion: Settings
Tipo: Propiedad (lectura/escritura)
Declaración: Public Property Let/Get Settings([sNewSettings])
La interfaz utiliza un control MSComm para comunicarse con la impresora. La propiedad Settings corresponde a la propiedad Settings de dicho control.

Identificacion: CommPort
Tipo: Propiedad (lectura/escritura)
Declaración: Public Property Let/Get CommPort([nPort])
Representa a la propiedad CommPort del control MSComm subyacente. Corresponde al número del puerto serial al cual está conectada la impresora fiscal (¡asco!)

Identificacion: PortOpen
Tipo: Propiedad
Declaración: Public Property Let/Get PortOpen([bIsOpen])
Corresponde a la propiedad PortOpen del control MsComm. Si se le asigna True, el puerto se abrirá; si se le asigna False se cerrará. Asignar True a un puerto abierto, o False a un puerto cerrado, causará un error.

Identificacion: EnvironmentError
Tipo: Funcion
Declaración: Public Function EnvironmentError() As String
Vea arriba la descripción de la variable nEnvironmentError. Esta función devuelve una cadena con una descripción de la condición almacenada en dicha variable.

Identificacion: Response
Tipo: Funcion
Declaración: Public Function Response(index) As Variant
Si se examina el Protocolo de Comunicación de la TMU, se verá que cada comando devuelve un bloque de respuestas, que puede variar según el comando ejecutado. Mediante la función Response(n) se puede acceder al n-ésimo campo del bloque de respuestas. La base es CERO, y Response(0) devuelve el número del último comando ejecutado. Response(1) y Response(2) devuelven una cadena con la representación hexadecimal de los estados del Impresor y del Controlador Fiscal, respectivamente, despues del último comando. A partir de Response(3) comienzan los valores "útiles" devueltos por la impresora. Si Response(n) == -1 es probable que haya empleado un índice inválido.

Identificacion: BitPrinter
Tipo: Funcion
Declaración: Public Function BitPrinter(nBit) As Long
Devuelve el valor del nBit-esimo bit de la palabra de estado del printer, despues del último comando ejecutado. nBit debe estar entre cero y quince. Un valor de -1 indica que el argumento nBit está fuera del rango permitido.

Identificacion: BitFiscal
Tipo: Funcion
Declaración: Public Function BitFiscal(nBit) As Long
Devuelve el valor del nBit-esimo bit de la palabra de estado del controlador fiscal, despues del último comando ejecutado. nBit debe estar entre cero y quince. Un valor de -1 indica que el argumento nBit está fuera del rango permitido.

Identificacion: RealizarCierre
Tipo: Funcion
Declaración: Public Function RealizarCierre(ByVal nTipo As nTipoCierreFiscal, Optional ByVal Imprimir As Boolean = True) As Integer
Ejecuta un cierre en el controlador fiscal. nTipo puede ser CERO (Cierre X, o cambio de turno) o UNO (1) (Cierre Z o cierre diario).
Si se trata de un cierre X, se puede indicar al controlador si se desea o no imprimir un resumen del turno, mediante el argumento Imprimir.

Identificacion: ReporteMemoriaPorFecha
Tipo: Funcion
Declaración: Public Function ReporteMemoriaPorFecha(dtInicial, dtFinal, Optional ByVal sTipoReporte As String = "R") As Integer
Genera un reporte de la memoria fiscal dentro del rango de fechas especificado. Para más detalles, refiérase al manual de protocolo de la Impresora.

Identificacion: ReporteMemoriaPorNumero
Tipo: Funcion
Declaración: Public Function ReporteMemoriaPorNumero(lngInicial, lngFinal, Optional ByVal sTipoReporte As String = "") As Integer
Genera un reporte de la memoria fiscal para los cierres Z comprendidos entre los dos números especificados. Para más detalles, refiérase al manual de protocolo de la Impresora.

Identificacion: IniciarFactura
Tipo: Funcion
Declaración: Public Function IniciarFactura( Optional ByVal sNombreCliente As String = "", Optional ByVal sRIFCliente As String = "") As Integer
Imprime el encabezado de un documento fiscal (Venta). Registra la operación en la memoria fiscal y consume un número de comprobante.

Identificacion: PasarLineaExtra
Tipo: Funcion
Declaración: Public Function PasarLineaExtra(sTexto) As Integer
Agrega una línea de descripción adicional a la última linea de detalle del comprobante fiscal en proceso. Se permite un másximo de tres líneas adicionales por cada línea de detalle fiscal.

Identificacion: IniciarDevolucion
Tipo: Funcion
Declaración: Public Function IniciarDevolucion( Optional ByVal sNombreCliente As String = "", Optional ByVal sRIFCliente As String = "", Optional ByVal NumeroComprobante As Long = 0, Optional ByVal sSerialEquipo As String = "", Optional ByVal dtFechaComprobante As Date = 0, Optional ByVal dtHoraComprobante As Date = 0) As Integer
Imprime el encabezado de un documento fiscal (Devolución). Registra la operación en la memoria fiscal, y consume un número de comprobante.
NOTA: Supongo que funcionará, pero no he podido probabrla porque aun no dispongo de una impresora "fiscalizada" (¡asco!)

Identificacion: PasarLineaFactura
Tipo: Funcion
Declaración: Public Function PasarLineaFactura(istrDescripcion, ivmPrecioNeto, idblCantidad, ivmPorcentajeImpuesto) As Integer
Agrega una línea al comprobante fiscal (¡asco!) abierto mediante IniciarFactura. ivmPrecioNeto representa el precio de venta UNITARIO del producto, sin incluir el impuesto. ivmPorcentajeImpuesto en realidad no es el porcentaje (sí, le puse el nombre incorrecto) sino el factor de impuesto, es decir, si el impuesto es del 14.5% (¡asco!) entonces ivmPorcentajeImpuesto deberá ser 0.145.

Identificacion: PasarLineaDevolucion
Tipo: Funcion
Declaración: Public Function PasarLineaDevolucion(istrDescripcion, ivmPrecioNeto, idblCantidad, ivmPorcentajeImpuesto) As Integer
Es lo mismo que PasarLineaFactura, pero en vez de sumar, resta.

Identificacion: RecibirPago
Tipo: Funcion
Declaración: Public Function RecibirPago(ivmMontoRecibido) As Integer
Informa al controlador fiscal el monto del pago recibido; al cerrar la factura, éste incluirá el monto del pago recibido y el cambio a devolver.

Identificacion: RegistrarDescuento
Tipo: Funcion
Declaración: Public Function RegistrarDescuento(ivmValorDescuento) As Integer
No la probé, pero según el manual permite registrar un descuento global.

Identificacion: CancelarComprobante
Tipo: Funcion
Declaración: Public Function CancelarComprobante() As Integer
Cancela el comprobante fiscal en proceso. El número de comprobante queda consumido (se consume con la apertura).

Identificacion: CerrarComprobante(Optional Tipo)
Tipo: Funcion
Declaración: Public Function CerrarComprobante() As Integer
Cierra el comprobante fiscal en curso y actualiza la memoria del controlador fiscal.
Si Tipo = "A" realiza un cierre parcial, mostrando los totales y permitiendo la adición de lineas de texto. Si no se especifica, o si tipo = "E" realiza un cierre definitivo.

Identificacion: Subtotal
Tipo: Funcion
Declaración: Public Function Subtotal() As Integer
La impresora devuelve una respuesta con los diferentes subtotales acumulados en la transacción. Estos datos pueden ser accedidos mediante la función Response. Consulte el manual de la impresora para más detalles.

Identificacion: AbrirDNF
Tipo: Funcion
Declaración: Public Function AbrirDNF() As Integer
Permite enviar texto no fiscal hacia la impresora. Al comienzo y cierre de los documentos aparecen las palabras "DOCUMENTO NO FISCAL".

Identificacion: PasarLineaDNF
Tipo: Funcion
Declaración: Public Function PasarLineaDNF(istrTexto) As Integer
istrTexto es una cadena de hasta 40 caracteres (el resto será eliminado). Se imprimirá si hay un documento no fiscal abierto.

Identificacion: CerrarDNF
Tipo: Funcion
Declaración: Public Function CerrarDNF() As Integer
Se cierra el documento no fiscal, y la impresora queda disponible para iniciar un nuevo documento.

Identificacion: SerialImpresora
Tipo: Funcion
Declaración: Public Function SerialImpresora() As String
Devuelve una cadena correspondiente al serial de identificación de la impresora.

Identificacion: GetDateTime
Tipo: Funcion
Declaración: Public Function GetDateTime() As Date
Devuelve la fecha y hora actuales, según el printer.

Identificacion: SetDateTime
Tipo: Funcion
Declaración: Public Function SetDateTime(idtFechaActual) As Integer
idtFechaActual contiene la fecha y hora que se registrará en el controlador de la impresora.

Identificacion: SetTextoFormato
Tipo: Funcion
Declaración: Public Function SetTextoFormato(bEncabezado, nLinea, sTextoLinea) As Integer
Permite configurar las líneas e texto que aparecerán en el encabezado y pie de cada uno de los documentos fiscales emitidos por la impresora. bEncabezado es una ariable de tipo boolean, que indica si las líneas corresponden al Encabezado (True) o al Pie (False) del documento. nLinea selecciona el número de la línea de encabezado/pie a la cual se asigna el texto y sTextoLinea el el texto.

Identificacion: AbrirGavetaN
Tipo: Funcion
Declaración: Public Function AbrirGavetaN(nGaveta) As Integer
Abre la gaveta o cajón de dinero conectado al printer. nGaveta es el número del cajón a abrir. Puede ser 1 o 2.

Identificacion: CortarPapel
Tipo: Funcion
Declaración: Public Function CortarPapel() As Integer
Activa el cortador de papel del printer.

Identificacion: PaperFeed
Tipo: Funcion
Declaración: Public Function PaperFeed() As Integer
Avanza una linea

Identificacion: ActivarSlip
Tipo: Funcion
Declaración: Public Function ActivarSlip() As Integer
Direcciona la salida hacia el impresor de slips (notas sueltas) del printer. Sólo funciona en los modelos 95x.

Identificacion: DesactivarSlip
Tipo: Funcion
Declaración: Public Function DesactivarSlip() As Integer
Redirecciona la salida hacia los rollos de recibos.

Identificacion: LlenarCheque
Tipo: Funcion
Declaración: Public Function LlenarCheque(vmMontoCheque, strBeneficiario, dtFechaEmision) As Integer
Llena un cheque con los datos de vmMontoCheque, strBeneficiario y dtFechaEmision. El cheque debe insertarse HORIZONTALMENTE y con el area imprimible hacia arriba en la ranura de slips de la impresora.

Identificacion: EndosarCheque
Tipo: Funcion
Declaración: Public Function EndosarCheque(strNombre, strCedula, strTelefono) As Integer
Escribe en el reverso de un cheque los datos del cliente. El cheque debe insertarse verticalmente y con la cara hacia abajo en la bandeja de slips de la impresora.

Identificacion: DebugMode
Tipo: Propiedad
Declaración: Public Property Get/Let DebugMode([ibDebug as Boolean])
Si DebugMode se pone a True, una copia del diálogo entre el PC y el printer fiscal se copiará a un archivo. Es útil para detectar problemas en la comunicación con el printer fiscal.
Puede forzarse DebugMode colocando en el registro la clave HKEY_CURRENT_USER\Software\VB And VBA program Settings\VSL\CONFIG\DebugPF con cualquier valor diferente de cero. En este caso, la interfaz ignora cualquier asignación a la propiedad, que siempre tendrá el valor True.
El archivo donde se almacena el diálogo es "C:\IFTRACE.TXT". Si se desea utilizar cualquier otro archivo, puede colocarse su nombre en el registro, con la dirección HKEY_CURRENT_USER\Software\VB And VBA program Settings\VSL\CONFIG\DumpPF.

Identificacion: GetStatusN
Tipo: Funcion
Declaracion: Public Function GetStatusN() As StatusN
Devuelve una referencia a un objeto de tipo StatusN, que contiene información acerca del estado de la impresora, implementada en las funciones siguientes:

CodigoStatus: un código de dos caracteres numéricos que representa el estado del dispositivo, segun la tabla siguiente:

  • 00 = Impresora lista para abrir una factura, abrir un documento no fiscal, hacer un reporte Z o un reporte de memoria fiscal.
  • 01 = Factura fiscal en curso. Esperando por un ítem, cerrar/cancelar la factura. Solo se admitieran comandos relacionados al la factura fiscal.
  • 02 = Documento no fiscal en curso. Esperando por línea de texto, cerrar el documento. Solo se admitieran comandos relacionados a documentos no fiscales.
  • 03 = SLIP activo. Solo se admitieran comandos relacionados a documentos no fiscales o comandos para el formato de cheques.
  • 04 = Mas de un día desde el último reporte Z. Es necesario un reporte Z. Para poder realiza una venta se deberá efectuar previamente un reporte Z.
  • 05 = Primeras líneas descriptivas de una factura fiscal impresas.
  • 08 = Equipo bloqueado a la espera de impresión de cierre Z. Esto ocurre solo en caso de producirse un error durante la impresión de un cierre Z. Por ejemplo, si se acaba el papel cuando se está imprimiendo un cierre Z. Se debe hacer un RESET al equipo.
  • 10= Error critico. Error en BCC RAM. Es necesaria la intervención del servicio técnico.
  • 11= Error critico. Error en BCC ROM. Es necesaria la intervención del servicio técnico.
  • 12= Error critico. Error de formato de FECHA en RAM. Es necesaria la intervención del servicio técnico.
  • 13= Error critico. Error de formato de datos al realizar un Z. Es necesaria la intervención del servicio técnico.
  • 14= Error critico. Limite de memoria fiscal. Es necesaria la intervención del servicio técnico.
  • ... y no, no parece haber una definición para "09"

DNFPeriodo: cantidad de documentos no fiscales emitidos durante el turno.
FacturasPeriodo:
cantidad de facturas emitidas durante el turno (desde el último cierre Z)
FechaImpresora:
fecha registrada en la impresora fiscal.
NumeroDNFAcumulado
: Numero del ultimo documento no fiscal emitido
NumeroFacturaAcumulado:
Numero de la última factura Impresa
UltimoCierreZ:
Numero del ultimo cierre Z emitido.

Identificacion:  PerformReturnCierre
Tipo: Funcion
Declaracion: Public Function PerformReturnCierre(TipoCierre As Integer) As ResultadoCierre
Ejecuta un cierre del tipo especificado en TipoCierre (1=Z, 0=X) y devuelve una referencia a un objeto  de tipo ResultadoCierre, que presenta los siguientes resultados:
BaseGravable1:
total neto de ventas a tasa General
BaseGravable2:
total neto de ventas a tasa reducida.
BaseGravable3:
total neto de ventas a tasa adicional
FechaReporte:
fecha de ejecución del cierre
FechaUltimaFactura:
fecha de la ultima factura emitida en el período
Impuesto1:
Valor del impuesto sobre las ventas a tasa general
Impuesto2:
Valor del impuesto sobre las ventas a tasa reducida
Impuesot3: Valor del impuesto sobre las ventas a tasa adicional
ImpuestoDescuentos: Total del impuesto correspondiente a los descuentos otorgados
ImpuestoNCBase1: Impuestos correspondiente las notas de credito emitidas sobre ventas a tasa general
ImpuestoNCBase2: Impuestos correspondiente las notas de credito emitidas sobre ventas a tasa reducida
ImpuestoNCBase3: Impuestos correspondiente las notas de credito emitidas sobre ventas a tasa adicional
MontoExentoNC: Total de productos exentos registrados en notas de credito.
NumeroUltimaFactura: Numero de la última factura del turno cerrado
ValorDescuentos: valor total de los descuentos otorgados.
ValorNCBase1: Valor neto de las devoluciones a tasa general
ValorNCBase2: Valor neto de las devoluciones a tasa reducida
ValorNCBase3: Valor neto de las devoluciones a tasa ampliada
VentasExentas: Total de ventas de productos exentos durante el turno.

Identificacion: GetResultadoCierre
Tipo: Funcion
Declaracion: Public Function GetResultadoCierre() As ResultadoCierre
Puede llamarse despues de RealizarCierre para obtener los resultados del cierre según la esctructura descrita en PerformReturnCierre.

Identificacion: ExecuteCMD
Declaracion: Public Function ExecuteCMD(nCmd As Integer) As Integer
Ejecuta un comando sin argumentos.

Identificacion: varParms
Tipo: Variable pública
Declaracion: Public varParms As Variant
Devuelve un array de cadenas que contiene los campos de resultado correspondientes al ultimo comando ejecutado. Refiérase al manual de protocolo de la impresora para conocer los valores devueltos por cada comando.

Identificacion: response
Tipo: Funcion
Declaracion: Public Function response(Index) As Variant
Implementa una manera "controlada" de acceder al contenido de varParms. El argumento Index es un entero que se usa como indice sobre el arreglo varParms. Si dicho argumento es inválido, el valor devuelto será -1.

Identificacion: StatusIF
Tipo: Funcion
Declaracion: Public Function StatusIF(nCommand [As String]) As Integer
Ejecuta una llamada a la función StatusIF del dispositivo. Consulte el manual de protocolo de la impresora para obtener información adicional. Para obtener los resultados de la consulta, utilice la propiedad varParms.

Valores de registro usados por la interfaz:

HLCU\Software\VB And VBA Program Settings\VSL\Config\LenDescripcionPF:
Establece la máxima longitud permitida para la descripcion de los productos. El valor por omisión es 20. Para las impresoras de 80 columnas (LX-300) puede definirse en 40.

HLCU\Software\VB And VBA Program Settings\VSL\Config\DebugPF:
Define si la impresora operará en "modo de depuración" (cualquier valor diferente de "0" lo activa, el valor por omisión es "0"). En este modo, todos los comandos enviados a, y las respuestas recibidas de, la impresora, se registrarán en un archivo de texto que puede ser examinado para determinar el origen de un problema. El nombre del archivo se puede especificar mediante la variable DumpPF, descrita en el siguiente parrafo. Si no se indica, se usará C:\IFTRACE.TXT

HLCU\Software\VB And VBA Program Settings\VSL\Config\DumpPF:
Se usa en conjunción con DebupPF para especificar la ruta completa del archivo donde se escribirá un log de todos los datos transferidos entre la impresora y el equipo anfitrión.

HLCU\Software\VB And VBA Program Settings\VSL\Config\SuprimirDecimalesEPF:
Este nombre es bastante desacertado. Si esta variable está deinida con un valor diferente de "0", las cantidad de unidades vendidas se igualará a uno (1), y el precio unitario será igual al precio unitario de entrada multiplicado por la cantidad de unidades. El valor del renglón no se altera, pero la información sobre cantidad y precio unitario efectivo se pierde. Se incluyó para eliminar problemas de diferencias entre las etiquetas generadas por algunas balanzas electrónicas y los resultados mostrados por la impresora fiscal.