Almoxarifado · WMS — Conferência por Código Data Matrix

Entre com sua conta Master Diagnóstica para acessar.

Acesso restrito aos colaboradores da Master Diagnóstica.

Início

Resumo executivo

Indicadores de decisão do mês corrente — fluxo de saída, prazo, qualidade do atendimento e saúde do estoque. Análise detalhada em Indicadores.

Unidades que saíram · dia (14 dias)

Unidades que entraram · dia (14 dias)

Painel operacional

—

Indicadores de separação

—

Mapa de calor — endereços mais visitados na separação

Cor mais quente = mais bipagens de separação no período. Use para reendereçar os itens de maior giro para perto da doca de expedição e reduzir deslocamento.

frioquente
EndereçoBipagensUnidades separadasPedidosItem mais separado ali

Produtos mais separados

Ranking por unidades separadas no período — candidatos a endereços de maior acessibilidade.

#CódigoDescriçãoUnidades separadasPedidosEndereço mais usado

Notas aguardando chegada

Toda nota fiscal criada na aba Recebimento começa aqui. Clique em Receber para registrar quem recebeu, o horário de chegada e a volumetria — a nota só passa a aparecer em Recebimento (pronta para conferência) depois disso.

0Aguardando chegada
NFFornecedorEmissãoItensUn.

Notas fiscais de entrada

0NFs a conferir
0Conferidas
0Itens a receber
0Unidades a receber
0Com divergência
0Un. sem etiqueta (fábrica)

Nova nota

Itens da nota

nenhum item

Importar notas

Notas no Supabase

Usa a conexão configurada na aba NF de Saída (URL e chave anon).

Não configurado.

NFFornecedorEmissãoItensUn.Status

Liberação de validade — recebimento de compra

Itens recebidos com validade abaixo do padrão da saída ficam PENDENTES DE LIBERAÇÃO e NÃO entram em estoque disponível. Não há recusa automática — só o perfil de Compras libera ou recusa, caso a caso, com justificativa.

DocumentoCódigoDescriçãoLoteValidade% vida útilQtdRecebido porStatus

Imprimir etiquetas da nota

Use o × no canto de cada etiqueta (na folha da tela) para excluir apenas ela antes de imprimir. A escolha do rolo vale para todas as telas do app.

Armazenar produto

Três passos: 1) bipe o código do produto · 2) informe a quantidade · 3) bipe o código da localização e conclua. A câmera aceita os dois códigos — o app identifica sozinho se é produto ou endereço.

Entrada manual / leitor pistola

1 · Produto — bipe o código do produto
2 · Quantidade
unidades a guardar
3 · Localização — bipe o código do endereço

A armazenar

Alimentado pelas conferências de recebimento finalizadas. Clique em usar para preencher os três passos de uma vez.

0Itens pendentes
0Unidades pendentes
0Guardados hoje
0Unidades hoje
0Endereços de origem
CódigoDescriçãoLoteVal.OrigemDocumentoPendente

Armazenagens de hoje

HoraCódigoLoteQtdDePara

Ressuprimento da face de picking

Produtos cuja face de picking ficou abaixo do mínimo. Repor mantém o separador pegando sempre na mesma posição, baixa e perto — sem subir nível nem procurar o lote. A origem sugerida é sempre o lote que vence antes (FEFO), então repor não quebra a regra de saída.

CódigoDescriçãoCurvaFaceNa faceMín/MáxReporPuxar deLote (FEFO)

A reposição é executada na aba Transferência — o botão repor já leva origem, produto, lote, quantidade e destino preenchidos, passando por todas as validações normais (temperatura, saldo reservado, saldo negativo).

O saldo do estoque ainda não sincroniza entre aparelhos: uma transferência feita neste coletor pode não aparecer no saldo de outro na hora. Confira o estoque no aparelho onde vai separar.

Transferir produto de endereço

Quatro passos: 1) bipe o endereço de origem · 2) bipe o produto/lote · 3) informe a quantidade · 4) bipe o endereço de destino e conclua. A câmera aceita todos os códigos — o app identifica sozinho se é endereço, produto ou caixa fechada.

Entrada manual / leitor pistola

1 · Origem — endereço de onde o produto sai
4 · Destino — endereço para onde o produto vai
2 · Produto / lote — bipe o produto/lote
3 · Quantidade
quantidade disponível na origem

Transferências recentes

0Transferências hoje
0Unidades movidas hoje
0Endereços esvaziados hoje
0Forçadas (no filtro)
Data/horaCódigoLoteQtdDe → ParaMotivoUsuário

Devoluções

Retorno de produto do cliente — avaria de transporte, recusa, recall/não conformidade, vencimento ou erro de expedição. Cada item recebido é triado na hora: volta ao estoque vendável, entra em quarentena ou é descartado.

Nova devolução

NúmeroPedidoClienteMotivoDataItensStatus

Decisão de qualidade — devoluções bloqueadas

Cada item devolvido entra bloqueado. Só o perfil de Qualidade decide: liberar (volta ao estoque disponível, com endereço), manter em quarentena para análise, ou descartar. A decisão exige motivo tipificado + campo livre e fica registrada com o responsável.

DevoluçãoCódigoDescriçãoLoteVal.QtdStatusDecisão

Área bloqueada e descarte

Lotes bloqueados por vencimento automático, quarentena de devolução ou bloqueio manual. Item bloqueado nunca aparece na sugestão de separação. Gere a lista de recolhimento para a empresa terceirizada e registre a baixa.

CódigoDescriçãoLoteValidadeQtdEndereçoMotivo do bloqueioDesde

Descartes registrados

Baixas de descarte já registradas — pela área bloqueada ou por decisão de qualidade sobre devoluções.

DataCódigoLoteQtdMotivoResponsávelLista

Fila de NF de Saída

0A separar
0A conferir
0Concluídos
0Unidades na fila
0Atrasados
0Aguardando aprovação
0Conflitos de reserva

Nova NF de Saída

Itens da NF

nenhum item

Importar do ERP

validade_min (opcional): validade mínima aceita pelo cliente — 90d = 90 dias até vencer, 40% = 40% da vida útil. encomenda_lote (opcional): lote de compra dedicada — o item só é separado nesse lote. uf_destino (opcional): sigla do estado de entrega — usado para sugerir a embalagem térmica.

A coluna local é opcional: em branco, o app busca o endereço no inventário pela regra FEFO.

Sincronizar com Supabase

Opcional. Com isso a fila de NF de Saída passa a ser compartilhada entre todos os aparelhos do almoxarifado. Sem configurar, o app funciona 100% local.

Não configurado.

NFClienteOperaçãoItensUn.EndereçosPrazoStatus

Auditoria de faturamento

Fila dos pedidos de venda LIBERADOS ainda não faturados, com as travas já calculadas pelo ERP (auditoria fiscal, política comercial, crédito, frete, pagamento, saldo, prazo). Em cima disso o WMS checa a validade dos lotes disponíveis (regra da Master: % de vida útil; Órgão Público exige mais de 12 meses) e o risco de devolução comparando com o histórico de venda faturada do cliente.

Alertas de risco não travam — sinalizam para você decidir. Marque cada pedido como OK para faturar, Pendência (com o motivo) ou Faturamento futuro (com a data). A decisão fica registrada e substitui a planilha "Análise de Faturamento".

Fila de separação

NF de Saída aguardando separação. O roteiro é montado na ordem do percurso do armazém (rua → módulo → nível), com o endereço de cada produto vindo do inventário e o lote escolhido por FEFO — vence antes, sai antes.

NFClienteItensUn.PrazoEndereços

Dados do produto

Biblioteca de código Data Matrix não carregada. Conecte-se à internet e recarregue a página para gerar os códigos. A leitura pela câmera continua funcionando.

Caixa fechada / master (vários lotes)

Um único código para a caixa inteira. Ao bipar, o app dá baixa em todas as unidades e lotes de uma vez.

Conteúdo da caixa

CódigoDescriçãoLoteValidadeQtd

Pré-visualização

Preencha código e lote e clique em Gerar Código.

Fila de etiquetas

Padrão Zebra TLP 2844. Escala 100% e margens zero na janela de impressão — veja a aba Ajuda.

Layouts de etiqueta

Cada modelo é um tamanho + uma lista de elementos posicionados em mm. Os modelos padrão reproduzem as etiquetas de sempre — edite à vontade, o botão Restaurar padrão volta ao original.

Qual modelo cada tela usa

Montar onda de separação

Separe várias NFs numa caminhada só. Cada NF ocupa uma posição fixa do carrinho — ao bipar o produto, o app diz quantas unidades vão em cada posição. O roteiro é consolidado: um mesmo produto pedido por três notas vira uma parada só.

Ou marque as notas na mão — as duas formas funcionam juntas, e a ordem da marcação define a posição no carrinho.

Sel.PosiçãoNFClienteItensUn.PrazoTransportadora
nenhuma NF marcada

Dados da conferência

Leitura

0Itens esperados
0Conferidos OK
0Faltantes
0Divergências
0Leituras

Fica gravada em cada leitura seguinte até você mudar o valor — atualize ao trocar de caixa/isopor.

HoraCódigoLoteQtdValidadeTemp. °CLocalStatusObservação

Lista esperada

É o gabarito do que a conferência espera encontrar — cada linha tem código, lote, validade e quantidade. Em geral já vem preenchida: ao puxar uma NF de Saída para conferir, ou ao concluir uma separação, os itens entram aqui sozinhos. Também dá para importar um CSV ou adicionar item a item numa janela (ícone do cabeçalho — só admin). O campo Lote em branco aceita qualquer lote.

Ao bipar, cada leitura é comparada com a lista: código que não está nela = NÃO PREVISTO; lote, validade ou quantidade diferentes = divergência. A conferência é cega — a quantidade esperada não aparece durante a bipagem, só ao finalizar. Com a lista vazia, toda leitura cai como NÃO PREVISTO. Limpar lista zera tudo.

CódigoDescriçãoLoteValidadeEsperadoLidoStatus

Ocorrências de conferência

Na conferência de expedição, toda divergência precisa de uma ocorrência registrada antes de concluir. A ocorrência não sobrescreve a separação original — o histórico mostra o que foi separado errado.

ProdutoLoteEsperadoEncontradoTipoSeparadorRegistrada

Registrar ocorrência

—

Encerrar

Use os ícones no topo da tela para finalizar, exportar, imprimir, voltar para separação ou iniciar uma nova conferência.

Tudo é salvo automaticamente neste navegador/dispositivo. Nada é enviado para a internet.

Dados da conferência

Leitura

0Itens esperados
0Conferidos OK
0Faltantes
0Divergências
0Leituras

Fica gravada em cada leitura seguinte até você mudar o valor — atualize ao trocar de caixa/isopor.

HoraCódigoLoteQtdValidadeTemp. °CLocalStatusObservação

Lista esperada

É o gabarito do que a conferência espera encontrar — cada linha tem código, lote, validade e quantidade. Em geral já vem preenchida: ao abrir a NF de entrada e clicar em Conferir esta nota, os itens da nota entram aqui sozinhos. Também dá para importar um CSV ou adicionar item a item numa janela (ícone do cabeçalho — só admin). O campo Lote em branco aceita qualquer lote.

Ao bipar, cada leitura é comparada com a lista: código que não está nela = NÃO PREVISTO; lote, validade ou quantidade diferentes = divergência. A conferência é cega — a quantidade esperada não aparece durante a bipagem, só ao finalizar. Com a lista vazia, toda leitura cai como NÃO PREVISTO. Limpar lista zera tudo.

CódigoDescriçãoLoteValidadeEsperadoLidoStatus

Encerrar

Use os ícones no topo da tela para finalizar, exportar, imprimir ou iniciar uma nova conferência.

Tudo é salvo automaticamente neste navegador/dispositivo. Nada é enviado para a internet.

Prontos para embalar

Conferências de expedição já finalizadas, aguardando embalagem e cubagem para envio.

DocumentoClienteDataResultado

Nova embalagem avulsa

Embalagens

DocumentoClienteVolumesCubagem (m³)Peso consideradoStatus

Prontos para despacho

NF de Saída já embalada, aguardando transporte — informe a transportadora para despachar.

NFClienteEmbalagemAguardando desde

Despachar

Despachos

NFClienteTransportadoraRastreioDataDespachado porRomaneio

Enviar Romaneio —

Registra o manifesto de carga deste despacho na Active OnSupply.

Nota fiscal

Cargas a fechar

Despachos com volumes gerados na Embalagem, aguardando a conferência física na entrega à transportadora. Bipe volume a volume contra o romaneio — a carga só fecha com todos os volumes bipados.

Cortes de expedição: Correios até 15:00 · demais até 16:00. Cargas em risco de perder o corte aparecem destacadas (não bloqueiam o fechamento).
Ajustar horários de corte
Correios — dias sem carga refrigerada/congelada

NF de Saída com item refrigerado ou congelado não são despachadas pelos Correios nos dias marcados. A exceção exige perfil autorizado (Comercial ou Administrador) e justificativa.

RomaneioNFClienteTransportadoraVolumesCorte

Cargas fechadas

RomaneioNFClienteTransportadoraVolumesFechada porHorário

Etiquetas de volume

Reservar peça para OS

Para o colaborador do SAM retirar peça/produto para manutenção ou validação de equipamento: bipe o código do produto e o endereço, informe a quantidade e reserve para a Ordem de Serviço. A reserva sai do disponível na hora. O número da OS é informado depois, na lista abaixo; a baixa por nota fiscal fica na aba OS Pendentes de fechamento.

Entrada manual / leitor pistola

—

Reservas de OS

CódigoLoteEndereçoQtdFinalidadeSolicitanteSituação

OS Pendentes de fechamento

Reservas do SAM que ainda não foram fechadas. Cada OS é baixada por nota fiscal: informe o número da NF para dar baixa no estoque (movimento de saída). Enquanto a NF não é informada, a OS fica pendente e o saldo continua reservado.

OSItemEndereçoQtdFinalidadeSolicitanteSituação

Cadastro de produtos

Base única de produtos do almoxarifado. Alimenta o autocomplete de todas as telas e permite bipar o código de barras EAN do fabricante — o app converte para o código oficial na conferência, separação e armazenagem. Os indicadores abaixo mostram quantos itens estão com cadastro incompleto (sem periculosidade, sem peso, sem embalagem etc.) — clique num indicador para filtrar só esses itens; clique de novo para limpar.

0Produtos
0Ativos
0Inativos / bloqueados
0Sem class. de periculosidade
0Com periculosidade
0Sem EAN
0Sem peso
0Sem dimensões
0Sem cubagem
0Sem embalagem (caixa)
0Sem marca / fornecedor
0Sem tempo de vida

Novo produto

Temperatura de armazenagem

A condição de armazenamento (Ambiente / Refrigerado / Congelado) é sempre calculada a partir desta faixa — não é possível definir manualmente.

Hierarquia de embalagem

O saldo é sempre guardado na menor unidade. Fator = quantas do nível de baixo cabem em um deste. Só inteiro ≥ 1.

Face de picking

Endereço fixo de onde este produto é separado, com a faixa de reposição. Quando o disponível na face cai abaixo do mínimo, o produto entra na fila de Ressuprimento para ser reposto até o máximo, puxando do pulmão pelo lote que vence antes (FEFO). Deixe em branco se o produto não tem face fixa — aí a separação continua buscando o endereço por FEFO no estoque todo.

Formato da etiqueta do fabricante

Layout de leitura da etiqueta do fabricante deste produto (o formato muda de item para item). Deixe sem campos para usar o leitor genérico — só configure quando a etiqueta vier num layout de largura fixa que o app não separa sozinho. Códigos GS1 (Data Matrix de fábrica) ou com campos separados por espaço/vírgula já são lidos direto e dispensam formato.

Monte a leitura da esquerda pra direita: cada linha consome um número de caracteres da etiqueta (ou "resto", só na última linha).

Imagem do produto

Redimensionada para ~480 px e comprimida (JPEG). Guardada na VPS (Supabase) e em cache neste dispositivo.

Importar produtos

Produtos no Supabase

Usa a conexão configurada na aba NF de Saída (URL e chave anon).

Não configurado.

Ler etiqueta / código de barras

Bipe o código do produto — Data Matrix ou código de barras EAN — da embalagem de fábrica para localizar o item no cadastro. Se o código bater com algum produto, o formulário abre já preenchido para consulta ou correção; se não encontrar, abre em branco com o EAN preenchido para cadastro.

Entrada manual / leitor pistola

Gerar etiqueta —

Informe o lote e clique em "Gerar etiqueta".
StatusImgEAN / DUNCódigoDescriçãoEmbalagemArmazenam.UMMarcaCubagemPericulos.Vida

Pendências de cadastro

Produtos ativos sem embalagem, faixa de temperatura ou imagem. Sem embalagem, o sistema assume unidade.

CódigoDescriçãoFalta

Cadastrar localização

Endereço no formato Rua | Módulo | Nível. Cada local recebe um código próprio — bipe o local antes dos produtos para registrar onde a mercadoria foi guardada ou de onde foi retirada.

Código gerado: —

Geração em lote

Os três campos aceitam letra (A → D, ou até AA, AB…) e número (01 → 12). Se você usar letra na rua e número no módulo, tudo bem — cada campo é independente. As medidas, o tipo de área e o peso suportado preenchidos acima são aplicados a todos os endereços gerados.

Locais cadastrados

Percurso de separação: O roteiro percorre a 1ª rua do módulo menor para o maior e a 2ª ao contrário, sem voltar ao início do corredor. Em armazém de ruas passantes (entra por uma ponta, sai pela outra) reduz a caminhada em 16% a 28% — quanto maior o roteiro, maior o ganho. Em ruas sem saída é indiferente (entra e volta pela mesma ponta de qualquer jeito), então pode deixar ligada.
CódigoRuaMóduloNívelSetor / observaçãoTipo de áreaMedidas (C×L×A)CubagemPeso suportadoOcupação atual

Sincronizar locais entre dispositivos

Usa a conexão configurada na aba NF de Saída (URL e chave anon). Teste da fundação de sync genérico (tabela wms_estado).

Não configurado.

Caixas de separação (pick-to-cart)

Etiqueta Data Matrix para colar nas caixas plásticas usadas na separação em onda. Numeração sequencial CX001, CX002… — imprima uma vez, em material sintético (transferência térmica com ribbon resina). Na aba Onda de separação, com a conferência ligada, o operador clica na posição e bipa a caixa; a caixa fica vinculada àquela posição pelo resto da onda.

Etiqueta do local

Pré-visualização no tamanho real do papel.

Clique em código na lista para visualizar.

Cadastro de Embalagem

Tipos de caixa cadastrados uma vez — cada caixa salva já gera o Data Matrix dela, usado no modo "Ler código" do processo de Embalagem e também reconhecido em qualquer outro aparelho, mesmo sem essa caixa cadastrada localmente.

CódigoDescriçãoC×L×A (cm)Peso unit.Térmica

Etiqueta da embalagem

Pré-visualização no tamanho real do papel. Clique em código na lista acima para gerar de novo a etiqueta de uma caixa já cadastrada.

Salve uma caixa ou clique em código na lista para visualizar.

Cadastro de Transportadora

CNPJ, nome reduzido, nome e status — usados na aba Expedição para sugerir a transportadora do despacho.

Usado para calcular o peso cubado dos volumes (Comprimento×Largura×Altura em cm ÷ fator) enviado ao TMS Active OnSupply.

CNPJNome Red.NomeStatusFator cubagem

Sincronização entre dispositivos

Usa a mesma conexão Supabase já configurada no app (aba NF de Saída). Tabela fixa: transportadoras.

Não configurado.

Lançar produto no inventário

Todo item precisa de localização — é o que permite montar o roteiro de separação e endereçar o recebimento. Endereço novo pode ser cadastrado na hora.

Localização *

—

Inventário no Supabase

Usa a mesma conexão configurada na aba NF de Saída (URL e chave anon). Aqui você só informa a tabela do estoque.

Não configurado.

A coluna local é obrigatória: linhas sem endereço são recusadas e listadas no fim da importação.

Contagem de inventário

Varredura física por localização: bipe o endereço, depois cada produto. Para cada leitura o app abre um painel: A) veio com lote legível → só informe a quantidade (unidade ou caixa); B) só o EAN → escolha o lote (lista do snapshot do ERP) e gere a etiqueta interna na hora; C) código sem cadastro → busque o produto ou registre uma pendência. O endereço só fecha sem etiquetas nem pendências em aberto. Ao final, o app compara com o cadastro e você decide quais diferenças aplicar — o ajuste vira um movimento rastreável no extrato de Saldo.

Carga inicial (uma vez, na implantação): abra em Carga inicial antes de contar. Enquanto aberta, a contagem é conferida contra o snapshot do ERP (o saldo do WMS ainda não existe) e o encerramento lança o endereçamento de tudo o que foi contado para aprovação — o saldo nasce só quando o supervisor aprova (há "aprovar todo o endereçamento"). A varredura prévia mapeia em que endereços cada produto está, sem contar, e deixa o produto em migração (bloqueado no FEFO/separação) até todos os seus endereços serem conciliados. A recontagem de uma divergência tem de ser feita por outra pessoa, não quem contou o endereço.

Carga inicial

Com a carga inicial aberta, a contagem é conciliada contra o snapshot do ERP (o saldo do WMS ainda não existe — nasce quando o endereçamento é aprovado). Feche a carga inicial quando o estoque estiver todo endereçado e conferido.

Ajustes aprovados — exportar para o contábil

Etiquetas com Código Data Matrix

Formato Zebra TLP 2844 — térmica 50 × 30 mm, rolo de uma carreira, uma etiqueta por página.

Marque os itens na tabela acima (ou deixe todos desmarcados para usar os itens filtrados) e clique em Gerar e imprimir etiquetas.

Inventário rotativo — contagem do dia

Sorteia endereços automaticamente por peso composto (curva ABC, giro, valor, validade, histórico de divergência e tempo sem contar). O endereço herda a curva mais alta entre os produtos com saldo nele; cada curva tem seu prazo de cobertura (A conta mais vezes que C). Endereço que passa do prazo da sua curva entra obrigatoriamente, marcado como vencido. Endereço reagendado volta no próximo sorteio.

EndereçoDias sem contarMotivo do sorteioScoreStatus

Cobertura do ciclo

Painéis do inventário

Implantação — carga inicial

Acuracidade por curva ABC

CurvaEndereços contadosSem divergênciaAcuracidade endereçoLinhasAcuracidade item

Distribuição de divergências

MotivoNºUnidadesR$
TipoNºUnidadesR$

Produtividade de contagem

PessoaSessõesEndereçosItensUnidadesHorasEnd./horaAcuracidade

Exportação por sessão encerrada

Cada sessão encerrada só exporta quando todos os ajustes dela saíram da aprovação. Ao exportar ela ganha um lote de exportação e os ajustes aprovados são carimbados — não reexportam. O CSV traz os ajustes aprovados (inclusive o endereçamento da carga inicial).

EncerradaCiclo / tipoAjustesExportação

Inventários realizados

DataTipoResponsávelCegoLocaisAjustes aplicados
Sincronizar inventário entre dispositivos:

Posição de estoque

0Linhas / lotes
0Unidades
0Códigos distintos
0Vencem em 90 dias
0Vencidos
CódigoDescriçãoLoteValidadeSituaçãoQtdLocalTemp.

Itens em endereço incompatível

Divergência de temperatura entre o produto e a posição onde ele está — para achar o que já estava errado antes do bloqueio entrar em vigor.

CódigoDescriçãoLoteQtdEndereçoExigeEndereço éQuando

Saldo dos itens

O saldo parte do que foi lançado no inventário e é movimentado pelas conferências finalizadas: recebimento soma, expedição subtrai. A Contagem de inventário (varredura por local) gera ajuste próprio; a conferência avulsa tipo Inventário continua sem efeito no saldo.

0Itens (cód.+lote)
0Unidades em saldo
0Entradas no mês
0Saídas no mês
0Saldos negativos
0Ajustes de inventário no mês
Sel.CódigoDescriçãoLoteVal.EndereçosFísicoSaldo ERPReservadoDisponívelEntradasSaídasÚltimo mov.

Físico = o que está no endereço · Saldo ERP = o que o Oracle acha que tem daquele lote (comparativo, só leitura) · Reservado = preso por NF de saída em aberto, por reservas para OS do SAM e por reservas de contrato · Disponível = o que entra em um pedido novo.

Saldo do ERP por lote:

Reserva de contrato

Comodato ou licitação com programação: separa uma quantidade de um lote/endereço que não entra no disponível para a saída comum. A reserva sai do disponível até ser encerrada ou até vencer a data da reserva.

CódigoLoteEndereçoQtdTipoValidade da reservaSituação

Etiquetas dos itens marcados (Saldo)

Formato Zebra TLP 2844 — térmica 50 × 30 mm.

Marque os itens na tabela Saldo (caixa "Sel.") e clique em Gerar e imprimir etiquetas.

Extrato de movimentação

DataHoraTipoDocumentoCliente/FornecedorCódigoLoteVal.EndereçoQtd

Cada linha nasce de uma conferência finalizada. Somente leituras validadas movimentam saldo — divergências (lote errado, não previsto, vencido) ficam de fora.

Consulta por endereço

Bipe (ou digite) o código do endereço e veja o que está guardado ali agora — lote, validade, quantidade, quanto já está reservado e quanto sobra de disponível. A lista sai em ordem FEFO: o que vence antes aparece primeiro.

CódigoDescriçãoLoteValidadeQtdReservadoDisponívelSituação

Conferências finalizadas

DataOperaçãoDocumentoResponsávelOKFaltaDiverg.Resultado

Auditoria — quem fez o quê, e quando

Trilha automática de governança: cada operação relevante (Recebimento/Conferência, Armazenagem, Separação, Contagem de inventário, Pedidos, Produtos, Locais) grava sozinha o usuário logado, o início e o fim. Não é possível apagar — só consultar e exportar.

InícioFimDuraçãoUsuárioMóduloOperaçãoDocumento

Acompanhamento de NF de Saída

Linha do tempo de cada NF de saída: Separação → Conferência → Embalagem → Aguardando transporte → Despachado. "Aguardando transporte" acende assim que a embalagem conclui, e vira concluído (com o nome da transportadora) quando a NF é despachada na aba Expedição. Clique no ícone de uma etapa para abrir a tela daquele processo já naquela NF.

Acompanhamento de Recebimento

Linha do tempo de cada nota fiscal de entrada: Pré-Recebimento → Recebimento → Conferência → Armazenagem → Nota lançada. Clique no ícone de uma etapa para abrir a tela daquele processo já naquela nota.

Indicadores de produtividade e KPIs

Desempenho, qualidade e ciclo da operação — para decisão da gestão, não fila de trabalho (isso fica no Painel operacional da Início).

Atividade diária

Operações registradas por dia (todos os módulos) no período selecionado.

Produtividade por operador

Separação, conferência (saída e recebimento), armazenagem, embalagem e contagem de inventário concluídas no período, por responsável. Linhas/hora é a métrica padrão de picking — compare operadores por ela, não por unidades/hora (que varia com o tamanho do item). Na armazenagem, o tempo é o tempo ativo: intervalos acima de 30 min entre bipagens contam como pausa.

UsuárioMóduloOperaçõesLinhasUnidadesHorasLinhas/horaUn./hora

Reslotting — itens fora da posição da curva

Produtos com curva ABC cadastrada guardados numa posição que não combina com o giro deles: curva A longe do início do percurso ou em nível alto, curva C ocupando as posições boas. Mover estes itens encurta a rota de separação todo dia. Use a aba Transferência para remanejar.

CódigoDescriçãoCurvaEstá emQtdDeveria estar emDesencaixe

Taxa de erro de separação

taxa = linhas com ocorrência de conferência ÷ total de linhas separadas, no período. Para o time de qualidade cruzar com os chamados do ERP.

Evolução mensal (taxa geral)

Ranking por separador

SeparadorLinhas separadasLinhas com ocorrênciaTaxa de erro

Por tipo de ocorrência

TipoOcorrências

Itens que mais geram erro

CódigoDescriçãoOcorrências

Ciclo do pedido (tempo médio por etapa)

—

Despacho por transportadora

TransportadoraDespachos no período

Assistente

Leitura da operação em linguagem natural, gerada sob demanda a partir dos indicadores e eventos do próprio WMS. O assistente não altera nada no sistema — as ações sugeridas são só atalhos que você acata ou dispensa.

O que é enviado à IA não inclui CNPJ, e-mail, telefone, preço, margem nem crédito.

—

Ações sugeridas

Nenhum insight gerado ainda.

Perguntar

Fila de retorno ao ERP Analyse

O app gera pendências; o RPA (Power Automate) lê a tabela erp_pendencias no Supabase, executa no ERP e devolve o status. Sem Supabase, use o CSV numa pasta de rede.

Pendências

CriadaTipoChave de negócioStatusTent.MensagemProcessada

Perfis de acesso

Um perfil define quais abas um usuário pode abrir. Sem nenhum perfil cadastrado, todo mundo continua com acesso completo — a restrição só passa a valer depois que você cria perfis e vincula e-mails a eles abaixo.

Novo perfil

Marque as abas que o perfil pode abrir. Para cada aba marcada, escolha se o perfil pode alterar (uso normal) ou só consultar (vê a tela, os dados e os filtros, mas não grava). O Administrador sempre pode alterar.

Sem a permissão marcada, a ação é bloqueada para o perfil (só Administrador passa). Toda tentativa negada é registrada na Auditoria.

NomeDescriçãoAbas liberadas

Usuários e vínculo de perfil

Vincula o e-mail corporativo (o mesmo do login Microsoft) a um perfil. Quem não estiver nesta lista usa o perfil padrão definido abaixo.

Novo vínculo

E-mailNomePerfil

Perfil padrão para e-mails não cadastrados

Aplica-se a qualquer e-mail logado que não esteja na lista de vínculos acima. Deixe em "(nenhum)" para não restringir ninguém que não esteja explicitamente cadastrado. O modo de teste local (sem login) nunca é restringido, mesmo com perfis configurados.

Sincronização entre dispositivos

Usa a mesma conexão Supabase já configurada no app (aba NF de Saída). Tabelas fixas: wms_perfis e wms_usuarios.

Não configurado.

O SQL de políticas de segurança exige um JWT válido do Entra em toda leitura/escrita e restringe as tabelas sensíveis (wms_perfis, wms_usuarios, estoque, wms_estado). Rode-o no SQL Editor do Supabase depois de criar as tabelas.

Entrada de mercadoria

Parâmetros do recebimento de compra e da área bloqueada.

Dados da empresa

CNPJ, razão social e Inscrição Estadual da Master Diagnóstica — usados como embarcador/remetente ao enviar romaneios para a Active OnSupply.

Usada junto com o cadastro de Transportadora e a conexão Supabase (aba NF de Saída) para enviar romaneios de despacho à Active OnSupply — ver aba Expedição.

Auditoria de faturamento

Parâmetros da aba Auditoria de faturamento (grupo Faturamento). As views do ERP (erp_ped_faturamento, erp_venda_hist) são criadas pela TI a partir do SQL abaixo. Itens com validade abaixo da regra passam a exigir aprovação (perfil Comercial) antes de liberar o faturamento; essa aprovação também dispensa a aprovação de validade na separação.

Assistente de IA

O assistente gera um insight da operação só quando alguém clica — nada é chamado sozinho. O provedor, a chave e o modelo ficam só no servidor. O pacote enviado não leva CNPJ, e-mail, telefone, preço, margem nem crédito; nome de operador entra (para a leitura de produtividade). O histórico fica 60 dias.

Função: —

Backup de emergência do aparelho

Baixa um arquivo JSON com tudo que está salvo neste dispositivo (todas as chaves mdqr_*). Guarde antes de limpar o cache do navegador ou trocar de aparelho. O import substitui o estado local — use com cuidado.

Manual de Operação

Cada processo do armazém, passo a passo, com o fluxograma do caminho que a mercadoria percorre. A regra de ouro: só o que é bipado e validado mexe no estoque — alerta ignorado vira divergência ou problema com o cliente.

Leitura de código de barras

Fundamento de todos os processos.

O app lê o Data Matrix do fabricante (GTIN, lote, validade, série), a etiqueta interna do app, o código linear (EAN, Code 128, ITF-14) e códigos com campos separados por espaço/vírgula. Com o EAN cadastrado no produto, bipar o código do fabricante já resolve para o código oficial da Master e completa a descrição.

  • Leitor USB / pistola: "digita" o código no campo. Se não ler um tipo, habilite a simbologia na folha de configuração do manual do leitor.
  • Câmera Android/Chrome: lê tudo (recomendado no celular). iPhone: use o Safari. Navegador de computador sem leitor nativo lê só QR — use o leitor USB.
Ritmo de 1 segundo: entre a leitura de um produto e a do próximo o app exige 1 s (evita contagem dobrada). Leitura cedo demais mostra "Aguarde 1 segundo" e é ignorada — bipe de novo. Endereço e caixa fechada passam livres.
Guia do próximo item: quando a quantidade bate, o app fecha a câmera e mostra o próximo item (código, lote, validade, quantas faltam, endereço). Toque em Continuar lendo para reabrir a câmera apontada para o próximo.

1 · Pré-Recebimento

Quando: a NF já foi lançada e a carga chegou (ou vai chegar) na doca.

NF lançada→Registrar chegada + volumes→Vai para Conferência
  • Abra Pré-Recebimento e a nota. "Recebido por" e "Chegada" já vêm preenchidos — ajuste se preciso.
  • Informe a volumetria (volumes / paletes que chegaram) e salve.
  • A nota passa a aparecer na Conferência de Recebimento.
Nota que veio "já Conferida" do ERP sem ter passado pela conferência aqui: o app avisa e deixa reabrir para conferir de verdade.

2 · Conferência de Recebimento

Quando: conferir fisicamente o que chegou contra a NF — código, lote, validade, quantidade.

NF a conferir→Bipar item a item→Finalizar→Estoque + Armazenagem
  • Abra a nota → "Conferir esta nota" — os itens da NF viram a lista esperada.
  • Bipe cada item. Só leitura OK soma ao estoque; divergências ficam registradas mas não movimentam saldo.
  • Finalizar — a NF vira "Conferida", o saldo recebe a entrada, sobe para o servidor e o item segue para a Armazenagem.
Validade abaixo do padrão? O item vai para "Liberação de validade" e não entra no estoque disponível até a decisão de Compras (processo 3).

Resultado de cada leitura: OK LOTE DIVERGENTE NÃO PREVISTO EXCEDENTE DUPLICADO / VALIDADE FALTANTE

3 · Liberação de validade (recebimento) — perfil Compras

Quando: um item chegou com vida útil abaixo do mínimo (padrão 75%). Fica PENDENTE DE LIBERAÇÃO, fora do estoque disponível.

Item retido→Card "Liberação de validade" (aba Recebimento)→Compras decide + justificativa
  • Liberar: escolha o endereço sugerido (temperatura compatível, lote lado a lado) → entra no estoque.
  • Recusar: não entra — tratamento com o fornecedor.
Fica registrado quem recebeu, quem decidiu e a hora de cada etapa. A finalização da conferência oferece um e-mail pronto para o comprador.

4 · Armazenagem

Quando: guardar no endereço o que já foi conferido e está na doca.

Fila "A armazenar"→Bipar produto→Ajustar qtd→Bipar endereço→Guardado
  • Bipe o produto — o app sugere a quantidade pendente, mostra onde o lote já está e um endereço sugerido.
  • Ajuste a quantidade; bipe o endereço e toque em Concluir armazenamento. O endereço continua selecionado para guardar vários itens em sequência.
Endereço incompatível com a temperatura do produto? Bloqueado — só Administrador força, com justificativa registrada na Auditoria.
Armazenar é transferência de endereço: o saldo total não muda (movimento ARMAZENAGEM origem → destino). Sem saldo em lugar nenhum, o app pergunta antes de lançar como entrada direta.

5 · NF de Saída — a fila de trabalho

A separar→Separando→A conferir→Concluído

Uma NF de saída nasce A separar, vira A conferir quando o separador termina e fecha em Concluído quando a conferência é finalizada. A fila mostra por padrão só o que está em aberto. O botão separar monta o roteiro; conferir carrega os itens e abre a conferência.

Trava de validade: se a NF exige validade mínima do cliente e nenhum lote atende, ela trava até o Comercial aprovar (processo 7).

6 · Separação

Quando: retirar do estoque os itens de uma NF de saída, pelo roteiro do armazém e regra FEFO (vence antes, sai antes).

NF "A separar"→Iniciar (roteiro + reserva)→Bipar endereço + produto→Concluir→Vai para Conferência
  • Iniciar separação — o app monta o roteiro (rua → módulo → nível), escolhe o lote por FEFO e reserva o saldo.
  • Bipe o endereço → bipe o produto; a linha avança. "tb:" mostra endereços alternativos.
  • Sem saldo na posição: botão ruptura + motivo. A conferência passa a esperar só o que realmente saiu.
  • Concluir a separação é o que libera a NF para a conferência.
Avisos na bipagem: LOCAL DIFERENTE (endereçamento desatualizado — avise) · ITEM DE ENCOMENDA (só sai no lote da encomenda) · VALIDADE RECUSADA (lote não atende ao cliente — pule para o indicado).
Conflito de reserva: se duas NFs disputam o mesmo lote, a fila mostra ⚠ CONFLITO DE RESERVA com o nome de quem segura o saldo. Toda ruptura exige motivo antes de concluir.

Onda de separação (carrinho)

Quando: há várias notas pequenas na fila. Separa todas numa caminhada só.

Montar a onda→Bipar endereço→Bipar produto→Distribuir nas posições→Concluir → cada NF vai p/ conferência
  • Montar: marque as notas na mão (a ordem da marcação vira a posição no carrinho) ou use Sugerir onda por prazo, transportadora ou cliente. As duas formas funcionam juntas.
  • Cada NF ocupa uma posição do carrinho — as caixas plásticas levam etiqueta CX001, CX002… (gerada no card Caixas de separação, aba Locais).
  • O roteiro é consolidado: um produto pedido por três notas vira uma parada só.
  • Ao bipar o produto, o app diz quantas unidades vão em cada posição. Confirme posição por posição ou use Confirmar tudo.
  • Conferência da caixa (opcional): ligue exigir conferência da caixa no card Montar onda. Aí o operador clica na posição e bipa uma caixa CX; ela fica vinculada àquela posição pelo resto da onda e o app recusa a caixa errada. Nesse modo o Confirmar tudo fica oculto.
  • Ruptura marca só as posições ainda não atendidas — as outras notas seguem normalmente.
Ao concluir, cada NF vira uma separação concluída própria e segue para a conferência como sempre. NF que está numa onda não pode ser separada avulsa — a aba Separação redireciona.
Para uma nota só, continue usando a aba Separação. A onda exige no mínimo 2 NFs.

7 · Aprovação de validade (saída) — perfil Comercial

Quando: a NF só pode ser atendida com lote de validade abaixo do que o cliente exige, ou abaixo do limite padrão.

NF travada→Comercial abre o link do e-mail (ou o card no painel)→Decidir + observação
  • Aprovar → NF liberada para separação.
  • Reprovar → tratamento comercial com o cliente.
A observação fica registrada na NF e aparece no resto do processo.

8 · Conferência de expedição

Quando: conferir o que o separador retirou, antes de embalar. Conferência cega (não mostra a quantidade esperada).

NF "A conferir"→Bipar item a item→Finalizar→Concluído + Embalagem
Divergência? Registre uma ocorrência (produto trocado / qtd a maior / qtd a menor / lote diferente / validade fora / avaria / faltante + observação). O botão Finalizar fica bloqueado enquanto houver divergência sem ocorrência.

Finalizar libera a reserva, baixa o estoque e a NF vira Concluída.

A ocorrência não apaga nada — guarda o separador original, o conferente e a hora, e alimenta a Taxa de erro de separação em Indicadores.

9 · Embalagem e cadeia fria

NF conferida→Montar volumes (cubagem)→Térmica + gelo (se frio)→Concluir→Volumes com etiqueta própria
  • Monte os volumes escolhendo as caixas padrão — o app calcula cubagem e peso cubado.
  • Produto frio: o app mostra a sugestão de embalagem térmica pela UF (SP → parede simples ≥ 48 h; fora de SP → parede dupla ≥ 72 h).
  • Para cada volume térmico, toque em "confirmar gelo" depois de colocar o gelo.
  • Conclua — cada volume ganha etiqueta com código próprio (Data Matrix) para o fechamento de carga.
Trava do gelo: a embalagem não fecha enquanto houver volume térmico sem gelo confirmado.

10 · Expedição

NF embalada→Escolher transportadora→Confirmar despacho→Fechamento de carga

A transportadora prevista já vem preenchida; o card mostra as últimas usadas por esse cliente. Ao confirmar, os volumes ficam vinculados à NF e ao romaneio.

Produto frio + Correios em dia bloqueado (qui/sex)? Despacho bloqueado — só o Comercial libera, com justificativa. O app mostra a próxima data liberada.

11 · Fechamento de carga

Quando: entregar a carga para a transportadora, bipando volume a volume contra o romaneio.

Transportadora chegou→Bipar cada volume→Todos bipados?→Carga fechada
  • Bipe cada volume. Volume desconhecido ou de outro romaneio é recusado; repetido dá aviso.
  • O romaneio só fecha com todos os volumes bipados. Fica registrado quem fechou, a transportadora e a hora.
Corte de expedição: cargas em risco de perder o corte (Correios 15h, demais 16h — ajustável) aparecem destacadas, mas não bloqueiam o fechamento.

11b · Reserva para OS (SAM) e fechamento por nota fiscal

Quando: um colaborador do SAM retira uma peça/produto para manutenção ou validação de equipamento, vinculada a uma Ordem de Serviço.

Bipar produto + endereço→Reservar→Informar nº da OS→Informar nº da NF→Estoque baixado
  • Na aba Reserva para OS (SAM): bipe o código do produto e o endereço, ajuste a quantidade, escolha a finalidade e o equipamento, e clique em Reservar para OS. Informe o nome de quem está retirando. A peça sai do disponível na hora.
  • Quando tiver o número da OS, clique em informar OS na lista. A reserva passa para OS Pendentes de fechamento.
  • Na aba OS Pendentes de fechamento, ao emitir a nota fiscal, clique em informar NF. Isso baixa o estoque (movimento de saída) e fecha a OS.
Cancelar (enquanto não fechada) devolve o saldo ao disponível. Enquanto a NF não é informada, o item continua reservado — não entra em pedido de venda.

12 · Devolução de cliente

Devolução recebida→Triagem (registra o item)→Concluir→Quarentena — aguarda Qualidade

Abra pela nota de devolução ou pelo chamado do ERP. A triagem só registra o item; ao concluir, todos os itens entram BLOQUEADOS em quarentena — saldo visível, indisponível para separação.

13 · Decisão de qualidade — perfil Qualidade

Item em quarentena→Card "Decisão de qualidade" (aba Devolução)→Decidir item a item
  • Liberar → volta ao disponível, escolhendo o endereço.
  • Manter → continua em quarentena.
  • Descartar → saída + registro de descarte.

Motivo tipificado (produto errado, item faltante, pedido incorreto, avaria, temperatura, validade, outro) + campo livre obrigatórios. Histórico completo por item.

14 · Área bloqueada, vencidos e descarte

  • Vencidos — ao virar a validade, o lote é bloqueado automaticamente (1×/dia, na abertura do app) e movido para o endereço da área bloqueada, se configurado. Nunca aparece na separação.
  • Recolhimento — em Área bloqueada e descarte, marque os lotes e gere a lista de recolhimento (CSV para a terceirizada).
  • Baixa — registre a baixa com o responsável. O saldo é zerado e o movimento fica no extrato.

15 · Inventário — lançamento e contagem

Lançar código/lote/validade/qtd/local→Enviar seleção p/ conferência→Contar bipando as prateleiras→Encerrar endereço

A localização é obrigatória — sem endereço o produto não entra no roteiro de separação. A contagem é cega (o app não mostra o saldo do sistema).

Contagem diverge do sistema? Recontagem obrigatória — as duas últimas contagens têm de bater; senão o app pede mais uma. Escolha o motivo + observação. O ajuste entra na fila "aguardando aprovação" — o estoque não muda ainda.

16 · Ajuste de inventário com aprovação — perfil Inventário

Ajuste "aguardando aprovação"→Card de aprovação (aba Inventário)→Aprovar / Reprovar
  • Aprovar → o estoque é ajustado (movimento AJUSTE + CSV contábil).
  • Reprovar / recontar → o saldo não muda.
Quem lançou não aprova o próprio ajuste. O estoque só muda na aprovação.

17 · Inventário rotativo

Quando: contar o armazém aos poucos, todo dia, sem parar a operação.

  • Defina a curva ABC dos produtos no cadastro e o prazo de cobertura por curva (padrão A 30 / B 60 / C 90 dias) na tela do rotativo.
  • Abra Inventário rotativo — contagem do dia — a lista já vem sorteada (curva ABC, giro, valor, urgência de validade, histórico e tempo sem contar).
  • Toque em Iniciar — a contagem segue igual à do processo 15.
  • Endereço que não dá para contar hoje: reagendar com motivo — volta no próximo sorteio.
  • Acompanhe em Cobertura do ciclo o % no prazo por curva e os endereços vencidos.
O endereço herda a curva mais alta dos produtos com saldo nele. Passou do prazo da sua curva (ou nunca foi contado) → entra obrigatório no sorteio, marcado como vencido.

Ressuprimento da face de picking

Quando: a posição fixa de separação de um produto ficou abaixo do mínimo.

Face abaixo do mínimo→Aba Ressuprimento→Botão repor→Confirma na Transferência→Face reabastecida
  • A face e a faixa mínimo/máximo são cadastradas no produto (aba Produtos → Face de picking).
  • A fila mostra quanto tem na face, quanto repor e de onde puxar — sempre o lote que vence antes.
  • O botão repor leva tudo preenchido para a Transferência; lá você confere e conclui.
Por que importa: com a face abastecida o separador pega sempre na mesma posição, baixa e perto — sem subir nível nem procurar lote. Face zerada aparece em vermelho no painel inicial.
Produto sem face cadastrada continua funcionando como sempre: a separação busca o endereço por FEFO no estoque todo.

Consulta por endereço

Quando: você está no corredor e precisa saber o que tem numa posição — antes de guardar, de separar ou de contar.

Bipe o endereço→Vê o conteúdo em ordem FEFO

Mostra cada produto/lote com validade, quantidade, quanto está reservado e quanto sobra de disponível, mais a ocupação do endereço em cubagem e peso. Lote vencido aparece como VENCIDO e lote em quarentena como QUARENTENA.

É só consulta — não movimenta nada. Para mover, use Transferência.

18 · Transferência de localização

Quando: remanejar um produto de um endereço para outro dentro do armazém. Não é entrada nem saída.

1 Origem→2 Produto / lote→3 Quantidade→4 Destino→Movimento TRANSFERÊNCIA

Ao bipar a origem, o app lista o que existe ali (botão usar por linha). Origem e destino continuam para mover vários itens; Inverter troca os dois; Mover tudo deste endereço transfere a posição inteira.

Bloqueia: origem = destino · saldo negativo · temperatura incompatível (só Admin força) · saldo reservado com NF já em separação (sem exceção). Saldo reservado fora de separação: só perfil Inventário move, e a reserva vai junto.

Status e alertas — referência rápida

NF de Saída: A separar Separando A conferir Concluído · Contingência (separado no papel).

Nota fiscal: aguardando chegada → A conferir → Conferida.

Leitura: OK LOTE DIVERGENTE NÃO PREVISTO EXCEDENTE DUPLICADO VALIDADE FALTANTE LOCAL DIFERENTE

ProblemaO que fazer
"Aguarde 1 segundo"Você bipou rápido demais. Espere 1 s e bipe de novo — a leitura anterior foi aceita.
O código do fabricante não vira o código da MasterO EAN não está cadastrado no produto, ou a etiqueta do fabricante precisa de um formato calibrado no cadastro do produto (seção "Formato da etiqueta do fabricante").
Câmera não abreA página precisa estar em https://. Em computador sem leitor nativo, use o leitor USB.
Endereço bloqueado ao guardar/transferirTipo de área incompatível com a temperatura do produto — escolha outro endereço.
Botão "Finalizar" da conferência não habilitaHá divergência sem ocorrência registrada. Registre a ocorrência de cada item.
Faixa vermelha "armazenamento cheio"Pare de bipar, toque no selo de sincronização, recarregue a página.
NF não aparece na conferênciaA separação ainda não foi concluída — é a conclusão que libera a NF.
Faixa vermelha "banco responde sem login"Problema de configuração do servidor — avise a TI. Não é erro seu.

Contingência e trabalho offline

Rede/coletor caiu na separação→Botão "Contingência" + motivo→Imprimir romaneio e separar no papel→Lançamento retroativo (horários reais)→Concluído

Sem internet o app continua funcionando — o que você bipa fica no aparelho e sobe sozinho quando a conexão volta. Um aviso no topo mostra o estado da conexão.

Backup do aparelho: em Configurações → Backup de emergência, exporte o JSON antes de limpar o cache do navegador ou trocar de aparelho.

Manual de TI

Instalação, configuração, escalabilidade e recuperação. Assume as correções de segurança já aplicadas ao código (CSP, migrações fechadas, tabelas de arquivo imutável, Edge Function com validação de JWT). Acesso restrito ao perfil Administrador.

1 · Arquitetura

Front-end de arquivo único, sem build — não há servidor de aplicação. Persistência local (localStorage, chaves mdqr_*_v1) com espelho no Postgres via Supabase (na prática obrigatório em produção multi-coletor).

ComponenteOnde vive
wms-master.html + css/wms.css + js/wms-boot.js + js/wms-app.js + sw.jshospedagem estática HTTPS — wms.masterdiagnostica.com.br
Identidade: MSAL.js (CDN Microsoft) + Entra ID (tenant único)App Registration
Banco: Supabase self-hosted (Postgres + PostgREST + GoTrue + Storage + gateway)VPS Hostinger — supabasemas.masterdiagnostica.com.br
Integração TMS: Edge Function enviar-romaneio-aosSupabase Functions (Deno)
Integração ERP: tabela erp_pendencias consumida por RPA (Power Automate)Power Automate + service_role

Sincronização por área: cada área vira 1 linha em wms_estado (blob JSON, lock otimista por versao). Todo fetch ao Supabase leva o access token do Entra no Authorization; a anon key vai só no apikey.

2 · Pré-requisitos de infraestrutura

  • Hospedagem estática com HTTPS (a câmera exige https://). Os 4 arquivos + sw.js na mesma origem/pasta.
  • VPS com Supabase self-hosted (Docker): Postgres 15+, PostgREST, GoTrue, Storage, gateway. ≥ 2 vCPU / 4 GB RAM / 40 GB SSD para o porte atual, disco com folga para o crescimento de wms_estado / wms_historico / imagens.
  • Tenant Microsoft 365 com permissão para criar App Registration.
  • Power Automate com conector Oracle/Analyse para o RPA.
  • Credencial da Active OnSupply (Token de Integração) para o TMS.
  • Leitores 2D (leem Data Matrix) + impressora Zebra TLP 2844 (ZPL), etiqueta 50 × 30 mm.

3 · Microsoft Entra ID — App Registration

  • New registration — "WMS Master". Account types: single tenant.
  • Authentication → Add a platform → Single-page application. Redirect URI: https://wms.masterdiagnostica.com.br (exato, sem barra final). Marque Access tokens e ID tokens.
  • Expose an API — Application ID URI api://<client-id>. Add scope access_as_user (admin+user consent, Enabled).
  • API permissions — Graph delegadas openid, profile, email. Grant admin consent.
  • Anote Application (client) ID e Directory (tenant) ID.
Single tenant + a checagem de tid em wms_entra_ok() garante que só contas do tenant da Master acessam — barrado no banco, não só na tela.

4 · wms-boot.js / WMS_CONFIG

Topo de js/wms-boot.js. Nenhum valor é segredo (client id, tenant id e anon key são públicos por design) — a segurança vem das políticas do banco.

var WMS_CONFIG = {
  MSAL_CLIENT_ID:   '<Application (client) ID>',
  MSAL_TENANT_ID:   '<Directory (tenant) ID>',
  MSAL_REDIRECT_URI:'https://wms.masterdiagnostica.com.br',  // == Redirect URI do Entra
  ALLOWED_DOMAIN:   'masterdiagnostica.com.br',              // '' desliga a checagem
  MSAL_API_SCOPE:   'api://<client-id>/access_as_user',     // vazio => usa id_token
  TESTE_LOCAL_PERFIL: 'Teste',
  TESTE_LOCAL_ADMIN:  true,      // file://localhost roda como Admin. Produção nunca é teste.
  SUPABASE_URL:     'https://supabasemas.masterdiagnostica.com.br',
  SUPABASE_ANON_KEY:'<anon key do projeto>'
};
MSAL_REDIRECT_URIidêntico ao do Entra, senão o login falha (AADSTS50011).
MSAL_API_SCOPEpreenchido → access token; vazio → id_token. A validação de JWT do Supabase precisa aceitar o aud correspondente.
TESTE_LOCAL_ADMINsó afeta file:// e localhost. Em produção login e perfis são sempre obrigatórios.
Quebras de linha: os arquivos usam LF. Garanta que o editor não converta para CRLF.

5 · Supabase — banco

5.1 Validação de JWT do Entra

É o que faz wms_entra_ok() funcionar (Authentication → Third-Party / JWT, ou a config equivalente do PostgREST no self-hosted):

JWKS URL : https://login.microsoftonline.com/<tenant>/discovery/v2.0/keys
Issuer   : https://login.microsoftonline.com/<tenant>/v2.0
Audience : <client-id>   (ou api://<client-id> , conforme o "aud" do token)

Sem isso, toda chamada autenticada falha — ou, se as políticas inseguras estiverem ativas, o banco fica aberto à anon key. O app tem um diagnóstico: se o banco responde a uma leitura feita só com a anon key, aparece uma faixa vermelha fixa + registro na auditoria.

5.2 Tabelas principais

TabelaPapel · SQL gerado por
pedidos, notas_fiscais, produtos, transportadoras, estoque, produto_imagensdados operacionais · botão "Baixar SQL da tabela" na aba correspondente
wms_estadosync por área (1 linha por area_<nome>, dados jsonb, versao). Guarda também locais e perfis. · aba Locais
wms_perfis, wms_usuariosperfis e vínculos e-mail→perfil · aba Configurações
erp_pendenciasfila para o RPA, unique(tipo, chave_negocio), o app só insere · aba Integrações
wms_historico, wms_estado_histappend-only (sem update/delete: política + trigger) · sqlPoliticasSeguras

5.3 Índices

create index if not exists wms_estado_chave_idx     on public.wms_estado (chave);
create index if not exists produtos_dun_idx          on public.produtos (codigo_dun);
create index if not exists wms_historico_area_idx    on public.wms_historico (area, arquivado_em);
create index if not exists wms_estado_hist_chave_idx on public.wms_estado_hist (chave, snap_em);

6 · Ordem de execução dos scripts SQL

No SQL Editor do Supabase, nesta ordem (todos idempotentes):

  1. Tabelas base — "Baixar SQL da tabela" de cada aba: NF de Saída, Recebimento, Produtos, Transportadoras, Saldo, Locais (wms_estado + sqlAreasSync), Configurações, Integrações.
  2. migracao_v8.sql (bloco UP) — embalagem, temperatura, imagem, GS1, tabelas opcionais de relatório.
  3. migracao_v9_perfil_comercial.sql (bloco UP) — coluna pode_comercial.
  4. supabase_policies_seguras.sql — botão "Baixar SQL de políticas (segurança)" na aba Configurações. Cria helpers, todas as políticas RLS, as tabelas de arquivo imutável e os triggers. Rode por último e re-rode após qualquer mudança de tabela.
  5. Bootstrap do 1º Administrador — seção 9.
Toda publicação que mexeu em SQL gerado: baixe de novo o supabase_policies_seguras.sql e rode. Ele é a fonte autoritativa das políticas.

7 · Políticas de segurança (RLS)

TabelasRegra
pedidos, notas_fiscais, produtos, transportadoras, produto_imagensCRUD para qualquer autenticado do tenant (wms_entra_ok()).
estoque, wms_estadoselect/insert/update para autenticado; DELETE só Administrador.
wms_perfis, wms_usuariosleitura para autenticado; escrita só Administrador.
wms_historico, wms_estado_histsó select + insert; sem update/delete (RLS + trigger). Imutável.
Limitação conhecida (INV-02): as permissões por perfil da aplicação são client-side. No banco, qualquer autenticado do tenant grava nas tabelas vivas. Endurecer isso (RLS por ação) é mudança de schema planejada. A trilha arquivada já está protegida pelas tabelas append-only.

Retenção do arquivo (job mensal com service_role — desabilite o trigger antes):

alter table public.wms_historico disable trigger wms_historico_imutavel;
delete from public.wms_historico where arquivado_em < now() - interval '5 years';
alter table public.wms_historico enable trigger wms_historico_imutavel;

8 · Edge Function — enviar-romaneio-aos

Proxy para a Active OnSupply. Mantém o token do TMS no servidor e valida o JWT do Entra (JWKS + tid + aud + exp).

supabase secrets set \
  ACTIVEONSUPPLY_TOKEN='<Token_Integracao>' \
  ACTIVEONSUPPLY_BASE_URL='https://ws.activeonsupply.com.br/API' \
  WMS_ENTRA_TENANT_ID='<tenant>' \
  WMS_ENTRA_CLIENT_ID='<client-id>' \
  WMS_ALLOWED_ORIGIN='https://wms.masterdiagnostica.com.br'

# deploy SEM verify_jwt do Supabase (a função faz a própria verificação)
supabase functions deploy enviar-romaneio-aos --no-verify-jwt

Homologação: ACTIVEONSUPPLY_BASE_URL = https://homologacao.activeonsupply.com.br/API.

O envio de romaneio tem fallback por CSV no app — se a função ficar fora, a expedição não para.

9 · RPA / Power Automate — retorno ao ERP

O app só insere em erp_pendencias (idempotente por tipo + chave_negocio). 6 tipos: conferência de recebimento, volumetria da nota, expedição despachada, ajuste de inventário aprovado, devolução recebida, decisão de qualidade.

  • O fluxo lê erp_pendencias com status in ('pendente','erro') usando a service_role key.
  • Após processar: PATCH status + processado_em + mensagem_erro.
  • Alerta "RPA parado" quando há pendências abertas e nada foi processado nas últimas 3 h.
Custódia da service_role: dá acesso total ao banco. Restrinja quem administra o fluxo, guarde-a só na conexão do Power Automate, rotacione periodicamente registrando a data. Avaliar um usuário de banco dedicado com permissão mínima em erp_pendencias.

10 · Perfis de acesso e bootstrap

  1. Em Configurações, crie os perfis (Operador, Compras, Comercial, Qualidade, Inventário, Estorno, Administrador) marcando abas e permissões especiais. Para cada aba marcada define-se pode alterar ou só consultar (nesta última o perfil vê a tela e os filtros mas não grava; sincroniza na coluna abas_modo de wms_perfis).
  2. Crie os vínculos e-mail → perfil. Crie ao menos um Administrador.
  3. Enviar para o Supabase.
  4. Depois de cadastrar o 1º Administrador, remova as duas policies de bootstrap:
drop policy if exists "wms bootstrap wms_perfis"  on public.wms_perfis;
drop policy if exists "wms bootstrap wms_usuarios" on public.wms_usuarios;

Defina o perfil padrão para e-mails não cadastrados (Configurações). "(nenhum)" = acesso completo para qualquer login do tenant.

A aba Manual de TI é visível só para o perfil Administrador; a Manual de Operação é visível para todos.

11 · Parâmetros operacionais

ParâmetroOnde
E-mail do comprador / vida útil mínima (%) / endereço da área bloqueada / endereço de quarentenaConfig → Entrada de mercadoria
CNPJ, razão social, IE (usados no romaneio ao TMS)Config → Dados da empresa
Corte Correios (15:00) / demais transportadoras (16:00)aba Fechamento de carga
Dias sem carga refrigerada nos Correios (padrão qui/sex)aba Fechamento de carga
Caixas térmicas (parede simples/dupla, autonomia em horas)Cadastro de Embalagem
Formato do código de endereço (RUA-00-00) / tamanho da etiqueta de localaba Locais
Prazo de cobertura por curva ABC (A 30 / B 60 / C 90 dias) e pesos do sorteio do inventário rotativoaba Inventário rotativo

12 · Impressão — Zebra TLP 2844

No driver ZDesigner TLP 2844 (Preferências de impressão), uma vez:

  • Stock personalizado 50,8 mm × 30 mm. Margens 0.
  • Media type: térmica direta (ou transferência com ribbon). Tracking: Web sensing.
  • Velocidade 2–3 ips · darkness 8–12. Rodar a calibração do rolo antes do 1º lote.

Na janela do navegador: destino ZDesigner TLP 2844 · escala 100% (nunca "ajustar à página") · margens nenhuma · desmarcar cabeçalhos e rodapés. Formatos de porta-palete (100×50, 100×35) exigem stock correspondente, orientação retrato.

13 · Service Worker (sw.js)

  • Network-first do app; não intercepta o Supabase.
  • A variável CACHE precisa ser incrementada a cada publicação que mude HTML, CSS ou JS — senão o navegador serve o cache velho.
  • Publicado na mesma pasta do wms-master.html. Não registra em file://.

14 · Rotina de publicação (release)

  1. node tests/run.js — deve passar (233+).
  2. Incrementar CACHE em sw.js.
  3. Publicar juntos, na mesma origem: wms-master.html, css/wms.css, js/wms-boot.js, js/wms-app.js, sw.js.
  4. Se algum SQL gerado mudou: rodar supabase_policies_seguras.sql de novo.
  5. Se a Edge Function mudou: supabase functions deploy enviar-romaneio-aos --no-verify-jwt.
  6. Smoke test em produção: login → abrir uma aba → forçar renovação de token (aba aberta ~1 h) → câmera (HTTPS) → selo de sincronização → romaneio de teste.
  7. Confirmar que o arquivo continua em LF.
Se o login quebrar após publicar: suspeite primeiro da linha da CSP em wms-master.html (comentário no arquivo) e do Redirect URI. Remover a CSP é seguro e reversível.

15 · Escalabilidade

PostgREST

Corta respostas em db-max-rows (default 1000). O app pagina as leituras grandes. Para menos requisições:

# .env do Supabase self-hosted
PGRST_DB_MAX_ROWS=5000

Crescimento de wms_estado

Cada área é 1 linha com blob JSON que cresce com os eventos. Tetos no cliente: movimentos 15.000, auditoria 15.000, inventarios 3.000, volumes_carga 30.000. Ao ultrapassar, o excedente vai para wms_historico (imutável) antes de ser cortado do blob — nada é perdido. Snapshot diário das áreas de estado pequenas em wms_estado_hist.

  • Monitorar o tamanho de area_movimentos / area_auditoria e o total de wms_historico.
  • Job de retenção (seção 7) para wms_historico / wms_estado_hist.
  • Blob de área acima de alguns MB: reduzir o tetoRemoto daquela área ou migrá-la para tabela relacional.

Imagens de produto

produto_imagens guarda o data URI (~120 KB) em coluna text. OK para centenas de produtos; para milhares, migrar para bucket do Storage e guardar só a URL.

Multi-coletor

Sem limite rígido. Pull ao abrir a aba, push debounced após salvar, pull de bloqueios_lote a cada 60 s, retry de pendências a cada 30 s. Gargalo é o Postgres/PostgREST do VPS — regra grosseira: 1 vCPU para cada ~15–20 coletores ativos bipando.

16 · Backup e recuperação de desastre

RPO atual: o backup da Hostinger é semanal → em perda total do VPS, até 7 dias de dados podem ser perdidos. Recomendação: pg_dump diário do banco do WMS para armazenamento fora do VPS, com teste de restauração trimestral.
# cron diário no VPS
0 2 * * *  pg_dump -Fc -d "$WMS_DB_URL" | \
           aws s3 cp - s3://backups-master/wms/wms-$(date +\%F).dump
DadoOnde persiste
Estado operacional (pedidos, estoque, movimentos, auditoria, áreas de sync)Postgres do VPS + réplica parcial em cada coletor
Histórico além da janela / snapshot diário de configswms_historico / wms_estado_hist (append-only)
Histórico de conferências finalizadas, inventário rotativo, endereçamentos forçadossó no coletor (não sincroniza hoje) — export JSON do aparelho

Recuperação: novo VPS + stack Supabase (mesmos domínios) → pg_restore do dump → reconfigurar secrets da Edge Function e a validação de JWT → republicar os arquivos estáticos → rodar supabase_policies_seguras.sql. Cada coletor, ao reconectar, faz merge do que não subiu (áreas eventos são união, sem perda).

17 · Monitoramento

SinalAção
Selo "N pendentes" / "sem conexão" (topo do app)checar rede do coletor / disponibilidade do VPS
Faixa "armazenamento local cheio" (rodapé)coletor saturado — sincronizar e recarregar; trocar por aparelho com mais espaço
Faixa vermelha "banco responde sem login"crítico — políticas RLS não aplicadas; rodar supabase_policies_seguras.sql
Alerta "RPA parado" (aba Integrações + painel)checar o fluxo do Power Automate
Tamanho do banco / conexões / logs (painel Supabase / VPS)alertar em disco > 80%, picos de conexão

18 · Checklist de implantação

BlocoItens
InfraVPS + Supabase no ar com TLS · hospedagem estática HTTPS · pg_dump diário + 1 teste de restauração
Entra IDApp single-tenant, SPA, Redirect URI exato · escopo access_as_user + admin consent · client/tenant ID anotados
Supabasevalidação de JWT configurada · tabelas base · migracao_v8/v9 · supabase_policies_seguras.sql (conferir pg_policies = wms_entra_ok(), não true) · índices · PGRST_DB_MAX_ROWS · job de retenção
Front-endWMS_CONFIG preenchido · CSP com hosts corretos · 4 arquivos + sw.js na mesma origem, CACHE incrementado · smoke test
IntegraçõesEdge Function com secrets + --no-verify-jwt · fluxo do Power Automate com service_role, rotação agendada
Operacionalperfis + vínculos, 1º Administrador, policies de bootstrap removidas · parâmetros da seção 11 · locais com tipo de área · produtos com embalagem + temperatura + tempo de vida · driver Zebra + etiqueta de teste · inventário inicial lançado

Como usar

  1. Início: painel com os números da operação (atualiza a cada 60 s ou no botão Atualizar) e atalhos em ícones. Cada indicador é clicável e leva direto à tela correspondente. O menu lateral (☰, canto superior esquerdo) abre em qualquer tela e mostra pendências nos módulos.
  2. NF de Saída: a fila de trabalho. Uma NF nasce A separar, vai para A conferir quando o separador termina e fecha em Concluído automaticamente quando você finaliza a conferência dela. Entradas possíveis: cadastro manual, importação CSV do ERP (uma linha por item) ou Supabase, que compartilha a fila entre todos os aparelhos. O botão conferir carrega os itens da NF na lista esperada e já abre a aba de conferência.
    A fila mostra por padrão só o que está em aberto (a separar / a conferir). Quando a NF é concluída ela sai da fila automaticamente — continua acessível no filtro Concluídos ou Todos os status.
    Para o Supabase: preencha URL do projeto + chave anon + nome da tabela, use Testar conexão e Baixar SQL da tabela para criar a estrutura no banco. Sem configurar nada, o app funciona 100% local.
  3. Gerar código (unidade): informe código, descrição, lote e validade → Gerar Código. Use Adicionar à fila para montar uma folha de etiquetas e imprimir todas de uma vez.
  4. Gerar código de caixa fechada: no card Caixa fechada / master, dê um identificador ao volume (ex.: CX-0001) e adicione uma linha por lote com a quantidade de unidades — 10, 12, 20, quantas houver. Uma caixa pode conter vários lotes e até vários códigos. O total é somado automaticamente e um único código representa o volume inteiro. A etiqueta impressa já sai com a lista de lotes ao lado do código.
    Ao bipar esse código na conferência, o app dá baixa em todas as unidades de todos os lotes de uma vez e mostra uma linha de status por lote. Limite prático: ~15 lotes por código.
  5. Recebimento: as notas entram por Nova NF, CSV (nf;fornecedor;emissao;codigo;descricao;lote;validade;quantidade, uma linha por item) ou Supabase (tabela notas_fiscais, com SQL para baixar). Abrindo a nota você tem os itens com lote, validade e situação de vencimento, e três caminhos:
    • Gerar e imprimir todas as etiquetas — código no padrão do app para todos os itens da nota.
    • Imprimir etiquetas selecionadas — marque só os itens que precisa reetiquetar.
    • Conferir esta nota — leva os itens da NF para a lista esperada e abre a conferência, validando código, lote, validade e quantidade contra a nota. Ao finalizar, a NF é marcada como Conferida com o resultado, o saldo recebe a entrada e o status sobe para o Supabase. A nota sai do Pré-Recebimento e da lista "A conferir" na hora — fica no filtro Conferidas (ou Todas) para consulta, e segue para a Armazenagem.
    A chave 1 etiqueta por unidade replica a etiqueta pela quantidade da nota (12 un. = 12 etiquetas); desmarcada, sai uma por lote. Tamanho e rolo seguem o que está configurado na aba Gerar Código.
  6. Armazenagem: o passo seguinte ao recebimento. A fila A armazenar é alimentada pelas conferências de recebimento finalizadas, mostrando o que está na doca, de qual NF e quanto falta guardar. O processo tem três passos: 1) bipe o código do produto — o app já sugere a quantidade pendente e mostra onde esse lote está hoje; 2) ajuste a quantidade; 3) bipe o código do endereço e clique em Concluir armazenamento. A mesma câmera lê os dois códigos, identificando sozinha se é produto ou endereço.
    Armazenar é uma transferência de endereço: sai da doca (ou do endereço com mais saldo) e entra na posição bipada — o saldo total não muda, e o movimento aparece no extrato como ARMAZENAGEM com o percurso origem → destino. Se o lote não tiver saldo em nenhum endereço, o app pergunta antes de lançar como entrada direta. O endereço bipado permanece selecionado depois de concluir, para você guardar vários itens na mesma posição em sequência. Bipar o código de uma caixa fechada preenche produto e quantidade de uma vez.
  7. Transferência (grupo Inventário): remanejamento de endereço — mover um produto de um endereço para outro dentro do armazém. Não é entrada nem saída: o saldo total não muda e nada vai para o ERP. Quatro passos, todos por bipagem ou digitação: 1) origem · 2) produto/lote · 3) quantidade (já vem com o disponível da origem; botão Tudo) · 4) destino. Ao bipar a origem, o app lista o que existe ali com um botão usar por linha. Depois de concluir, origem e destino continuam para você mover vários itens seguidos; Inverter troca os dois. O botão Mover tudo deste endereço transfere todos os itens da posição de uma vez, validando um a um.
    Validações antes de gravar: origem ≠ destino; nunca deixa saldo negativo; endereço de destino novo é cadastrado na hora; temperatura incompatível bloqueia (só Administrador força, com justificativa que vai para a auditoria); saldo reservado por NF de saída só é movido por quem tem a permissão de Inventário — e a reserva é remanejada junto para o novo endereço — e trava sem exceção se a NF já estiver em separação; lote em quarentena pode ser movido para a área bloqueada, com confirmação. O movimento aparece no extrato como TRANSFERÊNCIA, e a aba tem histórico próprio com filtros, KPIs e CSV.
  8. Separação: a fila mostra as NF de Saída A separar. Ao abrir um, o app monta o roteiro: uma linha por item, ordenada pelo percurso do armazém (rua → módulo → nível), com o endereço vindo do inventário e o lote escolhido por FEFO — vence antes, sai antes. Endereços alternativos aparecem como "tb:" abaixo do principal.
    Bipe o código do endereço e o app lista o que retirar ali; bipe o produto e a linha avança. Se o produto for bipado num endereço diferente do que o inventário aponta, ele conta mas avisa LOCAL DIFERENTE — sinal de endereçamento desatualizado. Sem saldo na posição, use ruptura: a conferência passa a esperar só o que realmente saiu. Concluir a separação é o que libera a NF para a conferência — antes disso ela não aparece lá.
  9. Guia do próximo item: quando a quantidade lida bate com a solicitada, o app fecha a câmera e mostra um painel com o item concluído e o próximo a ler — código, lote, validade, quantas unidades faltam e o endereço. Clique em Continuar lendo para reabrir a câmera já apontada para o próximo, ou Dispensar para seguir manualmente. Ao fechar a última linha, o painel avisa que a conferência (ou a separação) está completa. Vale para a conferência e para a separação, e pode ser desligado na chave Pausar a câmera ao concluir cada item.
  10. Conferência: preencha operação e documento, monte a lista esperada (manual, importando CSV ou puxando uma NF já separada) e comece a bipar.
  11. Ocorrências de conferência (qualidade da separação): na conferência de Expedição, toda divergência entre o que foi separado e o que o conferente encontrou precisa de uma ocorrência registrada antes de concluir — o botão Finalizar fica bloqueado enquanto houver divergência sem ocorrência. Tipos: produto trocado, quantidade a maior/menor, lote diferente do alocado, validade fora do critério, avaria, item faltante. Cada ocorrência guarda NF, produto, lote, quantidade esperada e encontrada, tipo, o separador original, o conferente e a data/hora, mais uma observação livre. A ocorrência não apaga o registro da separação: o histórico continua mostrando o que foi separado errado, e a correção segue como um movimento normal de conferência.
    A aba Indicadores tem o painel Taxa de erro de separação = linhas com ocorrência ÷ total de linhas separadas no período, com ranking por separador, quebra por tipo e por produto, evolução mensal e export CSV para o time de qualidade cruzar com os chamados do ERP.
  12. Fechamento de carga (bipagem de volumes): cada volume fechado na Embalagem ganha um identificador único (etiqueta própria, código Data Matrix) vinculado à NF e ao romaneio quando a NF é despachada na Expedição. Na aba Fechamento de carga, ao entregar para a transportadora, o operador bipa volume a volume contra o romaneio: o romaneio só fecha com todos os volumes bipados. Volume faltante impede o fechamento; volume repetido ou de outro romaneio é recusado com aviso. Fica registrado quem fechou, a transportadora e o horário. Cargas em risco de perder o corte (Correios até 15h, demais até 16h — ajustável) aparecem destacadas na fila e num aviso na tela, mas não bloqueiam o fechamento.
  13. Produtos: a base única do almoxarifado — status, EAN, DUN (caixa/master), código, código interno, descrição, unidade, marca, fornecedor, dimensões, peso bruto, peso líquido, cubagem, periculosidade (texto livre + químico/tamanho/embalagem/temperatura) e tempo de vida. Entra por cadastro manual, CSV (status;ean;codigo;codigo_interno;descricao;unidade;marca;fornecedor;dimensoes;peso_bruto;peso_liquido;cubagem;periculosidade;p_quimico;p_tamanho;p_embalagem;p_temperatura;tempo_vida;armazenamento;codigo_dun) ou Supabase (tabela produtos, com SQL para baixar e envio por upsert no código).
    Tempo de vida é a validade total do produto em dias (ex.: 730) — com ela cadastrada, o app calcula sozinho o % de vida útil restante de cada lote nas NF de Saída, para o alerta de aprovação de envio.
    O ganho maior está na leitura: com o EAN cadastrado, o operador pode bipar o código de barras do fabricante na conferência, na separação e na armazenagem — o app converte para o código oficial sozinho e ainda completa a descrição. O código interno também resolve. Produtos inativos saem do autocomplete. Pesos e cubagem aceitam vírgula decimal, e digitar as dimensões (30x20x15 cm) oferece a cubagem calculada.
  14. Locais (Rua | Módulo | Nível): cadastre os endereços um a um ou gere faixas inteiras de uma vez (ex.: ruas 1–4, módulos 1–10, níveis 1–4 = 160 endereços). O código sai no padrão RUA-00-00 (ex.: A-01-01) e cada local tem etiqueta própria com o endereço em letra grande + código.
    Na conferência, bipe primeiro o código do local: aparece a faixa “📍 Registrando em A-01-01” e todas as leituras seguintes ficam gravadas nesse endereço, até você bipar outro local ou clicar em limpar. A coluna Local do log e o bloco ENDEREÇAMENTO do CSV mostram o que foi guardado onde; a lista de locais mostra a ocupação registrada de cada posição.
  15. Resultado por leitura:
    • OK código e lote conferem com a lista.
    • LOTE DIVERGENTE o código existe na lista, mas o lote é outro.
    • NÃO PREVISTO item que não consta na lista.
    • EXCEDENTE quantidade lida acima do esperado.
    • DUPLICADO / VALIDADE mesma etiqueta bipada de novo, ou validade vencida/próxima (90 dias).
    • FALTANTE item esperado que não foi bipado até o fim.
  16. Inventário: lance código, lote, validade, quantidade e localização (obrigatória) — sem endereço o produto não entra no roteiro de separação. Endereço novo no padrão RUA-00-00 (ex.: A-01-01) é cadastrado em Locais na hora, com sua confirmação. O campo Local continua preenchido depois de lançar, para você cadastrar vários lotes da mesma posição em sequência. Na importação, a 6ª coluna do CSV é o local e linhas sem endereço são recusadas e listadas; no Supabase (botão na própria aba, usando a conexão da aba NF de Saída) o envio é upsert por codigo,lote,local. A tabela mostra a posição de estoque com KPIs de unidades, vencidos e a vencer em 90 dias, e filtros rápidos. O botão Gerar e imprimir etiquetas monta a folha de códigos dos itens marcados (ou dos filtrados, se nada estiver marcado) e abre a impressão direto — com a opção de 1 etiqueta por unidade para reetiquetar caixa por caixa. Enviar seleção p/ conferência transforma o inventário na lista esperada para você contar bipando as prateleiras.
  17. Saldo: consulta por código + lote com entradas, saídas, endereços, situação de validade e último movimento. O saldo parte do que foi lançado no inventário e é movimentado pelas conferências finalizadas — recebimento soma, expedição subtrai, conferência de inventário não movimenta. Só leituras validadas movimentam: divergências (lote errado, não previsto, vencido, excedente) ficam fora. O botão extrato de cada linha filtra o kardex daquele item.
    Na expedição, se o endereço bipado não tem a linha do lote, a baixa sai do endereço cadastrado por FEFO. Vender item sem cadastro deixa saldo negativo — é proposital, aparece em vermelho no painel e na aba para você corrigir o inventário em vez de esconder o erro. No recebimento sem endereço bipado, o app pergunta a posição de destino antes de dar entrada.
  18. Encerrar: Finalizar e salvar grava no histórico. Exporte o CSV para anexar ao processo.

Impressão — Zebra TLP 2844 · etiqueta 50 × 30 mm

Todas as etiquetas do app já saem no tamanho exato 50 × 30 mm, uma por etiqueta do rolo (uma carreira na horizontal). A página de impressão é configurada automaticamente para 50×30 mm sem margens quando você clica em qualquer botão de imprimir etiquetas.

Tamanhos disponíveis (o de local é escolhido na aba Locais):

  • 50 × 30 mm — produto, caixa fechada e local de prateleira. Stock 50,8 × 30 mm, uma carreira.
  • 50 × 30 mm em rolo de 2 carreiras — duas etiquetas de produto por avanço. Escolha o rolo no seletor da fila de etiquetas (aba Gerar Código) ou no inventário.
    • Deitadas: as duas lado a lado, página de 100 × 30 mm — no driver, stock 101,6 × 30 mm.
    • Na vertical: cada etiqueta gira 90° e ocupa 30 × 50 mm, página de 60 × 50 mm — no driver, stock 60 × 50,8 mm, orientação retrato.
    • Se o número de etiquetas for ímpar, a última página sai com a segunda posição em branco.
  • 100 × 50 mm deitada — local de porta-palete. Endereço em 13 mm de altura, código de 23 mm. Stock 101,6 × 50,8 mm.
  • 100 × 35 mm deitada — local de porta-palete em rolo mais estreito. Endereço em 10 mm, código de 15 mm. Stock 101,6 × 35 mm.
  • Versões "na vertical" — a mesma etiqueta girada 90°, para colar na coluna do porta-palete. A página troca de lado: 100 × 50 vira 50,8 × 101,6 mm e 100 × 35 vira 35 × 101,6 mm no driver. Mantenha a orientação retrato — a rotação já vem no desenho, não marque "paisagem".
  • 100 × 150 mm e 100 × 100 mm — 1 carreira — etiqueta grande (mesmo conteúdo das 50 × 30, ampliado) para produto, embalagem, local e caixa de separação. Escolha em cada tela: rolo de produto (aba Gerar Código / inventário), aba Locais (local e caixa de separação) e card "Etiqueta da embalagem". Página 100 × 150 mm / 100 × 100 mm sem margem, uma etiqueta por avanço.

Desde a v56, os layouts são editáveis pelo Administrador na aba Etiquetas (grupo Cadastros) — tamanho, elementos, campos e novos modelos. Os tamanhos acima são os modelos-padrão; "Restaurar padrão" volta qualquer um ao original.

Como o tamanho de página é único por impressão, quando a fila tiver etiquetas de tamanhos diferentes o app mostra um botão para cada tamanho — imprima uma rodada por rolo.

No driver da impressora (uma vez só):

  • Painel de Controle → Dispositivos e Impressoras → botão direito na ZDesigner TLP 2844 → Preferências de impressão.
  • Tamanho do papel / Stock: personalizado 50,8 mm × 30 mm (2,00" × 1,18"). Margens: 0 em todos os lados.
  • Media type: térmica direta (etiqueta térmica) — ou transferência térmica se usar ribbon. Tracking: Web sensing (gap entre etiquetas).
  • Velocidade 2–3 ips e escurecimento (darkness) 8–12: código muito claro não lê, muito escuro borra os módulos.
  • Rode a calibração do rolo antes do primeiro lote (botão de feed pressionado até piscar, ou pelo utilitário Zebra).

Na janela de impressão do navegador: destino = ZDesigner TLP 2844 · escala 100% (nunca "ajustar à página") · margens nenhuma · desmarque cabeçalhos e rodapés e gráficos de fundo não é necessário marcar.

Sai uma etiqueta com moldura de 50×30 mm e um código de leitura: se a moldura sair inteira e o código ler, está calibrado.

Densidade do código: o Data Matrix (padrão ECC200) ajusta automaticamente o tamanho da matriz ao conteúdo, sem "nível de correção" configurável como no QR, e com bem mais capacidade que um QR do mesmo tamanho físico. Etiquetas de caixa com muitos lotes ainda geram um código mais denso — o app avisa acima de ~320 caracteres (cerca de 6 lotes), com boa folga antes de comprometer a leitura.

v8 — embalagem, temperatura, imagem e Data Matrix

  • Embalagem: em Produtos, cadastre a menor unidade, o fator da caixa (1 CX = N UN) e do pallet (1 PL = N CX). Fatores só aceitam inteiro ≥ 1. O saldo é sempre guardado na menor unidade — em Recebimento (Nova NF), Inventário (lançar) e Separação (passo dos botões +/−) você escolhe em qual unidade digita e o app converte. Produtos sem embalagem entram na lista de pendências de cadastro (aba Produtos) e são tratados como unidade.
  • Temperatura: no produto informe a faixa (°C) — o tipo Ambiente / Refrigerado 2–8 / Congelado é derivado (o seletor Condição de armazenamento ainda sobrepõe manualmente). Em Locais, cada endereço tem um Tipo de área. No endereçamento (recebimento, armazenagem, devolução, inventário) o app bloqueia posição incompatível e mostra o tipo exigido × o do endereço. Só o perfil Administrador força, sempre com justificativa registrada na Auditoria. O relatório Itens em endereço incompatível (aba Inventário) lista o que já estava divergente.
  • Imagem: upload no produto — redimensionada para ~480 px e guardada na VPS (tabela produto_imagens); cada aparelho mantém cache local (IndexedDB). Miniatura aparece nas listas de Separação, Conferência, Conferência de Recebimento e Inventário ao lado da descrição; um toque amplia. Ao bipar um produto, a foto também aparece no cartão de resultado da leitura em todos os processos (Conferência, Recebimento, Separação, Armazenagem, Inventário, Devolução) — para conferência visual na hora. Produto sem foto: o cartão aparece sem imagem, sem ocupar espaço.
  • Ritmo de bipagem: o app exige 1 segundo entre a leitura de um produto e a do próximo — dá tempo de olhar a foto e a descrição antes de seguir, e evita contagem dobrada por eco do leitor ou disparo repetido da câmera. Leitura chegada cedo demais mostra "Aguarde 1 segundo" e é ignorada (basta bipar de novo). Bipar o endereço ou uma caixa fechada não entra nessa trava.
  • Data Matrix GS1: a bipagem já lê o Data Matrix do fabricante com os AIs (01) GTIN, (10) lote, (17) validade, (21) série e o separador FNC1 (além do formato calibrado por produto). Para item sem código de fábrica, a etiqueta interna do app já é um Data Matrix com produto + lote + validade; marque etiqueta interna GS1 na aba de etiquetas da NF para gerar no padrão GS1 (01)(17)(10) (ou (91) com o código interno quando não há EAN) — reconhecida depois como equivalente à do fabricante. A mesma rotina de etiqueta é usada na contagem de inventário.
    Código de barras linear (Code 128, Code 39 etc.) de teste rápido / IVD com código, lote e validade separados por espaço, TAB ou vírgula — em qualquer ordem (ex.: 30100166 0001191522 05/11/2027): o token que for uma data (dd/mm/aaaa, dd-mm-aa, aaaammdd) vira a validade, os outros viram código e lote. É lido direto, sem formato calibrado. Se um item desse tipo estiver lendo o lote errado, abra o produto e apague os campos da seção "Formato da etiqueta do fabricante". Campos colados sem separador continuam exigindo o formato calibrado no produto.
  • Que códigos de barras o app lê: no leitor USB o próprio aparelho decodifica e "digita" o texto — o app aceita qualquer texto; se um leitor novo não lê um tipo (EAN, ITF-14/DUN, Code 128, QR…), habilite a simbologia no manual do leitor (folha de códigos de configuração). Na câmera (celular/tablet) o app pede ao navegador todas as simbologias que ele souber decodificar — EAN-13/8, UPC-A/E, ITF-14/DUN, Code 128/39/93, Codabar, QR, Data Matrix, PDF417, Aztec. Funciona melhor no Chrome/Android; em navegadores sem leitor nativo (Firefox, Safari de computador) a câmera lê só QR — nesses use o leitor USB.
  • Curva ABC e posição no armazém: a curva cadastrada no produto (A/B/C) passou a decidir onde ele é guardado, não só a frequência de contagem no inventário rotativo. Curva A vai para posição perto do início do percurso e em nível baixo; curva C vai para o fundo e para o alto, liberando as posições boas para quem gira. Consolidar o produto onde ele já tem saldo continua tendo prioridade — a curva é o critério de desempate. O card Reslotting (aba Indicadores) lista quem está fora da posição da curva, com o endereço sugerido e um CSV para o remanejamento.
  • Formato da etiqueta do fabricante (por produto): no cadastro do produto, a seção Formato da etiqueta do fabricante calibra a leitura quando a etiqueta vem num layout de largura fixa (campos colados, sem separador). O campo Reconhecer pelo código de barras aceita uma etiqueta real (leitor USB ou colada): o app identifica onde ficam código, lote e validade (usa o código/EAN do próprio produto como âncora) e preenche o formato para você revisar e testar. Copiar de outro produto: bipe/digite o código de um produto já cadastrado e o app traz o formato dele — útil para famílias que repetem o layout de etiqueta. Deixe sem campos para usar o leitor genérico. Códigos GS1 ou com campos separados por espaço/vírgula não precisam de formato — o app avisa.

Entrada de mercadoria — compra x devolução

  • Recebimento de compra: conferência normal contra o pedido/NF (código, quantidade, lote, validade). Item que chega com validade abaixo do padrão da saída (mesmo % de vida útil da expedição, configurável em Configurações → Entrada de mercadoria) fica PENDENTE DE LIBERAÇÃO e não entra em estoque disponível. Não há recusa automática. Na finalização o app oferece o e-mail ao comprador. Na aba Recebimento → Liberação de validade, só o perfil de Compras libera (com endereço sugerido — temperatura compatível e lote lado a lado) ou recusa, sempre com justificativa. Fica registrado quem recebeu, quem liberou e a data/hora de cada etapa.
  • Devolução de cliente: fluxo próprio (aba Devolução), aberto por número de nota de devolução ou pelo chamado do ERP. Todo item entra BLOQUEADO em quarentena — saldo visível, mas indisponível para separação (nenhum perfil de operação separa lote bloqueado). Na aba Devolução → Decisão de qualidade, só o perfil de Qualidade decide item a item: liberar (volta ao disponível, com escolha do endereço), manter em quarentena ou descartar — sempre com motivo tipificado (produto errado enviado, item faltante, pedido de venda incorreto, avaria, temperatura, validade, outro) + campo livre. Histórico completo por item devolvido. Sem prazo limite de devolução.
  • Produto vencido / área bloqueada: ao virar a validade, o lote é bloqueado automaticamente (uma vez por dia, na abertura do app) e, se um endereço da área bloqueada estiver configurado, o saldo é movido para lá. Item bloqueado nunca aparece na sugestão de separação. Em Devolução → Área bloqueada e descarte: marque os lotes, gere a lista de recolhimento (CSV para a terceirizada) e registre a baixa com o responsável — o saldo é zerado e o movimento fica no extrato.

Formato do código

Unidade: MD|codigo|lote|validade|descricao
Caixa fechada: MDX|id|embalagem|total|cod*lote*validade*qtd*desc~cod*lote*validade*qtd*desc (lotes separados por ~).
Local: MDL|A-01-01|A|01|01|setor (a etiqueta de local no app leva só o código A-01-01)
Etiqueta interna GS1: Data Matrix (01)(17)(10) quando há EAN; senão (91)codigo(17)(10) (etiquetas antigas em (240) continuam sendo lidas).
Na leitura ele também entende: JSON ({"codigo":"...","lote":"..."}), pares chave=valor separados por | ou ;, GS1 (Data Matrix ou parênteses) com AIs (01)(10)(17)(21)(91)(240)(241) e FNC1, e, como último recurso, CODIGO|LOTE ou só o código.

Celular, tablet e computador

O app se adapta ao tamanho da tela: no celular as tabelas viram cartões (um item por bloco, sem rolagem lateral), os botões ganham área de toque de 44 px para uso com luva, os campos usam fonte 16 px para o iPhone não dar zoom ao focar e o resultado da leitura fica fixo no rodapé enquanto você bipa. No tablet os formulários se reorganizam em 2–3 colunas e no computador em 4. Vale adicionar à tela inicial (Chrome: menu → Adicionar à tela inicial; Safari: Compartilhar → Adicionar à Tela de Início) para abrir em tela cheia como um aplicativo.

Requisitos da câmera

Para a câmera funcionar, a página precisa ser aberta em https:// ou em localhost (exigência dos navegadores). Em celular Android/Chrome a leitura usa o detector nativo, sem depender de internet. No iPhone use o Safari.

Publicar online

É um arquivo único: suba em qualquer hospedagem estática (GitHub Pages, Netlify, IIS/Apache interno) e acesse pelo celular. Também funciona salvo na rede e aberto direto do arquivo, mas nesse caso a câmera pode ser bloqueada — use a entrada manual/leitor pistola.

Aprovação de validade — NF

—

Itens com validade abaixo do limite

CódigoDescriçãoLoteQtdValidade% vida útil restante

Pedidos do mesmo cliente/endereço

—

PedidoEntregaCódigoDescriçãoQtd

Adicionar item à lista esperada

Só para incluir um item que não veio da NF nem do CSV. Lote em branco = qualquer lote.