SacTactil — Restaurante AY-028

Panel de mesas, comanda, cocina KDS, cuentas/cobro y combos para restaurantes

Menú Ayuda

Visión general

SacTactil es el módulo de restaurante de FactuPOS. Está diseñado para operación táctil en tabletas o monitores tipo POS, con un flujo optimizado para mesero, cocina y caja.

MóduloFunciónUsuario típico
Panel de MesasVista del salón con estado de cada mesa (libre, ocupada, reservada)Mesero / anfitrión
ComandaToma del pedido de la mesaMesero
Cocina (KDS)Pantalla de cocina que recibe los pedidos en tiempo realCocinero
Cuentas / CobroDivisión de cuenta, pagos parciales y cobro finalCajero
CombosDefinir combos, grupos de escogencia y preciosAdministrador

Flujo típico de atención

  1. El cliente entra y el mesero le asigna una mesa desde el Panel de Mesas
  2. Al tocar la mesa se abre la Comanda y se toma el pedido
  3. Al confirmar, el pedido se envía a la pantalla de Cocina (KDS)
  4. Cocina marca los platos como "preparando" y luego "listos"
  5. El mesero lleva los platos al cliente
  6. Cuando el cliente pide la cuenta, el cajero abre Cuentas / Cobro
  7. Se divide la cuenta si es necesario, se cobra y se emite factura electrónica
  8. La mesa vuelve al estado "Disponible" y queda libre para el siguiente turno
Impresión en cocina Los pedidos se imprimen automáticamente en la impresora térmica de cocina (o bar, según el tipo de producto) al confirmar la comanda. La pantalla KDS es un complemento digital.

Panel de Mesas SA-MESAS

Vista del salón del restaurante con todas sus mesas dibujadas en su ubicación real. Permite conocer de un vistazo el estado del restaurante.

Estados de mesa

CódigoEstadoColorSignificado
DDisponibleVerdeMesa libre, lista para recibir clientes
OOcupadaRojoTiene comanda activa con pedidos
RReservadaAzulReservada para cliente próximo

Layout visual

  • Cada mesa se dibuja en su posición con tamaño configurado por salón (Pequeña / Mediana / Grande / XL / Personalizado)
  • Se puede tener varios salones (planta baja, terraza, VIP, etc.)
  • El número de la mesa ocupa todo el tablero, centrado y grande para lectura rápida desde lejos
  • Cada mesa tiene apariencia de "tablero real" con sombra de elevación, brillo cristal sutil arriba y borde inferior oscuro que simula el canto

Identificación de subcuentas por color (2026-05-06)

Cuando una mesa está ocupada con varias subcuentas (cuentas separadas para distintos clientes en la misma mesa), aparecen puntos de colores alrededor del tablero:

  • 1 punto = 1 subcuenta. Los puntos se distribuyen llenando primero las 4 esquinas y luego los 4 centros de los lados (8 max visibles, los extras quedan apilados en línea al pie)
  • Cada subcuenta tiene su propio color de una paleta de 10 (rojo, azul, verde, ámbar, violeta, cian, rosa, lima, naranja, índigo)
  • El color se mantiene consistente: "Juan" siempre será del mismo color en su mesa, en el modal MS-001 y en la lista de subcuentas
  • Al apuntar el cursor al punto se muestra el nombre del cliente
Elegir el color al crear subcuenta Al pulsar Agregar en una mesa, el modal "Subcuenta" muestra un selector con los 10 colores disponibles. El sistema pre-selecciona el primer color que no esté usado por las otras subcuentas de esa mesa. El usuario puede tocar otro chip para elegir manualmente. El color elegido se guarda y se usa de ahí en adelante para esa subcuenta.

Mesa libre vs mesa ocupada

  • Mesa libre / reservada: tablero limpio con su número grande centrado, sin elementos extras
  • Mesa ocupada / en cuenta: tablero del color del estado + puntos de colores por subcuenta

Acciones desde una mesa

  • Tocar mesa libre — Abre el modal "Nombre de cuenta" para iniciar la mesa
  • Tocar mesa ocupada — Abre el modal MS-001 con el detalle (items por subcuenta + acciones)
  • Tocar mesa reservada — Pregunta si liberar la reserva
  • Botones del header: Persona (verde) / Express (ámbar) / Reservar (violeta) / Para Llevar / Bitácora / Utilidades
  • Reservar: activa modo selección visual — las mesas libres pulsan en violeta y las demás se atenúan; tocar una mesa libre la reserva al instante. Toque "Cancelar" en la barra inferior para salir del modo
  • Para Llevar: abre una orden para llevar pidiendo el nombre del cliente, igual que Persona. La orden se crea en el salón LLEVAR; si ese salón aún no existe, se crea automáticamente con la configuración de impresoras del salón principal. Aparecerá como una pestaña más en la parte superior
  • Nombre del usuario: a la derecha de los botones del header se muestra, en un recuadro amarillo, el nombre del usuario que tiene la sesión abierta
  • Mover productos — Trasladar pedidos entre mesas (requiere permiso 065)
Editar layout + Reordenar (2026-05-06) En modo edición de layout, las mesas se pueden arrastrar libremente. El nuevo botón azul Reordenar en la barra inferior acomoda automáticamente todas las mesas en filas, ordenadas alfabéticamente y respetando el espacio que ocupa el sidebar de "Mesas Activas". Útil para resetear posiciones manuales y empezar desde una grilla limpia.

Detalle de línea MS-005

Al dar doble-click o tocar el botón de lápiz en una línea de la mesa, se abre el modal de detalle con la información de ese item:

  • Nombre + código del artículo en el header azul
  • Cantidad (solo lectura — se ajusta desde los botones +/− en la lista)
  • Precio unit. — precio base sin impuestos, editable
  • IVA, Imp. Servicio — porcentajes aplicados
  • Precio final — con IVA+Servicio, editable (cálculo inverso automático al base)
  • Desglose por pedido cuando una línea agrupa varios envíos con cantidades distintas
Edición de precio — requiere permiso 082 Editar el precio cambia la línea en SacMesaAcumulado. Si el usuario no tiene el permiso 082 (SAC, edita precio de venta), al dar Guardar se abre un modal que solicita la clave de un supervisor autorizado. Si la clave corresponde a un usuario que sí tiene 082, el cambio se aplica.
Cálculo inverso Precio final ↔ Precio unit. Si se edita Precio final (ej: 1200.00), el sistema recalcula el base dividiendo entre 1 + IVA/100 + Serv/100. Y al revés: si se edita el base, el final se recalcula multiplicando. Así se puede ingresar un precio redondo al cliente.
El precio de un combo no se edita Si la línea es un combo (tanto el renglón principal como sus artículos incluidos), los campos de precio aparecen bloqueados (gris) y no se pueden modificar. El precio de un combo está armado por su definición; para cambiarlo se ajusta el combo en su módulo de Combos, no desde la mesa. Los artículos sueltos (que no son combo) sí se siguen editando con el permiso 082.

Combos en la mesa — se manejan en conjunto MS-001

Cuando una mesa tiene un combo (por ejemplo un "Balde"), se muestra el renglón principal con la etiqueta COMBO y debajo, indentados con una flechita , los artículos que lo componen con su cantidad. El renglón principal muestra el total del combo (la suma de sus artículos).

  • El combo es indivisible: solo se opera desde el renglón principal. Sus artículos incluidos quedan de solo lectura (no tienen botones de cobrar, sumar, restar ni selección individual).
  • Pasar a facturar / cobrar: al tocar la flecha verde del combo se pasan todas las cantidades de todos sus artículos juntos (no uno por uno).
  • Mover: al mover un combo a otra mesa se traslada completo, con todos sus artículos.

Lista de "Mesas Activas" (panel derecho)

El panel derecho muestra todas las mesas con cuenta abierta, agrupadas por salón: un encabezado por cada salón (con la cantidad de mesas) y debajo sus mesas, una por fila con el nombre y el tiempo transcurrido. Cada ficha toma el color del salón y el texto se ajusta solo para que se lea bien. Tocar cualquier ficha abre el detalle de esa mesa.

  • Tiempo: se muestra en una sola unidad — 30 min si es menos de una hora, 1 hora / 2 horas si pasa de la hora, y 1 día / 2 días si pasa de las 24 horas.

Comanda

Es la pantalla donde el mesero toma los pedidos de los clientes. Diseñada para uso táctil rápido.

Áreas de la pantalla

  • Líneas del pedido (izquierda) — Artículos agregados con cantidad, modificadores y notas
  • Categorías — Botones grandes (Entradas, Platos fuertes, Bebidas, Postres…)
  • Productos — Cambia según la categoría seleccionada
  • Botones de acción — Enviar a cocina, imprimir precuenta, aplicar combo

Agregar un producto

  1. Toque la categoría
  2. Toque el producto
  3. Se agrega una línea con cantidad 1
  4. Puede modificar cantidad, agregar notas (ej: "sin cebolla") o seleccionar modificadores

Combos

Si el producto es un combo, el sistema abre un modal donde se seleccionan los grupos (ej: "elija plato fuerte", "elija bebida"). Ver sección Combos.

Enviar a cocina

Al presionar "Enviar":

  • Los nuevos platos se imprimen en la impresora de cocina/bar según su tipo
  • Aparecen en la pantalla KDS
  • El estado de la mesa cambia a "Ocupada"

Eliminar líneas

Requiere permiso 093 (SAC, quitar artículos de la mesa). Desde 2026-06-04, si el usuario no tiene este permiso, el botón de eliminar ya no aparece deshabilitado: al usarlo se abre un modal que pide la clave de un supervisor con permiso 093. Si la clave corresponde a un usuario autorizado, la línea se elimina y queda registrado en la bitácora quién autorizó la eliminación. Esto aplica a eliminar una línea, varias líneas seleccionadas y al botón de restar (−1) cuando deja la línea en cero. (Este comportamiento de autorización por clave de supervisor funciona en el panel de Mesas.)

Modificar pedido ya enviado Si el pedido ya fue enviado a cocina, eliminar o modificar líneas requiere autorización. El KDS muestra una alerta cuando una línea se elimina del pedido original.

SAC Móvil SA-MOBILE

SAC tiene una interfaz móvil/táctil específica para meseros con celular, optimizada para pantallas pequeñas y gestos rápidos. Se activa automáticamente al detectar User-Agent de teléfono o tablet.

Detección automática

Al entrar a /modulos/sac/mesas/ desde un dispositivo móvil, el sistema redirige a mesas/index_movil.php. Si tocás una mesa, te lleva a comandar_movil/?id=. Para forzar la versión desktop, se puede pasar ?desktop=1 en la URL.

Panel de mesas móvil MS-MOVIL

  • Tabs de salones sticky en la parte superior
  • Grid de mesas 3 columnas con borde grueso del color del estado (verde libre, rojo ocupada, turquesa con cuenta, naranja reservada) y sombra tipo botón
  • Acciones rápidas: Persona (mesa con cliente), Express (búsqueda directa de cliente), Refrescar
  • Tap en mesa libre abre comandar; tap en mesa ocupada abre detalle por subcuenta

Comandar móvil CM-MOVIL

Flujo en 4 pasos: Salón → Mesa → Productos → Pedido. Header con stepper.

  • Catálogo cacheado en localStorage compartido con desktop (clave sac_catalogo_<DB>_p<listaPrecio>)
  • Búsqueda con lupa por nombre/código/barra
  • Producto: tap en la fila abre modal cantidad+nota; tap en botón "+" agrega 1 directo
  • Subcuenta: se pide al confirmar COMANDAR (no antes); las existentes aparecen como sugerencia
  • Después de comandar: queda en la misma mesa, listo para agregar más
  • Botón "regresar" siempre vuelve al panel móvil de mesas

Combos en móvil

Si el artículo tocado es un combo (naturaleza 5), abre un modal especial con:

  • Cantidad del combo con stepper +/-
  • Notas opcionales
  • Total dinámico que se actualiza con cada selección
  • Fijos (lista azul "Incluye:") — siempre presentes
  • Grupos con título "Nombre (elegir N, puede repartir)" y chip de progreso X / N
  • Cada opción tiene su propio stepper para repartir entre opciones del mismo grupo

Al agregar al pedido, el combo aparece como línea padre destacada en azul con el precio total = suma de sus hijas. Las hijas aparecen indentadas con sin precio individual visible. Eliminar el padre elimina todas las hijas automáticamente.

Detalle de mesa móvil DM-MOVIL

Al tocar una mesa ocupada, muestra:

  • Encabezado con Mesa + Salón + Total
  • Una card por subcuenta con los items agrupados
  • Botón "+1" ámbar por cada item suelto para agregar 1 más a la misma subcuenta
  • Botón "Agregar a [SUB]" al pie de cada subcuenta para abrir comandar con esa subcuenta pre-seleccionada
  • Footer fijo: Agregar más (abre comandar sin sub) y Cobrar

Si la mesa se abrió pero no tiene items (huérfana), al cargar la pantalla se cierra automáticamente y vuelve al listado.

Auto-limpieza de mesas vacías

Al regresar de comandar sin haber pedido nada, la mesa se cierra automáticamente vía cerrar_vacia.php para no dejar mesas fantasma en el panel. Si hay items pendientes en el carrito local, la mesa NO se cierra. Si la sesión expiró por inactividad y querés comandar, el sistema re-abre la mesa automáticamente y reintenta el envío.

Permisos compartidos Todos los permisos del módulo SAC desktop aplican igual en móvil. La interfaz cambia, los permisos son los mismos.

Cocina (Kitchen Display System)

Pantalla digital que reemplaza o complementa a la impresora de cocina. Los pedidos aparecen en tiempo real con tiempos de espera y estados.

Paleta visual (2026-04-20)

La pantalla KDS usa una paleta blanco / negro / azul marino profesional — sin amarillos, verdes ni morados. Esto reduce la fatiga visual en cocinas bajo luz fluorescente y mantiene contraste alto.

  • Fondo del contenedor — azul marino #0a1930
  • Encabezado superior — cobalt #0047AB con texto blanco
  • Tarjetas de pedido — fondo blanco con texto negro

Colores por tiempo de espera

TiempoColor header de la tarjetaSignificado
≤ param 234 minAzul claro #dbeafeDentro del tiempo normal
≤ param 235 minAzul medio #cfe0ffTiempo medio — empezar a presionar
> param 236 minRojo pulsante #dc2626#991b1b (texto blanco)Tarde — urgente (animación 1.2s)
> 60 minTriple beep sonoro en cada refresco
> 180 min (3h)Auto-listo: estado pasa a '2' automáticamente

Información visible

  • Número de mesa (o comanda si es Para Llevar / Delivery / Persona)
  • Minutos transcurridos desde que se envió el pedido
  • Lista de platos con cantidades y anotaciones
  • Borde superior de color según tiempo (azul claro → medio → rojo)

Acciones

  • Clic en una línea — marca esa línea individual como lista
  • Botón "Listo" del pedido — marca todas las líneas del pedido como listas
  • Los pedidos listos desaparecen de la pantalla (solo se muestran los pendientes, estado 'E')

Configurar tamaño de letra y ancho de comanda (2026-04-20)

Cada cocina puede ajustar los tamaños de texto según su monitor, distancia de lectura y preferencia personal del cocinero.

Botón flotante (esquina inferior derecha) abre el modal "Configurar Tamaños" con tres controles deslizantes:

ControlRangoDefaultQué ajusta
Nombre del Artículo12 – 48 px20 pxTamaño del nombre del plato (ej: "ARROZ CON CERDO")
Detalle / Anotación12 – 56 px28 pxTamaño de las anotaciones del mesero (ej: "sin cebolla, sin sal")
Ancho de Comanda200 – 600 px260 pxAncho mínimo de cada tarjeta de pedido en el grid
  • Vista previa en vivo — cada slider muestra un ejemplo que cambia de tamaño mientras se mueve
  • Persistencia por navegador — se guarda en localStorage (key kds_cocina_config_v1) y se aplica al cargar la página
  • Restablecer — botón para volver a los valores por defecto
  • Los tamaños sobreescriben los breakpoints responsive mediante !important inyectado en un <style> dinámico
Alertas de tiempo Pedidos que superan el tiempo objetivo configurado cambian de color para avisar al cocinero. Los tiempos se configuran con los parámetros de empresa 234 (verde/normal), 235 (medio), 236 (tarde — header pasa a rojo pulsante).
Audio La pantalla reproduce un triple beep (onda square via Web Audio API) cuando llegan pedidos nuevos o cuando alguno supera los 60 minutos de espera. El AudioContext se desbloquea con el primer clic o toque en la pantalla.

Cuentas / Cobro SA-006

Pantalla del cajero para cobrar la cuenta de una mesa. Permite dividir, hacer pagos parciales y emitir la factura electrónica.

Acciones principales

  • Ver cuenta — Muestra todos los platos de la mesa con totales
  • Dividir cuenta — Repartir en partes iguales, o seleccionar platos por persona
  • Aplicar descuento — Descuento manual o cortesía
  • Servicio (10%) — Agregar o quitar el 10% de servicio
  • Cobrar — Abre modal de pago (contado o crédito)

División de cuenta

  1. Presione "Dividir"
  2. Seleccione cuántas personas pagan
  3. Opciones: división igual o asignar cada plato a una persona
  4. Cada persona paga su porción con su propio medio de pago
  5. Al terminar todas las divisiones, la mesa se libera

Factura electrónica

Al cobrar, se genera automáticamente:

  • Tiquete electrónico (04) si el cliente es genérico
  • Factura electrónica (01) si se ingresa cédula

El documento se envía a Hacienda y al email del cliente si se registra.

Impuesto de servicio El % de servicio se configura globalmente en parámetro 31. Si está en 0 y aun así querés cobrar servicio en una mesa específica, usá el botón +Serv del panel de cobro (ver abajo).

Descuento por artículo (por línea) vs descuento global (2026-05-29)

En el panel de cobro hay dos formas de aplicar descuento y se pueden combinar:

  • Descuento global: el botón Desc % (abajo del panel) aplica un porcentaje sobre el total de la cuenta.
  • Descuento por línea: tocá la columna % Desc de un artículo en la lista de cobro y escribí el porcentaje (0–100). Ese descuento aplica solo a ese artículo. La columna Total de la línea y el TOTAL general se recalculan al instante.
El descuento por línea ahora se refleja en la factura El descuento que aplicás a una línea se traslada a la factura con cualquier medio de pago (Contado, Tarjeta, SINPE y Crédito). Antes, el descuento por línea se veía en el panel pero el documento salía con el precio sin descontar — eso quedó corregido.

Botón +Serv (servicio personalizado por mesa) (2026-04-20)

En el panel de cobro del modal MS-001, el botón morado Serv permite aplicar un porcentaje de servicio aunque el parámetro 31 esté en 0:

  1. Pasar items al panel de cobro
  2. Tocar el botón Serv → aparece prompt "% de servicio a aplicar" (default 10)
  3. Al confirmar, el sistema hace UPDATE SacMesaAcumulado SET Imp2 = % solo para las líneas del cobro que tenían Imp2 = 0 (no sobreescribe servicio previo)
  4. La mesa se recarga automáticamente → el servicio queda persistido en cada línea
  5. Volver a abrir el modal de la mesa → los items ya muestran el % aplicado en MS-005 y el total refleja IVA + Servicio

Si se toca Serv de nuevo estando activo, se apaga (pero las líneas ya actualizadas en BD mantienen el valor).

Fórmula aditiva El servicio se suma sobre la base, no sobre el precio con IVA: Total = base × (1 + IVA/100 + Serv/100). Ejemplo: base 100, IVA 13%, Serv 10% → Total 123.00.

Bloque MESA en ticket de factura (2026-04-20)

Cuando se factura desde una mesa SAC, el ticket térmico (FIPVIVI002) imprime un bloque centrado en letra grande al final, justo debajo de ORIGINAL:

            ORIGINAL
********************************
      MESA 5 - PRINCIPAL
********************************
            Ver.4.5
       20/04/2026 22:30:00

Es útil cuando la impresora corta el papel y el mesero necesita saber rápidamente a qué mesa corresponde la factura. Solo aparece en facturas originadas desde SAC (proformas SAC enlazadas en tabla VentaMadreSac).

Combos

Configuración de combos y menús compuestos donde el cliente elige entre varias opciones.

Constructor de Combos (nuevo, 2026-06-03)

El Constructor de Combos es la pantalla rediseñada para armar y editar combos de forma visual. Se abre desde el menú SAC → Constructor de Combos y se organiza en cuatro columnas (de izquierda a derecha):

  • Grupos — paleta de grupos disponibles. Cada grupo muestra a la izquierda un ícono según su categoría (🍺 cervezas, 🧁 postres, 🍕 pizza, 🥗 ensaladas…) y debajo del nombre la cantidad de productos que tiene. Se arrastran al combo (o se tocan ) para agregarlos, y se pueden crear grupos nuevos ahí mismo.
  • Combos — lista de todos los combos; el botón Nuevo Combo crea uno desde cero.
  • Grupos del combo — el combo activo con sus grupos; acá se define cuántas unidades elige el cliente. El precio se calcula solo (los productos de cada grupo se administran en la paleta de la izquierda).
  • Vista previa — muestra en vivo cómo se verá el combo en el punto de venta. Tiene desplazamiento vertical para ver combos largos completos.

Pasos típicos para armar un combo:

  1. Tocá Nuevo Combo y elegí si el combo es de comida o de bebidas.
  2. Arrastrá uno o varios grupos desde la paleta al combo (si el combo ya tiene grupos, pide confirmación para no agregar uno por error).
  3. En cada grupo, agregá los productos que el cliente puede elegir y, en Elegir, indicá cuántas unidades se lleva.
  4. El precio del combo se calcula solo según las opciones; revisalo en la vista previa.
Requiere permiso El acceso al Constructor de Combos se controla con un permiso que el administrador asigna a cada usuario. La opción anterior, Definición de Combos, sigue disponible por ahora.
Todo queda en bitácora Crear, duplicar o eliminar combos, agregar o quitar grupos y productos, y los cambios de precio quedan registrados en la bitácora del sistema junto con el usuario que los hizo.

Estructura de un combo

  • Nombre del combo — Ej: "Combo Ejecutivo"
  • Precio fijo — Lo que paga el cliente
  • Grupos — Cada grupo es una categoría de escogencia

Grupos típicos

GrupoOpciones¿Cuántas elige?
Plato fuertePollo / Res / Pescado1 (obligatorio)
BebidaGaseosa / Té / Agua1 (obligatorio)
AcompañamientoArroz / Papas / Ensalada1 de 3 (obligatorio)
ExtrasQueso / Aguacate / TocinoHasta 2 (opcional)

CRUD de combos

Desde el módulo de Combos el administrador puede:

  • Crear un combo nuevo con sus grupos
  • Editar opciones disponibles por grupo
  • Definir si hay recargo al elegir ciertas opciones (ej: pescado +₡500)
  • Activar o desactivar combos según disponibilidad
Stock y combos Cada opción de un combo se descuenta del inventario individualmente. Si elige "pollo", se rebaja 1 pollo; si elige "arroz", se rebaja 1 porción de arroz. El combo en sí no es un artículo de stock.

Usar artículos tipo Insumo en los combos (2026-05-29)

Ahora podés asignar artículos con naturaleza Insumo (ingredientes) tanto a los grupos de opciones como a los artículos fijos de un combo. Antes los insumos no aparecían en el buscador al armar el combo.

Los insumos siguen ocultos en la comanda Un insumo no se puede vender suelto: no aparece en la grilla de productos de la comanda ni en la lista de precios. Pero sí se muestra dentro del combo cuando es uno de sus componentes/opciones. Así un ingrediente se usa solo como parte de un combo, nunca como venta directa.
Si no aparece el insumo (o un combo) al buscarlo Tocá Sincronizar Catálogo para refrescar la lista. Recordá que el artículo debe estar Activo, y que un combo solo sale en la comanda si tiene marcado "Mostrar en SAC" en su ficha de artículo.

Precio del combo cuando se eligen unidades repetidas (2026-06-03)

En grupos donde el cliente elige varias unidades y puede repetir (por ejemplo un balde de 6 cervezas escogidas entre 3 tipos disponibles), el precio del combo ahora suma todas las unidades a elegir, no solo los productos distintos del grupo. Las unidades que superan la cantidad de productos del grupo se valoran al artículo más caro.

Ejemplo Un balde de 6 cervezas a ₡1.500 ahora muestra ₡9.000 (antes mostraba ₡4.500 porque solo contaba los 3 tipos distintos). Los combos que ya tenían suficientes productos para elegir no cambian de precio.

Mejoras del Constructor (2026-06-06)

  • Acomodá las columnas a tu pantalla: arrastrá las líneas divisorias entre columnas para hacer una más ancha y otra más angosta. El ancho que elegís queda guardado para la próxima vez (doble clic en la línea para volver al ancho original).
  • Ícono y cantidad por grupo: cada grupo de la paleta muestra un ícono según su categoría y la cantidad de productos que contiene.
  • Arrastrar un grupo directo sobre un combo: podés tomar un grupo de la paleta y soltarlo sobre un combo de la lista para agregárselo (lo abre automáticamente).
  • Ver los productos del grupo dentro del combo: en la columna Grupos del combo, tocá una tarjeta para desplegarla y ver los productos de ese grupo (con su precio, IVA y total), sin tener que ir a la paleta.
  • Etiqueta Obligatorio / Opcional: cada grupo del combo se marca como OBLIGATORIO cuando el cliente debe elegir al menos una unidad, o OPCIONAL cuando Elegir está en cero.
  • Resumen del sistema abajo: el conteo de combos activos, grupos y productos se muestra ahora en una barra inferior.
Corrección de precio en ₡0 Se corrigió un caso en el que un combo con un grupo de "Elegir 1" podía mostrar precio ₡0 cuando el aporte calculado era menor que un costo viejo guardado en el artículo. Ahora el precio del combo siempre se calcula a partir de sus opciones. El precio se recalcula al abrir el combo, así que los combos afectados se corrigen solos al entrar a editarlos.

Configurar Mesas y Salones CF-SAC-001

Módulo para crear, editar y organizar salones (planta baja, terraza, VIP...) y las mesas que pertenecen a cada salón. También permite asignar las impresoras por salón y las impresoras por categoría de artículo.

Layout del módulo (rediseñado 2026-05-06)

  • Sidebar izquierdo — lista de salones, botón + arriba para crear salón nuevo, Volver en el pie
  • Panel derecho — la configuración del salón seleccionado aparece directamente como una fila de 4 fichas (Datos del salón / Impresoras / Fuentes de ticket / Tamaño de mesa) y debajo el grid de sus mesas
  • Cada ficha tiene encabezado negro con texto blanco y una breve descripción explicando para qué sirve
Cambio de UX (2026-05-06) La edición del salón ya no abre un modal: los campos están siempre visibles arriba del listado de mesas. Un click en el sidebar carga al instante los datos del salón en las 4 fichas.

Gestión de salones

  • Crear salón — botón + en la esquina superior del sidebar. Limpia las fichas para registrar uno nuevo
  • Ver / editar salónun click sobre la fila del salón en el sidebar; sus datos aparecen en las 4 fichas a la derecha
  • Guardar — botón Guardar en la barra superior de la ficha de configuración. Guarda los cambios sin recargar
  • Limpiar — botón Limpiar al lado de Guardar. Vacía los campos para empezar de cero (no toca lo guardado)
  • Eliminar salón — botón rojo Eliminar (visible solo al editar uno existente). Elimina el salón y todas sus mesas
  • Color — cada salón tiene un color que se muestra como punto en la lista y en el panel de mesas del SAC

Impresoras por salón

Dentro de la ficha Impresoras se definen 6 colas. Cada una tiene cola + ancho: la cola es el número de impresora (3 dígitos, 000 = no imprime, ej: 301) y el ancho es la cantidad de caracteres por línea que soporta físicamente la impresora.

CampoUsoAncho default
FacturaImpresora donde sale la factura electrónica48
CuentaImpresora para la precuenta y cuenta detallada48
CocinaImpresora de comandas — platos marcados con COM o COC40
CalientePlatos marcados con CAL (parrilla, plancha)40
FríaPlatos marcados con FRI (ensaladas, postres fríos)40
CoctelesPlatos marcados con BAR (bebidas, cocteles)40

Ancho de papel por impresora (2026-04-20)

Cada impresora del salón tiene su propio ancho de papel (32, 40 o 48 caracteres). El ticket se genera usando el ancho específico de la cola destino, no un valor global de la estación.

  • 32 caracteres — térmicas muy angostas (58 mm)
  • 40 caracteres — térmicas angostas / matriciales Epson TM-U220 (80 mm)
  • 48 caracteres — térmicas anchas estándar (80 mm full)

Si tenés la cocina con una matricial de 40ch y la facturadora con una térmica de 48ch, cada ticket se imprime al ancho correcto sin tener que cambiar la configuración de la estación.

Cómo elegir el ancho Imprimí una prueba y contá cuántos caracteres caben en una línea. Si el texto se corta o se parte, bajá el ancho. Si queda mucho espacio vacío a la derecha, subilo.

Persistencia: columnas ImpFacturaAncho, ImpCuentaAncho, ImpCocinaAncho, ImpCalienteAncho, ImpFriaAncho, ImpCoctelesAncho en sac_salon_definicion.

Tamaño de mesa por salón (2026-04-29 / actualizado 2026-05-06)

Dentro de la ficha "Tamaño de mesa" (4ta columna a la derecha), se elige cuán grandes se ven las mesas de ese salón en el panel del SAC. Cada salón tiene su propio tamaño y todas las mesas del salón se renderizan con esa medida.

Vista previa en vivo (2026-05-06) Al tocar Pequeña / Mediana / Grande / XL / Personalizado, el grid de mesas de abajo cambia de tamaño en tiempo real antes de guardar. Permite ver cómo van a quedar las mesas en el panel sin tener que aplicar para probar.
  • Pequeña (600 × 600) — útil para barras o salones con muchas mesas
  • Mediana (800 × 800) — default, equivalente al tamaño histórico
  • Grande (1000 × 1000) — destaca cada mesa, menos por pantalla
  • XL (1200 × 1200) — para pantallas táctiles grandes / kioscos
  • Personalizado — define ancho y alto independientes (200-3000 px lógicos), para mesas rectangulares (ej. 1200 × 600 = barra horizontal)

El picker es visual: cada opción muestra un cuadrado proporcional al tamaño real, así sabés cómo se va a ver antes de guardar. La opción seleccionada queda marcada en azul.

Tip Si tenés muchas mesas en un salón pequeño, elegí "Pequeña" o "Mediana" para que entren todas en pantalla sin scroll. Si tenés pocas mesas en un salón grande (zona VIP, terraza), "Grande" o "XL" hace que cada mesa se vea más prominente.

Persistencia: columnas salon_mesa_ancho y salon_mesa_alto en sac_salon_definicion (INT NOT NULL DEFAULT 800). Migración #20260424162887 obligatoria. Si la migración no está aplicada, el sistema usa el default 800 sin error.

Lista de precios por salón (2026-04-20)

Cada salón puede usar una lista de precios distinta (Precio 1 a Precio 10) que corresponde a las columnas Precio1..Precio10 de vista_articulo. Útil para manejar precios diferentes en barra vs mesa, happy hour, zona VIP, delivery, etc.

  • Configuración: modal del salón → campo Lista de Precios (default Precio 1)
  • Aplicación: al abrir una mesa del salón, la comanda carga el catálogo con esa lista de precios
  • Cache separado: localStorage guarda una cache por cada lista (sac_catalogo_${DB}_p${N}) — cambiar de lista no afecta la cache de otras

Persistencia: columna salon_lista_precio en sac_salon_definicion.

Fuente A o B por salón — Cuenta y Comanda (2026-04-20)

Debajo del grid de impresoras hay dos selectores opcionales de fuente ESC/POS: uno para el ticket de Cuenta y otro para el de Comanda. Permiten forzar un tipo de letra independiente del ancho de papel.

  • Auto (según ancho) — default: si el ancho ≤ 40 usa Font B (compacta), si > 40 usa Font A (ancha)
  • A — Font A (letra ancha, estilo 80mm térmica)
  • B — Font B (letra compacta, estilo 58mm / matricial)
Cuándo forzar A o B Útil si tu impresora física no sigue la convención estándar (ej: querés letra A en 58mm para que un cliente mayor lea mejor, o letra B en 80mm para que entre más texto).

Nota: la factura térmica (FIPVIVI002) sigue usando el ancho y formato de la estación (ImpContadoAnchoPapel), no del salón. Solo Cuenta y Comanda van por salón.

Persistencia: columnas ImpCuentaFuente, ImpComandaFuente en sac_salon_definicion.

Gestión de mesas

  • Nueva Mesa — crea una mesa individual con nombre (hasta 50 caracteres, soporta nombres descriptivos como "BARRITA FONDO"), capacidad y estado
  • Crear Varias — crea un lote de mesas con un prefijo y un rango numérico (ej: M1..M20, máx 100 a la vez)
  • Editar mesa — clic en la tarjeta de la mesa
  • Mover mesa a otro salón — arrastrar la tarjeta de la mesa sobre otro salón del sidebar
  • Desactivar / Activar — desde el modal de edición. Las inactivas quedan con opacidad reducida y borde discontinuo
Nombre de mesa hasta 50 caracteres (2026-04-29) Si una BD reporta error "String or binary data would be truncated" al crear mesas con nombres largos, falta aplicar la migración #20260424162886 que expande sac_mesa_definicion.Mesa de VARCHAR(10) a VARCHAR(50). Coincide con SacMesa.Mesa (VB6) que ya soportaba 50 chars.

Categorías Impresora — eliminado (2026-05-06)

La sección Categorías Impresora que asignaba la cola por categoría de artículo fue retirada. Desde la migración 778 (2026-04-30) cada artículo tiene su propio campo Tipo Consumo (COM/COC/CAL/FRI/000) que se edita directamente en la ficha del artículo (Inventario → Crear / Editar).

  • La cola de impresora se decide por artículo, no por categoría
  • Si un artículo no tiene Tipo Consumo definido, hereda el de su categoría (compatibilidad legacy preservada en backend)
  • Para cambiar a dónde imprime un plato: editar el artículo y elegir Comida / Coctel / Caliente / Fría / —
Estilo visual Banking Bold Desde 2026-04-20 el módulo usa la paleta corporativa Banking Bold: fondo gris marcado, cards blancos, encabezados de ficha negros (#0f172a) con texto blanco. Bordes visibles 1.5px, inputs con borde oscuro #64748b.

Moneda del módulo SA-MONEDA

SacTactil siempre trabaja y factura en la moneda predeterminada de la empresa. El catálogo de artículos se descarga ya convertido a esa moneda, y todas las facturas (contado, tarjeta, SINPE, crédito y facturar directo) salen en ella, sin importar la moneda del cliente.

Cómo se define

ParámetroQué esEjemplo
Moneda predeterminadaLa que usa el módulo y los documentos. Es la que podés configurar.USD
Moneda nacionalLa del país (solo lectura).CRC

Cómo se convierten los precios

El precio de cada artículo puede estar guardado en moneda nacional o extranjera; SacTactil lo refleja siempre en la moneda predeterminada usando el tipo de cambio del día:

  • Predeterminada = nacional (ej. ambas CRC) → el precio se muestra igual, sin conversión.
  • Predeterminada distinta (ej. nacional CRC, predeterminada USD) → un artículo de ₡1.000 con tipo de cambio ₡500 se muestra como $2,00.
  • Artículo ya en la predeterminada (ej. artículo en USD y predeterminada USD) → queda igual.
  • Artículo en moneda extranjera y predeterminada nacional (ej. artículo en USD, predeterminada CRC) → se multiplica por el tipo de cambio ($2 × 500 = ₡1.000).

El cálculo de IVA y el ajuste de precio hacia atrás se mantienen exactamente igual que antes; la conversión es el último paso.

Si falta el tipo de cambio Cuando la moneda predeterminada es distinta de la nacional y no hay tipo de cambio configurado para el día, SacTactil no se puede usar: el sistema avisa y devuelve al menú principal. Hay que registrar el tipo de cambio (Contabilidad → Tipos de Cambio, CT-014) para volver a entrar.
Si cambiás la moneda predeterminada Tras cambiar la moneda o el tipo de cambio, usá el botón Sincronizar catálogo del Panel de Mesas para que la lista local refleje los nuevos precios de inmediato (de lo contrario se actualiza sola al cabo de unas horas).

Permisos

CódigoNombreEfecto
042Eliminar mesa de la vistaPermite borrar una mesa del salón (solo desde edición de layout)
065Mover productos entre mesasTrasladar líneas de pedido de una mesa a otra
082SAC, edita precio de ventaCambiar el precio de una línea desde el modal de detalle MS-005. Sin este permiso, al guardar se pide clave de supervisor
093Eliminar líneas de comandaQuitar productos ya agregados a la comanda. Sin este permiso, solo supervisor puede eliminar
Sin permiso: botón deshabilitado Los botones sin permiso aparecen en gris con tooltip explicativo (ej: "Sin permiso 093"). No se ocultan, para que el usuario sepa que existe la función.

Override con clave de supervisor AUTH-OVR

Algunas acciones permiten que un usuario sin el permiso requerido las ejecute si un supervisor con ese permiso ingresa su clave. No es una puerta trasera: la acción queda registrada con el usuario del supervisor que autorizó.

Flujo en 4 fases:

  1. Ingresar clave — al guardar el cambio, se abre un modal solicitando la clave
  2. Determinar usuario — el sistema busca qué empleado tiene esa clave (hash+salt en Empleados)
  3. Verificar permiso — chequea en vista_permisos_usuario si ese usuario tiene el permiso requerido
  4. Ejecutar — si todo válido, la acción se aplica. El backend re-valida siempre la clave por seguridad
Aplicado actualmente Cambiar precio desde MS-005 (permiso 082). En próximas versiones el mismo mecanismo se aplicará a eliminar líneas (093), eliminar mesa (042) y mover productos (065).

Novedades 2026-04 SA-NOV

Catálogo SAC más rápido + precios al día (2026-05-02)

Tres cambios al catálogo de artículos del módulo Restaurante para que cargue mejor y muestre los precios actualizados:

  • Fuente única de precios — V1: el catálogo de SAC (/api/sac/menu/catalogo.php, articulos_solo.php, precios_solo.php) ahora lee desde ViArticuloPreciosVentaVersion1 (tabla unificada ArticuloPrecios, mig 794). Antes leía vista_articulo.Precio_n (legacy DBVenta1..10) y los números podían no coincidir con los del editor de artículos. Si la mig 794 no está aplicada, el endpoint falla explícito en lugar de servir precios desincronizados.
  • Sincronización solo desde el menú principal: antes cada visita a /sac/mesas/ disparaba sincronización (incluyendo F5 y volver de comanda). Ahora la sync ocurre solo cuando se entra desde el menú principal con el subitem "Panel de Mesas" — el menú agrega ?sync=1 al URL como flag explícito. F5 y vuelta de comanda usan el cache local sin tocar la red. Resultado: instantáneo en clientes con miles de artículos.
  • Delta sync (solo cambios): cuando entrás desde el menú con el flag ?sync=1, el backend trae únicamente artículos y precios modificados desde la última visita (timestamp del cache). Si editaste el precio de 1 artículo, viajan ~1 KB; el resto del catálogo (5000 artículos, ~5 MB) queda intacto en localStorage.
  • Botón "Sincronizar Catálogo" manual en mesas sigue funcionando — fuerza un sync delta visible con barra.
  • Lista de Precios (modal del menú): la columna Neto ahora aplica IVA + Servicio (Base × (1 + IVA% + Serv%)) — antes solo aplicaba IVA y dejaba el servicio fuera. Ahora coincide con el precio que paga el cliente.

Cache invalidado: la versión del cache localStorage subió de v3 a v4 (claves sac_arts_v1_ y sac_prcs_v1_). Caches viejos con precios DBVenta legacy se borran automáticamente al primer acceso.

Tipo de Consumo por artículo (2026-04-30)

Nueva forma de definir a qué impresora del salón rutea cada artículo del menú. Antes este dato vivía a nivel categoría (Tipo_Articulo.Impresora) y todos los artículos heredaban el de su categoría. Ahora cada artículo tiene su propio campo TipoConsumoSac que permite override fino por producto.

  • Ficha del artículo (Inventario → Crear/Editar artículo): selector "T. Consumo" en la fila NATURALEZA · TARIFA IVA · PART.ARANC. · T. CONSUMO. Valores: (sin asignar) · Comida · Coctel · Caliente · Fría.
  • Cascada: si el artículo tiene asignación propia (no 000), manda el del artículo. Si está en "Sin asignar", hereda del Tipo_Articulo legacy → 100% retro-compatible.
  • Override desde el modal de comanda: al agregar un artículo a la mesa, hay un select discreto a la izquierda del botón Cancelar para cambiar el tipo de consumo de esa línea. El cambio se persiste en la base automáticamente, queda como nuevo valor por defecto del artículo para próximas ventas y se refleja al instante en el catálogo del POS (la tarjeta del artículo actualiza su etiqueta de color sin recargar la página).
  • Badge en la tarjeta del POS: cada artículo del menú muestra una etiqueta corta de color con su código (COM verde, COC violeta, CAL naranja, FRI celeste) en la esquina sup-izq de la imagen (vista grilla) o al lado del nombre (vista lista).
Si una etiqueta no aparece Los artículos cuyo Tipo de Consumo se definió antes de que tu catálogo local se descargara pueden mostrarse sin etiqueta (—) hasta que sincronices. Tocá el botón 🔄 Sincronizar catálogo para que el POS tome los valores actuales de la base.

Migraciones requeridas: #20260424162896 (crea columna Articulos.TipoConsumoSac VARCHAR(3) NOT NULL DEFAULT '000') y #20260424162897 (backfill copiando desde Tipo_Articulo.Impresora). La segunda es re-ejecutable y solo toca filas en '000' — no pisa cambios manuales del usuario.

Bug histórico corregido En SAC Comanda v2 y SAC Comandar Móvil el mapa interno tenía: COC routeando a impresora de cocina (incorrecto, debe ser cocteles), código COT que no existe oficialmente, y faltaba COM (las comidas no salían). Mapas ahora consistentes con la lógica de impresión de comanda v1: { COM: cocina, COC: cocteles, CAL: caliente, FRI: fría }.

Comanda Clásica (v2) — nuevo módulo (2026-04-24)

Nueva versión alternativa de la comanda en /modulos/sac/comanda2/ con layout estilo POS supermercado de 3 cascadas: Familias + Subfamilias (columnas izq con scroll full-height) y Artículos arriba + Pedido abajo (panel der). Cada fila de artículo tiene su propio botón ámbar PEDIR.

  • Header editable inline: MESA (text), SALON (select de salones), CUENTA (select subcuentas + botón + para crear)
  • CONFIG (⚙): 3 sliders independientes para tamaño de letra de Categorías / Lista Artículos / Lista Pedido (10–26px, default 18px). Persiste en localStorage por empresa.
  • Toggle Moderna / Clásica en el header del panel de mesas (botones MOD/CLÁ ámbar cuando activos). Persiste en localStorage['sac_comanda_version'] — al abrir cualquier mesa, redirige a la versión elegida.
  • Mismo backend: usa /api/sac/lineas/estado.php para comandar, /api/sac/menu/catalogo.php para el catálogo, imprime a cocina con la misma lógica de v1 (agrupa por impresora del salón).

Botón Express — cliente real obligatorio (2026-04-24)

Nuevo botón Express (icono ⚡) en el header del panel de mesas, al lado de "Persona" y "Reservar". Similar a Persona pero exige seleccionar o crear un cliente real del catálogo. Asocia el código del cliente a SacMesa.ClienteId, creando el salón PERSONA automáticamente si no existe (copia impresoras y anchos del salón "Principal").

Útil para servicio a la mesa individualizado o para pedidos que van directo a crédito de un cliente conocido.

Pendientes de Cobro — cambio de cliente + Contado/Crédito (2026-04-24)

El modal de proformas pendientes ahora tiene dos botones por fila:

  • Cliente (outline azul) — abre búsqueda/creación de cliente y actualiza la proforma sin cobrar
  • Cobrar (azul sólido) — si la proforma tiene cliente real va directo a elegir Contado / Crédito; si sigue siendo SN, fuerza cambio primero. Crédito abre ModalPagoCredito, Contado abre ModalPagoContado

La etiqueta del cliente se marca en rojo con advertencia si es SN, verde con check si es real — así se detectan rápido las proformas sin asignar.

Salón "Cobra Imp. Servicio" — flag por salón (2026-04-24)

Nuevo checkbox en el modal de configuración de salón (CF-SAC-001): Cobra Imp. Servicio (default marcado). Si se desmarca:

  • El botón +Serv queda oculto en el panel de cobro de las mesas de ese salón
  • Los modales de agregar artículo no muestran la línea "Serv X%" ni la suman al precio final
  • El backend estado.php fuerza Imp2 = 0 al insertar (sobrescribe el parámetro 31 global)

Útil para salones tipo Delivery, Llevar, Barra donde no aplica propina automática. Migración BD: #20260420234036 (agrega columna sac_salon_definicion.salon_cobra_servicio BIT DEFAULT 1).

MS-001 / MS-005 / Estado de cuenta — FIEL a SacMesaAcumulado (2026-04-24)

Se eliminó el fallback al parámetro 31 global en todas las vistas. Ahora IVA y Servicio salen únicamente de la fila en SacMesaAcumulado:

  • item.tarifa_ivaa.Imp1
  • item.imp2a.Imp2
  • Si la BD dice 0% → se muestra 0% y no se suma (sin importar el param 31 ni la config del salón)

Aplica a: modal MS-001 (lista items), modal MS-005 (detalle línea), ticket de estado de cuenta normal y detallado, panel de cobro.

Combos — padre + hija con mismo Cod_Articulo (2026-04-24)

Caso: un combo cuyo grupo de opciones contiene el mismo artículo que da nombre al combo (ej: combo "CORTE NEW YORK" que incluye la opción "CORTE NEW YORK"). Antes esto causaba que al comandar se colapsaran en una sola fila perdiendo el precio de la hija.

  • Backend: en estado.php, si el item tiene combo_id, siempre INSERT (no consolida). Permite 2 filas con el mismo Cod_Articulo en la misma Linea: una padre con Precio=0, otra hija con el precio real.
  • Frontend: detecta padre por naturaleza=5 AND precio_unitario=0 (ya no basta con nat=5, para distinguir del artículo mismo cuando aparece como opción).
  • Validación bidireccional: bloquea al configurar (no retroactivo):
    • Al agregar un grupo a un combo, si el grupo tiene un artículo con el código del combo → error claro
    • Al agregar un artículo a un grupo, si algún combo que usa ese grupo tiene el mismo código → error claro

Combo wizard — auto-selección en grupos items=1 con una sola opción (2026-04-24)

Cuando un grupo tiene items=1 y solo una opción disponible, al abrir el wizard queda pre-seleccionada automáticamente (counter "1/1"). Se usa el precio real base × (1 + IVA + Serv).

Además, las opciones cuyos artículos están inactivos en inventario ahora sí aparecen en el wizard (antes se filtraban y provocaba que el grupo se mostrara vacío sin poder comandar). Se agrega un flag activo por opción para que el frontend pueda marcarlas visualmente si se requiere.

MS-005 Detalle Línea — Banking Bold + Override supervisor (2026-04-23)

  • Modal MS-005 rediseñado con estilo Banking Bold (header azul sólido, labels negras 700 uppercase, inputs borde oscuro, fila Precio Final resaltada en azul, zebra en la tabla)
  • Header ahora muestra código del artículo (Roboto Mono) además del nombre
  • Permiso 082 controla la edición del precio. Sin el permiso, al guardar pide clave de supervisor
  • Fórmula inversa: editar Precio final recalcula el base, y viceversa

Eliminar líneas — DELETE físico (2026-04-23)

Al eliminar una línea o restar toda la cantidad de un artículo, las filas se borran físicamente de SacMesaAcumulado en vez de marcarse Estado = 'X'. El rastro de auditoría queda en SacLog (acción QUITA con el motivo) y en SacComandaDetalle con cantidad negativa (que genera el ticket ELIMINA a cocina).

Artículos Local Storage — modal en Comanda (2026-04-23)

El botón que antes se llamaba Lista de Precios se renombró a Artículos Local Storage (ícono bi-box-seam). El modal ahora incluye la columna Código del artículo (Roboto Mono), es más ancho (1100px / 95vw) y el filtro busca por código o nombre.

Catálogo local — filtro por naturaleza (2026-04-23)

El catálogo que se descarga al localStorage (usado por comanda y mesas) ahora filtra NaturalezaCodigo IN ('1','2','5'): solo productos, servicios y combos. Los insumos (4) y "otros" (3) no aparecen al comandar.

Código de artículo por barcode fallback (2026-04-23)

Cuando una línea en SacMesaAcumulado tiene guardado el código de barras en vez del ArticuloCodigo, el endpoint comandas/obtener.php ahora resuelve el código real buscando primero por ArticuloCodigo y luego por CodigoBarra como fallback (vía OUTER APPLY). Esto evita que el MS-005 muestre códigos que no existen en el catálogo.

Panel de Mesas — Botón Utilidades VE-UTL

Nuevo botón de herramientas (bi-tools) en el header del panel de mesas junto a la Bitácora. Abre un modal con 9 opciones:

OpciónFunción
Histórico VentasLista las últimas 5 ventas del día con botón para reimprimir factura (MH-001)
Retiro Saldo a FavorRetiro de adelanto de un cliente específico
Retiro Adelantos SNSaldos del cliente genérico SN
Contador MonedasConteo manual de efectivo
Contabilizar CierreContabiliza el cierre de caja del usuario actual
Mov. ContableMovimiento contable libre (asiento manual)
Ingreso / Retiro Fondo CajaMovimientos del fondo de caja (param 243)
Abrir CajónComando ESC/POS a la impresora para abrir el cajón

Comanda — Clave obligatoria (Parámetro 161)

Si ParametrosEmpresa.161 = 1 ("Sac, requiere clave para comandar"), al presionar Comandar aparece un modal pidiendo la clave del usuario (sin código). Al validar, busca el empleado cuyo hash coincide (SHA2_256 + salt) y ese usuario queda registrado como el que comandó.

  • En el ticket: al pie aparece Comando: {nombre del usuario}.
  • La clave se pide una sola vez por sesión de página (se recuerda hasta recargar F5).
  • Si param 161 = 0: no pide clave, usa el usuario logueado.

Comanda — Líneas en blanco al final del ticket (Parámetro 402)

Nuevo parámetro 402 ("Sac, líneas en blanco al final del ticket de comanda"). Valor por defecto: 5. Rango 0-20.

Sirve para compensar el punto de corte físico del papel. Si la impresora corta muy arriba y el pie del tiquete (Comando: usuario) queda debajo del corte, subir el valor del parámetro a 7 u 8.

Mesa tipo Persona — Mesa = Salón = nombre persona

Al crear una orden por Persona (botón azul del header), tanto SacMesa.Mesa como SacMesa.Salon toman el nombre ingresado. Cada persona es su propia "mesa virtual en su propio salón".

Consecuencia: Juan y Pedro pueden coexistir sin pisarse. En el sidebar "Mesas Activas" aparecen como mesas virtuales independientes.

Modal Detalle Mesa MS-001 — Dos fichas iguales

  • Default (solo items): 800px de ancho — lista de artículos y subcuentas.
  • Al tocar "Facturar": se expande a 1600px mostrando el panel de cobro a la derecha con el mismo ancho (50% cada ficha).
  • Transición suave de 0.25s al abrir/cerrar.

Panel de Cobro — Tabla con 6 columnas

ColumnaDescripción
CantCantidad a cobrar / cantidad total del item
ArtículoNombre del producto
P/UPrecio unitario (con IVA + servicio)
% DescClickeable — abre prompt para ingresar descuento solo a esa línea
SubtotalP/U × Cantidad (antes del descuento)
TotalSubtotal − Descuento

Descuento por línea: se puede aplicar un % diferente a cada artículo de la cuenta, independiente del descuento global.

4 Métodos de cobro — Botón Crédito condicional

  • Contado, Tarjeta, SINPE — siempre visibles (no requieren cliente)
  • Crédito — solo aparece cuando hay cliente seleccionado. Abre ModalPagoCredito y convierte la proforma a factura crédito automáticamente.

Cuenta (resumen) — Fiel a SacMesaAcumulado

El resumen de cuenta impreso ahora usa exclusivamente los datos guardados en SacMesaAcumulado:

Dato cuentaColumna BD
Cantidada.Cantidad
Precio unitarioa.Precio
% IVAa.Imp1
% Servicioa.Imp2 (SIN fallback al param 31)

Si Imp2 = 0 en la línea, no se suma servicio aunque el parámetro 31 esté en 10%. Así la cuenta refleja exactamente lo que se guardó al comandar, sin sorpresas por cambios posteriores de parámetros.

Catálogo en localStorage — Única fuente de verdad

Todo código y precio que use la comanda o el panel de mesas se lee exclusivamente del localStorage. Sin fallback al servidor.

El catálogo se actualiza solo en 3 casos:

  1. Primera carga de comanda/mesas (sin cache).
  2. Cache con más de 3 horas → resync automático en background.
  3. Botón Refrescar Catálogo en la barra de búsqueda.

Esto garantiza precios estables durante toda la jornada. Si un admin cambia un precio o el % de servicio, los usuarios no ven el cambio hasta la próxima actualización del catálogo (3h o refresh manual).

Parámetro 388 — Ajuste de precio hacia atrás

Controla cómo se calcula el precio base en el catálogo:

ValorComportamiento
0base = Precio1 directo. Al aplicar IVA + Serv se suma arriba → el cliente paga más que el "Neto" del menú.
1 o enbase = (Precio1 × (1+IVA/100)) / (1+IVA/100+Serv/100) con 4 decimales. El "Neto" del menú (con IVA) queda respetado — el cliente paga exactamente ese valor al aplicar servicio.

Ejemplo ARROZ CON POLLO (Precio1 = 3,539.8230, IVA 13%, Serv 10%):

  • Con 388=1: Neto menú = 4,000.00 → base = 4000/1.23 = 3,252.0325 → cliente paga 4,000.00 exacto
  • Con 388=0: base = 3,539.8230 → cliente paga 3,539.8230 × 1.23 = 4,353.98

Configuración de salones — Ancho de impresora 42

En el modal de configuración de salón, los selects de ancho para cada impresora (Factura, Cuenta, Cocina, Caliente, Fría, Cocteles) ahora ofrecen 32 / 40 / 42 / 48 caracteres.

El valor 42 se agregó para impresoras matriciales Epson TM-U220 con ancho intermedio. Se guarda en sac_salon_definicion.Imp<Tipo>Ancho.

Salón PERSONA — catch-all para mesas virtuales (2026-04-23)

Cuando se crea una orden tipo Persona (botón Persona + nombre), ahora queda guardado así:

  • SacMesa.Mesa = nombre de la persona (ej: "Juan", "Fiorella")
  • SacMesa.Salon = "PERSONA" (fijo)
  • SacMesa.ClienteId = nombre de la persona
  • SacMesaAcumulado.SubCuenta = nombre en MAYÚSCULAS

Requisito: debe existir un registro en sac_salon_definicion con salon_nombre = 'PERSONA' configurado con sus colas de impresora (Factura, Cuenta, Cocina, etc). Ese salón actúa como catch-all para todas las personas.

Fallback automático Si una mesa tiene un Salon que NO existe en sac_salon_definicion, al abrirla el sistema automáticamente hereda la config del salón PERSONA. Esto cubre mesas viejas o casos donde el nombre del salón no matchea.

Reporte "Datos de SAC" SA-DAT-001

Nueva opción en el modal Utilidades (VE-UTL): Datos de SAC — abre una ventana nueva con vista cruda de ambas tablas transaccionales.

  • Tabla 1 — SacMesa: Consec, Mesa, Salón, Cliente, Usuario, Estado, Fecha Abre, Fecha Cierre
  • Tabla 2 — SacMesaAcumulado: Consec, Línea, Artículo, Cantidad, Precio, %IVA, %Serv, SubCuenta, Estado, Total calculado

Interacción: al hacer click en una fila de SacMesa, la tabla de abajo se actualiza por AJAX mostrando solo los items (SacMesaAcumulado) de ese Consec. La tabla superior NO se limpia.

Filtros: Consec, Estado mesa (1/2), Estado acumulado (1/X), buscar por Mesa/Salón/Cliente/Consec.

Sin filtros: muestra últimas 100 mesas y últimos 200 items.

Uso típico: diagnóstico de datos (soporte verificando por qué una mesa no suma bien, qué impuesto tiene cada línea, estado de eliminación, etc).

Panel de Cobro — Botón Crédito condicional

Los 4 botones de cobro en el panel de cobro MS-001 se comportan así:

BotónVisible siRequiere cliente
ContadoSiempreNo (usa genérico SN)
TarjetaSiempreNo
SINPESiempreNo
CréditoSolo cuando hay cliente seleccionado (código válido)

Los 4 botones se redistribuyen automáticamente en la fila (3 o 4 columnas).

Impresión de cuenta — Toast con impresora

Al imprimir el estado de cuenta, el toast ahora muestra la cola de impresión usada: Cuenta enviada a impresora 304. Facilita diagnóstico cuando un ticket no sale (el usuario ve exactamente a qué cola fue).

Huérfanos — Redefinición correcta

El concepto de "sesión huérfana" (SacMesa sin entrada en sac_mesa_definicion) fue retirado por incorrecto. Las mesas virtuales (LLEVAR/DELIVERY/Persona) no están en el catálogo visual y eso es normal.

La nueva definición de huérfano:

  • Tipo A: SacMesaAcumulado.Consec que NO existe en SacMesa (items apuntando a mesa inexistente).
  • Tipo B: SacMesa cerrada (CodEstado='2') sin ningún SacMesaAcumulado.

Limpieza automática al cargar el panel mediante /api/sac/mesas/limpiar_vacias.php.

2026-05-11 — Protección contra cierre prematuro de mesas recién abiertas

Se detectó una condición de carrera: si Usuario A abría una mesa nueva y Usuario B cargaba el panel de mesas mientras A todavía no había agregado artículos, el cleanup cerraba y borraba la mesa de A. Resultado: al darle Facturar aparecía "Sesión de mesa no encontrada" y el usuario quedaba bloqueado.

Fix aplicado en limpiar_vacias.php: el cleanup ya NO toca mesas con FechaAbre o FechaCierra en los últimos 15 minutos. Esto da margen al usuario para terminar de armar la comanda sin que otra acción concurrente le borre la sesión.

Fix UX en cliente (mesas.js y comanda.js):

  • Si el race ocurre igual (caso edge) y el servidor devuelve 404 "Sesión no encontrada", el cliente muestra un mensaje claro y refresca el panel de mesas automáticamente — antes el usuario quedaba en pantalla zombi.
  • Desde comanda al facturar: redirect al panel de mesas a los 3 segundos.
  • Desde panel de mesas al abrir detalle: cierra el modal, refresca cargarMesas() y muestra toast amarillo.

Sincronización unificada Mesas ↔ Comanda (2026-05-11)

Hasta esta versión, los botones Sincronizar Catálogo de la pantalla de Mesas y el de Artículos Local Storage de la pantalla de Comanda actualizaban caches diferentes en IndexedDB:

  • Mesas: 2 blobs separados (arts:<db> y prcs:<db>), endpoints delta articulos_solo.php + precios_solo.php.
  • Comanda: 1 blob combinado (sac_catalogo_v4_<db>_p<lp>), endpoint full catalogo.php.

Resultado: sincronizar en una pantalla NO actualizaba la otra → datos inconsistentes (artículo nuevo aparecía en mesas pero no en comanda, o viceversa).

Fix: ahora cada botón Sincronizar limpia AMBOS caches antes de descargar el suyo. Sin importar desde dónde sincronices, al ir a la otra pantalla los datos también estarán frescos.

Nuevo botón "Sincronizar" en el modal Artículos Local Storage

Se agregó un botón 🔄 Sincronizar en el header del modal Artículos Local Storage (MS-LP-001) que:

  1. Borra el blob propio de comanda (sac_catalogo_v4_*) en IndexedDB.
  2. Borra los blobs de mesas (arts: y prcs:) para forzar re-sync al volver.
  3. Descarga el catálogo completo desde /api/sac/menu/catalogo.php (no delta).
  4. Re-renderiza el modal con los datos frescos.

Útil cuando un cambio en la BD (artículo activado/desactivado, precio modificado, MostrarEnSAC toggleado) no entra por el delta automático.

Filtro de categorías y subcategorías en Comanda (2026-05-11)

Antes: la barra de categorías de la pantalla de comanda mostraba TODAS las categorías de la tabla Articulos, aunque alguna no tuviera artículos visibles en SAC.

Ahora: /api/sac/menu/categorias.php aplica el mismo filtro SAC que catalogo.php:

  • Cod_Estado = '1' (artículo activo).
  • Cod_NaturalezaArticulo IN ('1','2','3','5') (Producto / Servicio / Otro / Combo — excluye Insumos).
  • MostrarEnMenuRestaurante = 1 (campo "Mostrar en SAC" del UI).

Resultado: solo aparecen categorías y subcategorías que tienen al menos 1 artículo visible. Si una categoría queda vacía después de desactivar sus artículos, desaparece del menú de comanda automáticamente. El conteo cantidad_articulos también se ajusta al filtro.