Picking: olas, tareas y PICK-STAGE
Libere olas (manual o programada), genere tareas por pedido y ejecute paso a paso en el móvil, con picks parciales, omisiones y shorts.
Liberación de olas#
Una ola agrupa envíos de salida por merchant × filtro, los divide por cantidad de pedidos y los libera como ola; cada envío recibe luego su tarea de picking. Dos entradas: liberación manual (wave/manual) y programada (scheduler + cron externo). Solo envíos con estado commit/draft/ready; los bloqueados por una ola sin terminar quedan excluidos.
- Wave Filter: conditions [{field, operator, values[]}], operadores in/not_in/eq/ne/gt/lt/gte/lte (wave/filter).
- Dispatch Setting: customer_filters [{merchant_id, filter_id}], max/min por plan, default_pick_method (order/batch/wave/wave_by_item, por defecto order), is_active (wave/settings).
- Scheduler: work_days (1=lunes…7=domingo, por defecto 1–5), time_from/time_to, step_minutes, is_active (wave/scheduler).
- Horas de corte: por merchant/carrier, HH:MM (wave/cutoff-time).
- Elija Cliente (merchant, obligatorio) + 1 o más Dispatch Settings → Vista previa: devuelve el conteo por setting y el detalle por grupo sin crear la ola.
- Opcionalmente ajuste min/max_qty_per_batch (se valida Min ≤ Max).
- Liberar: crea la ola — wave_no = WV-YYYYMMDD-NNNN, status=released (la ola nace liberada; no hay estado draft intermedio), shipment_ids guarda los envíos.
- Tras liberar, la página lista los envíos de la ola: Create Pick Task por envío (ver abajo).
- Liberación programada: un cron externo hace POST a /api/wms/wave/scheduler/run cada N minutos (con x-cron-secret). Solo ejecuta schedulers cuyo día esté en work_days, la hora actual en time_from~time_to y la última ejecución ≥ step_minutes atrás.
Generar tareas de picking#
- Tres entradas: la página de la ola liberada, selección masiva en la lista de pedidos → Create Pick Task, o Create Pick Task en el detalle del pedido.
- pick_method=order: una tarea por pedido. Líneas = líneas del pedido × ubicaciones asignadas por el sistema (zona pick primero; faltantes crean líneas con la cantidad asignable y el resto en warnings).
- Planificación de ruta: cada línea recibe un seq por orden de recorrido; el móvil guía ubicación por ubicación.
- Protección contra duplicados: un pedido con una tarea sin terminar que aún tenga líneas pending no puede regenerar; lo restante como short puede regenerarse después.
- Tras generar, se escribe el campo de tarea en el pedido con enlace al detalle.
Ejecución en el móvil#
Un paso = un producto × una ubicación. Cada paso envía cuatro campos: ubicación origen, LPN del palé (solo ubicaciones storage), LPN destino (el tote objetivo), cantidad.
- Escanee/escriba la ubicación origen → Enter: inválida → error superior + entrada seleccionada; válida → una ubicación picking salta al to-LPN, una storage muestra primero el LPN del palé.
- Escanee/escriba el to LPN → validado (debe ser un tote asignado a la tarea) → pasar a cantidad.
- Ingrese cantidad (solo dígitos) → toque Pick para enviar → siguiente paso; si falla, se queda en el paso con el error.
- Pick parcial: pidió 10, recogió 5 → registra 5 y añade automáticamente un paso de 5 al final de la cola.
- Next: omite el paso actual; la cola volverá a él después.
- Force close (arriba a la derecha): cierra un pick parcial directamente; el sistema liquida con lo realmente recogido.
- Short: la ubicación no tiene stock o la mercancía está dañada → marcar short; la tarea puede completarse y el resto regenerarse después.
Totes objetivo y PICK-STAGE#
Los totes objetivo del picking pertenecen a la ubicación PICK-STAGE (una por almacén, location_type=staging; el sistema la crea si falta y está oculta en la UI). Genérelos en WMS → Pallets con «Batch generate LPN»: elija almacén (por defecto el actual) + cantidad N (1–200, por defecto 10). El backend genera LPN-{seq} (prefijo unificado; los PLT- existentes no cambian) con status=building y source_type=pick. Luego elija «Generate only» o «Generate and print». Nota: el picking cart (location_type=cart) es una ubicación móvil; un tote es un LPN (license_plate único por tenant) y el picking de totes contabiliza en el location_id del carro al que pertenece el tote. PICK-STAGE (staging) es el búfer por almacén; los palés objetivo deben pertenecer a él.
Estados de la tarea y revisión#
pending → in_progress (toque Iniciar, o automático en el primer pick; el envío pasa a picking) → completed (todas las líneas picked o short; el envío pasa a picked). Al completar se escribe picked_qty en las líneas y se dispara una verificación de reposición. Revisión: el detalle de la tarea en escritorio muestra todo lo enviado por el móvil (ubicación origen / LPN del palé / to LPN / cantidad / cada registro): aquí se verifica el picking; la verificación de empaque continúa en la estación de envío (pack-verify).