Estoque: consulta, ajustes, contagens e transferências
Consulte o estoque no desktop e no celular, lance ajustes diretos, execute contagens cíclicas (incl. automáticas ABC) e transfira entre armazéns.
O estoque usa um razão somente-inserção (wms_inventory_ledger) como única fonte da verdade: cada movimentação escreve uma linha com qty_change positivo/negativo; os saldos nunca são editados diretamente. A projeção de saldos é mantida pelo sistema e o razão proíbe UPDATE/DELETE no banco.
Consultar estoque#
- Desktop WMS → Inventory: visão detalhada (filtros por SKU, endereço, status, lote, série, canal…) e visão resumida (quantidades por item + status + tipo).
- Página de estoque no celular: buscar por SKU ou nome; os cartões mostram SKU/nome/endereço/quantidade (somente leitura).
- O estoque por lote é ordenado por validade crescente (FEFO). Os alertas de validade (expiry-alerts?days=90) listam estoque available com validade dentro de hoje+dias, retornando days_to_expiry.
Ajustes de estoque (modo direto)#
Os ajustes são lançados diretamente no razão: não há máquina de estados de “documento de ajuste” nem fluxo de aprovação. A entrada atual é a API (POST /api/wms/inventory/adjust); ainda não há página de desktop e é exigida a permissão wms.inventory_adjust.
- Obrigatório: warehouse_id, location_id, item_id, reason_code (texto livre como damage/lost/found; sem mestre de códigos).
- Quantidade, escolha uma: qty_after (ajustar para um valor-alvo) ou qty_delta (aumento/redução não nulo). Ambas ou nenhuma falha na validação; qty_after com delta zero retorna {adjusted:false} sem lançar.
- O status só pode ser available / hold / damaged (padrão available). Ajustes negativos validam primeiro o disponível (WMS_STOCK_001 se faltar); endereços bloqueados por contagem → LOCATION_LOCKED.
- É escrita uma linha com transaction_type=adjust, qty_change=delta (positivo = aumento, negativo = redução) e reason_code obrigatório.
Contagens cíclicas#
- Crie a tarefa (desktop/API): scope cycle (contagem cíclica), full (gera automaticamente até 5000 linhas) ou spot (amostragem); count_type blind ou open (padrão open). Registra um snapshot system_qty; sobrepor endereços de uma contagem inacabada rejeita a criação (aqui o bloqueio atua).
- Execute no celular: informe a quantidade contada por linha → enter-count envia uma linha por vez (linhas contadas mostram sistema/contado/divergência; reinserir marca recounted). A tarefa vai para in_progress.
- Aprove no desktop: approve passa as linhas para approved ou as devolve para pending (limpando contado e divergência) para recontar.
- Lance: post só processa linhas approved (variância zero é ignorada). Sobras → adjust com reason_code=found, faltas → lost (reference_type=count_task). Ao concluir, a tarefa termina e os bloqueios são liberados.
- Contagens automáticas ABC: POST /api/wms/count-tasks/abc gera tarefas cycle quando o intervalo da classe ABC vence. Padrão A=7 dias, B=30, C=90; configurável por armazém ou por chamada. Disparado por cron ou manualmente.
Transferências entre armazéns#
As transferências são documentais (rascunho → enviar → aprovar → expedir → receber) e atualmente só por API; ainda não há página de desktop. Número: TRF-YYYYMMDD-XXXX. É permitido mover entre dois endereços do mesmo armazém.
- Criar → draft; submit → submitted.
- approve: approved valida o disponível de cada linha na origem (falta → WMS_STOCK_001); rejected encerra o fluxo.
- ship → in_transit: revalida o disponível → lança duas pernas (origem available −qtd / mesmo endereço in_transit +qtd).
- receive → completed: origem in_transit −qtd / destino available +qtd; linhas para done. Cancelar só de draft/submitted/approved; in_transit só termina recebendo.
Status do estoque#
available → allocated ao reservar para picking/saída → shipped ao expedir. Retenções vão para hold, avarias para damaged; após expedir uma transferência, a origem fica in_transit. Ajustes só aceitam available/hold/damaged.