POS — Punto de Venta
Caja registradora para ventas presenciales. Vende cualquier ítem del Catálogo (productos, servicios, bundles) con descuento automático de inventario. Forma parte del addon Commerce.
Cómo usarlo
- Abrir turno — selecciona caja y vendedor. Registra fondo inicial.
- Agregar ítems — busca por nombre o SKU. Los bundles aparecen como un solo ítem y se descomponen automáticamente al cobrar.
- Cobrar — selecciona método de pago (efectivo, tarjeta, transferencia, gift card, cupón). Soporta pagos mixtos.
- Cerrar turno (Z-close) — cierra la caja, calcula totales por método y genera reporte.
- Cambiar vendedor — un mismo turno puede registrar ventas de varios vendedores sin cerrar caja.
Campos importantes
- Caja — POS físico/lógico. Cada caja tiene su propio turno activo.
- Vendedor — usuario que ejecuta la venta (puede cambiar dentro del turno).
- Método de pago — cash, card, transfer, gift_card, coupon. Configurables en POS Config.
- NCF — opcional. Al confirmar el cobro eliges Consumidor final (B02) o Crédito fiscal (B01). El número lo asigna la base de datos desde el mismo rango que usa Facturas (Configuración → Secuencias NCF), así que nunca se repite entre el POS, Facturas o dos cajas. Un B01 exige el RNC o cédula del cliente; sin él, la venta no se completa. Si no hay rango activo, la venta tampoco se completa: el cajero ve el aviso y no se cobra nada.
- Devoluciones con comprobante — la nota de crédito B04 también la asigna la base, solo sobre una venta que tuvo NCF de la serie B. Si la venta fue e-CF, la nota sale como E34.
- Si algo falla después de asignar el número (por ejemplo, se cae la conexión al registrar el pago), la orden queda cancelada conservando su NCF: ese número ya se consumió y tiene que quedar registrado. No intentes borrarla; la base no lo permite.
Bundles en POS
Vendes "Experiencia La Manual" (1 Taller + 10 Alpargatas) y el sistema:
- Inserta la línea del bundle en la orden.
- Al marcar la orden como
completed, el trigger descompone:
- 10 movimientos negativos en
inventory_movementspara Alpargatas. - 1 fila en
service_executionspara Taller (parent_bundle_id apunta al bundle).
- Permite reportar bundles vendidos y servicios ejecutados por separado.
Inventario — stock negativo
Por defecto, el POS bloquea las ventas que dejarían el inventario físico en negativo. Esto protege los reportes de stock, el costo promedio y los asientos automáticos.
- La validación se dispara al confirmar el cobro (antes de emitir NCF/e-CF).
- Aplica solo a ítems con
track_inventory = true(productos físicos). Servicios, bundles y itemstrack_inventory = falsese saltan. - Si falta stock, el sistema lista las líneas afectadas (ítem, pedido, disponible, faltante) y bloquea la venta.
Habilitar ventas con stock negativo (pre-ventas, entregas diferidas):
- POS → Configuración → Preferencias.
- Marcar Permitir stock negativo.
- Guardar preferencias.
El flag es por tenant. Cuando está activo, el POS deja pasar cualquier cantidad y los movimientos de inventario quedan en negativo hasta que se registre una entrada.
Integración con Contabilidad
Si el addon Contabilidad está activo, las ventas POS publican eventos pos:* que se convierten en asientos automáticos en el Mayor. El asiento se genera al cierre Z (default) o por venta individual según configuración.
Permisos
- pos:operate — abrir turno, vender, cobrar.
- pos:configure — configurar cajas, métodos de pago, descuentos.
- pos:close — cerrar turno (Z-close).
- pos:refund — anular ventas o procesar devoluciones.
- Rol Cashier trae
pos:operateypos:closepor defecto.
PIN del vendedor
- Cada vendedor fija su propio PIN de 4 dígitos la primera vez que entra al POS. Nadie más puede cambiarlo: ni otro cajero ni desde la API.
- La verificación y el bloqueo por intentos (5 fallos → 5 minutos) los lleva la base de datos, no el navegador. Un cajero no puede desbloquearse a sí mismo.
- Un administrador puede resetear el PIN y quitar el bloqueo de cualquier vendedor (por ahora, desde la base; el botón en POS Config está pendiente).
Preguntas frecuentes
¿Funciona offline?
No por ahora. POS requiere conexión a Supabase para validar stock y registrar ventas.
¿Puedo emitir e-CF desde POS?
Sí, si tienes el addon Emisor e-CF activo y configuras la secuencia E-series en POS Config.
¿Cómo manejo devoluciones?
Con permiso pos:refund, abre la venta original y procesa devolución. Genera movimiento positivo en inventario y, si aplica, Nota de Crédito.