Inventario: consulta, ajustes, conteos y transferencias
Consulte stock en escritorio y móvil, registre ajustes directos, ejecute conteos cíclicos (incl. automáticos ABC) y transfiera entre almacenes.
El inventario usa un libro mayor solo de inserción (wms_inventory_ledger) como única fuente de verdad: cada movimiento escribe una línea con qty_change positivo/negativo; los saldos nunca se editan directamente. La proyección de saldos la mantiene el sistema y el libro prohíbe UPDATE/DELETE a nivel de base de datos.
Consultar inventario#
- Escritorio WMS → Inventory: vista de detalle (filtros por SKU, ubicación, estado, lote, serie, canal…) y vista de resumen (cantidades por artículo + estado + tipo).
- Página de inventario móvil: buscar por SKU o nombre; las tarjetas muestran SKU/nombre/ubicación/cantidad (solo lectura).
- El inventario por lote se ordena por caducidad ascendente (FEFO). Las alertas de caducidad (expiry-alerts?days=90) listan stock available con caducidad dentro de hoy+días, con days_to_expiry.
Ajustes de inventario (modo directo)#
Los ajustes se registran directamente en el libro: no hay máquina de estados de «documento de ajuste» ni flujo de aprobación. La entrada actual es la API (POST /api/wms/inventory/adjust); aún no hay página de escritorio y se requiere el permiso wms.inventory_adjust.
- Obligatorio: warehouse_id, location_id, item_id, reason_code (texto libre como damage/lost/found; sin maestro de códigos).
- Cantidad, elija una: qty_after (ajustar a un valor objetivo) o qty_delta (incremento/decremento no nulo). Ambas o ninguna falla la validación; qty_after con delta cero devuelve {adjusted:false} sin escribir.
- El estado solo puede ser available / hold / damaged (por defecto available). Los ajustes negativos validan primero el disponible (WMS_STOCK_001 si falta); ubicaciones bloqueadas por conteo → LOCATION_LOCKED.
- Se escribe una línea con transaction_type=adjust, qty_change=delta (positivo = aumento, negativo = disminución) y reason_code obligatorio.
Conteos cíclicos#
- Cree la tarea (escritorio/API): scope cycle (conteo cíclico), full (auto-genera hasta 5000 líneas) o spot (muestreo); count_type blind u open (por defecto open). Se registra una instantánea system_qty; solaparse con un conteo sin terminar rechaza la creación (aquí actúa el bloqueo).
- Ejecute en el móvil: ingrese la cantidad contada por línea → enter-count envía una línea a la vez (las líneas contadas muestran sistema/contado/diferencia; reingresar marca recounted). La tarea pasa a in_progress.
- Apruebe en escritorio: approve pasa las líneas a approved o las devuelve a pending (limpiando contado y diferencia) para recontar.
- Contabilice: post solo procesa líneas approved (las de varianza cero se omiten). Sobrantes → adjust con reason_code=found, faltantes → lost (reference_type=count_task). Al terminar, la tarea se completa y los bloqueos se liberan.
- Conteos automáticos ABC: POST /api/wms/count-tasks/abc genera tareas cycle cuando vence el intervalo de la clase ABC. Por defecto A=7 días, B=30, C=90; configurable por almacén o por llamada. Lo dispara un cron o manualmente.
Transferencias entre almacenes#
Las transferencias son documentales (borrador → enviar → aprobar → expedir → recibir) y actualmente solo por API; aún no hay página de escritorio. Número: TRF-YYYYMMDD-XXXX. Se permite mover entre dos ubicaciones del mismo almacén.
- Crear → draft; submit → submitted.
- approve: approved valida el disponible de cada línea en origen (faltante → WMS_STOCK_001); rejected termina el flujo.
- ship → in_transit: revalida el disponible → escribe doble pierna (origen available −cant. / misma ubicación in_transit +cant.).
- receive → completed: origen in_transit −cant. / destino available +cant.; líneas a done. Cancelar solo desde draft/submitted/approved; in_transit solo se completa recibiendo.
Estados del inventario#
available → allocated al reservarse para picking/salida → shipped al expedir. Las retenciones van a hold, las roturas a damaged; tras expedir una transferencia, el origen queda in_transit. Los ajustes solo admiten available/hold/damaged.