El problema
Ristorante Gina, un restaurante de pescado y marisco, llevaba el servicio en papel: los camareros anotaban los pedidos a mano, la cocina y la barra leían las mismas comandas y la cuenta se sumaba en la caja. Los dueños querían un solo sistema para el salón, la cocina y el encargado, pensado para poder dar servicio más adelante a más de un restaurante.
Lo que construí
Desarrollé RistoFlow, una aplicación web de gestión de restaurantes, y la configuré con Gina como primer restaurante.
- Plano del salón — mesas agrupadas por sala, con estados en tiempo real (libre, ocupada, pedidos en curso, pedidos listos) y el número de comensales indicado al abrir la mesa.
- Pedidos desde el teléfono — los camareros arman el pedido por categoría, con notas por plato. Al enviarlo, se divide automáticamente entre cocina y barra, así cada puesto solo ve su propio trabajo.
- Pantalla de cocina — una pantalla que se actualiza cada 5 segundos, lleva cada pedido de enviado a en preparación, listo y servido, resalta los retrasos e imprime un ticket de 72 mm, automáticamente si hace falta.
- Cuentas — total de la mesa con cubierto, precuenta imprimible y cierre. Desde la versión 1.5.0 los precios solo los ve el encargado, que cierra la cuenta, y no los camareros ni el personal de cocina.
- Editor de menú e informes — categorías, precios (también por 100 g), platos marcados como agotados al instante, y la recaudación, los comensales y los platos más vendidos del día.
- Cuatro roles, muchos restaurantes — administrador de la plataforma, encargado, camarero y cocina. Cada restaurante tiene sus propios usuarios y datos, separados.
- Paquete para servidor local — un instalador que coloca la app, con el menú y las mesas reales de Gina, en un PC dentro del restaurante, con un script de copia de seguridad diaria.
Con qué está hecho
PHP 8 y MySQL con PDO, JavaScript puro, sin bibliotecas externas. Un único endpoint de API atiende todas las llamadas. Sesiones con tokens CSRF y contraseñas con hash. El menú y la carta de vinos de Gina se cargaron en 9 categorías.
Por qué se hizo así
Mantuve la app libre de dependencias y usé un polling sencillo en lugar de websockets, para que funcione en un hosting compartido corriente. La misma decisión facilitó llevarla a un servidor local: los pedidos y las cuentas siguen funcionando con el Wi-Fi del restaurante aunque se caiga la conexión a internet.


