Saltar al contenido
Leonardo Tapia

· 3 min de lectura · Leonardo Tapia

Desarrollador Java en Barinas: cómo construí un sistema POS de escritorio para comercios venezolanos

Cómo está construido Sonir Negocios, un sistema de caja, inventario y facturación de escritorio en Java 21 y JavaFX: servidor de sucursal, estaciones, ramos de comercio e instalador con actualizaciones firmadas.

Captura de Sonir Negocios: la pantalla de caja con el catálogo de productos a la izquierda y la venta en curso a la derecha.

En plena era de las apps y la nube, construí un programa de escritorio. No fue nostalgia: la caja de un comercio venezolano tiene que seguir vendiendo cuando se cae internet, hablar con una máquina fiscal por un puerto serie y responder al instante con el teclado, con una fila de clientes esperando. Así nació Sonir Negocios: punto de venta, inventario y facturación para comercios venezolanos.

Por qué Java y JavaFX

  • Java 21 es una versión con soporte de largo plazo: un sistema que maneja el dinero de un comercio tiene que poder mantenerse durante años.
  • JavaFX da una interfaz de escritorio nativa, a pantalla completa en la caja y con tablas densas en la oficina.
  • El ecosistema resuelve el hardware: puerto serie para máquinas fiscales y balanzas, impresoras de tickets ESC/POS y etiquetas para impresoras Zebra.
  • El programa se empaqueta con su propio Java: la computadora de la tienda no necesita tener nada instalado.

Cómo está organizado

Cada tienda tiene un servidor de sucursal que guarda la base de datos —un PostgreSQL 17 que viaja dentro del programa— y atiende a las estaciones: cajas, oficina, salón o cocina. Una tienda de una sola computadora instala las dos piezas juntas. Las estaciones encuentran al servidor solas en la red local y se emparejan con un código de seis dígitos que genera el dueño.

La caja de Sonir Negocios con productos, venta en curso, total en bolívares y botón de cobrar.
La caja: búsqueda por nombre o código de barras, tres niveles de precio y atajos de teclado visibles.

Lo que hace la caja

  • Sin turno abierto no se vende. Al cerrar, el cajero cuenta por medio de pago sin ver lo esperado: es un cierre ciego, y la diferencia queda registrada para el dueño.
  • Pago mixto en bolívares, divisas a la tasa del día, pago móvil, punto, transferencia, Zelle y Cashea. El vuelto se puede dar en dólares.
  • Descuentos con un tope por tienda; por encima, un supervisor autoriza con su PIN y queda anotado quién lo hizo.
  • Devoluciones con nota de crédito contra la factura original, sin poder devolver más de lo vendido.
  • Si el servidor falla justo después de imprimir, la venta queda en una cola en disco y sube sola al volver.
Ventana de cierre de turno de Sonir Negocios con campos para efectivo, divisas, pago móvil, punto y transferencia.
El cierre ciego: se cuenta lo que hay en la gaveta antes de ver lo esperado.

Un núcleo, varios tipos de comercio

Un restaurante, una farmacia y una ferretería no venden igual. En lugar de llenar el núcleo de excepciones, cada tipo de comercio es un módulo propio que el servidor descubre al arrancar. El restaurante trae el salón con sus mesas y la pantalla de cocina; la farmacia, el récipe en la caja y el libro de controlados; la ferretería, la venta en fracciones y los kits. El núcleo no conoce a ninguno.

Instalación y actualizaciones

Un solo instalador para Windows pregunta qué será cada computadora —la única de la tienda, el servidor, una caja, la oficina o el salón— y deja todo listo según ese papel. Las actualizaciones bajan de la nube al servidor y del servidor a las cajas, firmadas digitalmente con Ed25519: un paquete sin la firma de Sonir no se instala nunca. Una caja jamás se actualiza con un turno abierto, y si la versión nueva no arranca, el sistema vuelve solo a la anterior.

El stack

  • Java 21 y JavaFX.
  • Gradle con varios módulos y arquitectura hexagonal, con fronteras comprobadas por ArchUnit.
  • PostgreSQL 17 incluido en el programa, Hibernate 7 sin Spring, HikariCP y migraciones con Flyway.
  • jSerialComm para máquinas fiscales y balanzas; un puente en C# de 32 bits para la familia Bematech.
  • jpackage e Inno Setup para el instalador; JUnit 5, AssertJ y ArchUnit para las pruebas.

¿Tienes un producto que construir?

Barinas, Venezuela · Remoto