Audiencia: negocio Vertical: restaurant
Objetivo
Operar la carta pública (carrito + checkout por WhatsApp) y el trabajo de sala/cocina/caja rápida en el panel: Mesas, Mostrador, Cocina, Ambientes, Comandas (estaciones, centros de elaboración e impresión), Recetas, Reportes y Configuración. No hay pedidos por QR en mesa ni importación CAD.
Quién puede hacerlo
| Rol / permiso | Qué ve |
|---|---|
| Visitante | Home, carta, carrito, checkout (WhatsApp, transferencia o tarjeta PayPhone si están activos), registro / mi cuenta |
Mesero (dining.view / dining.operate) | Mesas (/mesas); con dining.operate también Mostrador (/mostrador) |
Cocinero (kitchen.view / kitchen.operate) | Cocina (/cocina) |
Administrador (dining.manage + cocina) | Grupo Restaurante (Mesas, Mostrador, Cocina, Ambientes, Comandas, Recetas, Reportes, Configuración) y, si el plan lo incluye, POS (escáner) |
| Organización / productos | Marca, pausa de entregas, platos publicados |
Mostrador (/mostrador) es la caja táctil del restaurante (cobro primero → cocina). No exige el complemento pos. El menú POS (/pos) sigue siendo la caja con escáner/código (complemento pos), aparte del grupo Restaurante.
Antes de empezar
- Vertical = restaurant.
- Plan con
storefrontpara la carta pública. Mesas / cocina / configurar requierenvertical_surface. - Platos publicados como productos (
is_public, tipo Bien) para que aparezcan en la carta. - WhatsApp de contacto en Organización → Sitio web → Contacto. Para cobrar por transferencia, los datos bancarios van en Sitio web → Envíos → Transferencia bancaria.
Rutas públicas (visitante)
| Acción | Ruta | Nota |
|---|---|---|
| Inicio | / | Portada (bloques) + platos destacados |
| Carta / categoría | /categoria-producto/... | Misma vitrina ProductCard que comercio |
| Plato | /producto/{slug} | Notas del plato opcionales |
| Carrito | /carrito | |
| Checkout | /checkout | Pedido por WhatsApp; retiro o domicilio |
| Contacto | /contacto | |
| Registro / login | /registro, /iniciar-sesion, … | Misma cuenta de cliente que comercio |
| Mi cuenta | /mi-cuenta, pedidos, direcciones |
No hay QR de mesa ni reservas en la web.
Rutas del panel
| Acción | Ruta | Permiso |
|---|---|---|
| Mesas | /mesas, /mesas/{tableId} | dining.view |
| Mostrador | /mostrador | dining.operate (+ vertical_surface; sin complemento pos) |
| Ambientes (pestañas Ambientes / Zonas / Mesas) | /mesas/ambientes (el enlace viejo /mesas/config redirige) | dining.manage |
| Comandas (pestañas Estaciones de servicio / Centros de elaboración / Centros de impresión) | /mesas/comandas | dining.manage |
| Recetas (ingredientes por plato y food cost) | /mesas/recetas | dining.manage |
| Reportes (pestañas Ventas / Platos y horarios / Tiempos de cocina / Propinas / Anulaciones y descuentos / Cola de impresión) | /mesas/reportes | dining.manage |
| Configuración (pestañas General: cargo por servicio, número de turno y tiempos de cocina / Motivos y autorizaciones / Costos y propinas) | /mesas/configuracion | dining.manage |
| Cocina | /cocina | kitchen.view |
| POS escáner | /pos | notas de pedido / POS (entitlement pos) |
Pasos — Carta pública
- Ver sitio público: el dominio (o
?tenant=restauranten local) muestra la home de restaurante con carrito, no la de hotel. - Organización → Sitio web:
- Identidad, fuente del sitio web, contacto (WhatsApp) y, en General, Pausar entregas a domicilio si no hay delivery. El retiro en el local sigue disponible; aparece un aviso en la vitrina.
- Portada (
?section=home): mismos bloques que comercio (carrusel, sección de tarjetas, banner CTA, bloque personalizado). Un restaurante nuevo llega con carrusel y carta de muestra: categorías como «Entradas (muestra)» y platos como «Cuarto de pollo a la brasa (muestra)», que puedes editar o eliminar desde Productos (ver 19 — Sitio web). El hero y el horario viven aquí; Platos destacados sigue siendo el catálogo público (no un bloque). En un bloque personalizado (p. ej. horario), para poner una segunda línea dentro de la misma viñeta usá el botón de salto de línea del editor o Shift+Enter (Enter crea otra viñeta). - Precio de entrega a domicilio (
?section=shipping, tarjeta arriba de las zonas): elegí uno de tres modos (ver Pasos — Precio de entrega). Por defecto es Confirmar por WhatsApp ($0 en la web; el visitante solo escribe ciudad y dirección).
- Publicá platos en Productos (visible en la web). Ocultar de la web en el listado deja de mostrar el plato pero conserva slug y SEO.
- El visitante arma el carrito (puede anotar el plato) y en checkout deja nombre y teléfono (apellido y correo opcionales). Elige retiro o domicilio.
- Formas de pago en el checkout (independientes del modo de precio de entrega: WhatsApp, zonas o distancia):
- Confirmar por WhatsApp (siempre): se crea una nota de pedido impaga (
source_channel=storefront_web). La pantalla de confirmación abre WhatsApp con el número de pedido; el personal acuerda el pago por chat. - Transferencia bancaria (opcional): aparece si en Sitio web → Envíos → Transferencia bancaria está activada. El checkout muestra los datos bancarios guardados; la NP queda esperando transferencia hasta que el personal pulse Confirmar pago recibido.
- Pagar con tarjeta (PayPhone, opcional): aparece solo si el plan incluye pagos en línea, en Sitio web → Envíos → Pago en línea está activado y las credenciales PayPhone de la tienda están guardadas. El visitante paga en PayPhone. Si PayPhone tiene habilitada la Notificación Externa (webhook) para la tienda, la NP queda Pagada sola en segundos y los platos pasan a Cocina (y a las impresoras) sin que nadie toque nada; si no, PayPhone avisa al negocio del pago aprobado (correo / Payphone Business) y el personal verifica monto y referencia
SF…y pulsa Confirmar pago recibido en la NP. - Cómo activar la confirmación automática: pedí a PayPhone (soporte o tu ejecutivo comercial) que active la Notificación Externa para tu tienda (indicá tu Store ID) con la URL
https://<dominio-del-API>/api/webhooks/payphone/NotificacionPago(soporte Dilepack te da el dominio exacto). PayPhone requiere autorización previa y una URL pública HTTPS: no funciona en pruebas locales (localhost), solo en el sistema publicado. Una vez activa, PayPhone avisa solo los pagos aprobados; Dilepack vuelve a consultar el pago en PayPhone y verifica monto y referencia antes de marcar la NP como Pagada.
- Confirmar por WhatsApp (siempre): se crea una nota de pedido impaga (
- Cocina espera el pago: los platos de un pedido web quedan retenidos (no aparecen en Cocina) hasta que el pago esté confirmado:
- Tarjeta → pasan a Enviado cuando la NP queda Pagada (webhook o Confirmar pago recibido).
- WhatsApp o transferencia → cuando el cliente paga, en Comercial → Notas de pedido abrí la NP y pulsá Confirmar pago recibido. En ese momento los platos pasan a Cocina. El historial de la NP muestra «Enviado a cocina (pago confirmado)».
- Una NP web por WhatsApp o transferencia no se puede convertir a factura hasta confirmar el pago.
- El efectivo contra entrega no se ofrece en la carta del restaurante.
Pasos — Precio de entrega a domicilio
Quién: administrador con permiso de edición en Organización → Sitio web → Envíos (/organization?tab=website§ion=shipping).
- En la tarjeta Precio de entrega a domicilio elegí el modo y pulsá Guardar:
| Modo | Qué ve el visitante en /checkout | Qué se cobra |
|---|---|---|
| Confirmar por WhatsApp (por defecto) | «Entrega (confirmar por WhatsApp)»; escribe ciudad y dirección | $0 en la web; la nota del pedido dice «Envío a confirmar por WhatsApp.» |
| Zonas y clases de empaque | «Entrega a domicilio»; elige provincia/cantón (mismas zonas de la tabla de abajo) + dirección | Tarifa de la zona (por peso o clase de empaque), igual que comercio |
| Por distancia con Google Maps | «Entrega a domicilio»; mapa con el local, busca su dirección / toca el mapa / Usar mi ubicación, ve la ruta, km, minutos y el costo | Tarifa base + costo por km adicional, con envío mínimo y distancia máxima |
- Modos con cobro (zonas o distancia): configurá también el Servicio de envío en esta misma sección (código, nombre, IVA). Se agrega como línea del pedido; sin él el checkout responde «Delivery service is not configured».
- Zonas: creá las zonas y tarifas en la tabla de zonas de esta sección (mismo editor que comercio).
- Distancia:
- Marcá la ubicación del local en el mapa (clic, arrastrar el pin o buscar la dirección); también podés escribir latitud/longitud.
- Completá Tarifa base, Km incluidos, Costo por km adicional, Distancia máxima (0 = sin límite) y Envío mínimo. La tarjeta muestra un ejemplo (p. ej. «un pedido a 5 km paga $3,00»).
- El servidor siempre recalcula el costo al confirmar el pedido; lo que muestra el navegador es solo una vista previa.
- Si la dirección está más lejos que la distancia máxima, el checkout lo indica y no deja confirmar.
- Resultado en la nota de pedido (distancia): información adicional con Distancia de entrega (km · min) y Ubicación de entrega (enlace de Google Maps para el repartidor). El pago se elige aparte (WhatsApp, transferencia o tarjeta).
- Sugerencias y envío gratis (tarjeta en esta misma sección): Mostrar sugerencias ofrece platos extra al añadir al carrito, en el carrito y en el checkout (p. ej. bebidas o postres; se eligen por plato en Productos → editar → Sitio web → Productos sugeridos). Envío gratis desde $ deja la entrega en $0 cuando el total de platos (IVA incluido) llega al monto; el servidor lo aplica también en el modo Por distancia (siempre con este monto general). En el modo Por zonas, cada zona puede usar el monto general, uno propio o ninguno (Editar zona → Envío gratis). No aplica a Confirmar por WhatsApp ni al retiro en el local. Detalle en Comercio — Sugerencias y envío gratis.
El modo Por distancia requiere que soporte haya configurado las claves de Google Maps en la plataforma (
GOOGLE_MAPS_SERVER_KEYen el API yREACT_APP_GOOGLE_MAPS_BROWSER_KEYen el frontend; verdocs/AWS_FIRST_LAUNCH.md). Mientras falte la clave del servidor, la tarjeta muestra un aviso y la tienda sigue en Confirmar por WhatsApp.
Pasos — Mesas y cocina
- Restaurante → Ambientes (
/mesas/ambientes), con tres pestañas:- Pestaña Ambientes (salón, terraza, segundo piso…) → Agregar ambiente (modal). Al tocar un ambiente queda seleccionado para las otras pestañas. Renombrar / Eliminar al pasar el mouse (eliminar quita también sus zonas y mesas).
- Pestañas Zonas y Mesas: arriba el selector Ambiente elige en cuál trabajás.
- Zonas → Agregar zona (modal) para sectores del ambiente (ventana, barra…). En la lista se ven los meseros asignados; Editar / Eliminar al pasar el mouse (editar asigna meseros entre empleados; eliminar quita también las mesas de la zona). Asignación fija, no el turno del día. El primer mesero de la zona queda como mesero por defecto de las mesas que se abren ahí.
- Mesas → Agregar mesa (código, etiqueta, zona, asientos). En la lista solo se ve la info; Editar / Eliminar al pasar el mouse. No se puede eliminar una mesa con ticket abierto. Colocar en mapa (botón de la sección) arrastra las mesas; la posición se guarda al soltar. Sin CAD ni QR.
- Restaurante → Configuración (
/mesas/configuracion), pestaña General: - Cargo por servicio (mesas): marcá Cobrar servicio y el Porcentaje (por defecto 10 %, máx. 20 %) → Guardar servicio. El servicio no es ingreso del negocio ni paga IVA: se calcula sobre el subtotal sin IVA, va aparte del IVA 15 % y es de los empleados (ver Reparto de propinas). Solo aplica a mesas (no a Mostrador, POS ni web). Se aplica al Pedir cuenta y el porcentaje queda guardado en esa NP: cambiar o apagar el servicio después no modifica las cuentas ya pedidas (un descuento o una división posterior recalcula con el porcentaje original). Las mesas aún abiertas toman el valor vigente cuando pidan la cuenta.
- Número de turno (Mostrador): modo Automático (1–máx., por defecto 99, reinicia), Manual (pieza / tent numerada al cobrar) o Desactivado → Guardar turno.
- Tiempos de cocina: Ámbar después de (min) (por defecto 10) y Rojo después de (min) (por defecto 20; siempre mayor que el ámbar) → Guardar tiempos. Cambia el color del reloj de cada plato en Cocina.
- Datos de muestra (
dining.manage): Cargar datos de muestra crea Salón (muestra) con las zonas Interior (muestra) y Terraza (muestra), 8 mesas ya ubicadas en el mapa (códigos 1–8; si un código ya existe usa M1, M2…), los centros Cocina (muestra), Bar (muestra) y Parrilla (muestra). Los grupos de muestra van a su centro: Bebidas → Bar, Platos fuertes → Parrilla, y Entradas y Postres → Cocina; solo se asignan los grupos que todavía no tienen centro. También fija el tiempo por defecto: Entradas = 1, Platos fuertes = 2, Postres = 3 (si el grupo ya tenía un tiempo elegido, se respeta). El producto de muestra Agua con gas queda como Sin preparación. También crea el circuito de comandas impresas: - las estaciones Lobby principal (muestra) y Bar (muestra);
- los agentes PC Cocina (muestra) y PC Bar (muestra), sin token entregado (pulsá Nuevo token al instalar la PC real);
- las impresoras Cocina impresora (muestra) (red 192.168.1.50) y Parrilla impresora (muestra) (red 192.168.1.52), ambas en PC Cocina, más Bar impresora (muestra) (USB «POS-80C») en PC Bar;
- el ruteo: General y Cocina → impresora de Cocina, Parrilla → impresora de Parrilla, Bar → impresora de Bar, y una excepción: lo tomado en la estación Bar (muestra) imprime en el Bar; además, el ticket de despacho de pedidos web sale en la impresora de Cocina.
- Cambiá las IP o los nombres de Windows por los tuyos. Mientras los agentes de muestra no se conecten, no aparece el aviso de «desconectado». Los restaurantes nuevos lo reciben automáticamente al aprobar la cuenta. Si ya habías cargado una versión anterior, Completar datos de muestra agrega solo lo que falta, sin duplicar nada. Eliminar datos de muestra quita el salón (con sus zonas y mesas), los centros, las impresoras, las estaciones y los agentes de muestra, con sus reglas de ruteo. No toca tus propios datos ni la carta. No se puede eliminar mientras una mesa de muestra tenga platos abiertos. Modificadores, motivos y el cargo por servicio (10 %, apagado) ya vienen por defecto; no hay empleados de muestra.
- Pestaña Motivos y autorizaciones: un motivo por línea en Motivos de anulación y Motivos de descuento (máx. 20), y las casillas Exigir PIN de supervisor para anular platos enviados y para descuentos (activas por defecto) → Guardar motivos.
- Pestaña Costos y propinas:
- Meta de food cost: Meta (%) (por defecto 35 %, entre 5 y 95) → Guardar meta. Es el porcentaje máximo del precio sin IVA que debería costar la receta (ver Recetas y food cost).
- Reparto de propinas: el % de cada departamento de RR.HH. → Guardar reparto (ver Reparto de propinas).
- Restaurante → Mesas (
/mesas): mapa por ambiente con filtros (Todas / Mis mesas / Ocupadas / Listas). Las mesas muestran estado de cocina, cantidad de platos, total y PAX (personas) si hay ticket. Si abrís el enlace/mesas/{id}de una mesa de otra zona, volvés al mapa con el aviso «Esta mesa no está en tu zona.». Al elegir una mesa de tu zona vas a/mesas/{id}y se abre el pedido táctil:- PAX: en la cabecera del ticket, botones − / + (1–50). Antes del primer plato arranca con los asientos de la mesa y se guarda al abrir el ticket; después se puede corregir hasta Pedir cuenta.
- Mesero: al abrir la mesa queda el primer mesero de la zona (o quien la abrió si la zona no tiene meseros). Solo un usuario con
dining.manage(encargado) puede elegir otro mesero en la lista Mesero; los demás ven el nombre sin lista y usan Cambiar con PIN: el mesero escribe su PIN de Recursos humanos (el mismo del marcaje) y toma la mesa. Tras 5 PIN incorrectos se bloquea unos minutos. El cambio queda en el historial de la NP («WAITER_CHANGED»). El empleado debe tener usuario vinculado en Recursos humanos. - Reimprimir comanda: si hay impresoras configuradas, vuelve a enviar todos los platos ya enviados de la mesa marcados como REIMPRESIÓN (ver Comandas impresas).
- Mover / unir: ver Pasos — Mover o unir mesas.
- Cuentas (Nuevos platos a: Cuenta A · + Cuenta): para grupos que pagan por separado, ver Pasos — Cuentas separadas durante el servicio.
- Barra de categorías arriba + Modificar + Configurar platos (ajustes del pedido: modificadores y varias categorías de alta frecuencia del riel derecho; no está en Ambientes).
- Modificar: modal con todos los modificadores; elegís uno o varios y confirmás. Si hay líneas pendientes seleccionadas en el ticket, se aplican a esas notas; si no, quedan listas para el próximo plato.
- Escritorio (≥1200px): ticket | grilla de platos | riel de alta frecuencia (productos de todas las categorías marcadas en Configurar platos, en una sola lista; por defecto Bebidas si el nombre coincide y no hay selección).
- Tablet/móvil: pestañas Pedido | Carta | Frecuentes y barra inferior de acciones (← Mesas, Enviar, Cuenta, Anular).
- Al agregar el mismo plato pendiente con las mismas notas, sube la cantidad de esa línea (no crea filas duplicadas). Notas distintas = líneas distintas.
- Los platos quedan pendientes (
held); Enviar a cocina dispara la ronda (sent). La NP nace con el primer plato. Si volvés al mapa sin platos, no queda NP vacía. - Tiempos (cursos): cada plato pendiente muestra un selector T1 / T2 / T3 con el tiempo de su grupo (ver Centros de elaboración); el mesero puede cambiarlo antes de enviar. Enviar a cocina manda solo los platos del tiempo en curso (al principio, el tiempo 1); los de tiempos posteriores quedan En espera. Cuando la mesa está lista para el siguiente, tocá Enviar tiempo 2 (y luego Enviar tiempo 3) en la barra inferior, junto a Enviar a cocina: esos platos pasan a Cocina (junto con cualquier pendiente de tiempos anteriores) y la comanda impresa dice TIEMPO 2. Si solo quedan platos en espera, Enviar tiempo N reemplaza a Enviar a cocina. Un plato que se agrega después sale con Enviar a cocina si su tiempo ya se envió. Pedir cuenta exige que no quede ningún tiempo en espera.
- Agotados: un plato agotado aparece gris con la etiqueta Agotado y no se puede agregar (en Mesas y en Mostrador). Para marcarlo o reactivarlo, mantené presionado el plato (o clic derecho) y confirmá; también se hace desde Cocina → Agotados. Requiere
dining.operate,kitchen.operateosales_orders.edit. - Aviso de platos listos: cuando cocina marca un plato Listo, en Mesas aparece arriba un aviso verde «Mesa 4: 2x Lomo listo» con un sonido corto. Servido marca esos platos como servidos; Ir a la mesa abre el pedido. La casilla Solo mis mesas muestra únicamente las mesas donde sos el mesero (y las que no tienen mesero); la elección se recuerda en ese dispositivo. Mesas consulta el servidor cada ~10 s mientras la pestaña está visible.
- Podés Quitar líneas pendientes antes de enviar (sin motivo). Un plato ya enviado se Anula con motivo: ver Pasos — Anulaciones y descuentos. Pedir cuenta exige haber enviado (o quitado) los pendientes; cierra el ticket de mesa y deja la NP abierta para cobro. Si el cargo por servicio está activo, en ese momento se agrega el porcentaje del subtotal sin IVA como propina de la NP; el pedido muestra Subtotal, Servicio (propina) y Total con IVA. Caja puede editar o quitar la propina en la NP antes de facturar. La mesa queda en CUENTA (total con centavos) hasta que la NP esté Pagada (o todas sus partes, si se dividió) o se anule; al volver a abrirla ves el pedido en solo lectura con Imprimir 80mm (ticket térmico para el cliente), Cobrar (ver Pasos — Cobrar en Mesas), Dividir cuenta y Abrir nota de pedido. Anular ticket anula la NP si no hay cobros y libera la mesa; si cocina ya recibió platos, pide motivo (y PIN si corresponde) e imprime una ANULACIÓN.
- Restaurante → Mostrador (
/mostrador): misma carta táctil que Mesas (categorías, grilla, frecuentes, Modificar, Configurar platos), pero el carrito es local hasta cobrar. En escritorio (≥1200px) el layout es Pedido | Carta | Frecuentes | Cobro (cobro en riel derecho). En tablet/móvil: pestañas Pedido | Carta | Frecuentes y cobro debajo. Cliente por defecto Consumidor Final (máx. $50). Al cobrar se asigna un número de turno (automático o manual según Configuración) visible grande en el ticket 80mm y en Cocina. Cobrar (nota) → NPstaff_poscon líneas ensent(origen Caja). Facturar → crea la misma NP (cocina) y la convierte a borrador de factura; Cocina sigue viendo las líneas aunque la NP quede facturada. Nueva venta limpia el carrito. No hay mapa ni Pedir cuenta. - Restaurante → Cocina (
/cocina): columnas Enviado (azul) / En prep. (ámbar) / Listo (verde). Solo ve líneas ya enviadas (noheld), en NP abiertas o facturadas; los pedidos web aparecen recién cuando su pago está confirmado, y el cargo de Envío a domicilio nunca aparece (es un cobro, no un plato). En pedidos de caja muestra el turno grande junto aCaja #NP-…. Un tablero para mesa, Mostrador/POS y web. El cocinero no marcaserved; el personal de sala sí. La pantalla consulta el servidor cada ~8 s (sin websockets) y solo redibuja cuando la cola cambia. Si la pestaña está en segundo plano, o nadie toca la pantalla ~30 min, deja de consultar sola (no hace falta cerrar sesión a las 02:00). Si hay centros de elaboración, el selector Centro (arriba) filtra la pantalla: Todos, General (sin centro) o un centro (p. ej. solo Bar). La elección se recuerda en ese dispositivo. Si un agente de impresión está desconectado aparece un aviso rojo: seguí trabajando con esta pantalla.- Cada tarjeta muestra un reloj (mm:ss) desde que el plato llegó a cocina; se pone ámbar y luego rojo (con borde rojo) según Configuración → Tiempos de cocina. En la columna Listo el reloj ya no se muestra.
- Los platos de un tiempo posterior llevan la etiqueta TIEMPO 2 / TIEMPO 3.
- Agotados (panel desplegable arriba): lista los platos agotados. Con
kitchen.operate(odining.operate) podés Reactivar uno, Reactivar todos (p. ej. al abrir el día) o buscar un plato y pulsar Agotar. Un plato agotado no se puede pedir en Mesas ni Mostrador, desaparece de la carta web y el checkout web lo rechaza.
- Ticket 80mm del cliente: desde el pedido de mesa (antes o después de pedir cuenta) → Imprimir 80mm abre
/sales-orders/{id}/ticket(mismo ticket que desde la NP o la lista). También desde Comercial → Notas de pedido → detalle o menú → Imprimir, o tras cobrar/facturar en Mostrador: el Turno grande aparece debajo del emisor (antes de la clave de acceso en facturas); el PedidoNP-…sigue en información adicional. - Factura después del cobro (Mesas): lo más rápido es Facturar ahora en la misma pantalla de cobro (ver Pasos — Cobrar en Mesas). Alternativa: si el total supera $50 (límite Consumidor Final SRI), en la NP usá Datos de factura (aunque ya esté Pagada): en la sección Cliente buscá o creá el cliente en Contactos y luego Convertir. Antes de convertir, todos los platos deben estar enviados a cocina (no quedar en
held). El cliente no necesita esperar la autorización SRI en mesa. - Después de convertir a factura, no se pueden agregar ítems ni anular el ticket (cocina sí puede marcar
servedy se puede cerrar la mesa). Si hay arqueo abierto, la ficha del ticket incluyeopen_cash_session_id. No hay factura automática al pedir cuenta. - El cliente de la NP de mesa es Consumidor Final / etiqueta de mesa por defecto; la mesa queda en el ticket (
source_channel=dining). Al facturar, caja usa Datos de factura (buscador inline;NewContactModalsolo si es nuevo). Los totales incluyen IVA.
Los tres canales no se mezclan: web → storefront_web; mesa → dining; Mostrador y POS escáner → staff_pos.
Pasos — Cobrar en Mesas
Quién: cobrar requiere fiscal_documents.edit (el mismo permiso que registrar cobros en la NP); Facturar ahora requiere además sales_orders.convert y que tu usuario tenga asignado el punto de emisión de la NP. Cuándo: después de Pedir cuenta.
- En el pedido de mesa (solo lectura) → Cobrar (si la cuenta está dividida, cada parte de Cuenta dividida tiene su propio Cobrar).
- La pantalla muestra Total, Pagado y Saldo, y una fila de pago con el saldo pendiente. Elegí la forma de pago (efectivo, tarjeta, transferencia…; las mismas de la NP) y el monto. Agregar pago suma filas para pagos mixtos (p. ej. $20 en efectivo + el resto con tarjeta); la nota de cada fila queda como referencia.
- Una fila por cuenta (solo si la mesa usó cuentas separadas y todavía no hay cobros): reemplaza las filas por una con el total de cada cuenta (A, B…). Elegí la forma de pago de cada una. Sigue siendo una sola NP y una sola factura; si cada cuenta necesita su propia factura, usá Dividir cuenta → Usar las cuentas.
- Dividir en pagos iguales (cuando los clientes solo quieren repartir el pago): elegí con − / + cuántas personas pagan (2–10) → Dividir. Las filas se reemplazan por N pagos del mismo monto (el último absorbe los centavos); cambiá la forma de pago de cada fila (p. ej. una con tarjeta y otra en efectivo). Sigue siendo una sola NP y una sola factura.
- Efectivo recibido (opcional): si el cliente paga en efectivo con un billete mayor, escribí lo recibido y la pantalla calcula el Vuelto (solo sobre las filas de efectivo).
- Registrar cobro. La suma no puede superar el saldo. El efectivo entra al arqueo abierto de quien cobra; si no hay arqueo abierto, un aviso lo indica y el cobro se registra igual (sin caja). Queda en el historial de la NP como «Cobro registrado desde Mesas».
- Cuando el saldo llega a cero, la mesa (o la parte) se libera y la pantalla ofrece Facturar ahora:
- Marcá Consumidor final (hasta $50) o escribí Cédula / RUC, Nombre o razón social y Correo (si el cliente ya existe en Contactos se usa ese).
- Facturar ahora convierte la NP en factura y la envía al SRI: verás «Creando factura…», «Enviando al SRI…» y luego «Factura autorizada» (se abre el ticket 80mm de la factura), «el SRI la autorizará en unos minutos» o, si falló el envío, la factura queda como borrador para revisarla en Facturas.
- Podés cerrar sin facturar y hacerlo luego desde la NP (Datos de factura → Convertir).
- Si la parte o la cuenta ya está facturada, el botón muestra Facturada · ver y abre la factura.
Pasos — Anulaciones y descuentos
Quién: mesero con dining.operate; si Configuración → Motivos y autorizaciones exige supervisor, hace falta el PIN de Recursos humanos de alguien con dining.manage (un usuario con dining.manage no necesita PIN).
- Anular un plato enviado (cualquier estado de cocina: enviado, en preparación, listo o servido): en el ticket de mesa → Anular en la línea → elegí el Motivo, la Cantidad a anular (si la línea tiene varias unidades), nota opcional y PIN si se pide → confirmá. Si el plato seguía en cocina, sale de la pantalla de Cocina y se imprime una comanda ANULACIÓN en su estación.
- Descuento en un plato (ticket abierto, antes de Pedir cuenta): Descuento en la línea → Porcentaje, Monto (sin IVA) o Cortesía 100 % → motivo, nota y PIN si se pide → Aplicar descuento. La línea muestra el descuento y el ticket recalcula el total (y el servicio, si aplica).
- Anular ticket con platos ya enviados: pide motivo (y PIN si corresponde); imprime ANULACIÓN de lo que seguía en cocina.
- Todo queda en el historial de la NP (plato anulado / descuento / ticket anulado) y en Reportes → Anulaciones y descuentos: periodo en la barra superior, resumen Por motivo (veces y monto) y Detalle con mesa, plato, quién lo registró y quién lo autorizó.
Pasos — Mover o unir mesas
Quién: dining.operate. Dónde: cabecera del ticket de mesa → Mover / unir.
- El modal muestra todas las mesas por ambiente: Libre, Ocupada, Cuenta (no seleccionable) y la Actual.
- Mesa libre → Mover aquí: el ticket completo (platos, PAX, mesero) pasa a esa mesa; cocina no se interrumpe.
- Mesa ocupada → Unir mesas: los platos pasan al ticket de la mesa destino, se suman los PAX y el ticket original se cierra (su NP queda anulada). Las comandas de cocina siguen igual. Si alguna de las dos mesas usaba cuentas separadas, las cuentas de la mesa que llega se ubican después de las de la mesa destino (p. ej. destino A y B, la que llega pasa a C), hasta la Cuenta J. Si ninguna usaba cuentas, todo queda en la Cuenta A.
- Con la cuenta ya pedida solo se puede mover a una mesa libre (no unir). Una cuenta dividida no se mueve: primero Deshacer división.
- Al terminar se abre la mesa destino. Queda en el historial de la NP (mesa movida / unida).
Pasos — Cuentas separadas durante el servicio
Quién: dining.operate (o sales_orders.edit). Cuándo: desde que se abre la mesa; mover platos entre cuentas se puede también después de Pedir cuenta, mientras la NP no tenga cobros ni esté dividida.
Las cuentas (Cuenta A a Cuenta J, máximo 10) agrupan los platos de quienes van a pagar por separado. La mesa sigue teniendo una sola NP: las cuentas solo ordenan los platos y muestran cuánto le toca a cada grupo.
- En el pedido de mesa, debajo de la cabecera, aparece Nuevos platos a: Cuenta A. Tocá + Cuenta para abrir la Cuenta B (y así hasta la J). La cuenta marcada recibe los platos que agregues; tocá otra cuenta para cambiar.
- Cuando hay platos en dos o más cuentas, el ticket los agrupa con un título por cuenta y su total (con IVA y su parte del servicio, si aplica). La suma de las cuentas es el total de la mesa.
- Mover un plato a otra cuenta: en la línea, el selector con el nombre de la cuenta → Pasar a Cuenta B. En un plato pendiente con varias unidades y sin descuento también aparece Pasar 1 a Cuenta B (la línea se separa). Un plato ya enviado a cocina se mueve completo. Queda en el historial de la NP («LINE_ACCOUNT_MOVED»).
- Se puede mover platos después de Pedir cuenta (p. ej. el cliente revisa el ticket y corrige). Deja de estar disponible cuando se registra un cobro o la cuenta se divide en varias NP (para volver a mover, Deshacer división).
- Al cobrar:
- Una sola factura para toda la mesa (lo normal): Cobrar → Una fila por cuenta y una forma de pago por fila (ver Cobrar en Mesas).
- Cada cuenta con su propia factura: Dividir cuenta → Usar las cuentas A/B… arma una parte por cuenta (ver Dividir la cuenta).
- Cocina no ve las cuentas: las comandas y la pantalla de Cocina no cambian. El ticket 80mm tampoco muestra subtotales por cuenta (solo la pantalla).
Pasos — Dividir la cuenta
Quién: dining.operate. Cuándo: después de Pedir cuenta, con la NP abierta y sin cobros. Usalo solo cuando cada cliente pide su propia factura por lo que consumió; si solo quieren repartir el pago, usá Cobrar → Dividir en pagos iguales (una sola factura).
- En el pedido de mesa (solo lectura) → Dividir cuenta (el botón aparece junto a Cobrar mientras no haya ningún cobro registrado).
- Si la mesa usó cuentas separadas, Usar las cuentas A/B… arma una parte por cuenta (Parte 1 = la primera cuenta con platos) y podés ajustar con + / − antes de confirmar. Si no, elegí el Número de partes (2–20). Todo empieza en la Parte 1; con + / − pasás unidades enteras de cada plato a otra parte. Cada parte necesita al menos un plato. Los platos no se fraccionan: si varios comparten un plato, asignalo a una parte o cobralo con pagos iguales.
- La vista previa muestra el monto de cada parte sin servicio; el servicio (propina) se recalcula en cada parte → Dividir.
- La NP original queda como Parte 1 y se crea una NP nueva por cada parte. En el pedido de mesa se siguen viendo todos los platos y el subtotal de la mesa completa; debajo aparece Cuenta dividida con cada parte, su total, lo pendiente, Cobrar (ver Cobrar en Mesas) y Abrir (cobro o Datos de factura por separado en la NP, p. ej. una factura con RUC y el resto Consumidor Final), más el Total de la mesa. El botón inferior pasa a Abrir parte 1. En Comercial → Notas de pedido todas las partes muestran el origen con la misma mesa (p. ej. Mesa 6).
- La mesa sigue en CUENTA hasta que todas las partes estén pagadas o anuladas.
- Cocina no cambia: aunque los platos sigan en preparación, la pantalla de Cocina muestra cada plato original una sola vez (con su cantidad total, aunque las unidades estén en partes distintas), y al marcarlo En prep., Listo o Servido se actualizan todas sus partes.
- Deshacer división: solo si ninguna parte tiene cobros ni factura; vuelve a juntar los platos en la NP original.
Pasos — Centros de elaboración
Quién: dining.manage. Dónde: Restaurante → Comandas (/mesas/comandas).
- Pestaña Centros de elaboración, sección Centros de elaboración → escribí el nombre (Cocina caliente, Parrilla, Bar…) → Agregar. Guardar renombra; Eliminar lo desactiva y sus grupos/productos vuelven a General.
- Misma pestaña, sección Grupos y productos (debajo):
- Cada grupo (categoría de productos) tiene un centro por defecto; elegilo en la tabla (se guarda al cambiar).
- Columna Tiempo: 1 · Con «Enviar a cocina», 2 · Con «Enviar tiempo 2» o 3 · Con «Enviar tiempo 3» (p. ej. entradas, platos fuertes y postres). Es el tiempo con el que llegan los platos de ese grupo al pedido de mesa (el mesero puede cambiarlo por plato). Solo afecta a Mesas; Mostrador, POS y web mandan todo junto.
- Sin preparación (no va a Cocina): opción del mismo selector para grupos o productos que no se preparan (bebidas embotelladas, agua, postres listos). Al Enviar a cocina esos platos quedan Servidos de inmediato: no aparecen en Cocina ni se imprime comanda, pero sí se cobran normalmente.
- Excepciones por producto: buscá el producto, elegí el centro (o Sin preparación) y Agregar. En la lista, Usar el del grupo quita la excepción. Un producto con centro propio siempre va a cocina aunque su grupo sea Sin preparación.
- Cada plato enviado a cocina (mesa, Mostrador/POS o web pagada) queda marcado con su centro en ese momento. Cambiar la asignación después no mueve platos ya enviados.
- En Cocina, cada pantalla elige su Centro (ver arriba).
Pasos — Comandas impresas
Las impresoras de red, estaciones de servicio, ruteo y el agente de impresión se configuran en la misma pantalla Comandas. Procedimiento completo: Restaurante — Comandas impresas.
Pasos — Recetas y food cost
Quién: dining.manage. Dónde: Restaurante → Recetas (/mesas/recetas).
- La lista muestra los platos de la carta (productos tipo Bien sin control de inventario propio, más los que ya tienen receta) con Precio sin IVA, Costo de la receta, Margen, Food cost e Ingredientes. Buscá con Buscar plato… o marcá Solo sin receta. Arriba se ve la Meta de food cost vigente.
- Crear receta / Editar abre el editor:
- Buscar ingrediente solo muestra productos con control de inventario y sin variantes (arroz, pollo, aceite…). Elegí uno y escribí la Cantidad por porción en la unidad del producto (p. ej. 0,25 kg).
- Cada fila muestra el Costo unitario (el costo del producto, que se edita en Productos) y el Costo de la fila. Quitar borra la fila. Máximo 40 ingredientes; no se repite un ingrediente ni se usa el mismo plato.
- Guardar receta. Una receta vacía la elimina.
- Food cost = costo de la receta ÷ precio sin IVA. Verde hasta la meta, ámbar hasta 5 puntos por encima y rojo más arriba. Si algún ingrediente no tiene costo, el plato muestra Costo incompleto. La meta se cambia en Configuración → Costos y propinas.
- Descuento de inventario: cada vez que el plato se envía a cocina (Enviar a cocina, Enviar tiempo N, Mostrador, POS o pedido web pagado), se descuentan sus ingredientes del inventario del establecimiento (movimiento Consumo receta). Si no alcanza el stock, el servicio no se bloquea: se descuenta lo que haya y el movimiento anota el faltante (p. ej. «Faltante 0,5 kg»).
- Anulaciones: si se anula un plato que todavía estaba Enviado (cocina no lo empezó), los ingredientes vuelven al inventario (Devolución receta). Si ya estaba en preparación, listo o servido, no vuelven: cuentan como merma. Anular el ticket o la NP devuelve solo lo que seguía en Enviado.
- Un plato con receta no debe tener control de inventario propio: si lo tiene, el editor muestra un aviso y Guardar receta se rechaza hasta desactivar el control de inventario del plato en Productos.
Pasos — Reportes del restaurante
Quién: dining.manage. Dónde: Restaurante → Reportes (/mesas/reportes). Todas las pestañas usan el periodo de la barra superior (Hoy, Este mes, Mes anterior, Última semana… o Seleccionar rango con desde/hasta; por defecto, el mes en curso; máximo 366 días). Las fechas son días de Ecuador. La pestaña Anulaciones y descuentos está en Anulaciones y descuentos; Cola de impresión en Comandas impresas.
Ventas
- Se cuentan las mesas cerradas (cuenta pedida) abiertas en ese rango, excluyendo NP anuladas.
- Tarjetas: Mesas atendidas, PAX, Ventas netas (sin IVA), Ventas con IVA, Propinas (no son ingreso) y Promedio por PAX (ventas netas de mesas con PAX ÷ PAX). El servicio / propina no se suma a las ventas.
- Tablas Por día, Por ambiente, Por zona y Por mesero con mesas, PAX, ventas netas, promedio por PAX, promedio por mesa y propinas. «Sin asignar» = mesa sin zona o sin mesero.
Platos y horarios (mesas, Mostrador, POS y web; sin NP anuladas ni servicios como el envío)
- Mix de platos: por plato, Cantidad, % del total, Ventas netas, Costo, Margen, Margen por plato y Clasificación: Estrella (popular y rentable), Caballo de batalla (popular, poco margen), Enigma (rentable, poco pedido) y Perro (ni popular ni rentable). Solo se clasifican los platos con receta y costo completo.
- Ventas por hora (pedidos, PAX y ventas netas por hora) y el mapa de calor Día de la semana × hora, en hora de Ecuador.
Tiempos de cocina
- Cuánto tarda la cocina desde que recibe el plato hasta marcarlo Listo, Por centro de elaboración y Por plato: Platos, Promedio, Mediana, 90% en menos de y % tarde (platos que pasaron el tiempo en rojo de Configuración → Tiempos de cocina).
- Los platos sin preparación o servidos sin pasar por Listo no cuentan.
Propinas → ver Reparto de propinas.
Pasos — Reparto de propinas
Regla: la propina y el cargo por servicio (10 %) son de los empleados, no ingreso del negocio, y van aparte del subtotal gravado y del IVA 15 % (en la factura y el RIDE salen en la línea Servicio / Propina). Solo lo cobrado con tarjeta, transferencia u otro medio electrónico entra al fondo; la propina en efectivo queda en el piso y el sistema no la registra ni la reparte.
- Configurar el reparto (
dining.manage): Configuración → Costos y propinas → Reparto de propinas. Requiere los departamentos creados en Recursos humanos (p. ej. Sala y Cocina). Escribí el % de cada departamento; el Total debe sumar 100 % → Guardar reparto. - Ver el reparto del periodo: Reportes → Propinas:
- Fondo de propinas electrónicas y Cuentas con propina electrónica. Si una cuenta se pagó en parte con efectivo, entra al fondo solo la parte de la propina proporcional a lo cobrado electrónicamente. Cuentan las NP con propina y las facturas autorizadas con propina que no vienen de una NP; no cuentan cobros anulados ni a crédito.
- Por departamento: % y monto. Por empleado: dentro de cada departamento, el monto se reparte según las Horas marcadas en Recursos humanos (asistencia) en el periodo.
- Si un departamento no tiene horas marcadas, su parte queda en Sin asignar (sin horas).
- Exportar CSV para nómina descarga el detalle por empleado para cargarlo en la nómina.
La tarjeta Propinas (no son ingreso) de Reportes → Ventas suma todo el servicio / propina de las mesas del periodo (cualquier forma de pago); el fondo a repartir es el de Reportes → Propinas (solo electrónico).
Resultado esperado
- Dominio público: carta con carrito, checkout WhatsApp y cuenta de cliente (registro / mi cuenta); sin pie de hotel.
- Panel Restaurante con mapa de mesas, Mostrador (cobro primero) y cocina.
- Ventas SRI desde NP / Mostrador / POS / comprobantes, no desde el ticket de mesa.
Si algo falla
- Home vacía sin platos → publicá productos del tenant o corré el seed de vitrina (
seed_vertical_showcase_catalog.pyen demos). - 403 al cargar la carta → el plan no tiene
storefront. - 403 en Mesas / Cocina → el plan no tiene
vertical_surfaceo falta el permiso del rol. - Sin WhatsApp en la confirmación → falta el número en Sitio web → Contacto.
- Un pedido web no aparece en Cocina → su pago aún no está confirmado: Confirmar pago recibido en la NP (WhatsApp, transferencia o tarjeta sin webhook).
- No aparece «Pagar con tarjeta» → el plan no incluye pagos en línea, Pago en línea está desactivado o faltan las credenciales PayPhone.
- Entregas visibles con el local cerrado a domicilio → activá Pausar entregas a domicilio.
- Elegiste Por distancia pero el checkout sigue en «confirmar por WhatsApp» → falta la ubicación del local o la clave
GOOGLE_MAPS_SERVER_KEYdel servidor (avisar a soporte). - «El mapa no está disponible» en el checkout → falta
REACT_APP_GOOGLE_MAPS_BROWSER_KEYo la clave no permite el dominio de la tienda (restricción por referrer en Google Cloud). - «Delivery service is not configured» al confirmar con zonas o distancia → configurá el Servicio de envío en Sitio web → Envíos.
- Cambiar con PIN responde «Invalid PIN» → el PIN no coincide con un empleado activo de Recursos humanos; «no staff login linked» → el empleado no tiene usuario vinculado.
- Un plato aparece en el centro equivocado en Cocina → revisá su grupo / excepción en Comandas → Centros de elaboración → Grupos y productos (aplica a los próximos envíos).
- Reporte en cero → solo cuenta mesas con Pedir cuenta en el rango; mesas abiertas no suman.
- Quitar no aparece en un plato → ya se envió a cocina: usá Anular con motivo.
- «Supervisor PIN required» / «This PIN does not belong to a supervisor» al anular o descontar → el PIN debe ser de un empleado activo con usuario vinculado y permiso
dining.manage; o desactivá la exigencia en Configuración → Motivos y autorizaciones. - No se puede unir con una mesa → la mesa destino está en CUENTA, o tu ticket ya pidió cuenta (solo mover a mesa libre).
- Dividir cuenta no aparece o falla → la NP ya tiene cobros o factura, o la cuenta todavía no se pidió.
- Deshacer división falla → alguna parte ya tiene cobros o factura.
- Aparece Enviar tiempo N en lugar de Enviar a cocina, o «Course N is waiting» → los platos pendientes son de un tiempo posterior: tocá Enviar tiempo N cuando la mesa esté lista.
- No aparece Cobrar → falta el permiso
fiscal_documents.edit, o la cuenta todavía no se pidió. «The payments exceed the balance due» → la suma de filas supera el saldo. - Facturar ahora responde «You may only issue documents from your assigned emission point» → tu usuario no tiene asignado el punto de emisión de esa NP (Configuración de empleados); «Consumidor Final» rechazado → el total supera $50: escribí cédula/RUC y nombre.
- Un plato no se puede agregar («is sold out») → está Agotado: reactivalo en Cocina → Agotados o manteniéndolo presionado.
- No suena el aviso de platos listos → el navegador bloquea el sonido hasta que tocás la pantalla una vez; el aviso visual aparece igual.
- Un ingrediente no aparece en Buscar ingrediente → el producto no tiene control de inventario, es un servicio o tiene variantes (color/talla).
- Guardar receta responde «Turn off inventory control on this dish first» → desactivá el control de inventario del plato en Productos.
- El plato no está en Recetas → la lista muestra productos tipo Bien sin control de inventario; si el plato lo tiene activado, desactivalo.
- Food cost en Costo incompleto → algún ingrediente no tiene costo unitario en Productos.
- Platos y horarios no clasifica un plato → el plato no tiene receta o tiene costo incompleto.
- Guardar reparto responde que debe sumar 100 % → corregí los porcentajes por departamento. Montos en Sin asignar (sin horas) → ese departamento no tiene horas marcadas en el periodo (revisá la asistencia en Recursos humanos).
Preguntas frecuentes
¿Tengo que usar los tiempos? No. Si todos los grupos quedan en 1 · Con «Enviar a cocina» (el valor por defecto), Enviar a cocina manda todo como antes y nunca aparece Enviar tiempo.
¿Cobrar en Mesas reemplaza a la nota de pedido? No: registra los cobros en la misma NP. Podés seguir cobrando desde Comercial → Notas de pedido si lo preferís; ambos caminos suman al mismo saldo.
¿Qué pasa con un plato agotado que ya estaba pedido? Nada: lo ya pedido o enviado sigue su curso. Agotado solo impide pedirlo de nuevo (Mesas, Mostrador y web) hasta que lo reactives.
¿El aviso de listos reemplaza a la pantalla de Cocina? No; es un aviso para sala. Cocina sigue marcando Listo en su pantalla y el mesero confirma con Servido.
¿Cómo cobro una cuenta que pagan entre varios en partes iguales? En Cobrar usá Dividir en pagos iguales: queda una sola NP y una sola factura con varias formas de pago (el SRI lo permite mientras la suma cuadre con el total). Dividir cuenta es solo para dar facturas separadas por lo que consumió cada uno; los platos no se fraccionan en «1/3». Si alguien insiste en una factura propia por una parte igual de la cuenta, el personal puede emitirla manualmente (p. ej. copiando la NP y ajustándola), fuera del flujo de Mesas.
¿Las cuentas A/B crean varias notas de pedido? No. La mesa sigue con una sola NP; las cuentas solo agrupan los platos y muestran cuánto paga cada grupo. Se crean NP separadas únicamente si usás Dividir cuenta (por ejemplo con Usar las cuentas), cuando cada grupo pide su propia factura.
¿Puedo cambiar un plato de cuenta después de pedir la cuenta? Sí, mientras no haya ningún cobro registrado y la cuenta no esté dividida. Después del primer cobro las cuentas quedan fijas.
¿La propina cuenta como venta? No. Los reportes muestran Ventas netas (sin IVA) y la propina / servicio aparte como Propinas (no son ingreso). En la factura el servicio no forma parte de la base del IVA.
¿Se reparte la propina en efectivo? No. El sistema solo reparte lo cobrado con tarjeta, transferencia u otro medio electrónico; el efectivo se maneja en el piso y no se registra.
¿Tengo que cargar recetas para usar el restaurante? No. Sin receta el plato se vende igual y no descuenta inventario; solo deja de tener costo y clasificación en Platos y horarios.
Relacionados
- 19 — Índice sitio web
- 16 — Notas de pedido
- 22 — POS
- 25 — Catálogo e inventario
- Restaurante — Comandas impresas
- 26 — Recursos humanos (PIN del empleado)
- ADR tickets de mesa:
docs/adr/restaurant-dining-tickets.md
Última revisión: 2026-10-31
Si este flujo cambia en el producto, actualiza esta página.