El módulo de Punto de Venta (POS) es la interfaz principal de Ferred para registrar ventas en mostrador. Lo usan cajeros y administradores para buscar productos por código de barras o nombre, armar el carrito, confirmar la venta y generar automáticamente el Documento Tributario Electrónico (DTE). La aplicación es local-first: las ventas se registran en SQLite cuando no hay conexión y se sincronizan al reconectarse.Documentation Index
Fetch the complete documentation index at: https://mintlify.com/Carlos-Gnd/FERRED-Inventario-y-Ventas/llms.txt
Use this file to discover all available pages before exploring further.
Flujo de venta
Buscar producto
Escanea el código de barras con el lector (campo siempre en foco) o escribe nombre, código o categoría en la búsqueda manual. La búsqueda aplica un debounce de 300 ms y consulta
GET /api/productos?buscar=...&sucursalId=<id>.Agregar al carrito
Al seleccionar un producto, se agrega una línea al carrito. Si el producto ya existe en el carrito, se incrementa la cantidad en 1. La interfaz muestra subtotal por línea en tiempo real usando
precioConIva.Verificar stock
El cliente comprueba el stock de la sucursal activa antes de mostrar el producto. Si
stockActual === 0, el producto aparece deshabilitado y no puede agregarse. La verificación definitiva ocurre dentro de la transacción en el servidor.Confirmar venta
El cajero ingresa el nombre del cliente (por defecto
Consumidor Final) y confirma. La pantalla llama a POST /api/ventas con el carrito completo. El servidor crea la FacturaDte y descuenta stock en una sola transacción atómica con timeout de 10 segundos.Validaciones
El servidor aplica dos capas de validación antes de crear la factura. Validación de tipo de unidad (tipoUnidad): garantiza que la cantidad sea coherente con la forma en que se vende el producto.
| Tipo de unidad | Regla de cantidad |
|---|---|
UNIDAD | Número entero positivo |
CAJA / LOTE | Número entero positivo |
PESO | Decimal mayor que 0 |
MEDIDA | Decimal mayor que 0 |
Cálculo de precios
Ferred aplica IVA del 13% sobre el subtotal de la venta. El cálculo se hace en el servidor antes de crear la transacción:totalSinIva, iva, total) se almacenan por separado en el modelo FacturaDte y aparecen detallados en el ticket.
Tipos de pago
El campotipoPago en el esquema de la venta acepta cualquier cadena de texto; el valor por defecto es efectivo.
tipoPago: 'efectivo'. Para registrar otros medios de pago (tarjeta, transferencia, etc.), pasa el valor correspondiente al campo al llamar a POST /api/ventas.
Reimpresión de tickets
Para reimprimir un ticket desde el historial, usa el endpoint:ADMIN, CAJERO. El cajero solo puede acceder a tickets de su propia sucursal (validado por assertSameSucursal).
La respuesta incluye todos los datos necesarios para imprimir:
Comportamiento offline
Cuando la conexión al servidor central está caída, el módulo POS sigue operativo:- Las ventas se registran localmente en SQLite mediante el servicio
logPendiente. - Los productos se sirven desde
obtenerProductosSqlite()con los últimos datos conocidos. - Al recuperarse la conexión, el
SyncServicedrena la colaSyncLogy sube todos los registros pendientes al servidor central.
El envío del DTE a Hacienda se dispara con
setImmediate() después de devolver la respuesta HTTP al cliente. Esto significa que la confirmación de venta no espera a que Hacienda responda: la factura se crea primero con estado SIMULADO y luego pasa a PROCESADO (o ERROR_HACIENDA) de forma asíncrona. Si necesitas reenviar un DTE fallido, usa POST /api/dte/:id/reenviar.