pfbatch (Impresoras Fiscales)

Introducción

Introducción

Una impresora fiscal es utilizada para imprimir tiquets y facturas
pfbatch Programa utilizado para enviar comandos a una impresora fiscal Epson.
vpfbatch Alternativa, soportado por arquitecturas de 64 bits: Descarga
jpfbatch Alternativa, requiere java: Descarga
ixbatch Alternativa privativa con una sintáxis mejorada: Descarga Si se utiliza la versión de prueba, imprimirá una leyenda “demo” en los tiquets y facturas

Los comandos presentados a continuación fueron probados en una impresora Epson TM-U220AFII versión fiscal para Argentina

Ejecución vpfbatch

Desde la interfaz de comando:

vpfbatch /c:2 /i:input.txt /o:output.txt
/c:2 #puerto com2
/i:input.txt #archivo de texto que contiene los comandos a ejecutar.
/o:output.txt #archivo de texto que contiene la salida de los comandos ejecutados. Se graba línea por línea la respuesta a cada comando como una cadena de caracteres
Ejecución jpfbatch

Desde la interfaz de comando:

java -jar jpfbatch.jar -i input.in
  -i comando.in #archivo de texto que contiene los comandos a ejecutar. La salida la guarda en un archivo con el mismo nombre pero la extensión out, para este caso comando.out
Sintaxis comandos
@COMANDO|00001|PARAM 1|PARAM 2|...
  00001 #número de transacción. Se define un número de referencia o de transacción dentro del lote para poder asociar las respuestas a cada transacción (este número se debe repetir para cada comando de la transacción, y debe ser distinto para cada transacción). Generalmente se realiza una transacción a la vez, por lo tanto el número siempre se define como 00001
  PARAM 1, PARAM 2 #parámetros

VPFBATCH y JPFBATCH utilizan la misma sintaxis que PFBATCH.
Las instrucciones de IxBatch a diferencia del PFBATCH no llevan un número de secuencia y las cifras deben tipearse con los decimales.

Comandos

Tiquets

Los tiquets son una factura B pero sin nombre del cliente. Su numeración sigue la secuencia de las facturas B.

@TIQUEABRE
@TIQUEABRE|00001
  00001 #numero de referencia

Ejemplo error: Ya existe un comprobante abierto

|@TIQUEABRE         |ERROR|0080|B620

Se soluciona cancelando el comprobante anterior

@TIQUEITEM
@TIQUEITEM|00001|descripcion|00001000|000000010|2100|M|00001|00000000
  00001 #numero de referencia
  descripcion #descripcion de articulo, hasta 20 caracteres
  00001000 #cantidad 5 enteros y 3 decimales
  000000010 #precio 7 enteros y 2 decimales
  2100 #Tasa de IVA 4 decimales. En general, no se discrimina IVA para tiquets y facturas B. (IVA = 0000)
  M #Calificador de ITEM 1 carácter. M Monto agregado mercadería SUMA. m Reversión Resta. R Bonificación Resta. r Anula la bonificación SUMA
  00001 #Cantidad de bultos 5 enteros
  00000000 #Tasa de ajuste 8 enteros
@TIQUESUBTOTAL
@FACTSUBTOTAL|00001|P|TITULO SUBTOTAL
  00001 #Número de transacción
  P #Modo de impresión: P imprime caso contrario envía la información
  TITULO SUBTOTAL #Descripción de la línea de subtotal (29 caracteres)
@TIQUEPAGO

En los tiquets se incluye al finalizar la leyenda:

SUMA DE SUS PAGOS XXXXXX
SU VUELTO YYYYYY

A través del comando TIQUEPAGO se puede indicar el valor de XXXXXX, YYYYYY se calculará automáticamente. Si no se incluye TIQUEPAGO, dependiendo del modelo del controlador fiscal se imprimirá XXXXXX en 0 e YYYYYY con el total negativo, o XXXXXX con el total e YYYYYY en 0

@TIQUEPAGO|00001|DESCRIP PAGO|000002050|T
  00001 #numero de referencia
  DESCRIP PAGO #leyenda del pago
  000002050 #Importe 7 enteros y 2 decimales 0000020,50
  T #Calificador de pago 1 carácter - C Cancela Comprobante - T Suma el importe pagado - t Anula un pago hecho con Ticket - D Realiza un descuento global por monto Fijo - R Realiza un recargo global por monto Fijo

Ejemplo cancelación

@TIQUEPAGO|00001|CANCELACION|000002000|C
@TIQUECIERRA
@TIQUECIERRA|00001|T
  00001 #numero de referencia
  T #Corte de papel. T Total P Parcial
Ejemplo input.txt
@TIQUEABRE|00001|C
@TIQUEITEM|00001|Nafta Mezcla|00012000|000003000|0000|M|00001|00000000
@TIQUEITEM|00001|Diesel + Euro|00010500|000002005|0000|M|00001|00000000
@TIQUESUBTOTAL|00001|P|SUBTOTAL
@TIQUEPAGO|00001|PAGO|00100000|T
@TIQUECIERRA|00001|T
Ejemplo output.txt
|@TIQUEITEM         |OK   |0080|3600||||||00000|00000|00000000
|@TIQUEITEM         |OK   |0080|3600||||||00000|00000|00000000
|@TIQUESUBTOTAL     |OK   
|0080|3600|A|00002|000000057053|000000000000|000000000000|000000000000|000000000000|000000057053
|@TIQUEPAGO         |OK   |0080|3600|000000000000
|@TIQUECIERRA       |OK   |0080|0600|00000010
  #00000010 coincide con numero de comprobante
Ejemplo tiquet impreso

tique

Factura y Notas de Crédito

En las facturas se define el nombre del cliente. Dependiendo del tipo de factura debe discriminarse iva.
Cada tipo de factura tiene su propia secuencia de numeración. La secuencia de las facturas B esta asociada a la de los tiquets.

@FACTABRE
@FACTABRE|00001|T|C|B|1|P|17|I|F|JUAN PEREZ|NOMBRE 2|DNI|20179665523|N|BELGRANO 970|DOMICILIO 2|DOMICILIO 3|REMITO 1|REMITO 2|C
  00001 #numero de referencia
  T #Tipo de documento T = Tique fiscal - M Notas de crédito
  C #Tipo de salida impresa - C formulario continuo - F hoja suelta
  B #Letra del documento - (facturas A-B-C)
  1 #Cantidad de copias
  P #Tipo de Formulario - F (pre impreso) - P (dibuja la impresora) - A (auto impreso)
  17 #Tamaño de los caracteres -10 12 17
  I #Responsable IVA Vendedor: I Responsable Inscripto - R Responsable no Inscripto - N No responsable - E Exento - M Monotributo
  F #Responsab IVA Comprador I R N E M F (cons. final). Para las facturas "tipo B" debe definirse "Responsable F", si se define "Responsable I" entonces se imprimirá una "Tipo A" por más que se haya puesto "Tipo B"
  JUAN PEREZ #Nombre comercial comprador 1 línea
  NOMBRE 2 #Opcional. Nombre comercial 2 línea
  DNI #Tipo de documento comprador DNI CUIT CUIL
  20179665523 #Nro. de documento comprador
  N #Bien de Uso - B (leyenda VTA BIENES USO) - N (no se imprime la leyenda)
  BELGRANO 970 #Domicilio de comprador 1 línea
  DOMICILIO 2 #Opcional. Domicilio de comprador 2 línea
  DOMICILIO 3 #Opcional. Domicilio de comprador 3 línea
  REMITO 1 #Remito 1 línea. Para las facturas, se imprime el número de remito. Para las notas de crédito, en el comprobante impreso se incluirá la leyenda ¿?
  REMITO 2 #Opcional. Remito 2 línea
  C #Formato para almacenar datos - C (no se va a realizar un DFH para Farmacia) - G (únicamente cuando se va a emitir un DFH para Farmacia)

Ejemplos

@FACTABRE|00001|T|C|A|1|P|10|I|I|JUAN PEREZ||CUIT|20312345678|N|DOMICILIO|||REMITO||C #Factura A
@FACTABRE|00001|M|C|A|1|P|10|I|I|JUAN PEREZ||CUIT|20312345678|N|DOMICILIO|||REMITO||C #Nota de Crédito A
@FACTABRE|00001|T|C|B|1|P|10|I|F|Consumidor Final||CUIT|000000000000|N|DOMICILIO|||REMITO||C #Factura B
@FACTABRE|00001|M|C|B|1|P|10|I|F|Consumidor Final||CUIT|000000000000|N|DOMICILIO|||REMITO||C #Nota de Crédito B
@FACTITEM
@FACTITEM|00001|DESCRIPCION ART 1|00012500|000000234|2100|M|00001|00000000|LIN COMP 1|LIN COMP2|LIN COMP3|0000|00000000
  00001 #Número de transacción 
  DESCRIPCION ART 1 #Descripción del ítem. En las pruebas se incluyeron longitudes de hasta 20 pero la impresión solo salieron 14 caracteres.
  00012500 #Cantidad Unidades (tres decimales), corresponde a 00012,500
  000000234 #Precio (dos decimales), corresponde a 0000002,34 - Factura A Sin IVA - Factura B y C Con IVA
  2100 #Tasa de IVA corresponde a 21% o 0,21
  M #Calificador de ITEM - M Monto Agregado de Mercaderías SUMA - m Anula el ítem Vendido RESTA - R Bonificación RESTA - r Anula una bonificación SUMA
  00001 #Cantidad de bultos No se usa 00001
  00000000 #Tasa de ajuste En Factura A se calcula diferente que en Facturas B. 8 decimales, ej 73206442 equivale a 0.73206442
  LIN COMP 1 #Línea extra 1 descrip complementaria. Generalmente aparece entre la descripción y la cantidad.
  LIN COMP 2 #Línea extra 2 descrip complementaria. Generalmente aparece entre la descripción y la cantidad.
  LIN COMP 3 #Línea extra 3 descrip complementaria. Generalmente aparece entre la descripción y la cantidad.
  0000 #Tasa de IVA acrecentamiento R.no Inscr. (Un resp. Inscripto le vende a un Resp. No Responsable Inscripto)
a un Resp. No Inscripto)
  00000000 #Monto de impuestos internos fijos |00000000|nnnnnnnnn.nnnnnnnn ¿¿??

Ejemplos

@FACTITEM|00001|Nafta Mezcla|00012000|000001716|2100|M|1|65019506||||0000|00000000 #utilizado en factura A o nota de credito A (se carga el precio neto y el iva)
@FACTITEM|00001|Nafta Mezcla|00012000|000003000|0000|M|1|00000000||||0000|00000000 #utilizado en factura B o nota de crédito B (se carga solo el precio total)
@FACTPERCEP
@FACTPERCEP|00001|DESCRIP PERCEPCION|O|000000053
  00001 #Número de transacción
  DESCRIP PERCEPCION #Descripción de la línea de percepción 25 caracteres.
  O #Marca de percepción de IVA Indica si es una percepción sobre IVA o sobre otra percepción. Cualquier otra letra rechaza el comando: I percepción sobre IVA - O Otro tipo de percepción
  000000053 #Monto de percepción: 7 enteros, dos decimales, corresponde a 0000000,53
@FACTSUBTOTAL

Similar a @TIQUESUBTOTAL

@FACTPAGO

Similar a @TIQUEPAGO

@FACTCIERRA
@FACTCIERRA|00001|T|A|FINAL
  00001 #Número de transacción
  T #Tipo de documento fiscal: F Factura Fiscal - T Ticket Factura Fiscal - R si estoy abriendo un Recibo Factura - 
  A #Letra de Documento Fiscal Factura A B o C (Según haya abierto)
  FINAL #Descripción de la línea de totaL

Ejemplos
@FACTCIERRA|00001|T|A|FINAL #Cierre de factura A
@FACTCIERRA|00001|M|A|FINAL #Cierre de nota de crédito A
@FACTCIERRA|00001|T|B|FINAL #Cierre de factura B
@FACTCIERRA|00001|M|B|FINAL #Cierre de nota de crédito B

Ejemplo input.txt Factura A
@FACTABRE|00001|T|C|A|1|P|10|I|I|Juan Perez||CUIT|20312345678|N|.|||.||C
@FACTITEM|00001|Nafta Mezcla|00012000|000001716|2100|M|1|65019506||||0000|00000000
@FACTITEM|00001|Diesel + Euro|00010500|000001272|2100|M|1|73206442||||0000|00000000
@FACTPERCEP|00001|PERCEPCION|O|000000001
@FACTSUBTOTAL|00001|P|SUBTOTAL
@FACTPAGO|00001|PAGO|00100000|T
@FACTCIERRA|00001|T|A|FINAL
Ejemplo output.txt Factura A
|@FACTABRE          |OK   |0080|3600|
|@FACTITEM          |OK   |0080|3600|
|@FACTITEM          |OK   |0080|3600|
|@FACTPERCEP        |OK   |0080|3600|
|@FACTSUBTOTAL      |OK
|0080|3600|A|00002|000000057045|000000007129|000000000000|000000015967|000000000000|000000033948
|@FACTPAGO          |OK   |0080|3600|000000000000
|@FACTCIERRA        |OK   |0080|0600|0000005
Ejemplo Factura A Impresa

facturaa

Otros

@ESTADO
@ESTADO|00001|

Respuesta ok

|@ESTADO            |OK
|0080|0600|00000|00000002|00000002|00000002|00000000|00000000|00000|00000000|00000000|00000000|00000000

Respuesta error: Debe hacerse un Cierre Z

|@ESTADO |ERROR|0080|0A00|N|*|||

Extra

Fuente

vpfbatch
jpfbatch
ixbatch
Manual de Soporte para Desarrolladores de Software Impresoras Fiscales

Ultima actualización 15/10/2016

26 Comentarios

  1. Hola saludos. gracias por el aporte.
    Hay algún emulador que les funcione para trabajar con el pfbatch.exe?

    1. Hola José, podés utilizar el emulador de impresoras fiscales, más de una vez nos ha tirado pantalla azul pero nos sirvió para realizar algunas pruebas sin depender del controlador fiscal.
      Lo único malo que tiene es que te da un período de prueba de 15 días.

      1. Muchas gracias amigo, yo no he podido imprimir a traves de la impresora fiscal virtual, me dice que error de comandos, o que no reconoce los comandos, yo le envio comandos a traves de epson soft demo, no se si lo has usado, este tiene facturas de muestra precargadas, yo lo conecto para que mande datos a la impresora fiscal y nada, hay algun medio a traves del cual me comunique contigo para que me des mas luz en este asunto, gracias, este es mi correo diazvjosetomas@gmail.com, de antemano gracias.

        1. La verdad es que no he usado epson soft demo, para probar el controlador, lo probé desde un Windows 7

          lo que hice es descargar el software por ejemplo el vpfbatch (lo descargué en el directorio downloads/vpfbatch/vpfbatch.exe)

          dentro de downloads/vpfbatch cree un archivo input.txt con los comandos del controlador

          entonces fui al Símbolo del Sistema (cmd) y ejecute las siguientes instrucciones:

          cd C:\Users\Ivan\Downloads\vpfabtch
          vpfbatch /c:2 /i:input.txt /o:output.txt

          y me tiró los resultados en el emulador… y posteriormente en el controlador.

          Después desarrollé una app en php y solamente utilicé la instrucción shell_exec que me permite ejecutar comandos del sistema, me quedó algo así:

          $exec = shell_exec(‘vpfbatch /c:2 /i:input.txt /o:output.txt’);

          En general todos los lenguajes de programación ofrecen alguna instrucción para ejecutar comandos del sistema.

          Muchos éxitos!

          1. Gracias hermano, listo lo logre, use el VPFBATCH en lugar del otro, Dios te lo multiplique en Bendiciones 😀 , agradecido, terminaron mis dolores de cabeza, jejeje!

            Muchas Gracias! 🙂

          2. Ivan, me parece genial que lo hayas logrado, estoy intentando hacer lo mismo en php, pero no tengo suerte con shell_exec , si lo corro en cmd anda todo bien. Sabes que puede ser? uso XAMPP

          3. Iván Castañeda dice:

            Yo instalé el xampp también, creo que el sistema corría con un php 5.5.
            Te fijaste los logs a ver que te tira?

            Acá te dejó un ejemplo del codigo ejecutado:

            $comando = "@ESTADO||\n";
            
            //***** ejecutar comando *****
              //@return salida de la ejecucion
              public function exec($comando){
                $input = fopen("input.txt", "w");
            
                fwrite($input, $comando);
                fclose($input);
            
                $exec = shell_exec('vpfbatch /c:2 /i:input.txt /o:output.txt');
            
                $output = file("output.txt"); 
                file_put_contents("output.txt", "");
                file_put_contents("input.txt", "");
            
            
                return Array("exec" => $exec, "output" => $output);
              }
            
    2. Hola. Soy Roberto Rogers, el autor de VPFBATCH. Ahora desarrollé el VPFBATCHNT que es la interface para las Epson No Tecnologías. Tengo una versión que en modo prueba anda ilimitada y en modo fiscal tiene limitaciones o podes comprar la versión paga. Mí mail es robertorogers@gmail.com. Saludos

  2. hola alguien me puede decir si puedo utilizar mas de un comando facpago en pfbatch como por ejemplo colocar efectivo y ademas pago con tarjeta o sea que una parte se paga en efectivo y el resto con tarjeta
    saludos y gracias

    1. Nunca lo usé pero creo que está el comando “FACTSUBTOTAL” para imprimer subtotales en cierto momento, de esta forma podés generar todos los items que pagas en efectivo e imprimir el subtotal y luego con tarjeta y volves a imprimir el subtotal, creo que al subtotal le podés aplicar alguna leyenda.

  3. hola Iván!
    hace ya unos cuantos años estoy utilizando el pfbatch para imprimir facturas en una controladora fiscal lx-300+

    el tema es que ahora debería hacer algo muy parecido, la idea pasa por utilizar casi casi el mismos soft de gestión desarrollado por mi, para otra empresa del mismo cliente, que como controlador fiscal utiliza un tm-u220af o tm-u220afii, todavía no sé bien cual de los dos es.

    el pfbatch es el mismo o hay otra versión?

    gracias!

    1. Iván Castañeda dice:

      ¿Cómo va Ariel? El único sistema de facturación lo hice el año pasado, tuvimos que usar una alternativa al pfbatch que saqué en este enlace: https://robertorogers.blogspot.com.ar/2014/05/vpfbatch-pfbatch-para-64-bits.html porque la pc era de 64 bits
      En cuanto al uso, nunca use pfbatch, pero me parece que usar vpfbatch es lo mismo o muy parecido.
      Supongo que en el mercado ya debe haber nuevas máquinas homologadas por la AFIP con algo mejor, pero si tenes la tm-u220af vas a tenes que seguir usar el vpfbatch.
      ¡Exitos!

      1. alguien sabe a traves de pfbacht como puedo capturar la fecha y donde lo tomo ?
        gracias

    2. Hola si, desarrolle el VPFBATCHNT para las Epson nuevas tecnologías. Mira en https://robertorogers.blogspot.com

  4. Ivan, buenas noches, estoy renegando con un Impresor Epson TM-u220afII en el comando @FACTITEM al tratar de registrar una bonificacion definiendo el Item como “r”.

    @FACTITEM|00001|BONIF ART 2|00001000|000000050|2100|r|00001|00000000|DESCUENTO 10.00%|||0000|00000000

    Vos o alguien me puede ayudar con esto?.

    Gracias

  5. Buenas, al usar jpfbatch en una epson tm-u220af desde linux, probe todas las alternativas posibles de comandos pero salta el error la impresora no reconoce el “gomando x”. Alguien sabe si funciona correctamente la app? gracias!

  6. Iván Castañeda gracias por el codigo lo voy a probar. Pude hacerlo andar finalmente, lo que estoy viendo ahora es de validar el codigo obtenido para mostrar un error. Creo que en caso de que el archivo de salida no tenga la linea @FACTCIERRE, deberia mostrar un error y anular la transacccion en MYSQL. gracias por todo , a seguir programando

  7. Hola, me interesaria probar para luego adqurir si es necesario el VPFBatch. Intente descargarlo, lo instale y al ejecutarlo aparece un dialogo que indica que faltan archivos .ocx
    Lo intento usar en una pc nueva, que vino con W10 pro version de 64 bits
    Si me pueden informar de donde descargar esos faltantes seria genial.
    Gracias!

    1. Iván Castañeda dice:

      El VPFBatch es un programa gratuito que hizo Roberto Rogers y puede ser descargado desde https://robertorogers.blogspot.com.ar/2014/05/vpfbatch-pfbatch-para-64-bits.html

      Yo lo probé desde windows 7 (no recuerdo qué versión) de 64 bit sin problemas. Hace bastante que no hago un sistema de facturación electrónica, aún no lo he probado en un windows 10. Lamento no poder ayudarte

      1. Muchas gracias Ivan por el dato, lo descargue de alli donde me indicas y como no funcionaba me comunique con el autor del blog, quien muy amablemente me envio los archivos necesarios por mail. Ahora solo resta poder probar todo con un controlador fiscal. Saludos a todos…
        Claudio

  8. Hola, quisiera saber si existe, y cual sería, algún comando para enviar a reimprimir el último comprobante emitido?
    Gracias desde ya,
    Hernán.-

  9. Hola, alguien sabe si para las nuevas versiones de controladores fiscales (2da generacion) tambien se puede utilizar el pfbatch? o en su defecto, con que libreria lo reemplazaron?

    Gracias!
    Saludos.
    Fernando.

  10. Hola, gracias por el aporte! está genial. Es posible reimprimir comprobantes? hay algún comando para eso? Gracias desde ya!

  11. Buenos días. Cómo es la sintaxis para un informe de auditoría de cierres z en PF batch? Porque una z se me imprimió mal por un atasco de papel y quiero reimprimir

  12. jUAN CARLOS LENCINA dice:

    Hola, alguien tiene datos como se calcula el impuesto interno para el pfbatch?

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *