Manual do usuário
Central de ajuda/Manual do usuário/Estoque: consulta, ajustes, contagens e transferências

Estoque: consulta, ajustes, contagens e transferências

Última atualização 2026-10-13

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.

  1. Obrigatório: warehouse_id, location_id, item_id, reason_code (texto livre como damage/lost/found; sem mestre de códigos).
  2. 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.
  3. 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.
  4. É escrita uma linha com transaction_type=adjust, qty_change=delta (positivo = aumento, negativo = redução) e reason_code obrigatório.

Contagens cíclicas#

  1. 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).
  2. 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.
  3. Aprove no desktop: approve passa as linhas para approved ou as devolve para pending (limpando contado e divergência) para recontar.
  4. 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.
  5. 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.

  1. Criar → draft; submit → submitted.
  2. approve: approved valida o disponível de cada linha na origem (falta → WMS_STOCK_001); rejected encerra o fluxo.
  3. ship → in_transit: revalida o disponível → lança duas pernas (origem available −qtd / mesmo endereço in_transit +qtd).
  4. 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.

Bloqueio por contagem: endereços cobertos por uma contagem inacabada ficam bloqueados; ajustes, movimentações e drops são rejeitados com LOCATION_LOCKED. O bloqueio é liberado ao concluir ou cancelar.