sábado, 29 de noviembre de 2008

OpenbravoPOS y una impresora fiscal Hasar

Un cliente me preguntó si tenía algún programita que lo ayudara a llevar su local de comidas y le permitiera imprimir tickets fiscales con una impresora que tenía arrumbada debajo del mostrador. Enseguida pensé en usar la solución de punto de ventas que ofrece Openbravo (y que tiene un nombre tan original como OpenbravoPOS).

Si bien esta solución es bastante intuitiva a la hora de ser usada por los clientes, su configuración y administración a veces es un poco complicada.
Así me encontré con que adaptarla para usar la impresora fiscal Hasar de mi cliente no era algo muy natural. Si hubiera sido una impresora que respetara el estandar jPos hubiera sido más fácil, pero menos entretenido.

El proceso que me llevó a la solución que voy a comentar incluyó bastantes búsquedas en el código de la aplicación y revisión de la documentación de administración de la misma.

A continuación voy a tratar de explicar cómo hay que configurar el OBPos para hacer que imprima tickets fiscales usando una impresora fiscal Hasar:.

Lo primero que hice fue armarme un ambiente de desarrollo sobre NetBeans, pueden encontrar una documentación detallada para hacer esto aca.

Después, gracias a un post que encontré por ahí, vi que tenía que armar una clase que implemente la interfaz: com.openbravo.pos.printer.DeviceFiscalPrinter (aca está la primera implementación que hice para poder testear la interacción con OBPos, todavía le falta la interacción con la impresora, la clase se llama: com.openbravo.pos.printer.hasar.DeviceFiscalPrinterHasar).

Bueno, ya tenía mi clase de prueba... pero no lograba hacer que se ejecute desde OBPos. Aca es dónde está un poco floja la documentación de OBPos. Para que la aplicación "se dé cuenta" que tiene una impresora fiscal instalada hay que agregar la siguiente línea:

machine.fiscalprinter=hasar

al archivo de configuración openbravopos.properties (vale aclarar que en mi máquina este archivo está en el raíz de mi usuario: C:\Documents and Settings\Marcos).

Bueno, en realidad, además de agregar esta línea hay que tocar un poco el código... En el constructor de la clase com.openbravo.pos.printer.DeviceTicket hay que agregar un if para que la cadena "hasar" sea asociada a la clase que creamos antes (com.openbravo.pos.printer.hasar.DeviceFiscalPrinterHasar):

...
} else if ("hasar".equals(sFiscalType)) {
m_deviceFiscal = new DeviceFiscalPrinterHasar();
...

Aca está la clase ya modificada.

Bueno, finalmente hay que editar desde dentro de OBPos el recurso correspondiente a Printer.Ticket para agregarle la entrada que indica cómo imprimir el ticket fiscal:

<fiscalreceipt>
#foreach ($ticketline in $ticket.getLines())
<line price="${ticketline.getPrice()}" units="${ticketline.getMultiply()}">${ticketline.printName()}</line>
#end
<total paid="${ticket.getTotal()}">Total</total>
</fiscalreceipt>

Con estas modificaciones, cada vez que presionen el botón "Aceptar" en la ventana de Pagos se estará emitiendo el ticket en la impresora fiscal. La ventana de Pagos aparece luego de presionar el botón "=" en la ventana de Ventas.

Para imprimir los reportes "X" y "Z" de la impresora, tienen que ir a la vista de la impresoras (haciendo click en la opción Impresora del menu de la izquierda) y allí a la solapa "Hasar". Hay un botón para cada reporte. Estos botones se definen en el formulario asociado a la clase DeviceFiscalPrinterHasar.

Por ahora es todo lo que tengo, me está faltando agregar la comunicación con la impresora fiscal, pero gracias al trabajo de esta persona, creo que va a ser bastante fácil.