Manual de Usuario
Resultados de búsqueda
BodegApp — WMS+TMS simple, poderoso y confiable.
Este manual es tu guía completa: desde el primer escaneo de un operario hasta la torre de control del supervisor y la configuración del administrador. Cada módulo incluye su descripción funcional, el paso a paso de uso y su fundamento técnico — porque un sistema de clase mundial se opera con confianza cuando se entiende de verdad.
Bienvenido a BodegApp
BodegApp digitaliza tu bodega de punta a punta: recepción con etiquetas inteligentes, ubicaciones trazadas, picking guiado, despacho con ruteo optimizado y entrega con prueba fotográfica — todo sincronizado en tiempo real con tu ERP y con trazabilidad total de cada unidad.
El sistema está construido sobre tres principios que lo distinguen:
- La realidad física manda. El inventario del sistema refleja siempre dónde está la mercadería de verdad: lo que se prepara sigue en su bodega de origen, lo que viaja está "en tránsito", y nada aparece en destino antes de ser recepcionado.
- Trazabilidad inmutable. El Kardex nunca se borra ni se edita. Deshacer una operación genera su movimiento inverso, con usuario, motivo y hora. Cada saldo se puede reconstruir movimiento a movimiento.
- Doble registro sincronizado. Cada operación se escribe simultáneamente en la base del WMS y en tu sistema on-premise (ERP), con verificaciones de consistencia y un chequeo de integridad automático cada 6 horas.
¿Por qué BodegApp? — Los diferenciadores
Hay muchos sistemas que "controlan inventario". Estos cinco atributos son los que separan a BodegApp de ellos — y los puedes verificar tú mismo operando el sistema.
Cada operación sensible se escribe primero en el sistema on-premise y se verifica; si algo no calza, se aborta completa — nunca a medias. El Kardex es inmutable (deshacer = movimiento inverso), las reversas son idempotentes (reintentar jamás duplica) y un auditor automático revisa la salud de los datos cada 6 horas.
Disciplina de sistema financiero aplicada a inventario — los ERP PyME no la tienen.El inventario del sistema refleja siempre la realidad: lo que se prepara sigue siendo del origen (EN_PREPARACION), lo que viaja está EN_TRÁNSITO con su destino documentado, lo auto-recepcionado en sucursal queda POR_VERIFICAR hasta el conteo. La bodega de un bulto cambia solo cuando se recepciona físicamente.
La mayoría de los WMS PyME muestran stock fantasma en destino apenas se despacha. Aquí, cero fantasmas.La consola del conductor funciona sin señal: cada entrega, foto y firma se encola localmente con su hora real y se sincroniza sola al volver la cobertura. La operación de reparto no depende de la cobertura rural.
Estándar de las plataformas de última milla dedicadas — inexistente en los WMS del segmento.Una sola taxonomía de movimientos gobierna todos los indicadores; se excluye el ruido (cargas del sistema, correcciones, datos de prueba, productos eliminados) y cada tarjeta muestra su fórmula con el badge ⓘ. Los números del dashboard reconcilian entre sí — y contra la bodega.
Transparencia de cálculo rara incluso en sistemas enterprise.Lo que mata a los WMS en la PyME es el costo de implementarlos. BodegApp lo resolvió como producto: import masivo de catálogo y stock, asistente de puesta en marcha con checklist en vivo, inventario negativo por bodega (opera desde el día uno mientras cargas), y activación de sucursales con verificación ítem a ítem.
De cero a operando en días, no en meses de consultoría.WMS + ruteo optimizado + prueba de entrega + tracking del cliente + WhatsApp + sincronización ERP, integrados de fábrica. La alternativa del mercado es contratar dos o tres productos distintos y pagarle a alguien para pegarlos.
El bundle completo que el segmento no ofrece integrado.Arquitectura y seguridad
Cómo está construido
- Aplicación web responsiva — funciona en computador, tablet y teléfono, sin instalar nada. Los escáneres usan la cámara del dispositivo o pistolas lectoras.
- Doble base de datos: PostgreSQL como motor del WMS (ubicaciones, manifiestos, rutas, kardex) y escritura dual al MySQL on-premise (
APP_STOCK), que sigue siendo la base compartida con los sistemas históricos de la empresa. Sincronización automática cada 30 segundos en ambos sentidos. - Multi-empresa y multi-bodega: varias razones sociales operan las mismas bodegas físicas con inventarios lógicamente separados y KPIs consolidables.
Seguridad
- Sesiones con token firmado (JWT) de 8 horas. Al expirar, la app muestra el aviso de desconexión y vuelve sola a la pantalla de login.
- Permisos en tres dimensiones: empresa, bodega y módulo — un usuario solo ve y opera lo que le corresponde.
- Cambio de empresa con documento abierto: si tienes un picking, un packing, una recepción o un bulto sin cerrar, la app no te deja cambiar de empresa activa (evita que los escaneos siguientes caigan sobre datos de otra razón social). El aviso indica cuál es el documento y ofrece llevarte a la pantalla donde se cierra.
- Las credenciales de integraciones (API keys, WooCommerce, WhatsApp) se guardan cifradas u ocultas tras escritura ("write-only": se ingresan una vez y no vuelven a mostrarse).
- Respaldo automático diario (03:00) de base de datos y código, con retención de 7 días.

Roles y permisos
Niveles de acceso diseñados para que cada persona tenga exactamente las herramientas de su responsabilidad — ni más, ni menos. Y cuando los roles estándar no calzan con tu organización, creas tus propios perfiles a medida.
| Rol | Para quién | Qué puede hacer |
|---|---|---|
| ADMIN | Gerente / jefe de operaciones | Todo lo de su(s) empresa(s): usuarios, configuración, corrección de inventario, reversas, todos los módulos. |
| SUPERVISOR | Jefe de turno | Toda la operación (incluye Mi Ruta y el Catálogo en modo lectura) + las reversas operativas, los ajustes de inventario y la asignación de tareas. Sin acceso a Configuración. |
| OPERATOR | Operario de bodega | Operación diaria: recepción, picking, packing, putaway, consultas y Catálogo Maestro en modo lectura — y puede salir a repartir si le asignan una ruta (Mi Ruta). Sin acceso a Transporte y Ruteo (planificación y torre de control: SUPERVISOR hacia arriba). En las colas ve solo las órdenes que le fueron asignadas (ver Asignación de Tareas). |
| CHOFER | Conductor | Solo su consola "Mi Ruta": entregas, evidencias, navegación. No puede re-optimizar rutas (facultad exclusiva del despachador). |
Privilegio especial del Maestro SKU: todos los perfiles ven el catálogo en modo buscar y visualizar; crear y modificar productos es un privilegio separado ("Maestro SKU: crear y modificar") que por defecto solo tienen los administradores y que se puede otorgar a perfiles personalizados según las políticas de cada empresa.
🤖 Cuentas de sistema: los usuarios que usan las integraciones para llamar a la API (por ejemplo el POS) se marcan como "Cuenta de sistema (integración / API)" en su ficha (Configuración → Usuarios). Conservan su acceso técnico, pero no son personas: no aparecen en la asignación de tareas ni cuentan en los KPIs de productividad, y se distinguen con el distintivo 🤖 Sistema en la lista de usuarios.
⭐ Perfiles personalizados: el acceso a la medida de tu organización
Además de los roles estándar, cada empresa puede crear perfiles propios con distintos niveles de acceso según su requerimiento (Configuración → Perfiles). Un perfil define exactamente qué módulos del menú ve y opera cada usuario — nada más, nada menos:
- Ejemplos reales: "Recepcionista" (solo Recepción + Consulta de Stock), "Jefe de Despacho" (Picking, Packing, Despacho y Monitor), "Analista" (solo Dashboard y Kardex, sin operación), "Encargado de Sucursal" (Recepción de Traslado + Putaway + Consultas).
- Nivel del perfil: cada perfil personalizado se crea con nivel Operador (ve solo las órdenes asignadas) o Supervisor (equivale a SUPERVISOR: ve las colas completas y accede a reversas, ajustes de inventario y asignación de tareas, además de los módulos que se le marquen). Ejemplo: "Jefe de Despacho" con nivel Supervisor.
- Los perfiles se asignan por usuario y por empresa — la misma persona puede tener perfiles distintos en empresas distintas.
- Se combinan con el alcance de bodegas de cada usuario: los KPIs, las colas de trabajo y las búsquedas respetan automáticamente ambas dimensiones.
- Los cambios de perfil aplican al instante en el menú del usuario, sin reinstalar ni reiniciar sesión.
Conceptos clave: B-, PL- y MN-
Tres códigos gobiernan toda la trazabilidad:
B-00000000— Etiqueta de SKU (bulto unitario). Identifica una cantidad concreta de un producto. Nace en la recepción con su etiqueta QR imprimible y acompaña al stock toda su vida: putaway, picking, fraccionamiento, traslado. Es la unidad mínima de trazabilidad.PL-00000000— Pallet / bulto de salida. Agrupa etiquetas B- en la estación de packing para viajar juntas. Es lo que se escanea al recibir un traslado.MN-000000— Manifiesto. El documento que ordena el trabajo: qué se mueve, de dónde a dónde, en qué estado del flujo va (picking → packing → despacho → entrega/recepción).
Regla de oro: escanea, no digites. Cada etiqueta tiene QR; el escáner integrado identifica automáticamente si leíste un B-, un PL-, un SKU o una ubicación, y actúa en consecuencia.
Escaneo y Lectura QR
El escáner es el teclado de la bodega: cada pantalla operativa lee QRs con la cámara del dispositivo o con pistola lectora, identifica solo qué le mostraste — etiqueta, pallet, SKU, serial o ubicación — y actúa sin que tengas que elegir nada.
Dos formas de escanear, cero configuración
- 📷 Cámara del dispositivo (teléfono, tablet o notebook): el botón de escaneo abre el visor con enfoque automático. Funciona en Chrome, Edge y Safari; el navegador pedirá permiso de cámara la primera vez.
- 🔫 Pistola lectora (hardware): cualquier lector USB o Bluetooth en modo teclado ("keyboard wedge") funciona de inmediato — dispara la lectura en el campo activo, sin drivers ni configuración. Es la opción recomendada para estaciones fijas de alta frecuencia.
Despacho inteligente de códigos
El lector es contextual: la misma acción de escanear hace lo correcto según la pantalla y el patrón del código leído:
| Código leído | Patrón | Qué hace el sistema |
|---|---|---|
| Etiqueta de SKU | B-00000000 o ID numérico | Carga el bulto: picking, putaway, consulta, reversa. |
| Pallet | PL-00000000 | Opera el bulto completo: recepción de traslado, putaway de pallet, consulta. |
| SKU / código de barras | Código del maestro o EAN | Identifica el producto en recepción y búsquedas. |
| N° de serie genérico | Definido por producto | Resuelve el SKU automáticamente (recepción y maestro). |
| Serial del fabricante | Libre (captura de datos) | Registra el serial único de la unidad para garantía y trazabilidad. |
| Ubicación | Etiqueta de rack | Confirma el destino en putaway. |
html5-qrcode (getUserMedia) y contextos de escaneo por pantalla (inbound_sku, master_serial, pm_serial, etc.). Los QRs de las etiquetas codifican el identificador puro (B-/PL-), lo que hace la lectura robusta incluso con etiquetas parcialmente dañadas.Impresión y Etiquetas
Etiquetas térmicas impresas directo desde el navegador a tu impresora Bluetooth — sin drivers, sin software intermedio, sin cables al servidor. Cada empresa define su formato una vez y toda la operación imprime igual.
Conectar y sincronizar la impresora (cada dispositivo)
- Toca el ícono de impresora 🖨️ en la barra superior (junto al selector de empresa): se abre el selector de impresoras.
- Presiona "📡 Escanear Dispositivos Bluetooth": el navegador muestra las impresoras al alcance; elige la tuya y empareja (una sola vez por dispositivo).
- El punto de estado del ícono pasa a activo. La impresora queda recordada en ese dispositivo — cada estación o teléfono se vincula con la suya, y varias estaciones imprimen en paralelo sin interferirse.
Requisito: Google Chrome (Android o escritorio) con Bluetooth activo — usa Web Bluetooth (BLE). También se soporta conexión USB/red según el modelo configurado.
Reconexión automática: una vez emparejada, la app recuerda la impresora en ese dispositivo y al volver a abrir o recargar la página se reconecta sola, sin mostrar el diálogo de emparejamiento. El diálogo solo vuelve a aparecer si la impresora no está al alcance.
¿Se abre el diálogo "desea sincronizarse" y la impresora no está en la lista? El navegador lista todo dispositivo Bluetooth cercano (los sin nombre salen como "desconocido o no compatible"); la impresora solo aparece cuando está libre: encendida, cerca y no conectada a otro teléfono o tablet (una térmica BLE acepta un solo equipo a la vez). Apaga y enciende la impresora, o desconéctala del otro equipo, y vuelve a imprimir. Si cancelas el diálogo, la app avisa que la etiqueta no se imprimió — no se pierde nada, solo hay que reintentar.
¿La impresora aparece pero no imprime? BodegApp homologa las familias de chips BLE más usadas en térmicas portátiles (incluidas las generaciones nuevas). Si un modelo conecta pero no expone un canal compatible, la app lo avisa con el nombre del dispositivo en vez de fallar en silencio: anota el modelo exacto para homologarlo.
Reconexión en un toque: el modal muestra la última impresora de este equipo con su estado (● conectada / ○ no conectada) y el botón 🔄 Reconectar; el escaneo queda solo para buscar OTRA impresora — nadie termina enlazado a la impresora de la estación vecina. En Chrome de escritorio la reconexión es silenciosa; en Android se abre el selector del sistema indicando cuál elegir (para reconexión automática en Android: activar la bandera enable-web-bluetooth-new-permissions-backend — el login lo avisa con el comando listo para copiar en los equipos que lo necesitan).

Configuración de etiquetas por empresa
En Configuración → Empresas, cada razón social define su perfil de impresión — y toda la operación lo hereda automáticamente:
| Parámetro | Opciones | Cuándo usar |
|---|---|---|
| Tipo de impresora | ESC/POS (térmica) | El estándar de las térmicas portátiles y de mesón. |
| Conexión | Bluetooth BLE · USB/Red | Bluetooth para operación móvil; USB para estaciones fijas. |
| Tamaño de etiqueta | 54×84 · 50×30 · 40×30 mm (configurable) | Debe calzar con el rollo instalado. |
| Fin de etiqueta | corte · gap · avance (feed) | Corte para impresoras con guillotina; gap para rollos pre-troquelados; avance con N líneas configurables para modelos sin corte. |
| Modo raster | activado / desactivado | El modo "a prueba de impresoras": envía la etiqueta como imagen fija (ancho configurable en puntos, 384 = 203 dpi) en lugar de comandos de texto. Actívalo si tu modelo imprime caracteres corridos, tildes mal o QRs deformes. |
Anatomía de las etiquetas
- Etiqueta B- (SKU): QR grande del código B-, razón social y RUT, SKU y descripción, cantidad y unidad, bodega, fecha de emisión y — si el producto exige captura de datos — la fila S/N con el serial del fabricante. Color de acento y subtítulo personalizables al fraccionar.
- Etiqueta PL- (pallet): QR del código PL-, operador, total de SKUs y el documento en una línea compacta (DESP/RETIRO/TRASL/RECEP + NV/COT + folio MN). En pallets de pedidos agrega la razón social del cliente (truncada a una línea) y el tipo de venta; en traslados y recepciones, la bodega destino. Mismo formato en térmica y en impresión web.
printerType, printerConnection, printerSize, labelFinish, escposRaster, rasterWidthDots, labelFeedLines). El diseño térmico está calibrado para las impresoras portátiles en uso (QR + texto, sin comandos de corte ni espaciado no soportados) y el modo raster garantiza fidelidad de impresión en cualquier firmware. La reimpresión de cualquier etiqueta está disponible desde el detalle del bulto.Recepción (Inbound) e Inventario Inicial
Del camión al sistema en segundos: cada ingreso genera su etiqueta B- con QR, queda registrado en el Kardex y disponible para ubicar — con impresión térmica directa desde el navegador.
Cómo se usa
- Menú → Recepción. Selecciona bodega y tipo de ingreso.
- Escanea o busca el SKU (también puedes escanear su N° de serie genérico si el producto lo tiene configurado en el maestro).
- Indica cantidad. Si el producto exige captura de datos, escanea el serial único del fabricante de cada unidad (garantía y trazabilidad unitaria).
- Confirma: se crea la etiqueta
B-y se imprime en la térmica (ESC/POS por Bluetooth/USB, formato configurable por empresa). - El stock queda en la ubicación genérica
00-00-00de la bodega, listo para putaway.
Recepciones en curso (retomar un manifiesto inbound)
Un manifiesto de recepción que quedó a medias ya no depende del equipo donde se inició: retómalo desde cualquier dispositivo y termina el trabajo.
- Al entrar a Recepción, si existen manifiestos inbound iniciados y sin finalizar en tu empresa, aparece la tarjeta "⏳ Recepciones en curso" con cada MN: folio, orden de referencia, bodega, bultos, ítems y unidades ya recibidas.
- Presiona ▶ Retomar: la sesión se reconstruye desde el servidor — manifiesto activo, bodega fijada, orden de referencia y los bultos ya recibidos con sus totales.
- Continúa recibiendo bultos con normalidad (todo se ancla al mismo MN) y usa Finalizar Manifiesto cuando termines.
- Si el manifiesto ya está activo en tu equipo, la tarjeta lo marca "✓ Activo aquí". Si tienes un bulto abierto, ciérralo o cancélalo antes de retomar otro manifiesto.
Toda recepción viaja dentro de un MN: si el equipo perdió su manifiesto activo (o nunca se inició uno), el servidor lo resuelve solo — reutiliza el manifiesto inbound abierto por ese usuario en esa bodega, o crea uno nuevo automáticamente. Nunca queda un bulto recepcionado sin manifiesto agrupador.
Guardia auto-sanadora: si el equipo cree tener un pallet abierto pero éste ya fue cerrado o anulado en el servidor (por un supervisor, desde otro equipo), la app lo verifica en línea y limpia sola el estado local — sin quedarse bloqueada. Como escape universal ante cualquier sesión pegada: abrir wms.bodegapp.cl/?reset-sesion=1.
Inventario Inicial (carga base de una bodega)
La puerta de entrada de una bodega nueva a BodegApp: carga el inventario existente etiquetándolo pieza a pieza — sin detener la operación y sin depender de que los saldos históricos estén perfectos.
- En la misma pantalla de Recepción, cambia el tipo de ingreso a "Inventario inicial (carga base)" — la opción solo aparece en bodegas habilitadas para carga inicial.
- Presiona "▶ Iniciar carga de inventario inicial" y trabaja en modo sesión: escanea SKU, ingresa la cantidad contada, imprime la etiqueta B- y pégala — repite producto por producto o zona por zona.
- Cada carga es aditiva: crea una etiqueta B- nueva con las unidades ingresadas y las suma al saldo (nunca pisa lo anterior) — puedes cargar el mismo SKU en varias pasadas o desde varios dispositivos a la vez.
- La carga masiva alternativa: sube un CSV/Excel con SKU y cantidades por bodega (Configuración, con plantilla descargable) — ideal para el arranque cuando ya existe un conteo digitado.
- Mientras la carga avanza, la bodega puede operar con inventario negativo: si se pickea algo aún no cargado, el saldo queda negativo y visible en el reporte de Inventarios Negativos; el ajuste posterior (fijar el saldo al conteo real) lo regulariza con auditoría.
Requisito: la bodega debe tener habilitado "Permitir picking con inventario negativo" (Configuración → Bodegas) — es el flag que marca a una bodega como "en proceso de carga inicial".
APP_STOCK (on-premise) y su espejo en PostgreSQL con el mismo correlativo B-. El inventario inicial usa el movimiento INVENTARIO_INICIAL en el Kardex, deja el stock en la genérica 00-00-00 (para putaway posterior) y muestra el saldo previo y nuevo en cada carga. La regularización de negativos usa reconcileSkuToCount, que fija el saldo exactamente al conteo con su movimiento de ajuste. También existe recepción contra orden de compra (RECEPCION_INBOUND) que genera manifiesto con cierre. Distinción clave: inventario inicial = aditivo (suma lo contado) · ajuste = absoluto (fija el saldo al conteo).
Almacenamiento (Putaway)
Cada bulto a su ubicación exacta — pasillo, columna y nivel — para que después el picking sea un paseo y no una búsqueda del tesoro.
- Menú → Almacenamiento. Escanea la etiqueta del bulto (B- o PL-) o usa la búsqueda inteligente: al tipear 2+ caracteres aparecen sugerencias de bultos, pallets y SKUs con stock — cada una muestra en qué bodega está, para confirmar de un vistazo antes de elegir.
- Escanea la etiqueta de la ubicación física destino (ej:
A-01-02). - Confirmado: el bulto sale de la genérica y el KPI de "stock sin ubicar" baja en tiempo real.
Reglas de seguridad: el sistema valida que el bulto esté en la misma bodega que la ubicación destino (cambiar de bodega siempre es un traslado, nunca un putaway) y que el usuario tenga permisos sobre la empresa del bulto y la bodega destino.
Direccionamiento 3D con drill-down: en el mapa de ubicaciones, al tocar una celda se ve su etiqueta QR, el slotting (ABC/distancia) y el resumen de ocupación por empresa; tocando una empresa se abre el detalle de sus SKUs en esa ubicación — código, nombre, cantidad y los números de cada etiqueta B- con su bulto PL- cuando viaja empacada —, todo sin salir de la pantalla, con botón 📥 Excel que exporta el detalle completo de la ubicación (empresa, SKU, bulto/lote, pallet y cantidad) en CSV listo para Excel. El inventario de la ubicación muestra el estado de cada bulto y considera solo stock vigente: lo entregado o cerrado no ocupa ubicación.
Eliminar ubicaciones (ADMIN y SUPERADMIN): el detalle de cada ubicación ofrece eliminarla, con resguardos: nunca la genérica 00-00-00 (buffer del sistema), nunca con stock vigente (indica cuántos bultos y unidades trasladar primero) y solo en bodegas a las que tienes acceso. La eliminación es lógica: la ubicación desaparece de la grilla y de los conteos, pero el Kardex histórico sigue resolviendo su nombre. Para recuperarla basta regenerar esa coordenada en el generador — o que un operador la use en putaway —: revive con su mismo historial.
PUTAWAY_PALLET en el Kardex con origen y destino. La clasificación ABC por rotación está disponible por ubicación. Las sugerencias de búsqueda se acotan en servidor al alcance (empresas y bodegas) del usuario.Picking Manual
Extrae exactamente lo que el documento pide, con validación de saldo, seriales y bodega — por partes y entre varios operadores si hace falta, con la libertad de deshacer al instante si algo se escaneó de más.
- Menú → Picking Manual. Define el documento (tipo de movimiento, folio, bodega, destino si es traslado).
- Escanea el bulto origen (B- o ID) y la cantidad a extraer hacia el pallet de salida.
- Extracción parcial: se genera un B- hijo con la cantidad extraída (el padre conserva el saldo). Extracción total: viaja la misma etiqueta.
- Cada ítem pickeado ofrece dos etiquetas a demanda: 🏷️ Hija (la etiqueta del ítem extraído) y 📦 Padre (reimprime el bulto de origen con su saldo actualizado; si quedó en cero, el sistema avisa en vez de imprimir una etiqueta falsa). La opción Padre solo aparece cuando hubo extracción parcial. Y si después de imprimirla una nueva extracción o una reversa vuelve a cambiar ese saldo, el sistema avisa que la etiqueta pegada quedó obsoleta y ofrece reimprimirla al instante.
- ¿Te equivocaste? El botón deshacer de la sesión revierte la extracción completa: el stock vuelve a su ubicación y bodega originales, con su reversa registrada en Kardex.
- Al finalizar, el picking se convierte en manifiesto y avanza a packing. ¿Cancelaste sin pickear nada? El manifiesto vacío queda ANULADO como evidencia (nunca se borra ni se reutiliza el folio).
Picking parcial y colaborativo (relevos)
Un picking no tiene que hacerse de una sola vez ni por una sola persona. El manifiesto es la sesión: se puede pausar, retomar en otro equipo y repartir entre turnos, sin perder nada de lo ya pickeado.
La pantalla se divide en dos pestañas: 🛒 Picking Manual (iniciar uno nuevo) y ⏳ Picking en proceso, que muestra en su propio rótulo cuántas sesiones hay abiertas. Es también donde viven los pedidos inyectados desde el ERP (Wave Picking).
- ⏳ Picking en proceso — los pickings abiertos de tus bodegas, con su avance (ítems, unidades, hace cuánto se trabajó), quién lo tiene y quiénes han participado. El botón ▶ Retomar reconstruye la lista desde el servidor: cada ítem muestra el operador que lo pickeó. Si no hay ninguno, la pestaña lo dice explícitamente.
- Un pickeador activo a la vez (la "posta") — quien retoma queda como responsable; los demás ven el avance pero no pueden extraer. Esto evita el error clásico de dos personas pickeando el mismo SKU sin saberlo.
- La posta se suelta sola a los 10 minutos sin actividad (colación, teléfono sin batería) y también con el botón ⏸ Pausar. Si alguien necesita asumir un picking ocupado, puede hacerlo con una confirmación que muestra quién lo tiene y desde cuándo.
- Quién cierra el picking — el portador de la posta, que es quien está viendo físicamente que no falte nada. La confirmación resume ítems, unidades y todos los participantes. Un SUPERVISOR o superior puede finalizar o liberar la posta en cualquier momento (el caso "el operador se fue y el camión espera").
- Revertir ítems ajenos requiere rol SUPERVISOR o superior; cada operador siempre puede revertir lo propio.
EN_PREPARACION en la bodega de origen — el estado final (EN_TRANSITO / DESPACHADO) lo asigna el despacho, y la bodega cambia recién en la recepción del destino. Bodegas con inventario negativo habilitado permiten pickear sin stock registrado (carga inicial gradual), acumulando saldo negativo visible en su reporte. La reversa es autoritativa e idempotente: deriva cantidades y ubicaciones de la genealogía y el Kardex, nunca de lo que envía la pantalla. El picking colaborativo persiste cada ítem al momento de extraerlo (con operador y hora), de modo que la lista del servidor —no el navegador— es la fuente de verdad al retomar desde otro equipo; la posta vive en el manifiesto con un latido de 10 minutos que la libera automáticamente.
Wave Picking — Pedidos inyectados desde el ERP
Las notas de venta llegan solas: un colector revisa el ERP cada minuto y las pone en la cola de picking de su bodega, con toda la identidad del pedido. La operación logística se gestiona en torno a la NV — el mismo folio que conocen ventas, facturación y el cliente.
Qué llega y cuándo
- Carga a la emisión de la NV: apenas la nota de venta se digita en el ERP, aparece en la cola de su bodega marcada ⚠ SIN FACTURAR — no entregar. Se puede pickear y packear de inmediato; la marca se actualiza sola (~1 minuto) cuando el ERP emite el documento.
- Solo notas de venta. Todo pedido nace de una NV; las cotizaciones no se inyectan (ni con boleta ni como traslado). Desde el 02-10-2026 los traslados internos también se emiten como NV.
- Documentos vinculados: el colector detecta la factura, boleta o guía de despacho asociada y la muestra en la tarjeta (✓ FACTURADA Nº…, ✓ BOLETA Nº…, ✓ GUÍA Nº…).
- Sin retroactividad: la regla de traslados internos por NV aplica solo a notas de venta con fecha igual o posterior al inicio configurado (
trasladoDesde, hoy 02-10-2026). Las NV internas anteriores no se inyectan aunque reciban guía o factura después; y si el colector tarda en ver una NV, la rescata solo si es posterior a esa fecha. - Traslados internos: una nota de venta emitida al RUT de la propia empresa entra como Traslado interno, con las mismas reglas de picking (se captura a la emisión y recibe después su guía). Al abrirlo, el operador debe seleccionar la bodega de destino (obligatorio) entre todas las bodegas habilitadas de la empresa — la NV del ERP no trae ese dato. Las cotizaciones ya no se inyectan: solo notas de venta.
- Líneas fraccionables: si el producto es fraccionable y calza con una regla de Configuración → Productos Fraccionables, la línea indica "📋 va a mesón", luego "⏳ en preparación" mientras se corta y finalmente "✂️ Listo en mesón — B-…" (se retira del mesón de preparación, no del rack). Sin regla que calce, se pickea como cualquier producto.
- Candado de entrega: un pedido sin documento tributario no se puede entregar — el botón de entrega lo rechaza con el folio de la NV y la instrucción de facturar primero. En cuanto el documento existe en el ERP, el candado se abre solo.
- El tipo de venta decide el flujo logístico: RETIRA CLIENTE, VENTAS MESON y RETIRO EN TIENDA abren el manifiesto como Retiro en Tienda (entrega directa al cliente, sin datos de transporte); el resto viaja como DESPACHO. Y el tipo de venta se mantiene vivo: si ventas lo cambia en el ERP después de capturada la NV (incluso después del packing), el colector lo detecta (~1 min), actualiza la orden y reclasifica el manifiesto (Retiro ↔ Despacho) para que entre o salga de la cola de ruteo según corresponda — salvo que la ruta ya haya partido.
- Documento modificado durante el picking: si la NV cambia en el ERP mientras se prepara, la sesión lo detecta (~1 min), alerta con sonido y muestra un recuadro rojo con el antes/ahora de cada línea. El botón "✔ Aplicar cambios" re-sincroniza conservando lo ya pickeado y señala los conflictos a revisar (sobre-pickeado, línea eliminada con pickeo).
- El wave es la vía ÚNICA para NVs registradas: no se puede crear un picking manual sobre una NV con orden inyectada (el sistema lo bloquea explicando el motivo); y si un picking antiguo duplicó una orden, el colector la reconcilia solo (adopta ese manifiesto y la saca de la cola).
- Las colas de wave, packing, despacho y mesón se refrescan solas cada minuto — lo que entra del ERP aparece sin tocar nada.
Ruteo por bodega (campos estructurales, no texto)
- Cada línea de la NV trae su código de bodega y la cabecera su sucursal: el pedido entra a la cola de la bodega que corresponde, sin heurísticas de texto.
- NV con bodegas mixtas: se captura completa (nunca se descarta) y la tarjeta muestra una alerta de inconsistencia para que el supervisor decida.
- La visibilidad es por perfil: cada usuario ve los pedidos de sus bodegas asignadas. La habilitación de la inyección es por bodega, 1:1 con el código de bodega del ERP (Configuración → Empresas → Inyección de órdenes), con minuto cero por fecha del documento.
Cómo se trabaja un pedido
- Menú → Wave Picking: la cola muestra las órdenes por antigüedad (y prioridad), cada tarjeta con NV, estado documental, cliente, RUT, ciudad, sucursal, tipo de venta, dirección y observaciones. El filtro sobre la lista acota en vivo por N° de nota de venta, razón social, RUT (con o sin puntos y guion) o folio de manifiesto MN-; varias palabras deben calzar todas.
- Preparar abre el picking dirigido línea a línea. En bodegas con control de stock se escanean bultos B-/PL-; en bodegas sin control de stock (inventario negativo habilitado) se confirman solo cantidades — los seriales exigidos se capturan igual.
- Al completar el picking, el pedido se convierte en manifiesto y sigue el flujo normal: packing → despacho → entrega, siempre identificado por su NV.
Cancelar órdenes
Una orden por preparar se puede cancelar con motivo (ADMIN+); queda CANCELADA con fecha, usuario y motivo — nunca se borra. Para limpiezas masivas, el botón 🧹 Cancelar antiguas de la cola permite cancelar en bloque las órdenes NUEVA anteriores a una fecha (opcionalmente de un solo tipo de venta), con vista previa del conteo y motivo obligatorio. Las órdenes EN_PICKING no entran en el bloque: tienen manifiesto y stock en preparación y se resuelven una a una (reversa de picking → anular manifiesto → cancelar).
Guardas relacionadas: eliminar un pick dentro de la sesión de picking devuelve el stock sin tocar los demás ítems del manifiesto; y un traslado no se puede despachar si alguno de sus ítems quedó sin etiqueta B- (el sistema lo rechaza con el detalle para corregirlo en picking).
Quién ve cada pedido
Un operador ve en su cola solo los pedidos que le corresponden según la matriz de asignación de su bodega o una asignación manual. Los supervisores ven la cola completa y, en cada tarjeta, el botón 👤 Asignar / Reasignar para entregar el pedido a un operador concreto (la tarjeta muestra "🧩 Asignada a …"); "Sin asignar" lo devuelve al régimen de la matriz.
TRASLADO_INTERNO por cualquiera de esas vías (con corte de fecha trasladoDesde). La captura es idempotente (empresa + origen + documento) y los documentos que van llegando se fusionan sobre el pedido existente sin duplicarlo. Si el detalle de una NV se replica después que su cabecera, el colector la retiene hasta 20 minutos y un rescate por ventana de Id recupera las que hayan quedado atrás. Los SKUs que no existen en el maestro se crean automáticamente desde el maestro de productos del ERP. El candado de entrega valida en el servidor (HTTP 423) la existencia de factura/boleta/guía antes de aceptar la entrega.Asignación de Tareas
Cada operador ve solo lo suyo. Una matriz visual por bodega — tipo de venta × etapa — define quién es responsable de qué, y el sistema reparte las órdenes nuevas de forma equilibrada entre los responsables de cada celda.
La matriz
- Menú → 🧩 Asignación de Tareas. Elige la bodega: cada bodega tiene su propia matriz.
- A la izquierda están los usuarios habilitados en esa bodega (acceso a la empresa activa y a la bodega; se excluyen choferes y cuentas de sistema).
- La tabla cruza tipo de venta (filas) con la etapa (columnas: Wave Picking, Packing, Despacho). Arrastra un usuario a una celda, o tócalo y luego toca la celda (tablets). El ✕ del chip lo quita.
- Toda bodega parte con una sola fila "* Cualquier tipo". Solo agrega filas por tipo de venta (VENTAS MESON, DESPACHO REGION…) si esa bodega separa responsables por tipo; el campo sugiere los tipos que el ERP ya envió.
- 💾 Guardar matriz. Los operadores ven el cambio al refrescar su cola.
Reglas de visibilidad
- Un OPERATOR ve en cada pantalla (Wave Picking, Packing, Despacho) solo las órdenes de las celdas donde está incluido, según la bodega y el tipo de venta de la orden.
- Si el tipo exacto no tiene celda con usuarios, aplica la fila "* Cualquier tipo".
- Celda vacía = todos la ven. Así la operación sigue funcionando aunque la matriz esté a medio configurar.
- SUPERVISOR, ADMIN y SUPERADMIN nunca se filtran: ven la cola completa para gestionar.
- Los manifiestos creados a mano (sin pedido inyectado) no se restringen.
Reparto equilibrado
Si una celda de Wave Picking tiene 2 o más usuarios, cada pedido nuevo que llega del ERP se asigna automáticamente a uno por turno (1.ª al primero, 2.ª al segundo… y vuelve a empezar). El turno se recuerda por celda, así que el reparto se mantiene parejo aunque los pedidos lleguen espaciados. Con un solo usuario en la celda no hace falta asignar: la matriz ya hace que solo él la vea.
Asignación manual
Desde Wave Picking, el supervisor puede 👤 Asignar / Reasignar cualquier pedido por preparar a un operador concreto. La asignación manual manda sobre la matriz para el picking; packing y despacho siguen la matriz (quien empaca rara vez es quien pickeó).
assignment_matrix, un bloque por bodega con filas, celdas tipo|etapa → usuarios y el puntero de turno por celda). La asignación manual es sales_orders.assigned_user_id. El filtro se aplica en el servidor sobre las colas de picking, packing y despacho solo para roles inferiores a SUPERVISOR; el reparto round-robin corre al capturar cada orden y al cargar la cola (cubre órdenes anteriores a la configuración).Packing
La estación donde el pedido toma forma física: etiquetas B- agrupadas en pallets PL- con su propia etiqueta madre, listas para subir al camión.
- Menú → Packing: la cola muestra los manifiestos listos para packing y los que quedaron en proceso, cada uno con su distintivo.
- Escanea cada etiqueta B- del manifiesto y asígnala a un pallet PL- (se genera e imprime su etiqueta madre con resumen).
- ¿Un bulto es muy grande? Fracciona en packing: divide un B- en dos sin salir de la estación (con reversa disponible).
- Cierra el packing: el manifiesto avanza a DESPACHO. Cancelar un manifiesto vacío (sin bultos) lo deja ANULADO como evidencia.
La cola es de la estación, no de quien pickeó
Packing lo hace quien esté en la estación, casi nunca la misma persona que pickeó (y con picking colaborativo pueden haber sido varias). Por eso la cola lista los manifiestos de la empresa activa filtrados por tus bodegas asignadas, no por quién los originó. Si un manifiesto no aparece, revisa que su bodega de origen esté entre las asignadas a tu usuario.
Identidad del pedido y búsqueda
Las tarjetas de la cola tienen la misma estructura que Wave Picking: la NV en grande con su estado documental (✓ FACTURADA / ✓ BOLETA / ✓ GUÍA o ⚠ SIN FACTURAR), el folio MN en pequeño, cliente, RUT, ciudad, sucursal, tipo de venta, dirección y observaciones. El buscador de la cola filtra en vivo por NV, nombre o RUT del cliente.
Dejar un packing en proceso
No hace falta terminar de una sentada. Al abrir un manifiesto pasa a estado PACKING y, si sales con ⏸ Dejar en proceso, sigue en la cola marcado ⏳ En proceso para que cualquiera lo retome.
✕ Cancelar bulto: el bulto en construcción se puede descartar desde su propia tarjeta: las cantidades ya asignadas vuelven a la lista del manifiesto (nada de lo pickeado se pierde) y el código PL- se libera — si era el último emitido, el folio se recicla. Para salir del manifiesto solo se exige cerrar o cancelar el bulto en construcción; con bultos ya cerrados se puede salir, con la advertencia de que ese armado aún no está persistido (se guarda al terminar el packing) y deberá rehacerse.
↩️ Volver a picking: si al empacar descubres que faltan o sobran ítems, cada tarjeta de la cola ofrece devolver el manifiesto a picking (reversa supervisada, con motivo obligatorio). Queda en EN_PICKING y se retoma desde Picking Manual → Picking en proceso para corregirlo. Requiere SUPERVISOR+.
PALLET on-premise y bultoCode en los ítems del manifiesto). "Desarmar PL-" (Monitor, supervisores) es la inversa exacta: libera etiquetas sin tocar su estado ni ubicación, con Kardex REVERSA_PACKING.Despacho
El momento de la verdad, documentado: patente, conductor y transportista quedan grabados, el cliente recibe su link de seguimiento y el inventario pasa a "en tránsito" o "despachado" en ambas bases a la vez.
- Menú → Despacho: manifiestos en estado DESPACHO listos para salir, cada tarjeta con la misma estructura que Wave Picking — la NV en grande, estado documental, cliente, RUT, sucursal y tipo de venta — más la cantidad de bultos físicos (los PL- armados en packing), que es también cuántas carátulas se imprimen. El buscador filtra por NV, nombre o RUT del cliente.
- Ingresa los datos de transporte (patente, conductor, RUT, transportista — se recuerdan para reutilizar). La fecha y hora de despacho se interpreta y se imprime en la zona horaria de la empresa.
- Confirma: los bultos pasan de EN_PREPARACION a su estado de stock — EN_TRANSITO (traslados) o DESPACHADO (despachos y retiros) — y se disparan las notificaciones al cliente.
Manifiesto impreso con emisor automático: el documento del manifiesto llena solo el bloque EMISIÓN de las firmas de conformidad con el nombre y RUT del usuario activo (el RUT se configura como dato opcional del usuario) y la fecha/hora de emisión en la zona horaria de la empresa.
📄 Carátulas de despacho (media carta, impresora de red)
Complemento opcional a las etiquetas térmicas: la portada courier que viaja pegada por fuera de cada bulto. El botón 📄 Carátulas de cada tarjeta abre un diálogo pre-poblado con lo que el manifiesto sabe (cliente, dirección, N° de documento, cantidad de bultos) y deja completar ciudad y fono. Imprime una página media carta (21,6 × 14 cm) por bulto con numeración 1/N … N/N, mediante el diálogo del navegador — ahí se elige la impresora láser o de red.
- Formato courier: cabecera con la empresa, RUT, bodega de origen y folio MN; destinatario, dirección, ciudad y fono en tipografía grande legible a distancia; QR del manifiesto (escaneable con la propia app, lleva a su trazabilidad) y caja BULTO i/N destacada.
- Si el marco oscuro sale claro en papel, activa "Gráficos en segundo plano" en el diálogo de impresión de Chrome.
Prueba de entrega (retiro en tienda y entrega de despacho): el formulario "Recibido Conforme" permite verificar los bultos escaneando con la cámara (escaneo continuo hasta completar el manifiesto) además de digitarlos. La captura de firma del receptor y de fotografías de respaldo se activa o desactiva por separado en la configuración de cada empresa.
🔒 Candado de facturación: un pedido inyectado que sigue SIN FACTURAR no se puede entregar — el servidor rechaza la entrega indicando la NV y pide emitir la factura/boleta en el ERP; el candado se libera solo (~1 minuto) cuando el documento existe.
↩️ Volver a Packing: si al despachar se detecta un error de armado, cada tarjeta ofrece devolver el manifiesto a la Estación de Packing (reversa supervisada, motivo obligatorio, queda en el Kardex). El botón solo aparece mientras el pedido no está facturado: con factura, boleta o guía emitida el picking ya no debe cambiar y la corrección va por nota de crédito / devolución. Los datos de transporte ya ingresados se conservan para cuando vuelva a despacho.
dispatch-complete propaga el estado a los bultos en PostgreSQL y APP_STOCK simultáneamente, registra el Kardex por SKU y activa el hook de WhatsApp "pedido en ruta" con el link de tracking. La bodega física NO cambia en este paso (Diseño B).Traslados entre Bodegas
Mercadería que viaja con pasaporte: sale del origen como "en preparación", cruza como "en tránsito" con su destino documentado en el manifiesto, y solo al escanearse en destino pasa a ser inventario de la nueva bodega. Cero stock fantasma.
Ciclo de vida completo
| Etapa | Estado del bulto | Bodega |
|---|---|---|
| Picking del traslado | EN_PREPARACION | Origen |
| Despacho (datos transporte) | EN_TRANSITO | Origen |
| Recepción escaneada en destino | STOCK | Destino (recién aquí cambia) |
Recepción Verificada de Traslado
- Menú → Recepción de Traslado en la bodega destino. Escanea el QR del bulto (PL-).
- Se abre el formulario de verificación: la lista de productos declarados del pallet con un campo de cantidad recibida por SKU (precargada con lo declarado; las diferencias se resaltan al instante).
- Declara el resultado: ✅ Recibido conforme, ⚠️ Con observaciones o ❌ No recibido conforme. Si hay diferencias de cantidad, el sistema no permite declarar "conforme"; si no es conforme, las observaciones son obligatorias. La fotografía de evidencia es obligatoria: al menos 1 por pallet (hasta 4), capturada con la cámara. El rótulo muestra el contador en vivo ("N adjuntas") y la confirmación indica cuántas quedaron guardadas en el acta — las fotos son por pallet: la tira se reinicia al escanear el siguiente PL.
- Al confirmar, el stock queda disponible en la genérica y el acta de recepción (declarado vs recibido, conformidad, observaciones, fotos, quién y cuándo) se guarda en el historial del PL. Una barra de progreso muestra cuántos bultos del manifiesto van recibidos.
- Al recibir el último bulto, el manifiesto pasa a RECIBIDO y se envía automáticamente un resumen por correo al emisor y al receptor con el detalle por bulto y un enlace que abre el acta completa en la app.
- Luego ubica con putaway normal. ¿Escaneaste por error? Un supervisor puede anular la recepción (mientras no haya putaway) y el bulto vuelve a tránsito.
Las diferencias de cantidad no ajustan stock automáticamente: quedan documentadas en el acta para gestión posterior (ajuste o reversa según corresponda).
Bodegas "solo destino" (sucursales sin BodegApp)
Las bodegas que aún operan con el sistema antiguo se marcan como no operativas en Configuración → Bodegas. Los traslados hacia ellas se auto-recepcionan al confirmar la entrega en ruteo (o por barrido tras 24 h) al estado POR_VERIFICAR: aislado, visible, pero no disponible. Cuando la sucursal se implemente, el asistente de puesta en marcha exige resolver cada ítem uno a uno (✅ a stock / ➗ parcial / ❌ cerrar con motivo) antes de activarla — el día uno parte con inventario real, no heredado.
manifests.dest_warehouse vía el PALLET (con fallback al modo anterior para traslados en vuelo). La auto-recepción respeta el flag wmsOperated por bodega y solo procesa filas creadas por BodegApp.Fraccionamiento
Divide un bulto padre en hijos con genealogía completa: cada fracción sabe de dónde viene, y el árbol de trazabilidad se puede recorrer entero desde cualquier etiqueta.
La pantalla tiene dos pestañas: 📋 Lista de productos a fraccionar (por defecto; cortes que piden las órdenes inyectadas, con un contador de pendientes) y ✂️ Fraccionamiento manual (la función base, para cualquier bulto).
✂️ Fraccionamiento manual
- Pestaña Fraccionamiento manual. Escanea el bulto padre (el producto debe estar marcado fraccionable en el maestro).
- Indica la cantidad a separar y la ubicación destino; personaliza la etiqueta (color, subtítulo, QR).
- El flag "fraccionable" del maestro gobierna los decimales: marcado → se pueden partir unidades (cortar 4,6 MT de cable); sin marcar → solo cantidades enteras, sin importar la unidad (ni 0,5 panel ni 0,5 bidón aunque diga LTS). La ficha del padre lo indica al escanear (✂️ admite decimales / 🔒 solo enteras).
- Mover parte de un lote a otro estante es también fraccionamiento: extraes 50 enteras de 100 con destino el estante nuevo — el hijo nace allá con su etiqueta y el padre conserva el saldo. Regla de oro: montón nuevo = etiqueta nueva (un B- vive en UNA sola ubicación).
- Se genera el B- hijo vinculado al padre. La reversa devuelve la cantidad al padre y anula el hijo conservando su historial.
- Las cantidades aceptan hasta 3 decimales en toda la app (recepción, inventario inicial, picking, fraccionamiento y conteo cíclico) — pensado para metros y kilos de productos fraccionables. La precisión calza exacta con el ERP on-premise (
decimal(11,3)); un cuarto decimal se redondea.
Cortes múltiples (N piezas iguales)
Para sacar, por ejemplo, 10 piezas de 10 metros de una bobina: ingresa la cantidad por pieza (10) y el Nº de piezas (10). La vista previa muestra el total (100 m) y el saldo que quedará en el padre; al ejecutar, cada pieza es un corte real con su propio B- y etiqueta, y al final aparecen todas las etiquetas hijo más la del padre con su saldo, con un botón Imprimir todas (por Bluetooth salen una a una; por navegador, una por página). El total debe dejar saldo mayor a cero en el padre; si un corte falla, se detiene y muestra cuáles B- sí se generaron. En una tarea del mesón el campo queda en 1 (una línea = un corte).
📋 Lista de productos a fraccionar (mesón de preparación)
El corte es la operación lenta del picking de cables: el mesón la saca de la ruta crítica. Un operador corta en paralelo, el pickeador retira del mesón — la ola no espera.
- La pestaña Lista de productos a fraccionar muestra cada línea de las órdenes inyectadas de tus bodegas cuyo SKU es fraccionable y calza con una regla de Configuración → Productos Fraccionables (ver más abajo), con NV, cliente, SKU, cantidad y antigüedad — desde la emisión de la NV, marcada ⚠ SIN FACTURAR si aún no tiene documento (se puede cortar igual; la entrega sigue bloqueada hasta facturar).
- ▶ Preparar toma la línea (queda ⏳ En preparación con tu nombre), salta a la pestaña de fraccionamiento manual con un banner de contexto (NV, SKU, cantidad, destino) y el cursor en el escáner, precarga la cantidad exacta y fija como destino la ubicación MESÓN de la bodega (una por bodega, se crea sola).
- Escanea la bobina padre y ejecuta el corte: el B- hijo nace en el mesón con su etiqueta, y la línea pasa a ✂️ Listo en mesón — B-XXXXX.
- En el Wave Picking, esa línea ya no sugiere rack: indica "✂️ Listo en mesón" con el B- a retirar (o "⏳ en preparación" si el corte va en curso — el pickeador avanza con el resto de la orden mientras tanto).
- El botón ↩ suelta o corrige una línea. Si una orden se anula después del corte, el hijo aparece en el panel de cortes huérfanos para reintegrarlo a rack con putaway.
Qué productos van al mesón: reglas por empresa
Estar marcado Transformable en el maestro habilita el fraccionamiento del bulto, pero no envía por sí solo la línea al mesón. Eso lo deciden las reglas de tratamiento (Configuración → 📋 Productos Fraccionables, ADMIN+):
- Sin reglas, un SKU fraccionable se trata igual que cualquier producto: va a picking directo y la lista del mesón queda vacía.
- Cada regla filtra por prefijo de SKU (uno o varios, separados por coma; sin distinguir mayúsculas) y define el tratamiento — por ahora Preparación en mesón. Si el SKU calza, la línea entra a la lista de productos a fraccionar; si no calza ninguna regla, sigue a picking.
- Las reglas se evalúan en orden (la primera que calza manda) y pueden activarse o desactivarse sin borrarlas.
parentBatchId; productos de unidad discreta exigen fracciones enteras. La conversión de unidades (transformables) usa el mismo motor con Kardex CONVERSIÓN. La lista del mesón nace de las líneas de órdenes activas cuyo producto es transformable y cuyo SKU calza con una regla transform_rules de la empresa; el estado de preparación viaja con la línea de la orden y el hijo queda ubicado en BODXXX-MESON. Los cortes múltiples ejecutan N veces el mismo fraccionamiento atómico (on-premise y BodegApp por corte), nunca un lote parcial.Inventario Cíclico
Exactitud de inventario de clase mundial sin detener la operación: conteos por ubicación o SKU, diferencias al instante y ajustes auditados.
- Plan anual (pestaña Planes): meta de ubicaciones a contar por bodega en el año, con umbral de varianza; la pestaña Progreso muestra el avance contra la meta mensual.
- Sesiones: crea una sesión eligiendo bodega, fecha, el usuario asignado que contará, y las ubicaciones (con selección rápida por clase A/B/C).
- El conteo es CIEGO y por SKU × ubicación: el contador no ve la cantidad del sistema. El snapshot considera solo stock físico vigente (sin cerrados ni en tránsito) y aísla por empresa en bodegas compartidas.
- Ejecutar Conteo (pestaña propia): el contador elige su sesión y aparece la pantalla de trabajo — barra de progreso, campo para escanear la etiqueta QR de la ubicación (o escribirla) y la lista de ubicaciones tocables con su avance; cada ubicación abre sus SKUs con el campo de cantidad.
- Al registrar cada conteo se calcula la varianza (unidades y %); el cierre entrega el resumen (total contado, filas con diferencia, unidades de varianza) y alimenta el progreso del plan.
- Rectificar: los planes se editan re-guardando la misma bodega/año (✏️ precarga el formulario) y se eliminan solo sin sesiones; una sesión sin conteos se edita (nombre, fecha, responsable) o elimina; con conteos solo se reasigna el responsable o se anula (los conteos quedan de auditoría, sin sumar al plan); COMPLETADA es inmutable. Todo SUPERVISOR+.
- El conteo no ajusta stock por sí solo: la regularización es una decisión explícita vía Ajustes de inventario (AJ-), con su auditoría. La exactitud alimenta el KPI del dashboard (meta world-class: ≥98%).
Consulta de Stock
Una sola búsqueda, toda la verdad: dónde está cada unidad, en qué estado y en qué bulto — unificando el WMS y el sistema on-premise en una vista.
- Menú → Consulta de Stock. Busca por SKU, nombre, etiqueta B- o bulto PL-. El autocompletado usa un catálogo liviano que carga en segundos incluso en móvil con señal débil.
- El resumen agrupa por bodega; toca una tarjeta para el detalle de bultos y ubicaciones. En el detalle, el encabezado de cada SKU queda fijo mientras recorres sus bultos — con SKUs de códigos parecidos siempre sabes cuál estás mirando.
- Cada bulto del detalle tiene un botón 🖨️ de reimpresión: genera la misma etiqueta que Trazabilidad de Manifiesto (resuelve unidad de medida del maestro y número de serie si el bulto es serializado).
- Si el bulto tiene pallet asignado, un segundo botón 🏷️ imprime la etiqueta del pallet (PL-) — térmica Bluetooth o SVG según la conexión del equipo — con los ítems y unidades del PL- visibles en la consulta.
Solo stock vigente: las consultas de stock muestran lo que realmente está en bodega — disponible, en pallet, en picking, en preparación, listo para retiro, en tránsito o por verificar — cada uno con su estado a la vista. Lo ya cerrado o entregado no aparece como stock: vive en el Kardex y en los manifiestos, que es donde corresponde consultarlo. Este mismo criterio rige en el Direccionamiento 3D, en la ocupación por bodega y en el Avance ERP, de modo que los cuatro indicadores siempre cuadran entre sí.
El stock no disponible se muestra en grupos propios, nunca mezclado con el disponible:
- 📦 En preparación — pickeado en un pallet, aún no despachado (cuenta en su bodega de origen).
- 🚚 En tránsito — viajando, con su destino ("→ Temuco") tomado del manifiesto.
- 📋 Por verificar — auto-recepcionado en sucursal, pendiente de conteo físico.

Kardex (Trazabilidad)
La caja negra de tu inventario: cada movimiento de cada unidad, con quién, cuándo, desde dónde y hacia dónde. Inmutable por diseño — las correcciones suman movimientos, jamás borran historia.
- Menú → Kardex. Busca por SKU, nombre, etiqueta B-, bulto PL-, tipo de movimiento o documento.
- Cada fila muestra tipo, cantidad, bodega/ubicación origen y destino, usuario, fecha y notas.

Monitor de Manifiestos
El pulso de la operación en un tablero Kanban vivo: cada manifiesto en su columna de estado, con filtros por bodega, alertas y las herramientas de supervisión a un clic.
- Vista Kanban o lista, con filtros por bodega y estado, refresco automático y búsqueda en vivo por NV, folio MN, nombre o RUT del cliente — incluye pedidos aún Pendientes (avistados en el ERP y todavía sin picking).
- Acciones por manifiesto: PDF, envío por correo, y para supervisores la reversa ↩️ (retroceder un paso del flujo con motivo).
- Herramientas de supervisión en el encabezado: Desarmar PL-, Anular ingreso, Anular recepción.
- Los flujos de estados son configurables por empresa y tipo de movimiento (Configuración → Flujos).
- Display Público opcional: pantalla para TV de bodega con el pipeline de pedidos en tiempo real.
- Trazabilidad de Manifiesto acepta también una NV: muestra su etapa aunque esté Pendiente (aún sin picking), el pipeline de la orden y sus manifiestos relacionados.
- En la trazabilidad de un traslado, el botón 📋 Acta de recepción abre el acta consolidada de TODOS sus pallets: conformidad, declarado vs recibido, quién recepcionó y las fotografías (click para ampliar).
- La vista del manifiesto es histórica: las cantidades de cada bulto son las del momento del traslado y no cambian aunque el bulto después se fraccione. Lo único vivo está rotulado como tal: "📍 Hoy:" (dónde está el bulto ahora).

Display Público de Pedidos
La TV de la bodega: cada nota de venta con su estado en tiempo real, desde que se digita en el ERP hasta que sale por la puerta. Sin login, sin clics — la pantalla se desplaza sola.
- Pipeline por pedido: Pendiente (NV avistada o cargada a la emisión, aún sin documento) → Facturada / Guía emitida → estados WMS (En picking, Por preparar, Listo para packing…). Los pedidos terminados salen solos de la pantalla.
- Columnas: empresa (en modo multi-empresa), NV, estado, cliente, tipo de venta, inicio (primer avistamiento del documento en el ERP) y tiempo transcurrido en vivo. Ordenado con lo más antiguo arriba; los traslados internos son opcionales.
- Token multi-empresa: el link se genera desde el Monitor para las empresas que el usuario seleccione (una misma pantalla puede mostrar COMERCIAL PH y SOLARYLED juntas). Filtros configurables por bodega y por estado.
- Modo claro por defecto (pensado para TV), tipografías compactas, scroll automático con pausas y refresco continuo — cero interacción necesaria.
Dashboard de KPIs
Métricas de operación calculadas con rigor de auditoría: solo trabajo físico real, consolidadas por bodega entre todas tus empresas, y con la fórmula de cada indicador a la vista.
- Resumen: movimientos, ocupación, manifiestos, SKUs activos, tipos de movimiento (Entradas/Salidas/Internos por SKUs con movimiento) y estado de manifiestos.
- Productividad: operaciones físicas por operador (recepciones, pickings, posicionamientos, transformaciones) con ranking. Excluye estados, correcciones y cargas del sistema.
- Inventario: unidades por bodega, top SKUs, ocupación de ubicaciones.
- Nivel de Servicio: completitud por tipo de documento.
- KPIs Avanzados: OTIF, tiempo de ciclo recepción→putaway, rotación, stock sin ubicar, edad del stock, líneas/día, exactitud de inventario — con semáforos world-class.
- Filtros globales: período (por defecto 7 días), bodega y empresa — el consolidado multi-empresa es el default si tienes acceso a varias. Al cambiar cualquier filtro (o la empresa activa de la sesión) todas las pestañas de KPIs, incluida Avance ERP, se refrescan automáticamente con el nuevo alcance.
- Pasa el mouse por el badge ⓘ de cualquier tarjeta o gráfico para ver qué mide y su fórmula exacta.

Avance ERP
El termómetro de tu implementación: cuánto del inventario del ERP ya vive gobernado por BodegApp, bodega por bodega, familia por familia, valorizado a precio de lista.
- Dashboard → 🎯 Avance ERP. Filtra por empresa (si accedes a más de una; por defecto consolida todas), bodega, familia o SKU.
- Tiles: avance global SKU×bodega, SKUs 100% cuadrados, unidades y valorización BodegApp vs ERP (valores resumidos en K/M).
- Barras duales por bodega, % cuadrado por familia (peor primero) y tabla de mayores diferencias valorizadas.
- Exporta el detalle a Excel (columnas separadas de stock BodegApp y ERP), con opción de incluir SKUs sin diferencias.
Qué se compara: lo que hay físicamente en cada bodega — eso es lo que se cuenta y debe cuadrar. El lado BodegApp considera el stock vigente (disponible, en pallet, en picking o preparación); lo cerrado o entregado no participa.
⇄ Auditoría de tránsito y por verificar (panel aparte): lo que viaja entre bodegas y lo enviado a destinos sin control de inventario (POR VERIFICAR) no ajusta la cuadratura — se lista en su propio panel al pie, con bulto, cantidades, origen → destino, manifiesto y antigüedad. Lo POR VERIFICAR es el registro del período sin control: no exige explicación hacia atrás; cuando esa bodega se implemente con BodegApp, su minuto cero es el conteo inicial y desde ahí rige el control. El tránsito también sigue visible en la Consulta de Stock bajo su grupo 🚚.
APP_STOCK on-premise (cache 60 s, fallback al espejo); el lado ERP desde las vistas homologadas por empresa. Solo cuentan bodegas creadas en BodegApp. En modo consolidado, cada empresa compara contra su propio ERP por RUT y los agregados suman.
Transporte y Ruteo
Optimización de rutas al nivel de los grandes: ventanas horarias, prioridades, tráfico real por carretera, torre de control con alertas en vivo y reprogramación de fallidos en dos clics.
Planificación
Choferes = usuarios creados, siempre: las rutas solo se asignan a usuarios del sistema (selector, nunca texto libre) — cada entrega queda ligada a una cuenta real con su consola y su GPS. Pueden conducir los perfiles CHOFER (consola mínima dedicada, siempre en el selector) y cualquier usuario marcado "🚗 Habilitado para conducir" en su ficha — operadores, supervisores o perfiles personalizados, rotulados con su perfil en el selector. El flag representa la realidad (licencia de conducir) y es independiente del perfil de acceso. El transportista externo (Starken, etc.) sigue siendo un catálogo de texto del despacho, sin usuario.
Programador de reparto: en la matriz de asignación (Configuración → Asignación) la columna 🗺️ Ruta designa a quien programa: ese usuario — aunque sea operador base — entra a la consola con vista de gestor (todas las rutas, flota en el mapa, filtro por chofer) y asigna o cambia el chofer de cada ruta con el selector 👤 Chofer.
Panel interactivo estilo ruteador: la cola "Sin asignar" muestra cada MN como tarjeta con su NV, la razón social del cliente y la empresa (los traslados, en morado con su bodega destino). Con una ruta seleccionada, los MN pendientes aparecen abajo y se arrastran a la ruta en la posición exacta deseada: al soltar se agrega la parada y se recalculan secuencia, ETAs y ventanas. Las paradas también se reordenan por arrastre, y al elegir chofer el RUT y teléfono se precargan desde su ficha de usuario.
Posición geográfica por niveles: cada parada indica cómo se ubicó — EXACTA (geo del manifiesto o fijada a mano), DIRECCIÓN (geocodificada por API, anillo ámbar en el pin) o COMUNA (centroide aproximado, anillo rojo + aviso "verificar"). El planificador puede ✏️ editar la dirección (se re-geocodifica por API y re-optimiza) o 📍 ubicar la entrega tocando el mapa; los pines de la ruta seleccionada son arrastrables y al soltar se re-optimiza la secuencia completa por cercanía. La geo corregida se guarda en el manifiesto para las próximas rutas del cliente.
- Menú → Transporte y Ruteo. Toma manifiestos despachables de la cola y créales un documento de transporte con chofer y vehículo.
- Define por parada: ventana horaria y prioridad (normal/alta/urgente).
- Optimizar: el motor ordena las paradas minimizando el costo real del recorrido, respetando ventanas y priorizando urgentes. Reordenamiento manual por arrastre disponible (con recálculo de ETAs).
Restricciones del vehículo
Cada vehículo de la flota puede definir, todas opcionales: capacidad (unidades), peso máximo (kg), volumen máximo (m³) y turno (desde/hasta). En la planificación son restricciones duras: ninguna ruta se genera excediendo el vehículo ni su jornada, y lo que no cabe se reporta como "no asignado" con el motivo específico (peso, volumen, capacidad o turno). El peso y volumen de cada manifiesto se calculan automáticamente desde la ficha de los productos (peso/volumen unitario × cantidad). Un campo vacío o en 0 significa sin restricción.
Re-optimizar en ruta es facultad exclusiva del despachador (Torre de Control) — el chofer no puede alterar su recorrido.
📋 Chequeo de salida de carga (nuevo paso obligatorio)
Antes de que el chofer pueda iniciar, un SUPERVISOR (o gestor / programador de reparto) valida la carga: el botón "📋 Chequear carga" de la ruta abre un formulario resumen con una fila por manifiesto — folio MN, NV, documento tributario (factura/boleta/guía, o ⚠ SIN FACTURAR en rojo), razón social del cliente, y el conteo y códigos de los bultos PL — con un check por fila para cotejar contra lo físicamente cargado al vehículo. Cada ✔ registra quién y a qué hora. Solo con todas las filas validadas la ruta se libera: hasta entonces el botón "Iniciar ruta" del chofer está bloqueado y el servidor rechaza el inicio (también por el link de acceso del conductor). Los traslados entre bodegas también se programan aquí: aparecen en la cola "Sin asignar", su destino toma la geo de la bodega, el inicio de la ruta los pasa solo a EN_TRANSITO, y la salida directa desde Despacho queda bloqueada (el sistema exige programarlos en ruta). Una entrega no concretada queda FALLIDA en la ruta (con motivo y evidencia) y puede reprogramarse de inmediato; si nadie la reprograma, al finalizar la ruta su manifiesto vuelve solo a la cola de despacho — la parada fallida queda en la ruta como historial. El chequeo se puede realizar desde dos lugares: la consola Mi Ruta (franja ámbar "Chequeo pendiente" en la ruta) y el detalle del TR en Transporte y Ruteo (botón junto a "Optimizar ruta", que muestra "✅ Chequeo de salida OK" al completarse). El bloqueo rige en las tres vías de inicio — consola del chofer, link público del conductor y el botón Iniciar del módulo de transporte — y una vez iniciada la ruta el chequeo queda inmutable. Las rutas sin manifiestos (paradas libres) no lo requieren.
Torre de control
- Mapa en vivo con cada camión (posición GPS del chofer) y cada parada con su ETA.
- Alertas automáticas: sin señal >10 min, ruta atrasada, ritmo lento, ventana en riesgo/perdida, cliente respondió por WhatsApp.
- Paradas fallidas: reprogramar a la cola de despacho o directamente a otra ruta.
- Posición de todos los choferes activos visible según tu alcance de empresa/bodega, tengan o no ruta asignada.
lastLat/lastLng) con actualización continua. Proveedor de optimización externo conectable por API key.
Mi Ruta (Consola del Chofer)
Una consola de reparto que funciona hasta donde no llega la señal: offline-first, con navegación a Waze en un toque, prueba de entrega con foto y firma, y un mapa que gira contigo.
- El chofer entra con su usuario (rol CHOFER aterriza directo en Mi Ruta) y activa el GPS. Si la ruta lleva manifiestos, el botón Iniciar permanece bloqueado 🔒 hasta que un supervisor complete el chequeo de salida de carga.
- Cada parada trae: la razón social del cliente y su documento tributario (Factura/Boleta/Guía Nº — o "NV · ⚠ SIN FACTURAR" en rojo si aún no puede entregarse), dirección, contacto (botón llamar), Waze y WhatsApp, y el botón "Llegué" (check-in con hora).
- Entregar: nombre de quien recibe + foto de evidencia + firma (cada evidencia se activa o desactiva por empresa en Configuración). Los bultos del manifiesto se verifican escaneando con la cámara en modo continuo o digitando. No entregar: motivo tipificado (cliente ausente, dirección incorrecta, rechazado, sin acceso, fuera de horario) + foto. El receptor es obligatorio siempre, y la foto lo es cuando la empresa tiene las fotos POD activas — validado en el servidor, no solo en pantalla.
- ¿Sin señal? La app encola todo localmente y sincroniza sola al volver la cobertura, con la hora real de cada evento. Banner 📵 y marcadores ⏳ indican lo pendiente.
El chofer no puede re-optimizar su ruta: el recorrido lo gobierna el despachador desde Torre de Control.
El mapa que acompaña
- Rotación heading-up: el mapa gira para que el camión siempre apunte hacia arriba, con movimiento continuo (sin saltos).
- Seguimiento inteligente: encuadre automático mientras te mueves; al detenerte más de 10 s, el mapa se libera. Tocar una parada la centra 30 s.
- La pantalla no se bloquea mientras Mi Ruta está activa (Wake Lock).
Tracking del Cliente
Tu cliente sigue su pedido como si fuera un delivery premium: página blanca con tu marca, línea de tiempo, hora estimada, cuántas paradas faltan y el camión moviéndose en el mapa en vivo.
- Cada parada genera un link único
/t/…que se envía por WhatsApp al salir la ruta. - Muestra: estado (preparando / en ruta / entregado / no entregado), ETA, paradas restantes, quién recibió, y botón "Escríbenos" al WhatsApp de la empresa.
- Mapa en vivo con la posición del vehículo (actualización cada 25 s). El link expira 48 h después de terminado el pedido.
Notificaciones WhatsApp
Comunicación proactiva con plantillas aprobadas de WhatsApp Business: "va en camino", "entregado", "no pudimos entregar" — y las respuestas del cliente llegan directo a la torre de control.
- Configuración → 💬 WhatsApp (por empresa): URL del conector, API key, canal, número de contacto y las 3 plantillas.
- Los envíos se disparan solos: al iniciar ruta, al entregar y al fallar — siempre "best-effort" (jamás bloquean la operación).
- Si el cliente responde, su mensaje queda anotado en la parada y genera la alerta 💬 en la torre de control.
Catálogo Maestro SKU
Un maestro de productos que es fuente de verdad: fotos importadas de tu tienda WooCommerce, precio y stock ERP sincronizados, seriales, fraccionabilidad y papelera reversible — todo gobernado desde una pantalla.
- Ficha completa: SKU, nombre, unidad, múltiplo de venta (unidades por las que se vende, ej. de 5 en 5 — lo consume el POS para validar cantidades), proveedor, familia, código de barras, serial genérico, fraccionable, captura de datos, stock mín/máx, foto y PDFs adjuntos. La sección Logística captura el peso (kg por unidad de medida) y las dimensiones alto × ancho × largo (cm): el volumen (m³) se calcula y guarda solo, y ambos alimentan las restricciones de peso/volumen de los vehículos en el ruteo. La carga masiva CSV acepta las columnas
peso,alto,anchoylargo. - Acceso en dos niveles: todos los usuarios pueden buscar y visualizar la ficha completa (modo solo lectura, con historial y PDFs descargables); crear y modificar requiere el privilegio "Maestro SKU: crear y modificar", que se otorga por perfil según las políticas de la empresa.
- Sincronizado con el ERP: precio de lista y stock ERP por bodega se refrescan cada 5 minutos y se muestran en la grilla.
- Fotos desde WooCommerce: Configuración → 🛒 importa las imágenes publicadas en tu tienda cruzando por SKU (normalizadas y livianas). La foto manual siempre puede reemplazarlas.
- Papelera (borrado lógico): eliminar exige stock cero en ambas bases; lo borrado no cuenta en ninguna estadística y es restaurable con su historial íntegro.
- Protecciones: la unidad de medida no se puede cambiar con stock vigente; renombrar un SKU (operación restringida de administración) propaga el cambio al on-premise con auditoría.
- Carga masiva por CSV/Excel con plantilla descargable.
Reversas Operativas
Equivocarse es humano; deshacer con trazabilidad es world-class. Cada proceso tiene su reversa guiada: el sistema solo ofrece el paso atrás válido para el estado actual, exige motivo y lo graba todo en el Kardex.
| Reversa | Qué hace | Dónde |
|---|---|---|
| Deshacer picking | Devuelve la extracción a su ubicación y bodega originales (parcial o total). | Picking Manual (misma sesión) |
| Reabrir manifiesto ↩️ | Retrocede UN paso del flujo (ej: DESPACHO→PACKING), con motivo. Bloqueado si ya salió a transporte, está en estado final o —al volver desde despacho— el pedido ya está facturado. | Monitor · Packing · Despacho ("Volver a Packing") |
| Revertir ajuste de inventario | Aplica el ajuste inverso sobre el mismo bulto y marca el original como revertido (Kardex REVERSA_AJUSTE). Una reversa no se revierte. | Ajustes de Inventario → Historial |
| Desarmar PL- | Libera las etiquetas B- de un pallet armado (pre-despacho). | Monitor |
| Anular ingreso | Etiqueta ingresada por error, disponible y sin historia → queda ANULADA (nunca se borra). | Monitor |
| Anular recepción de traslado | Bulto escaneado por error (sin putaway) → vuelve a EN_TRÁNSITO junto con su manifiesto. | Monitor |
REVERSA_*), sumando cero contra el original. Orden on-premise-primero con guardas de idempotencia: reintentar una reversa jamás duplica stock.Ajustes de Inventario
Cuando el conteo físico no calza con el sistema, el supervisor corrige unidades dentro del bulto exacto — con motivo clasificado, observaciones y fotos — y todo queda con folio propio, en el Kardex y en ambas bases. Reversible.
Nuevo ajuste
- Menú → ⚖️ Ajustes de Inventario. Elige la bodega y busca el SKU (por código o nombre).
- La pantalla lista los bultos B- de ese SKU en la bodega, agrupados por pallet PL-, con ubicación, saldo y estado. Solo se pueden ajustar los bultos disponibles; los que están en picking, tránsito, etc. aparecen atenuados (para ellos, usa la reversa del proceso correspondiente).
- Selecciona el bulto y elige + Agregar o - Reducir con las unidades; la vista previa muestra el saldo resultante. ¿Encontraste un sobrante que no pertenece a ningún bulto? La opción "Sobrante sin bulto" crea un B- nuevo en la ubicación genérica (solo agregar). Reducir siempre exige elegir el bulto.
- Indica el motivo (lista configurada por la empresa; algunos motivos solo admiten aumentos o solo disminuciones, y "Otro" exige observaciones), agrega observaciones y hasta 4 fotos con la cámara.
- Confirma. El ajuste recibe un folio AJ-000001, se escribe primero en el ERP on-premise y luego en BodegApp, y genera el movimiento AJUSTE en el Kardex del bulto con el folio como referencia.
- Reimprime las etiquetas. La etiqueta física del bulto quedó con el saldo anterior: el resultado del ajuste ofrece 🏷️ Reimprimir etiqueta B- (con el saldo nuevo) y, si el bulto está en un pallet, 📦 Reimprimir etiqueta PL- (etiqueta madre con la cantidad de bultos y unidades vigentes). Los mismos botones están en el detalle de cada ajuste del historial, siempre con el estado actual del bulto.
Historial y reversas
La pestaña 📜 Historial y Reversas filtra por bodega, SKU / B- / PL- / folio y fechas, y muestra por cada ajuste fecha, bodega, SKU, bulto, cantidad (antes → después), motivo, usuario y fotos. ↩️ Revertir (motivo obligatorio) aplica el ajuste inverso sobre el mismo bulto —que debe seguir disponible— y marca el original como REVERTIDO; una reversa no se revierte.
Motivos configurables
Configuración → ⚖️ Motivos de Ajuste (ADMIN+): código, descripción, dirección (ambas / solo aumentos / solo disminuciones) y activo. La app trae una lista inicial (error de conteo, sobrante encontrado, merma, rotura, vencimiento, robo o pérdida, error de despacho, otro); los motivos inactivos dejan de ofrecerse pero conservan su historial.
Relación con otras herramientas: el botón ⚖ Ajustar de Configuración → Inventario Negativo fija el saldo de un SKU al conteo para eliminar negativos (también SUPERVISOR+); el Inventario Cíclico registra conteos y varianzas pero no mueve stock — las diferencias detectadas se corrigen aquí, con motivo y evidencia.
inventory_adjustments (folio por secuencia AJ-, bodega, SKU, B-, PL-, ubicación, antes/delta/después, motivo, observaciones, fotos, usuario, resultado on-premise, marca de reversa). On-premise PRIMERO con guarda de calce (UPDATE APP_STOCK … WHERE ID_WMS = ? AND STATUS = 'STOCK' AND CANTIDAD calza): si no afecta exactamente una fila, responde 502 y no toca BodegApp. Kardex AJUSTE / REVERSA_AJUSTE, clasificados como administrativos (fuera de productividad). Un bulto no puede quedar negativo salvo en bodegas con inventario negativo habilitado.Corrección de Inventario (Registros Erróneos)
El bisturí del administrador para alinear el inventario cuando algo quedó mal — con doble confirmación en estados sensibles, consistencia garantizada entre ambas bases y huella completa en Kardex y auditoría.
- Configuración → 🧹 Registros Erróneos. Busca por B-, PL-, SKU o descripción y combina con el filtro por bodega (la grilla muestra la bodega de cada registro). Al filtrar por bodega la búsqueda amplía su ventana antes de filtrar, de modo que también encuentra bultos antiguos de esa bodega.
- Revisa el detalle (stock, movimientos, manifiestos, genealogía) y elimina de raíz.
- Si el registro está en estado sensible (en tránsito, despachado) el sistema lo advierte y sugiere la reversa como vía correcta antes de permitir continuar.
- El historial de eliminaciones se consulta bajo demanda con filtros (código/SKU/usuario/fechas) y exporta a CSV.
Qué protege el sistema al eliminar
Un bulto casi nunca vive solo: suele estar citado en documentos. La app distingue dos situaciones y actúa distinto en cada una.
| Situación del registro | Qué hace la app |
|---|---|
| Está en un documento EN CURSO picking, packing, despacho, tránsito… |
Bloquea la eliminación e indica qué documento lo retiene. No admite forzar: purgarlo dejaría el manifiesto sin contenido y el stock movido sin respaldo. La vía correcta es la reversa del pick, que saca el ítem del manifiesto y devuelve el stock a su ubicación. Luego sí se puede eliminar. |
| Está en un documento CERRADO entregado, recibido, cerrado |
Permite eliminar el bulto, pero conserva la línea del documento como evidencia histórica — mismo criterio que el Kardex, que queda desanclado y nunca se borra. Una entrega firmada sigue mostrando qué se entregó aunque el registro de stock ya no exista. |
Manifiestos sin ítems: si un manifiesto queda sin contenido (todos sus bultos revertidos o eliminados) no puede avanzar, despacharse ni entregarse — evita generar una prueba de entrega sobre cero unidades. La salida es anularlo o rehacer el picking.
CORRECCION_INVENTARIO con la cantidad negativa — el saldo del SKU siempre reconcilia. Las líneas de manifiesto no referencian al bulto (legacy_id/bulto_code son texto), por eso conservarlas no deja registros viudos.Integridad de Datos
Un auditor incansable trabaja para ti cada 6 horas: busca registros viudos, tránsitos olvidados, preparaciones colgadas y negativos anómalos — y te lo muestra en un panel de salud con ejemplos concretos.
- Panel 🩺 Integridad de datos en Configuración → Registros Erróneos, con ejecución bajo demanda.
- Chequeos: ítems de manifiesto sin etiqueta, paradas sin manifiesto, transitorios >7 días, stock de productos en papelera, tránsitos >7 días sin recepción, negativos en bodegas sin inventario negativo habilitado.
- Guardas estructurales activas: no se puede desactivar/eliminar una bodega con stock; los cambios manuales de estado de manifiesto solo aceptan transiciones válidas del flujo.

Configuración
| Sección | Qué gobiernas |
|---|---|
| Empresas | Razones sociales, planes y límites, datos de facturación, impresoras y formato de etiquetas, zona horaria (gobierna todas las fechas y horas de la app, con cambio de hora automático) y prueba de entrega (firma y fotografías activables por separado) por empresa. |
| Bodegas | Creación, geolocalización (origen de rutas), generación masiva de ubicaciones, empresas asociadas, inventario negativo y "Opera BodegApp" (recepción escaneada vs solo-destino). |
| Usuarios y Perfiles | Altas, roles, acceso por empresa y bodega (las empresas asignables se limitan al alcance del administrador que edita), RUT y teléfono del usuario (el RUT se imprime como emisor en manifiestos; ambos se precargan como datos del chofer al crear rutas), marca de 🤖 cuenta de sistema para usuarios de integración/API, marca 🚗 Habilitado para conducir (candidato a chofer en Transporte y Ruteo), perfiles de menú personalizados por empresa (incluido el privilegio de edición del Maestro SKU). |
| ⚖️ Motivos de Ajuste | Clasificación preestablecida de los ajustes de inventario: código, descripción, dirección (aumentos / disminuciones / ambas) y activo. |
| 📋 Productos Fraccionables | Reglas por prefijo de SKU que definen qué productos fraccionables van a la lista de productos a fraccionar (mesón); sin reglas van a picking directo. |
| Flujos de Manifiesto | Secuencia de estados por tipo de movimiento, configurable por empresa. |
| Conector, plantillas y número de contacto por empresa. | |
| 🔌 Integraciones | Todas las conexiones externas en un solo lugar, con sub-pestañas: Bsale (ERP/POS: catálogo, stock por sucursal para el Avance ERP y ventas como manifiestos, con webhook en tiempo real), Fotos WooCommerce y API para sistemas de venta (API keys de lectura: productos, stock dual, bodegas, usuarios). |
| ✉️ Correo | Proveedor de envío (Resend/SMTP) para manifiestos y notificaciones. |
| 🧹 Registros Erróneos | Corrección de inventario, historial de eliminaciones e integridad de datos. |
| Display Público | Pantalla de TV con manifiestos activos, por token. |

Integraciones y API
BodegApp no vive aislado: conversa con tu ERP on-premise cada 30 segundos, alimenta a tu sistema de ventas por API y recibe pedidos del POS — un ecosistema, no una isla.
- ERP on-premise (dual-write): toda operación se escribe también en
APP_STOCK; la sincronización bidireccional corre cada 30 s y los precios/stock ERP cada 5 min desde vistas homologadas por empresa. - Inyección de pedidos (Wave Picking): el colector lee las notas de venta y sus facturas, boletas y guías del ERP cada 1 minuto, por bodega habilitada, y alimenta la cola de picking (las cotizaciones no se inyectan; los traslados internos son NV al RUT propio) — ver Wave Picking.
- API externa de solo lectura (
/api/ext/v1): productos (con precio, stock ERP y múltiplo de venta para validar cantidades en el POS), stock dual BodegApp+ERP por bodega, bodegas y usuarios. Autenticación por API key con hash, scopes y rate-limit; gestión y rotación desde Configuración. - Pedidos desde el POS (oomnisale): ingresan como manifiestos. Mientras la integración esté en modo prueba, sus pedidos quedan aislados de KPIs y colas operativas (interruptor
OOMNISALE_TEST_MODE). - WooCommerce: importación de fotos del catálogo por SKU.
- oomnichat: WhatsApp Business API con plantillas y webhook de respuestas.
Arquitectura Técnica Detallada
Para el equipo de TI y los evaluadores técnicos: cómo está construido BodegApp por dentro, por qué se tomaron esas decisiones y qué garantías entrega cada capa.
Las cuatro capas
| Capa | Tecnología | Responsabilidad |
|---|---|---|
| Presentación | Aplicación web SPA (HTML5/JS), responsiva, sin instalación | Todas las pantallas, escaneo QR por cámara, impresión Web Bluetooth, mapas (Leaflet/OSM), gráficos (Chart.js), operación offline del chofer (IndexedDB). |
| API | Node.js + Express, ~180 endpoints REST | Reglas de negocio, máquina de estados, validaciones, autenticación JWT, permisos por empresa/bodega/módulo, rate-limiting en endpoints públicos. |
| Datos | PostgreSQL (Prisma ORM) + MySQL on-premise | PostgreSQL: modelo relacional completo del WMS. MySQL APP_STOCK: base histórica compartida con los sistemas legados — escritura dual en cada operación. |
| Infraestructura | Docker Compose · HTTPS (Let's Encrypt) · nginx | Contenedores de app y base de datos, puertos internos solo en localhost, certificados automáticos, respaldos diarios con retención. |
Flujo de una operación (ejemplo: picking de traslado)
- Escaneo → la SPA envía la operación al API con el token del usuario.
- Validación → el API verifica permisos (empresa + bodega + módulo), estado del bulto y saldo.
- Escritura dual → primero el on-premise (
APP_STOCK), luego PostgreSQL en transacción; si el on-premise no calza con lo esperado, la operación aborta sin efectos parciales. - Kardex → se registra el movimiento con usuario, origen, destino y documento (append-only).
- Convergencia → los ciclos de sincronización reconcilian cualquier desfase residual entre bases.
Ciclos automáticos del sistema
| Proceso | Frecuencia | Qué hace |
|---|---|---|
| Sincronización de stock | 30 segundos | Bidireccional con APP_STOCK: altas, bajas, cantidades y democión de disponibilidad. Preserva los estados internos en curso (EN_PICKING/EN_PACKING/EN_PREPARACION). |
| Precios y stock ERP | 5 minutos | Importa precio de lista y stock ERP por bodega desde las vistas homologadas por empresa (alimenta Maestro y Avance ERP). |
| Auto-recepción de traslados | al confirmar entrega + barrido cada 30 min | Traslados a bodegas "solo destino" > 24 h en tránsito pasan a POR_VERIFICAR. |
| Chequeo de integridad | al arranque + cada 6 horas | Busca huérfanos, transitorios colgados, tránsitos vencidos y negativos anómalos; publica el reporte en Configuración. |
| Respaldo | diario 03:00 | Dump completo de PostgreSQL + código, retención de 7 días. |
Modelo de datos principal
| Entidad | Rol en el modelo |
|---|---|
Company | Tenant: razón social, plan, perfil de impresión/etiquetas, configuración de integraciones. |
Warehouse → Zone → Location | Bodega física en 3 niveles; ubicaciones con código escaneable, clase ABC y bloqueo. Flags por bodega: inventario negativo, "Opera BodegApp". |
Product | Maestro por empresa: unidad, seriales, fraccionable, captura de datos, foto, precio y stock ERP sincronizados, papelera (soft-delete). |
InventoryBatch (B-) | La etiqueta: lote con genealogía (padre/hijos de fraccionamiento) y serial opcional. |
StockItem | El saldo: cantidad + estado + ubicación de cada etiqueta. |
StockMovement | El Kardex: movimiento inmutable con tipo, cantidad, origen/destino, usuario y documento. Sobrevive a la eliminación de su etiqueta. |
Manifest + Items | El documento de trabajo con su flujo de estados configurable y el vínculo etiqueta↔pallet. |
TransportDocument + Stops | La ruta: chofer, vehículo, paradas con ventana/prioridad/ETA, evidencias de entrega y token público de tracking. |
ApiKey · AppSetting · Audits | Integraciones con hash y scopes; configuración por empresa; auditorías de productos y eliminaciones. |
Decisiones de diseño (el porqué)
- On-premise primero, con verificación: en operaciones sensibles (correcciones, reversas, recepciones) se escribe primero la base compartida y se verifica el resultado esperado; si no calza, nada se modifica. Elimina de raíz las divergencias silenciosas.
- Kardex append-only: deshacer = movimiento inverso. El historial de cualquier SKU siempre suma cero contra la realidad — auditable por construcción.
- Idempotencia: las operaciones del chofer offline y las reversas usan guardas de estado — reintentar una operación jamás la duplica.
- Diseño B de traslados: la mercadería pertenece a su bodega de origen hasta la recepción física en destino; el destino viaja en el manifiesto, no en el stock.
- Taxonomía canónica de KPIs: una sola clasificación de movimientos para todos los indicadores, que excluye ruido (estados, correcciones, cargas del sistema, datos de prueba).
- Estados desconocidos = no disponibles: cualquier estado fuera de STOCK/EN_PALLET queda automáticamente fuera del stock vendible — el sistema falla hacia el lado seguro.
Mapa funcional (módulo → capa de datos)
Recepción e Inventario Inicial crean etiquetas · Putaway y Fraccionamiento las reorganizan · Picking/Packing/Despacho las comprometen a un manifiesto · Traslados y Ruteo las mueven entre bodegas y hacia clientes · Recepción de Traslado y las Reversas las devuelven a disponibilidad · Kardex, Consulta de Stock y KPIs las observan sin tocarlas · Corrección e Integridad las gobiernan.
Referencia de Estados
Estados del stock (bultos B-)
Criterio único de "stock vigente": todos los estados de esta tabla salvo CERRADO, DESPACHADO y ANULADO se consideran stock vigente y se muestran —con su estado a la vista— en Consulta de Stock, Direccionamiento 3D, ocupación por bodega y Avance ERP. Los tres excluidos ya no son inventario: se consultan en el Kardex y en los manifiestos.
| Estado | Significado | ¿Disponible? |
|---|---|---|
| STOCK | Disponible en su ubicación. | Sí |
| EN_PALLET | Disponible, agrupado en un pallet. | Sí |
| EN_PREPARACION | Pickeado hacia un pallet de salida; aún en bodega de origen. | No |
| EN_PICKING / EN_PACKING | En proceso dentro de la estación. | No |
| EN_TRANSITO | Viajando entre bodegas (destino en el manifiesto). | No |
| POR_VERIFICAR | Auto-recepcionado en sucursal; pendiente de conteo físico. | No |
| DESPACHADO / ENTREGADO | Salió hacia el cliente / entregado con evidencia. | No |
| CERRADO / ANULADO | Ciclo terminado / anulado por reversa (evidencia histórica). | No |
Estados del manifiesto (MN-)
Intermedios (la tubería): LISTO_PARA_PICKING → EN_PICKING → LISTO_PARA_PACKING → PACKING → DESPACHO → EN_TRANSITO / LISTO_PARA_RETIRO — configurable por empresa y tipo de movimiento. Retroceder es siempre vía reversa supervisada (↩️), un paso a la vez.
Finales (cierran el ciclo y son la base de medición):
| Estado final | Cierra el flujo de |
|---|---|
| ENTREGADO | Despacho y Retiro en Tienda (con prueba de entrega). |
| RECIBIDO | Traslado entre Bodegas (recepción verificada en destino). |
| CERRADO | Recepción Inbound y movimientos "Otro". |
| ANULADO | Cancelación (ej. manifiesto vacío cancelado en picking o packing). Se excluye de los KPIs de servicio. |
Importante: DESPACHADO es un estado del stock (así quedan los bultos que salieron), nunca de un manifiesto — el intermedio del manifiesto es DESPACHO. Cancelar un manifiesto sin bultos ni SKUs lo deja ANULADO como evidencia (el folio no se reutiliza).
Un documento final es evidencia: no se modifica
Alcanzado un estado final (ENTREGADO, RECIBIDO, CERRADO, ANULADO) el manifiesto queda inmutable por todas las vías: no admite avanzar ni retroceder de estado, no se le agregan ni quitan ítems, no recibe datos de transporte, no se re-despacha, no se re-entrega y no se elimina — ni aunque haya quedado sin ítems. Corregir algo de un documento cerrado se hace emitiendo un documento nuevo, nunca reescribiendo el anterior.
La única excepción es un rompe-vidrio de SUPERADMIN para corregir datos en una emergencia, y no es silencioso: queda registrado en el log del servidor y en el historial del propio manifiesto. La eliminación no admite excepción alguna.