Volver al portafolio
Restaurantes

Subito.

Sistema web de gestión de pedidos para restaurantes. Los meseros toman el pedido desde el celular, la cocina y la barra reciben las comandas por área y la caja cobra la cuenta consolidada de cada mesa.

Cliente
La Fragua del Diablo
Tipo
Aplicación privada y Proyecto de título
Desarrollo
Diseño y desarrollo completo
Cuenta consolidada de una mesa en la caja

Qué resuelve

El restaurante La Fragua del Diablo tomaba los pedidos en papel, los volvía a transcribir en caja y los copiaba en una planilla para imprimir las comandas. Un mismo pedido se escribía al menos dos veces, con más tiempo de atención y más errores. Subito reemplaza ese proceso: el pedido se ingresa una sola vez y llega a caja en segundos.

Flujo de un pedido

  1. Mesero

    Toma el pedido

    Elige la mesa libre, arma el pedido por categorías desde el celular y lo envía. La mesa queda ocupada.

  2. Cocina y barra

    Recibe la comanda

    Cada producto llega a su área de preparación. Los pedidos aparecen en caja en menos de 3 segundos.

  3. Cajero

    Consolida la cuenta

    Reúne todos los pedidos de la mesa en una sola cuenta y la marca como por cobrar.

  4. Cajero

    Cobra y libera

    Cobra en efectivo o tarjeta, calcula el vuelto y la propina, imprime el recibo y libera la mesa.

Roles

Mesero

Mapa de mesas con estados en color. Puede modificar un pedido mientras esté pendiente.

Cajero

Pedidos en vivo, cuenta consolidada por mesa, cobro con vuelto y propina sugerida.

Administrador

Productos, categorías, menús, áreas, mesas y usuarios. Historial de pagos y configuración de impresoras.

La aplicación incluye un manual de uso dentro de la misma interfaz. Tiene una guía por cada rol, con pasos, estados de mesa, preguntas frecuentes y un glosario de términos del restaurante.

Decisiones técnicas

Impresión desde el navegador

El backend genera los bytes ESC/POS y el navegador los envía a la impresora por USB o Bluetooth. La impresora no necesita estar expuesta en la red del servidor.

Pedidos en tiempo real

Los pedidos llegan a caja mediante WebSockets. El requisito es que el pedido aparezca en caja en menos de 3 segundos.

Arquitectura hexagonal y CQRS

El dominio no depende de NestJS ni de TypeORM. Los repositorios son puertos con adaptadores, lo que permite cambiar la persistencia sin tocar la lógica de negocio.

Respaldos automáticos

Un respaldo diario de PostgreSQL, comprimido y guardado en almacenamiento compatible con S3 (Backblaze B2), con retención configurable.

Seguridad

Contraseñas y PIN cifrados

Las contraseñas y los PIN de todos los usuarios se guardan con bcrypt. Nunca se almacenan ni se comparan en texto plano.

Bloqueo progresivo de sesión

Tras tres intentos fallidos, el acceso se bloquea por 15, 30, 60 y luego 120 segundos.

Control de acceso por rol

Las rutas del frontend y los endpoints del backend validan el rol con un token JWT. Un mesero no puede entrar al panel de administración, aunque conozca la URL.

Protección de la API y del tiempo real

Cabeceras de seguridad con Helmet, límite de peticiones por IP y verificación del token en cada conexión WebSocket.

Trazabilidad y monitoreo

Registro de cada petición

Cada request queda registrado con el usuario, su rol, el método, la ruta, el estado de respuesta y la duración.

Errores reportados a Sentry

Los errores del servidor se envían a Sentry con el contexto de la petición. La integración solo se activa si hay una DSN configurada.

Calidad y proceso

Las funcionalidades nuevas empiezan como especificación, con requisitos, diseño y tareas, antes de escribir código. El backend y el frontend tienen pruebas unitarias, y el frontend incluye pruebas end-to-end con Cypress. Los respaldos se pueden restaurar en una base local con un comando, sin tocar producción.

Galería

Capturas tomadas con datos de demostración. Haz clic para ampliar.

Tecnologías

Vue 3 TypeScript Vite Pinia NestJS PostgreSQL TypeORM Socket.IO JWT Sentry PWA
Subito fue mi proyecto de título y es un sistema de uso privado, desarrollado para un restaurante. No tiene acceso público, por lo que las capturas muestran la interfaz con datos de demostración.