El reto
Las PyMEs que abren caja cada día se enfrentan a una elección incómoda: cajas registradoras heredadas que no hablan con su contabilidad, software de TPV cerrado con licencias por terminal y por sector, o hojas de cálculo y apps sueltas pegadas con cinta adhesiva. El resultado son cierres de caja a mano, descuadres difíciles de auditar, stock siempre desactualizado y cero visibilidad real del negocio cuando llega el contable.
El reto era construir un TPV propio, profesional y escalable, que sustituyera de un golpe la caja, el control de stock, el directorio de clientes y proveedores y los informes de ventas — accesible desde tablet, móvil y escritorio, instalable como aplicación, capaz de funcionar en una tienda pequeña hoy y en una cadena multi-sector mañana.
Nuestra solución
Diseñamos y desarrollamos un TPV web completo sobre stack moderno (Angular 20, NestJS, PostgreSQL, Docker), con una arquitectura modular que cubre venta, caja, inventario, clientes, proveedores, usuarios, auditoría y configuración en una sola aplicación.
El terminal de venta está pensado para usarse a dedo: grid de productos con imágenes, búsqueda por nombre o SKU, lector de códigos de barras nativo en móvil y tablet (Android via ML Kit, iOS via zbar-wasm sobre el mismo API estándar), filtros por categoría y carrito con descuentos. El cobro abre un diálogo con los métodos de pago configurados (efectivo, tarjeta, Bizum, los que el negocio quiera) y emite un ticket PDF en formato 80mm que se imprime, descarga o se envía por WhatsApp directamente desde la pantalla de éxito.
La gestión de caja es de verdad: apertura con saldo inicial, depósitos y retiros con motivo, arqueo y cierre con descuadre calculado, todo con actualizaciones en tiempo real vía SSE para que el encargado vea desde su pantalla los movimientos según ocurren. El historial es exportable a CSV con desglose por método de pago y por IVA.
El panel de administración incluye un dashboard con ventas del día/semana/mes, alertas de stock mínimo y top de productos; inventario con historial de movimientos, ajustes con motivo estructurado (recepción, merma, robo, regalo, devolución a proveedor…) y órdenes de compra automáticas que se generan agrupadas por proveedor cuando el stock baja del mínimo configurado; historial de ventas con filtros por fecha y método de pago, anulaciones y devoluciones parciales; directorio de clientes con historial completo de compras y detalle de cada venta; y CRUD de usuarios con tres roles predefinidos (admin, encargado, cajero) y 17 permisos granulares.
La seguridad está pensada para entorno de tienda real: login en dos pasos (email + password para identidad, PIN numérico para abrir caja), JWT con refresh tokens rotatorios sobre cookie HttpOnly, bloqueo automático por inactividad (5 min de idle o 30 s de pantalla apagada) que solo se desbloquea con PIN, rate limiting en login, bcrypt 12 rondas, encriptación AES-256-GCM para campos PII (DNI, email, teléfono) con HMAC indexado para búsqueda sin desencriptar, audit log global de toda mutación con sanitización de credenciales, y cabeceras Helmet en producción.
Es PWA instalable con service worker, cache offline para los assets, manifest e iconos, y persistencia de sesión al abrir la app: el operador instala el TPV en su tablet, se loguea una vez y la siguiente sesión arranca directamente sin volver a teclear contraseñas. El sistema es además multi-moneda (EUR, USD, GBP, MXN, ARS) y multi-idioma (Español, Inglés) con cambio en caliente.
Despliegue completo sobre Docker Compose en VPS con Plesk + Let's Encrypt, backups diarios automáticos de PostgreSQL con retención de 14 días, y CI/CD con GitHub Actions: cada push a main dispara build y despliegue con smoke test. Está en producción en tpv.avilaweb.es.