POS — toma y cobro de pedidos
Ruta: /pedidos
Quién la usa: cajero (y el gerente, que además ve los descuentos)
Permiso requerido: order.take para entrar; pos.sell para cobrar; pos.discount para descontar; pos.comp para la cortesía; pos.refund para reembolsar; reports.cashier para el botón 📋 EOD
Capturas: docs/manual/screenshots/pos/
Qué es
El POS es la caja registradora del restaurante. A la izquierda están las secciones del menú y las tarjetas de producto; a la derecha se arma un ticket: canal, modalidad, datos del cliente, líneas, notas, promociones y los totales (Subtotal (sin ITBMS), ITBMS, Total). Cobrar crea el pedido y lo factura en una sola operación: el pedido aparece en cocina ya pagado. En la fila del título —que es del POS, no la barra superior del panel— se abre y cierra la caja, se consulta el EOD, se entra a 🧾 Pedidos (que es también la puerta del reembolso) y aparecen los tickets pausados.
Cuándo se usa
Durante todo el servicio, cada vez que alguien pide en el mostrador, por
teléfono, por WhatsApp o llega un ticket de una plataforma. En la simulación
frankies-sim la operó el cajero (cajero@frankies-sim.local) con la caja
abierta; con la caja cerrada la pantalla igual carga y deja armar el ticket,
pero el encabezado muestra 🔓 Abrir caja en lugar de 🔒 Cerrar caja.
Paso a paso
Abra POS en el menú lateral. Verifique en el encabezado que diga 🔒 Cerrar caja; si dice 🔓 Abrir caja, ábrala antes de vender: el diálogo Abrir caja propone como fondo el efectivo del cierre anterior («Cierre anterior: $271.39 — se sugiere como fondo inicial»).
Diga para quién es el pedido: al abrir el POS —y tras cada venta— aparece la ventana ¿Para quién es el pedido?. Escriba nombre o teléfono y toque la coincidencia, toque Último cliente para repetir el anterior, cree la ficha con + Nuevo cliente (nombre y teléfono; Guardar y usar) o presione Consumidor Final para vender sin datos. La ventana no tiene ✕: siempre hay que elegir. El ticket recuerda la elección (✓ Cliente vinculado o 👤 Consumidor Final) y cambiar la vuelve a abrir.
Elija el Canal (Mostrador · Teléfono · WhatsApp · PedidosYa) y la modalidad (Para llevar · Delivery · En local).
Toque la tarjeta del producto. Se abre la hoja del producto con el grupo Tamaño («Obligatorio · elige 1»: 10" $12.00, 14" $18.00, 18" $26.00), el grupo Extras («hasta 5»), el campo Notas para este producto y, al pie, la cantidad y Agregar N · $X.
Repita con el resto. Con 1 × Margherita 14" y 1 × Refresco los totales quedan en Subtotal (sin ITBMS) $19.50 · ITBMS $1.37 · Total $20.87.

Presione Cobrar $20.87. Se abre el panel Pagar: elija el método, anote el monto y confirme con Pagar $X. El ticket cierra con el cambio y el aviso «Pedido pagado · Factura #N · ya está en cocina». Todo el detalle —métodos, denominaciones, cobro dividido, notas obligatorias, cortesía— está en Panel de cobro del POS.

Para cobrar con dos medios, agregue el primer pago al ticket y luego el segundo; cuando el importe tecleado iguala lo que falta, el botón pasa a Pagar $X y ahí se confirma.

Si tiene que atender a otro cliente sin perder el ticket, presione ⏸ (Pausar ticket): el ticket se vacía y queda como un botón ⏸ —o ⏸ N art., si no escribió nombre— en la fila del título. Presione ese botón para retomarlo tal cual estaba: canal, modalidad, cliente, notas y líneas, y su botón desaparece de la fila. Los tickets pausados viven en el navegador de esa estación: en la caminata sobrevivieron a recargar la página, pero no se ven desde otra tablet, no llegan a cocina y no aparecen en ningún reporte. Para descartar uno, retómelo y vacíelo con Quitar en cada línea: no hay botón de descartar.
Con Delivery, aparecen Zona de entrega… (San Francisco — $2.50 · El Cangrejo — $4.00 (mín. $15.00)), Dirección de entrega (punto de referencia), Indicaciones para el motorista (edificio, piso, timbre…) y 📍 Ubicar en mapa; el envío se suma como línea Envío. En esta modalidad desaparece Pagar al recoger: un delivery se cobra en el mostrador antes de que exista, porque el motorista nunca maneja dinero del pedido — ver Reparto — tablero de despacho.
Con el canal PedidosYa el ticket cambia: pide # pedido plataforma y cómo se entrega (Reparto de la plataforma · Reparto propio · Retiro), cada línea gana el campo Precio plataforma, y el panel Promo / descuentos desaparece por completo.

Para devolver una venta, abra 🧾 Pedidos, elija el pedido y use el panel Reembolsar pedido completo.

Campos y botones
| Campo/Botón | Qué hace | Notas |
|---|---|---|
| 🧾 Pedidos | Abre la lista de pedidos del día dentro del POS | Buscador «# ticket, teléfono o nombre…»; cada fila trae Cobrado o Por cobrar |
| 🔓 Abrir caja / 🔒 Cerrar caja | Abre o cierra el turno de caja sin salir del POS | Sólo con pos.sell; al cambiar el fondo sugerido exige una nota |
| 📋 EOD | Lleva al cierre del día (/caja/eod) | Sólo con reports.cashier |
| Todo · Por slice · Pizzas | Filtran las tarjetas por sección del catálogo | «Por slice» agrupa lo que se descuenta por unidad |
| Tarjeta de producto | Abre la hoja del producto | Muestra «quedan N» en lo que lleva existencia por unidad (Slice Margherita quedan 5, Refresco quedan 116); si está agotado dice Agotado y no se puede tocar |
| Tamaño / Extras | Variantes y modificadores de la línea | «Obligatorio · elige 1» en Tamaño; Extras suma el recargo al precio |
| Agregar N · $X | Mete la línea al ticket con la cantidad elegida | |
| Canal: Mostrador · Teléfono · WhatsApp · PedidosYa | Marca de dónde viene el pedido | PedidosYa sólo aparece si hay contrato vigente para esa plataforma |
| Para llevar · Delivery · En local | Modalidad de entrega | Delivery agrega zona, dirección y pin |
| ¿Para quién es el pedido? (ventana al iniciar) | Cada venta empieza aquí: Buscar por nombre o teléfono, Último cliente (el último con ficha que atendió esta cuenta), + Nuevo cliente o Consumidor Final | No se cierra sin elegir. Vuelve a aparecer tras cada venta, tras Nueva venta y tras pausar un ticket; sin conexión sólo ofrece Consumidor Final y «Escribir nombre en el ticket» |
| + Nuevo cliente (formulario) | Nombre y Teléfono; también Apellido, Correo, Género o Fecha de nacimiento si el negocio los marcó obligatorios en Ajustes | Guardar y usar crea la ficha y la vincula al ticket. Si ya había un cliente con ese teléfono, usa esa ficha en vez de duplicarla. Basta con el permiso de tomar pedidos: la cajera no necesita poder editar clientes |
| ✓ Cliente vinculado · cambiar / 👤 Consumidor Final · cambiar | Recuerda lo elegido para este ticket | cambiar vuelve a abrir la ventana |
| Nombre del cliente / Teléfono del cliente | Muestran al cliente elegido (borde verde si tiene ficha); también sirven para escribir un nombre de recogida sin registrarlo y para buscar coincidencias | Borrar o editar el nombre desvincula la ficha: la venta queda entonces como Consumidor Final con ese nombre en la comanda |
| Zona de entrega… | Fija la zona y su costo de envío | Muestra el mínimo de la zona entre paréntesis |
| Indicaciones para el motorista (edificio, piso, timbre…) | Cómo llegar hasta la puerta | Sólo en Delivery, bajo la dirección; es lo que ve el motorista en su tablero — no las notas del pedido |
| 📍 Ubicar en mapa | Abre Ubicación de entrega para poner el pin | Responde «✓ », «✕ Área excluida — sin delivery» o «✕ Fuera de cobertura» |
| − / cantidad / + / Quitar | Ajustan o eliminan la línea | |
| Desc. | Descuento de una línea, en $ o % | Sólo con pos.discount. Sin el permiso el botón no se dibuja |
| Notas del pedido | Texto libre que viaja a la comanda y al KDS | Aquí van las instrucciones del cliente («sin cebolla», «tocar el timbre»). En la simulación traen en su lugar una etiqueta técnica del guion del día, que en un restaurante real no existe |
| Promo / descuentos ▸ | Despliega el código de promo y, si el rol lo permite, Desc. pedido | Al cajero le muestra sólo «Código promo» + Aplicar; no existen «Desc. pedido» ni el botón «Desc.» de línea |
| Código promo / Aplicar | Aplica un código de promoción al ticket | Aplicar está apagado hasta que hay código y carrito |
| Desc. pedido ($ / %) | Descuento manual sobre todo el pedido | Sólo pos.discount; el ITBMS se recalcula sobre la base ya descontada |
| Subtotal (sin ITBMS) · Descuento · Envío · ITBMS · Total | Desglose del ticket | El descuento y el envío sólo aparecen cuando existen |
| Cobrar $X | Abre el panel de cobro | Apagado sin productos, sin pos.sell, o si falta la zona / el # de plataforma |
| Pagar al recoger | Manda el pedido a cocina sin cobrar | No existe en Delivery ni en canal de plataforma. Ese pedido no se cobra después desde el POS: la única pantalla que lo cobra es el KDS, con Cobrar y entregar |
| ⏸ | Pausa el ticket y lo deja como botón en la fila del título para retomarlo | Se guarda en esa estación (sobrevive a recargar la página); apagado con el ticket vacío. Ver el paso 8 |
| # pedido plataforma | Número del pedido en la plataforma | Obligatorio |
| Reparto de la plataforma · Reparto propio · Retiro | Cómo se entrega el pedido de plataforma | Obligatorio |
| Precio plataforma | Precio que la plataforma cobró por esa línea | Un 0 se marca en ámbar con «⚠ B/. 0 — verifica el ticket de la plataforma», pero se acepta |
| Devolver por / Motivo (obligatorio) / Reembolsar $X | Cierran el reembolso total desde 🧾 Pedidos | Viene preseleccionado el método con que se pagó; el botón se habilita con un motivo de 3 letras o más |
| 🧾 Comanda · 🖨 Recibo | Reimprimen la comanda de cocina y el recibo | «Recibo» sólo si el pedido tiene factura |
| Nueva venta | Limpia el ticket para el siguiente cliente |
Mensajes y errores
"Pedido pagado · Factura #N · ya está en cocina" — cierre normal de una venta cobrada.
"Pedido enviado a cocina — se cobra al entregar" — cierre de Pagar al recoger.
"Falta el número de pedido de la plataforma"
NG_MARKETPLACE_ID_REQUIRED
"Selecciona cómo se entrega el pedido"
NG_MARKETPLACE_MODE_REQUIRED
"Ese pedido de la plataforma ya fue ingresado"
NG_MARKETPLACE_DUPLICATE
"Agrega al menos un producto al pedido."
NG_ORDER_EMPTY
"Revisa el pedido: cantidades y datos válidos."
NG_ORDER_INVALID
"Faltan o sobran opciones en un producto (revisa tamaños y extras)."
NG_MODIFIER_SELECTION
"Ese producto no está disponible ahora."
NG_PRODUCT_NOT_AVAILABLE
"Elige una zona de entrega válida."
NG_ZONE_INVALID
"Tu pedido no llega al mínimo para esta zona."
NG_MIN_ORDER
"Este pedido ya fue cobrado y facturado."
NG_ORDER_ALREADY_SETTLED
"Los pedidos de delivery se pagan en línea y este negocio aún no activa pagos en línea."
NG_DELIVERY_PREPAY_REQUIRED— el rechazo de fondo detrás de que Pagar al recoger no exista en Delivery: un pedido a domicilio sólo se crea con el cobro ya hecho.
"No encontramos esa caja."
NG_SHIFT_NOT_FOUND
"No tienes permiso para esta acción."
NG_FORBIDDEN
"Sin respuesta del servidor. Revisa la conexión y vuelve a cobrar — no se duplicará el pedido."
"Código no válido para este pedido." — el código escrito no existe o no aplica al carrito.
Sobre el reembolso, el panel responde con textos propios:
«Abre la caja antes de reembolsar (el efectivo sale del cajón).»
(NG_SHIFT_REQUIRED), «Solo se reembolsan ventas del turno abierto.»
(NG_REFUND_WINDOW), «Este pedido ya fue reembolsado.»
(NG_ALREADY_REFUNDED) y «Este pedido no está cobrado — cancélalo en vez de
reembolsar.» (NG_ORDER_UNPAID).
Lo que esta pantalla no hace:
- Al cajero sin
pos.discountno le rechaza el descuento — sencillamente no le dibuja el control, y nada en la pantalla avisa que existe y está oculto. - No reembolsa por línea: el panel es siempre Reembolsar pedido completo.
- Con el canal de plataforma no permite promociones ni descuentos de ninguna clase.
- No pide identificar al cajero. El POS del restaurante no tiene el botón Cambiar cajero ni pide PIN: la venta queda a nombre de la cuenta con la que se entró al panel. Por eso, en una estación compartida, cada persona debe entrar con su propia cuenta y cerrar sesión al terminar el turno (ver Encabezado del panel).
- No permite saltarse la pregunta del cliente. La ventana «¿Para quién es el pedido?» no tiene ✕: para una venta rápida sin datos se presiona Consumidor Final, que es un toque. El ajuste Exigir cliente en cada venta (Ajustes → General) sigue sin cambiar nada en el POS del restaurante: la pregunta se hace siempre.
- No pone hora a un pedido. No hay campo de «programado para las…»: todo ticket entra como pedido de ahora.
- No cobra propinas ni tarjetas de regalo — ver Panel de cobro del POS.
- No cancela pedidos. Ni desde el ticket ni desde 🧾 Pedidos: lo cobrado se reembolsa, y para un pedido sin cobrar ninguna pantalla del panel ofrece cancelar.