HageTag — motor de rastreabilidade assistida

A HageTag é o motor de rastreabilidade assistida da HageLab: além de registrar a cadeia de custódia, ele orienta a execução, valida a regra no ato do registro e bloqueia o avanço quando a condição crítica não é satisfeita. Rastreabilidade de amostras, vacinas, hemocomponentes, medicamentos, malotes e cargas — com monitoramento de temperatura, evidência auditável e operação offline.

Nível 1 · O motor

HageTag: motor de rastreabilidade assistida

Modele operações físicas como fluxos digitais rastreáveis. Você define etapas, dados, responsáveis, evidências e regras de negócio; conecta pessoas, sistemas e dispositivos IoT. O motor orienta a execução, valida a regra no ato do registro, bloqueia o avanço quando a condição crítica não é satisfeita e preserva o histórico completo da operação.

O que é uma HageTag

A identidade digital de uma instância real de um processo — uma carga, um malote, uma bolsa, uma ordem de serviço. Ela liga o objeto do mundo físico ao fluxo que o governa e ao histórico do que aconteceu com ele.

Agnóstico ao processo

Não é um software de vacinação, de transporte ou de laboratório. É o motor que permite modelar qualquer uma dessas operações — e é por isso que a mesma plataforma atende verticais que não se parecem.

Humano e máquina no mesmo fluxo

Registro por QR Code ou código de barras no aplicativo e telemetria IoT (temperatura, umidade, GPS) alimentam a mesma linha do tempo. O dado do sensor ganha contexto: a etapa em que ele foi medido.

O modelo HageTag

Seis peças em sequência, mais uma que atravessa todas. Entender esta cadeia é entender o produto inteiro.

  1. Configuração O desenho do processo, feito uma vez: quais etapas existem, em que ordem, com quais campos, regras, prazos, notificações e permissões. Tudo o que vem depois é execução dele.
  2. HageTag Uma ocorrência real do processo, com identificador próprio. Pode ser física — QR impresso pela plataforma, ou o código de barras que o item já traz de fábrica, quando é único — ou virtual, criada e escolhida direto no aplicativo, sem nada para colar.
  3. Etapas O que precisa acontecer, por quem e em que ordem. Cada etapa é um formulário a preencher no ato — e é o preenchimento dela que faz o processo avançar.
  4. Campos O que precisa ser informado, capturado ou calculado em cada etapa.
  5. Regras, automações e avisos Como o processo reage: exigir, ocultar, calcular, consultar, bloquear — e notificar quem precisa saber, por e-mail, push ou WhatsApp, com o conteúdo que você definir e só nas situações que escolher.
  6. Registro e histórico Quem fez, quando, onde, o quê e sob quais condições — reconstituível a qualquer momento.

O que uma HageTag pode representar

A mesma estrutura, processos diferentes.

uma vacina uma bolsa de sangue um malote uma entrega uma coleta domiciliar uma carga uma amostra uma ordem de serviço um equipamento um processo de qualidade

Três modelagens, para comparar

Vacinação
Separação → Transporte → Conferência do lote → Aplicação → Reconciliação

Transporte de medicamentos
NF-e → Embarque → Trânsito → Entrega → Canhoto → Dossiê

Malote biológico
Solicitação → Coleta → Transporte → Recebimento → Conferência por diferença

Rastreabilidade total em tempo real HageLab
Visão Geral

Como uma HageTag nasce e avança

Na prática, o ciclo de vida de uma HageTag segue 5 passos bem definidos para garantir controle total do processo:

  • 1. Criar a categoria: Define-se o fluxo de trabalho uma única vez (etapas, ordem, campos de coleta e automações/regras aplicáveis).
  • 2. Criar a HageTag: Abre-se uma nova tag vinculada à categoria (manualmente, via QR/cartão ou por equipamento) e ela recebe seu identificador.
  • 3. Preencher as etapas: Os operadores avançam o processo preenchendo formulários com dados, fotos, assinaturas ou leituras no celular/navegador (mesmo offline).
  • 4. Notificar e acompanhar: Ao registrar cada etapa, quem precisa saber é avisado por e-mail, push ou WhatsApp — sempre, ou só quando houver exceção. O status das tags aparece em tempo real no Kanban, com indicadores e, quando há IoT vinculado, alertas de temperatura do equipamento.
  • 5. Gerar histórico/relatório: Linha do tempo auditável completa exibindo quem fez, quando, onde e sob quais condições (com IoT ou manual).
Nível 2 · Execução assistida

Não é apenas workflow. O processo reage à operação.

Uma plataforma de rastreabilidade responde o que aconteceu. Antes disso, o HageTag responde isso pode acontecer — e quando a resposta é não, a etapa não conclui.

01

Rastrear

Quem executou, quando, onde e em que condição. Usuário, data e hora, coordenada, endereço geocodificado e a leitura do equipamento IoT entram em todo registro sem campo configurado.

02

Orientar

O operador abre o app e vê a próxima ação. O procedimento aparece na tela no momento em que importa, e muda conforme o contexto do que já foi respondido.

03

Validar e bloquear

A regra é conferida no ato do registro: comparação com cadastro, com etapa anterior, com faixa configurada ou com resposta de API externa. Quando a regra é crítica, a etapa não conclui — e o app diz por quê, para o operador corrigir ali. Validar nem sempre precisa bloquear; você decide onde a barreira existe.

04

Notificar

Ao registrar a etapa, avisa quem precisa saber por e-mail, push ou WhatsApp — sempre, ou só quando houver exceção: recusa de recebimento, avaria, divergência. Você escolhe quais campos entram na mensagem; o que não entra, não é enviado.

05

Provar

Trilha, foto, assinatura, curva de temperatura e dossiê saem prontos. A evidência é consequência da operação, não uma tarefa depois dela.

E, o tempo todo, automatiza

Por baixo dos cinco, o motor calcula prazos e derivações, consulta bases de dados, etapas anteriores e APIs externas, e executa — preenche campo, define o prazo da próxima etapa, aciona o equipamento IoT. Automação não é um sexto verbo: é como o motor cumpre os outros cinco.

Cinco verbos, um processo seu

Rastrear, orientar, validar e bloquear, notificar e provar — aplicados ao fluxo que você já executa hoje. Teste grátis por 15 dias, sem cartão de crédito.

IoT + HageTag

O sensor dá realidade física ao processo. O processo dá contexto operacional ao sensor.

Monitoramento de temperatura em tempo real, sozinho, responde "quanto estava". Vinculado à HageTag, responde quanto estava, em qual etapa, sob responsabilidade de quem e se aquele limite era aplicável naquele momento.

01

Monitorar

Telemetria contínua de temperatura, umidade, localização e abertura de porta, por datalogger e sensor com calibração rastreável.

02

Contextualizar

O HageTag informa ao monitoramento quando o equipamento entra e sai de operação. A regra de alerta passa a valer só quando faz sentido — o baú refrigerado parado, vazio e desligado deixa de disparar alarme.

03

Evidenciar

As leituras compõem automaticamente a curva contínua daquele processo, com os checkpoints sobrepostos. Se o processo passar por mais de um equipamento — um sensor na câmara durante o armazenamento, outro no baú no transporte —, as séries são mescladas na mesma linha do tempo, com cor e limites próprios de cada um.

04

Entregar

Ao concluir, a notificação de encerramento pode levar o relatório completo — curva de todos os equipamentos envolvidos, nota fiscal, canhoto, fotos e assinaturas — gerado e enviado automaticamente ao contratante.

Alerta de sensor não é notificação de etapa

São dois canais distintos, e é comum confundi-los. O alerta de IoT vigia o equipamento continuamente, enquanto durar a operação, e dispara quando uma leitura viola a faixa. A notificação de etapa não depende de sensor nenhum: acontece quando alguém registra uma etapa, avisa quem você definiu e pode ser condicional — só sai se houve recusa de recebimento, por exemplo. Uma operação inteiramente manual usa notificação de etapa normalmente, sem nenhum IoT.

Por que o contexto importa: fadiga de alerta

Em monitoramento sem contexto, toda leitura fora de faixa vira notificação — inclusive as do equipamento parado na garagem. Quando tudo alerta, a equipe para de olhar, e o alerta que importava se perde no meio. Ao aplicar a regra apenas na janela real da carga, o alarme volta a significar alguma coisa. É a diferença entre monitoramento de temperatura e rastreabilidade assistida.

Registro imediato e telemetria contínua

Sem IoT, o dado informado no ponto da execução entra na cadeia de rastreabilidade no instante em que é registrado, com autor, horário e localização — e a plataforma governa a rotina de medição: cobra a leitura no horário previsto, acusa quando ela não aconteceu e registra o que foi feito a respeito. Com IoT, a condição física passa a ser medida automaticamente e de forma contínua, formando a curva e permitindo alerta.

São camadas diferentes, e resolvem problemas diferentes. Em operação laboratorial essa distinção importa: a RDC 978/2025 trata do controle térmico e da avaliação dos sistemas de informação, e o roteiro de inspeção da Anvisa reconhece o monitoramento eletrônico em tempo real como nível superior de controle, acima do mínimo normativo. Ver a aplicação em logística laboratorial

Objetivo

Como funciona

HageTags entregam rastreabilidade e monitoramento. Elas são a unidade que alimenta:

  • Painéis e Kanban — uma coluna por etapa, mostrando onde cada item está agora;
  • Dashboards e BI — indicadores de desempenho, prazos, desvios;
  • Relatórios — linha do tempo completa, evidências, responsáveis e condições;
  • Alertas — avisos automáticos quando algo sai do padrão (com IoT).

São usadas tanto para monitorar ativos físicos (cadeia de frio, transporte refrigerado) quanto para controlar processos (um pipeline configurável de etapas, como conferência de recebimento, auditoria, checklist de qualidade).

Estrutura

Anatomia de uma tag

Uma tag é organizada em camadas configuráveis:

  • Categoria — o modelo do fluxo para uma classe de tags. Define ícone, cor, regras (ex.: proibir duplicidade) e o conjunto de etapas.
  • Subcategoria — uma variação da categoria, normalmente vinculada a setores.
  • Etapa (checkpoint) — cada fase do fluxo, com ordem, marcações de início/fim, prazos esperados, notificações e um formulário dinâmico próprio.
  • Campos — os itens do formulário de cada etapa: texto, número, data, seleção, foto, assinatura, código de barras, tabela, endereço, agenda, base de dados e muito mais.
  • Registro de etapa — cada vez que um operador preenche uma etapa, gera um registro com data/hora, autor, coordenadas GPS, arquivos e os valores informados.

Setores e permissões atravessam todas as camadas

Quem enxerga qual processo, quem registra qual etapa e até onde vai o histórico de cada um. A restrição é por função e por setor, e pode alcançar o histórico — não apenas o cadastro. É o que permite segregar áreas internas ou atender clientes concorrentes na mesma operação, com toda consulta registrada na trilha.

Quer ver isso rodando no seu processo?

Uma demonstração com o seu fluxo mostra mais do que qualquer página. O time técnico monta o exemplo com a sua operação, sem compromisso.

Além do formulário

Agenda, base de dados e roteirização — no mesmo fluxo

Três peças que costumam exigir três sistemas diferentes. Aqui elas conversam entre si e com a etapa, e é a combinação que gera o ganho — não cada uma isolada.

Agenda

Horário de trabalho por dia da semana, duração de slot, folga de deslocamento antes e depois, tipos de evento com o vocabulário do seu negócio (visita, manutenção, coleta) e regra de sobreposição. A agenda aceita campos próprios, no mesmo esquema do formulário da etapa — então o evento carrega os dados que a sua operação precisa, não um formato fixo.

Base de dados

Dados mestres da operação: cliente, serviço, equipamento, transportadora e produto deixam de ser texto digitado e viram entidades reutilizáveis, com os mesmos tipos de campo do formulário de etapa. Trava de valor único (CPF, placa, número de série), indicador de completude do cadastro, edição em planilha e importação por Excel. Funciona offline — o cadastro fica no aparelho.

Roteirização

Origem, paradas e ponto de retorno, com sequência otimizada e previsão de chegada por parada — considerando o tempo previsto em cada atendimento, não só o deslocamento. Onde há hora marcada, a ordem é mantida. A rota vai para o app de quem executa, com abertura no Maps ou no Waze.

As três juntas, num exemplo

Uma operação de assistência técnica em campo:

01

As demandas entram na agenda do técnico, cada uma com o tempo previsto de atendimento e o endereço do cliente.

02

O coordenador filtra o período — a semana, o dia — e manda as demandas daquele técnico para o roteirizador.

03

A rota é otimizada somando deslocamento e tempo de parada, e a previsão de chegada de cada cliente sai daí.

04

A demanda chega no aplicativo do técnico designado, já na ordem da rota. No atendimento, ele seleciona o serviço na base de dados e preço, hora técnica e ferramentas vêm preenchidos.

Ao concluir, a notificação avisa o cliente e o registro fica com responsável, horário, foto, assinatura e localização. Nenhuma das quatro etapas exigiu um sistema à parte.

Campos que fazem mais do que coletar

São 28 tipos. Estes economizam digitação, evitam erro na origem ou resolvem algo que normalmente exigiria outro software.

Endereço

Autocomplete do Google, inclusive por nome de estabelecimento. Devolve logradouro, bairro, cidade, CEP e coordenada — e é a base do cálculo de rota.

Nota fiscal

Leitura por chave de acesso ou QR: emitente, destinatário, produtos e valor entram sozinhos. Ninguém digita 44 dígitos.

Tabela

Sub-formulário repetível dentro da etapa, editado como planilha. Cada coluna é um campo de qualquer tipo — itens conferidos, medições, peças trocadas.

Botão de ação

Executa algo sob demanda: consultar um sistema externo e confirmar pedido, contrato ou liberação com o operador ainda no local.

OCR e leitura de código

Extrai texto de foto e lê QR ou código de barras. Identificação por leitura em vez de digitação — menos erro na origem.

Malote

Embalagem secundária: agrupa vários itens lidos por código, ganha identificador próprio e oferece a impressão da etiqueta ao salvar.

Foto com câmera obrigatória

Bloqueia o acesso à galeria: a imagem prova o ato, não o arquivo. Some-se assinatura em tela e anexo de documento.

Texto por voz

Ditado embutido no campo de texto longo. Em campo, com luva ou com as mãos ocupadas, é a diferença entre registrar e não registrar.

Máscara com validação

CPF, CNPJ, telefone, moeda e padrão personalizado — placa, CEP, código interno — com validador próprio. Moeda exibe formatada e grava número, para calcular.

O catálogo completo dos 28 tipos, com o formato de valor que cada um grava, está na referência técnica.

Um caso de regra, do problema ao código

Validação cruzada entre etapas — o padrão mais usado em operações onde o erro tem custo alto.

Problema A separação prevê um lote; em campo, o operador pega outro. A divergência só aparece depois da aplicação.
Entrada Leitura de QR ou código de barras do lote, na etapa de aplicação.
Contexto O lote registrado na etapa de separação, lido do histórico da própria tag.
Validação Lote lido precisa ser igual ao lote separado.
Falha Exibe a incompatibilidade e impede a conclusão da etapa.
Resultado O erro é interrompido antes da aplicação, não investigado depois.

EXEMPLO — identificadores fictícios. Os IDs reais vêm da configuração de cada instalação.

// onFieldChange na etapa de aplicação
                    const separado = tagFull.info
                      .find(e => e.checkpoint === 'separacao')
                      ?.campos?.lote;

                    if (campo.id === 'lote_aplicado' && separado) {
                      if (campo.value !== separado) {
                        etapa.blockSave = 'Lote divergente da separação: '
                          + `previsto ${separado}, lido ${campo.value}.`;
                      } else {
                        etapa.blockSave = null;
                      }
                    }
Ver a referência de onFieldChange

Já sabe qual é a sua operação?

As páginas por segmento mostram o fluxo, as evidências geradas, a base regulatória aplicável e os planos — com teste grátis por 15 dias.

Aplicação

Rastreabilidade de quê?

O motor é o mesmo; o processo é seu. Cada página abaixo mostra o fluxo daquela operação, as evidências que ela gera, a base regulatória aplicável e os planos — com teste grátis por 15 dias.

Nível 3 · Arquitetura

O mapa antes do manual

Seis camadas. A referência técnica na seção seguinte detalha cada peça; aqui está onde cada uma vive.

Modelagem

Categoria, subcategoria, etapa, campo, agenda e base de dados. É o design-time: onde o processo é desenhado, sem código.

Runtime

Os objetos disponíveis durante a execução — etapa, campo, tag, tagFull, user — e os gatilhos onFieldChange e onClick.

Evidência

Registros, fotos, arquivos, assinaturas, geolocalização, carimbo de tempo, autoria e histórico versionado.

Mundo físico

Dispositivo IoT, telemetria, temperatura, umidade, GPS e eventos — vinculados à etapa em que a medição ocorreu.

Integração

API, fetch autenticado dentro da automação, leitura de NF-e, bases externas e o widget público de solicitações.

Apresentação

Kanban, linha do tempo, painel de fluxos, BI com indicador por campo, relatório da tag e compartilhamento externo.

Otimize as operações da sua equipe com regras automatizadas, alertas instantâneos e evidências digitais irrefutáveis.

Nível 4 · Referência técnica

Contrato da plataforma

Desta seção em diante o texto é referência, não argumento. Serve a quem vai implantar, integrar ou gerar configuração — inclusive agentes de IA.

Não precisa ler nada disto para começar. Se você só quer saber se resolve o seu caso, o caminho é mais curto: o time técnico monta a demonstração com o seu processo. Falar com um especialista
Versão da documentação 2026.08 · atualizada em 27/08/2026. Referência normativa do HageTag para implementação, integração e agentes de IA. Salvo indicação em contrário o conteúdo é NORMATIVO; blocos de código são EXEMPLO e seus identificadores são fictícios.

Artefatos: reference.md · prompt.md · llms.txt

Modelo conceitual e glossário

Entender estes sete conceitos é suficiente para ler o resto do documento.

Termo (UI)Termo técnicoDefinição
Fluxo / CategoriaCategoriaCheckpointO processo modelado. Agrupa etapas, define configurações globais (duplicidade, mapa, sequência, auto-início, publicação) e subcategorias.
EtapaTipoCheckpointUma fase do processo, com formulário próprio, prazo, notificações, automação e setores. Tem ordem (única na categoria).
TagTagA ocorrência rastreável: um lote, um transporte, um chamado, um plano de ação, uma visita. Percorre as etapas do fluxo. Tem identificador (chave de busca / código de barras) e, opcionalmente, alias_identificador (rótulo legível).
Registro de etapaCheckpointRecord (tag.info[])A execução de uma etapa por um usuário: respostas (adicionais), arquivos, coordenada, endereço, data, usuário e leitura IoT do momento. É a unidade de evidência.
CampoCheckpointFieldUm item do formulário. Tem id imutável (chave de BI), label, type e flags.
Base de DadosBaseDados / ItemTabela de cadastro reutilizável (clientes, produtos, veículos, pacientes…) com layout definido pelos mesmos CheckpointField.
AgendaAgenda / AgendaEventCalendário com regras de disponibilidade e campos próprios; um evento pode ser vinculado a uma etapa ou virar parada de rota.

Subcategoria é um agrupamento de etapas dentro do fluxo (ex.: "Planejamento", "Execução", "Qualidade"). Serve para filtrar o Kanban por frente de trabalho e para restringir etapas por setor — uma etapa de uma subcategoria com setores só aparece para quem pertence a esses setores.

Relação entre as entidades

Categoria (fluxo)
 ├─ config: duplicidade, mapa, sequência, auto-início, publicável, ícone/cor
 ├─ subcategorias[] ── setores[] → visibilidade por setor
 └─ Etapas[] (ordem)
 ├─ flags: início, fim, oculta, obrigatória, exige imagem, avulsa, repetível
 ├─ prazo padrão (duration, min) → prev_next_step da tag
 ├─ notificações: e-mail, push, WhatsApp, webhook
 ├─ automação: onFieldChange
 └─ Campos[] (29 tipos)
 ├─ database → Base de Dados (item)
 ├─ schedule → Agenda (evento)
 ├─ routing → Rota (origem, paradas, retorno)
 └─ table → sub-formulário repetível (colunas de qualquer tipo)

Tag (ocorrência)
 ├─ identificador / alias_identificador / descrição
 ├─ produto (equipamento IoT) · cliente · responsáveis · contatos
 ├─ prev_inicio · inicio · prev_conclusao · conclusao · prev_next_step
 ├─ checkpoints[] = snapshot das etapas no momento do vínculo
 └─ info[] = registros realizados (evidência)

Ponto de arquitetura importante para validação: tag.checkpoints é um snapshot. Ao alterar uma etapa, as tags já em andamento continuam com a configuração antiga até que se execute "Revincular tags" (oferecido automaticamente ao salvar a etapa). Isso preserva a integridade histórica do que foi coletado e permite decidir explicitamente quando propagar a mudança.


Ciclo de vida da tag

Estados

Estado (_status)Significado
desvinculadasTag existe no pool mas não foi associada a um processo
vinculadas / novoAssociada a uma categoria, sem nenhuma etapa registrada ("Planejado")
andamentoPelo menos uma etapa registrada, sem conclusão
atrasadaEm andamento com algum prazo estourado (_algum_atraso)
concluidasEtapa marcada como fim registrada (ou encerramento forçado)
concl_atrasoConcluída após o prazo

A coluna atual no Kanban é a etapa da última ordem concluída (getEtapaAtual), ignorando etapas avulsas. Tags sem nenhum registro caem na coluna virtual "Planejado".

Datas e SLA

CampoPapel
prev_inicioPrevisão de início do processo
inicioInício real
prev_conclusaoPrevisão de conclusão do processo (SLA macro)
conclusaoConclusão real
prev_next_stepPrazo da próxima etapa (SLA micro)

prev_next_step é a peça central do controle operacional. Ele é resolvido em cascata:

  1. Valor definido por automação (tag.prev_next_step no script) — precedência máxima;
  2. Caso contrário, data do registro + config.duration da etapa (em minutos);
  3. Caso contrário, ausente — sem prazo (o campo é omitido do payload e a API decide).

O Kanban desenha o SLA vivo a partir disso, com texto padronizado por estado ("faltam 2h 15min", "atrasado 35min", "adiantou 12min", "no prazo", "atrasou 18min") e cor por proximidade do vencimento. A contagem usa um relógio compartilhado com contagem de referência (ClockService): colunas que só têm tags concluídas não assinam o relógio (SLA congelado).

Identificador e apelido

O identificador é a chave funcional: é o que a busca e o leitor de código de barras usam. Quando ele precisa ser um código pouco legível (ex.: chave de acesso de NF-e com 44 dígitos), a automação pode gravar alias_identificador — um rótulo amigável ("NF 32298 · AC Labor") exibido como título no app, sem substituir o identificador. Definir alias só é possível por automação.

Geradores de identificador disponíveis compartilhados por Kanban, geração em lote, QR de início e tela de vínculo):

FormatoExemplo
Sem dataCOLETA
Dia/mêsCOLETA 21/08
Dia/mês/anoCOLETA 21/08/2026
HoraCOLETA 21/08 - 14h
PeríodoCOLETA 21/08 - tarde

Compõem-se como prefixo + data + sufixo, onde o sufixo costuma ser a descrição da categoria ou o identificador do equipamento. Isso permite padronizar nomenclatura sem intervenção do operador — um requisito recorrente de qualidade ("identificação unívoca e legível do registro").


Configuração da etapa

Tela gestao/etapa, organizada em três abas: Geral, Campos, Notificações.

Flags de comportamento

FlagEfeito
inicioEtapa de abertura do processo (mutuamente exclusiva com fim — a UI desabilita a outra)
fimEtapa de fechamento: registrar conclui a tag
hiddenEtapa oculta em Kanban e listagens operacionais (só alcançável por automação/fluxo específico)
stage_requiredEtapa obrigatória: com "restringir sequência" ativo, bloqueia as posteriores
image_requiredExige ao menos uma imagem para concluir o registro (validado no submit)
allow_repeatPermite registrar a mesma etapa várias vezes (padrão: sim)
skip_last_stage_updateEtapa avulsa: fora do fluxo sequencial, registrável a qualquer momento; não vira coluna do Kanban nem avança a etapa atual — aparece na seção "Atividades"
is_routing_completionEtapa de conclusão de parada de rota: só aparece no fluxo de roteirização
public_visibleDisponível para solicitação online — esta etapa pode ser preenchida por quem não tem login, via widget embutido no site do cliente (Widget público de solicitações (embed no site do cliente)). Exige também a categoria marcada como publicável
duration (min)Prazo padrão até a próxima etapa
subcategoriaAgrupamento/setor
setores[]Restrição direta de setor

O conceito de etapa avulsa é subestimado e vale destaque comercial: ele permite modelar atividades que acontecem em paralelo ao fluxo principal e quantas vezes for necessário — uma ocorrência, uma medição periódica, um registro de temperatura horária, um contato com o cliente — sem sujar o Kanban nem alterar o estágio do processo, mas mantendo tudo na mesma trilha auditável da tag.

Notificações por etapa (aba Notificações)

CanalConfiguraçãoObservação
E-maillista nome → e-mailTambém controlável dinamicamente por automação (etapa.emails) — sem custo
Pushlista nome → destino, com msg_title/msg_bodySuporta variáveis
WhatsApplista nome → númeroCanal com custo por mensagem — configurado só na tela, nunca por script; a documentação de IA obriga avisar sobre o custo e pedir confirmação
Webhookhost + headers customizados (chave/valor)Integração com ERP/CRM/RPA ao concluir a etapa

As mensagens aceitam variáveis: {{identificador}}, {{etapa}}, {{cliente}}, {{produto}}, {{usuario}}, {{atualizacao}} e, dinamicamente, {{<label de qualquer campo da etapa>}} — a tela lista as variáveis disponíveis e monta placeholders de exemplo com os campos reais da etapa.

Notificação de etapa × alerta de IoT — são coisas distintas

Notificação de etapaAlerta de IoT
Dispara quandouma etapa é registradauma leitura viola a regra do equipamento
Depende de sensornãosim
Duraçãopontual, no atocontínua, enquanto o equipamento está em operação
Destinatáriodefinido por etapa, e ajustável por automaçãogrupos de alerta do monitoramento
Conteúdoos campos que você escolher expora leitura que violou e o contexto do equipamento

A notificação de etapa funciona sem nenhum IoT. É o canal do processo: avisa o cliente que a coleta foi feita, o gestor que houve recusa de recebimento, o financeiro que a entrega foi concluída.

Condicional: como etapa.emails é mutável por automação, o disparo pode depender da resposta — etapa.emails = { Gestor: '...' } notifica; null não notifica. É assim que se avisa só quando houve exceção (recusa, avaria, divergência), em vez de a cada etapa concluída.

Conteúdo selecionável: as variáveis da mensagem determinam o que sai. Campo que não entra no texto não é enviado — dado sensível pode ficar de fora da notificação e permanecer só no registro.

Com IoT vinculado, o relatório anexado ao encerramento traz as leituras contínuas do período. Quando o processo passa por mais de um equipamento ao longo do tempo — um sensor na câmara durante o armazenamento, outro no baú durante o transporte — as séries são mescladas na mesma linha do tempo, com cor e legenda por equipamento e as faixas de limite de cada um. O gráfico e o relatório são do processo, não do sensor.

Validações de consistência no salvamento (impedem publicar etapa inconsistente):

  • campo Agenda sem agenda vinculada;
  • Botão de ação sem script;
  • campo com máscara sem tipo de máscara;
  • campo Rota incompleto (sem origem válida, sem campo de endereço do destino, ou retorno

"personalizado" sem ponto/base resolvida);

  • script de automação com erro de sintaxe ou referência inexistente (validação obrigatória antes de

salvar).


Catálogo de tipos de campo

29 tipos publicados no editor, organizados em quatro grupos. A coluna "valor salvo" é essencial para automação, BI, exportação e integração.

Entrada de dados
TipoRótulo na UIValor salvoNotas de uso
textTextostring
numberNúmerostring numérica (converter com Number)Vira medida no BI (soma/média/mediana)
dateDataAAAA-MM-DD
datetime-localData/HoraISO 8601
emailE-mailstring
telTelefonestring
textareaTexto longo / VozstringDitado por voz embutido (botão de microfone) — reduz digitação em campo. É também o tipo correto para automação gravar um texto calculado que deve persistir (readonly: true)
noteTexto e Avisosstring (texto ou HTML)Campo "Texto e Avisos" (note) e condições declarativas — instrução ao operador, não é salvo por padrão
maskedCampo com máscarastring formatada (exceto moeda)Máscaras: CPF, CNPJ, CPF/CNPJ, telefone, moeda e padrão personalizado com validador JS próprio

Máscara personalizada: padrão com 9 = dígito, A = maiúscula, a = minúscula, * = qualquer (ex.: 99999-999 para CEP, AAA-9999 para placa, 99/99/9999), mais um validador opcional em JS que recebe o valor e devolve null (válido) ou a mensagem de erro. Cobre validação de documentos e códigos internos sem desenvolvimento.

Moeda é exceção deliberada: exibe "R$ 1.234,56" e grava número (1234.56), para permitir cálculo em automação, BI e backend.

Seleção
TipoRótuloValor salvoNotas
selectSeletorstringOpções podem ser reescritas por automação em runtime
radioEscolha únicastring
checkboxMúltipla escolhastring[]
switchSim/NãobooleanVira Sim/Não no BI
listListastring[]Itens livres, com leitura por QR/código de barras; rejeita duplicados e sanitiza invisíveis
Mídia e captura
TipoRótuloValor salvoNotas
photoFotobase64Câmera ou galeria
cameraCâmerabase64Não é um tipo próprio: é photo + cameraOnlyforça captura ao vivo, sem galeria. Diferença crítica para evidência (impede subir foto antiga)
signatureAssinaturabase64Canvas de assinatura, nunca câmera — aceite de entrega/serviço
barcodeQR/BarcodestringLeitura nativa
qrcode-ocrQR + OCRstringLeitura por QR ou reconhecimento de texto
ocrOCRstringReconhecimento de texto em imagem (número de série, laudo, etiqueta)
fileArquivos[{file, name}]Anexo documental (PDF etc.), com visualizador de PDF no relatório
Especiais (estruturados)
TipoRótuloValor salvoO que habilita
tableTabelaarray de linhas (cada linha = conjunto de campos completos)Sub-formulário repetível dentro da etapa, editado como planilha (edição em célula). Cada coluna é um campo de qualquer tipo, inclusive outra tabela. Tem automação própria por linha
addressEndereçoobjeto (formatted_address, logradouro, bairro, cidade, estado, cep, lat, lng)Endereço com autocomplete e geocodificação; base do cálculo de rota
scheduleAgendaid do eventoVincula a etapa a um evento de agenda (data/hora, participantes, local, lembretes)
databaseBase de Dadosobjeto do item (mapa label→valor + _id/_label)Seleção de item de cadastro reutilizável; funciona offline
routingRotaobjeto (origin, items[], ending, previsões)Roteiro de paradas com otimização —
nfeNota Fiscalobjeto (número, chave de acesso, emitente, destinatário, produtos, valor total)Leitura de NF-e por chave/QR; restrito por permissão de renderização
maloteMalote{ id, data[] }Embalagem secundária: agrupa embalagens primárias lidas por código; recebe id próprio gerado localmente (alfabeto Code 128 sem caracteres ambíguos, ex.: M-LX9K2A-4F7) e oferece impressão do código do malote ao salvar
action-buttonBotão de açãostring (o que o script gravar)Botão que executa script somente ao clique: consultar API, preencher campos sob demanda, disparar fluxo pontual. Suporta rótulo próprio e confirmação prévia

Tipos legados aceitos em cadastros (não criáveis no editor): datetime, currency, url.

Flags disponíveis em qualquer campo
FlagEfeito
requiredPreenchimento obrigatório
importantPainel: o valor aparece no painel de monitoramento e no card
hiddenOculto do operador — canal padrão para valores preenchidos por automação
share_infoInclui o campo em relatórios e compartilhamentos externos
readonlyOperador vê mas não edita (usado por automação para exibir resultado calculado)
unique_entrySó em Base de Dados: impede valor repetido entre itens
cameraOnlySó em photo: força câmera

Coletado automaticamente em todo registro, sem configurar campo: usuário que preencheu, data/hora, coordenadas, endereço geocodificado a partir das coordenadas, leitura IoT do equipamento vinculado no instante, e um campo "Observações" padrão ao final do formulário. A documentação de IA proíbe explicitamente gerar campos duplicando esses dados.


Automação: onFieldChange e onClick

O diferencial mais forte do módulo em termos de flexibilidade. Cada etapa aceita um script JS (corpo de função) que roda:

  • ao abrir o formulário, uma vez com campo vazio (inicializações) e uma vez por campo já

preenchido (reaplicação de regras);

  • a cada alteração de campo, com campo = o campo alterado.

Campos action-button têm um script separado (onClick) que roda somente ao clique.

Capacidades que isso abre (todas com exemplo pronto no editor):

  1. Obrigatoriedade e visibilidade condicionais — exigir laudo só quando o resultado é "Reprovado".
  2. Cálculo de campos — total = quantidade × preço, recalculado a cada alteração.
  3. Cálculo de prazos — definir prev_conclusao ou prev_next_step conforme a resposta

(ex.: prioridade "Urgente" → 2h; demais → 24h).

  1. Destaque no painel — marcar campo.important dinamicamente quando o valor sai da faixa

(ex.: temperatura fora de 2–8 °C) e alterar a descrição da tag para "ALERTA: 9,4 °C".

  1. Avisos visuais ao operadorchip/banner em campo note, sem HTML manual.
  2. Reaproveitamento de etapas anteriores — usar tagFull.info para montar a lista do que foi

coletado numa etapa anterior e calcular o que falta (padrão clássico de conferência de recebimento: malotes coletados − malotes recebidos = faltantes).

  1. Consulta a API externafetch (com e sem autenticação; o token do usuário está em

user.token), com indicador de carregamento automático em scripts async.

  1. Integração com o próprio ecossistema IoT — colocar o equipamento vinculado em operação

(passa a notificar grupos de alerta sobre anormalidade) ao iniciar o transporte, e fora de operação ao coletar a assinatura do recebedor (evita alarme falso no retorno do veículo).

  1. E-mail condicionaletapa.emails = { Gestor: '...' } dispara; null não dispara.
  2. Bloqueio de salvamentoetapa.blockSave = 'motivo' impede o save e mostra o motivo ao

operador; null libera. É diferente de required: cobre respostas preenchidas porém incompatíveis (data de coleta posterior à de entrega, valor fora de faixa, campos mutuamente obrigatórios). Requisito direto de "verificação de consistência de dados" em validação.

  1. Título legível — gravar alias_identificador a partir da NF-e lida.
  2. Criação de campo em runtime — o script pode inserir um campo somente leitura na etapa (ex.:

uma linha única de histórico de integração que é sobrescrita a cada execução).

Qualidade e segurança do script

  • Validação obrigatória antes de salvar: validateAutomationScript compila o script (com

suporte a async) e faz dry-run com stubs universais, testando um cenário por label referenciado, para capturar erro de sintaxe e ReferenceError. A etapa não salva com script inválido.

  • Indicador de impacto: extractAutomationLabels extrai por regex os labels tocados pelo

script — como gatilho ou como alvo — e o editor de estrutura marca quais campos a automação manipula. É best-effort (não AST): referência por variável ou template string não é detectada.

  • Erro em runtime não bloqueia o operador: exceção no script vira aviso, nunca impede o save

(exceto o blockSave explícito).

  • Regras de estilo obrigatórias na documentação: proteger cada regra pelo campo que a dispara

(if (campo.label === '...')), comentar em português, organizar em blocos independentes para extensão futura. Isso existe porque o script inteiro roda a cada alteração de qualquer campo.

  • Cache de tagFull por tag durante a sessão do formulário — uma única chamada de API,

compartilhada entre o script da etapa e os scripts de linha de tabela.

Assistência de IA embutida: o editor de automação gera um prompt completo (buildAutomationDocs) com o contexto do sistema, a estrutura real dos campos da etapa, o catálogo de tipos, o formato de value por tipo, as variáveis, as agendas e bases de dados reais do ambiente (com IDs), as regras de notificação e ~17 instruções de conduta. As instruções obrigam o assistente a: fazer levantamento antes de codificar (com escolha prévia do nível de detalhamento — simplificado/médio/detalhado), avaliar se a estrutura de campos está adequada antes de escrever script, propor proativamente Base de Dados e Agenda quando detectar dados repetidos ou datas futuras, validar o desenho com o usuário antes de entregar código, e nunca inventar e-mails ou IDs.

Contexto disponível no script
VARIÁVEIS DISPONÍVEIS NO SCRIPT:

O script é o corpo de uma função executada nestes momentos:
 • Ao ABRIR o formulário: primeiro uma vez com a variável "campo" VAZIA (campo.label fica '' /
 indefinido) — use para inicializações (ex.: preencher opções a partir de etapas anteriores);
 depois uma vez para CADA campo do formulário, preenchido ou não (campo = aquele campo),
 reaplicando regras de obrigatório/oculto. Regras que dependem de um campo-gatilho ainda vazio
 também rodam — por isso proteja efeitos colaterais testando campo.value.
 • A cada ALTERAÇÃO de campo: com "campo" sendo o campo alterado.
Use campo.label para decidir o que executar. Para rodar algo SOMENTE na abertura, teste !campo.label.
Suporta async/await (um indicador de carregamento é exibido automaticamente).
Alterar campo.value dentro do script NÃO redispara o hook — não há recursão.

etapa (Object) — a etapa atual (leitura e escrita):.campos Array — todos os campos do formulário; cada item é mutável:.label string — nome do campo (use para localizar via find).value any — valor atual; altere para preencher automaticamente.type string — tipo do campo (ver lista acima).required boolean — true = obrigatório.hidden boolean — true = oculto.important boolean — true = destaque no dashboard.share_info boolean — true = exibido na linha do tempo.readonly boolean — true = somente leitura (exibe o valor mas impede edição).
 Para campos 'note': readonly:true (padrão) = não salva; readonly:false = salva..options any[] — opções disponíveis (select / radio / checkbox).identificador string — nome/descrição desta etapa.emails object — dispara e-mail SOMENTE nesta etapa: { NomeDestinatario: 'email@dominio.com',... }.blockSave string|boolean — IMPEDE o salvamento desta etapa (validação de respostas incompatíveis).
 Atribua uma STRING com o motivo para bloquear (o motivo é exibido ao operador ao tentar
 salvar); true bloqueia com mensagem genérica; null / false / '' liberam o salvamento.
 Combine com um campo do tipo 'note' para mostrar a explicação fixa dentro do formulário.
 REAVALIE SEMPRE: defina o motivo quando estiver incompatível e null quando resolvido,
 protegendo a regra pelo(s) campo(s) que a disparam (e !campo.label para checar na
 abertura). O bloqueio persiste até o script defini-lo como null — não é limpo sozinho.

campo (Object) — o campo que acabou de ser alterado (mesmas propriedades de etapa.campos[n])
 campo.label → qual campo disparou a execução (fica '' / indefinido na abertura do formulário)
 campo.value → novo valor
 Para executar lógica na abertura do formulário, teste !campo.label
 (ex.: if (!campo.label | — | campo.label === 'Recebimento malotes') {... }).

chip(texto, variante) (Function) — monta o HTML de um chip colorido (pill curta) para preencher
 um campo 'note'. variante: 'primary' (informativo) | 'success' | 'warning' | 'danger'. Não use
 hex/style à mão — o chip já usa as cores do tema (claro/escuro).
 Ex.: status.value = chip('✓ Dentro da faixa', 'success');

banner(variante, titulo, corpo) (Function) — monta o HTML de um aviso em destaque (título +
 descrição opcional) para preencher um campo 'note'. Mesmas variantes de chip; corpo é opcional
 (omita ou passe '' para um banner só com título). É o MESMO formato visual que o builder "Aviso"
 do editor de estrutura gera — automação e configuração manual ficam consistentes.
 Ex.: aviso.value = banner('warning', 'Ainda faltam malotes', '2 malote(s) pendente(s).');

tag (Object) — dados do registro atual em edição (leitura e escrita):.descricao string — descrição livre.identificador string — código identificador da tag. É a CHAVE de busca/leitura (código de
 barras / QR) e continua sendo o valor funcional — não o troque por um
 texto "bonito". Ex.: uma chave de acesso de NF-e (44 dígitos)..alias_identificador string — APELIDO legível do identificador, exibido como TÍTULO no app quando
 presente (o app renderiza alias_identificador | — | identificador). Use
 quando o identificador for um código difícil de ler (ex.: chave de NF-e)
 e você quiser mostrar algo amigável ("NF 32298 - AC Labor"). Defina SOMENTE
 por automação; atribua string vazia/null para limpar. NÃO substitui o
 identificador (que segue como código de barras/busca) — é só o rótulo visual.
 Ex.: tag.alias_identificador = 'NF ' + numero + ' - ' + cliente;.tipo_checkpoint number — ID da etapa (checkpoint) que está sendo registrada AGORA.
 Já vem preenchido com o ID da etapa atual; use para identificar a
 etapa dentro do script (ex.: comparar com o tipo_checkpoint de
 registros anteriores em tagFull.info). Somente leitura na prática —
 o sistema regrava com o ID correto ao salvar..produto object | null — equipamento/produto vinculado à tag (somente leitura). null
 quando a tag não tem equipamento vinculado. Campos úteis:.identificador string — nome/identificação do equipamento.imei string — IMEI do rastreador/sensor.num_serie string — número de série.modelo string — modelo do equipamento.temp_max number — temperatura máxima configurada.temp_min number — temperatura mínima configurada.controles object — controles do equipamento (relé, umidade, …).sck object — última leitura recebida ({ temperatura,
 lat, lng, voltagem, velocidade, local,
 eventtime, … }); use p/ ler a temperatura
 ou posição atual do equipamento.
 Ex.: if (Number(tag.produto?.sck?.temperatura) > tag.produto?.temp_max) {... }.date string — data/hora do registro (ISO 8601).inicio string — data de início (ISO 8601).conclusao string — data de conclusão (ISO 8601).prev_inicio string — previsão de início (ISO 8601).prev_conclusao string — previsão de conclusão (ISO 8601).prev_next_step string — limite (prazo) para a PRÓXIMA etapa (ISO 8601). Defina para
 sobrescrever o prazo (use sempre new Date para "agora", não tag.date).
 Defina null/'' para NÃO ter prazo. Se você não tocar neste campo, o sistema
 calcula automaticamente a partir do prazo padrão da etapa (em minutos):
 prev_next_step = data do registro + prazo.

user (Object) — dados do usuário logado (somente leitura):.sub number — ID do usuário.nome string — nome completo.nome_social string — nome social / apelido.empresa object — dados da empresa vinculada.estabelecimento object — estabelecimento ativo

tagFull (Object | null) — tag completa salva no dispositivo (somente leitura); pode ser null se a tag ainda não foi salva localmente:._id string — ID único da tag.descricao string — descrição.identificador string — código identificador.produto object — equipamento/produto vinculado (com.imei,.identificador,.controles, etc.).produto_id number — ID do equipamento vinculado.estabelecimento object — estabelecimento vinculado.cliente_id number — ID do cliente/estabelecimento.categoria object — categoria da tag.info array — histórico completo de registros de etapas; cada item:.tipo_checkpoint number — ID da etapa registrada.checkpoint object — dados do tipo_checkpoint (campos configurados com label, type, value, etc.).adicionais object — mapa label→valor dos campos preenchidos naquele registro.date string — data/hora do registro.usuario object — usuário que registrou.ultima_etapa object — último registro de etapa (mesmo formato de.info[n]).inicio string — data de início (ISO 8601).conclusao string — data de conclusão (ISO 8601).prev_inicio string — previsão de início (ISO 8601).prev_conclusao string — previsão de conclusão (ISO 8601).prev_next_step string — limite para a próxima etapa (ISO 8601)
 Uso típico: ler dados de etapas anteriores para pré-preencher campos da etapa atual.
 Exemplo simples: const lote = tagFull?.ultima_etapa?.adicionais?.['Número do Lote'];

routingItem (Object | undefined) — a PARADA DE ROTA vinculada a este registro, quando esta etapa foi
 aberta a partir de uma parada de um campo tipo "routing" (roteiro). Fica undefined fora desse
 fluxo (etapa aberta normalmente, sem rota) — sempre trate como opcional (routingItem?.algo).
 Identifica com precisão a parada ATUAL mesmo quando a etapa se repete (uma vez por parada): não
 infira a parada por contagem de registros anteriores nem por status desatualizado em tagFull —
 use routingItem diretamente..id string — id estável da parada (não muda com reordenação/otimização de rota).state string — 'pending' | 'going' | 'completed' | 'skipped' | 'cancelled'.sequence number — ordem da parada na rota.endereco string — endereço da parada.lat /.lng number — coordenadas da parada.adicionais object — mapa label→valor dos dados do evento/agendamento desta parada
 (ex.: routingItem.adicionais['Guia']).agendaEventId string — id do evento de agenda que originou a parada (quando houver).agendaId string — id da agenda de origem (quando houver).agendaNome string — nome da agenda de origem (quando houver).agendaEventDescription string — descrição do evento de agenda de origem (quando houver).scheduledStart/.scheduledEnd string — início/fim previsto do evento de agenda (ISO 8601)
 Exemplo: const paciente = routingItem?.adicionais?.Paciente?.['Nome completo'] ?? '—';

infoIndex (number | undefined) — índice, dentro de tagFull.info, do registro da etapa de rota
 (campo tipo "routing") que contém routingItem. Só é útil em conjunto com routingItem; não altera
 o item nem o índice diretamente — use apenas para referência/leitura, se precisar cruzar com
 tagFull.info[infoIndex].
Interfaces dos objetos
CONTRATO DOS OBJETOS DO RUNTIME (TypeScript, para referência — o script em si é JavaScript):

type FieldType =
 | 'text' | 'number' | 'date' | 'datetime-local' | 'email' | 'tel'
 | 'textarea' | 'note' | 'masked'
 | 'select' | 'radio' | 'checkbox' | 'switch' | 'list'
 | 'photo' | 'signature' | 'file' | 'ocr' | 'barcode' | 'qrcode'
 | 'malote' | 'nfe' | 'schedule' | 'database' | 'routing' | 'table'
 | 'address' | 'action-button';

interface CampoRuntime {
 label: string; // nome do campo; chave de busca via etapa.campos.find
 value: unknown; // tipo depende de FieldType — 'number' chega como string
 type: FieldType;
 required: boolean;
 hidden: boolean;
 important: boolean; // destaque no painel e no card
 share_info: boolean; // aparece em relatório e compartilhamento externo
 readonly: boolean;
 options?: string[]; // apenas em select/radio/checkbox/list
}

interface EtapaRuntime {
 campos: CampoRuntime[];
 emails: Record<string, string> | null;
 blockSave: string | true | null; // string = motivo exibido; true = motivo genérico
}

interface TagRuntime {
 identificador: string;
 alias_identificador: string | null; // só definível por automação
 descricao: string;
 prev_inicio: string | null; // ISO 8601
 inicio: string | null;
 prev_conclusao: string | null; // SLA macro
 conclusao: string | null;
 prev_next_step: string | null; // SLA micro — prazo da próxima etapa
 produto?: {
 sck: unknown; // última leitura do sensor vinculado
 temp_min: number | null;
 temp_max: number | null;
 };
}

interface TagFullRuntime { // SOMENTE LEITURA
 info: Array<{
 checkpoint: string;
 adicionais: Array<{ label: string; value: unknown }>;
 }>;
}
// ATENÇÃO: tagFull é null em tag nova. Sempre verifique antes de acessar.info

interface UserRuntime { // SOMENTE LEITURA
 sub: string;
 token: string;
}
Mutabilidade e persistência
MUTABILIDADE E PERSISTÊNCIA (o que sobrevive ao salvamento):

 Objeto Propriedade R/W Persistido? Observação
 --------------------------------------------------------------------------------------------
 campo value RW sim vira resposta da etapa
 campo required RW não (comportamento) validado no envio
 campo hidden RW não (comportamento) campo oculto não é exigido
 campo readonly RW não (comportamento) em 'note', false faz o valor persistir
 campo important RW sim (marcação) destaque no painel e no card
 campo share_info RW sim (marcação) entra em relatório externo
 campo options RW não (comportamento) só select/radio/checkbox/list
 campo label / type R — não altere: quebra a busca e o BI
 etapa campos RW via os campos mutação é sempre no item
 etapa emails RW sim destinatários da notificação
 etapa blockSave RW não (runtime) lido no envio; o script define E limpa
 tag prev_next_step RW sim precedência máxima sobre o padrão
 tag prev_conclusao RW sim SLA macro do processo
 tag descricao RW sim aparece no card e na busca
 tag alias_identificador RW sim nunca substitui o identificador
 tagFull info R — histórico; não modificar
 user sub / token R — use token em fetch autenticado

 Mutação NÃO é gravada no momento da execução: a persistência acontece no envio da etapa.
 Alterar campo.value dentro do script NÃO redispara o hook — não há recursão.

Semântica de execução do runtime

Este é o contrato de execução para quem — pessoa ou agente — escreve automação sem poder testar no ambiente real.

Quando o script roda

Momentocampo recebido
Abertura do formulárioUma vez com { label: '', value: '' } — teste !campo.label para inicialização
Ainda na aberturaUma vez para cada campo do formulário, preenchido ou não, na ordem da lista
AlteraçãoO campo alterado
Clique em action-buttonO próprio campo, via onClick (script separado; requireConfirm pede confirmação antes)

⚠️ O replay de abertura percorre todos os campos, não só os preenchidos — regras que inicializam visibilidade ou obrigatoriedade de campo dependente precisam rodar com o gatilho ainda vazio. Proteja efeito colateral testando campo.value.

Reentrância — alterar campo.value dentro do script não redispara o hook. Não há recursão nem cascata: o script roda uma vez por interação e a view é reconciliada no fim.

Persistência — mutações do script vivem no modelo em memória. Nada é gravado no momento da execução: a persistência acontece no envio da etapa, que monta adicionais a partir dos campos. Campo note com readonly diferente de false não é persistido — é instrução ao operador.

Erro, e por que blockSave é flag e não exceção

Toda exceção do script é capturada pelo engine, registrada no console e exibida como aviso (Automação: <mensagem>). Ela não impede o salvamento. throw dentro do script é engolido — é exatamente por isso que o bloqueio é uma flag lida no envio, e não uma exceção.

O script é dono do ciclo da flag: precisa definir e limpar etapa.blockSave. Não há rollback das mutações já feitas quando o bloqueio dispara; o operador corrige e o hook roda de novo.

Valor de etapa.blockSaveEfeito no envio
string não vaziaBloqueia e exibe a string como motivo
trueBloqueia com motivo genérico
null, false, ''Libera

Ambiente de execução — o script é o corpo de uma função criada com new Function e executada no realm do navegador. Não é sandbox: os globais do navegador estão disponíveis (fetch, console, Date, JSON, localStorage). Não há timeout — script que trava, trava o formulário.

O modo assíncrono é detectado por presença textual da palavra await no código-fonte do script (/\bawait\b/). Em script assíncrono o app exibe "Processando automação..." automaticamente, exceto durante o replay de abertura.

fetch e operação offlinefetch para API externa falha offline, a exceção é capturada, o aviso aparece e o salvamento continua permitido. Automação que consulta serviço externo não deve ser a única barreira de uma regra crítica: em campo, sem sinal, ela não roda.

tagFull — carregado sob demanda e cacheado por tag durante a sessão do formulário: não reflete alterações feitas no formulário aberto. Em tag nova (tagId === 'novo') vem null — sempre proteja com verificação antes de acessar tagFull.info.


Campo "Texto e Avisos" (note) e condições declarativas

O tipo note merece seção própria porque cobre três necessidades distintas:

  1. Instrução ao operador (padrão, readonly: true): texto ou HTML exibido durante o

preenchimento, não persistido. Serve para orientação de POP dentro do próprio formulário e pode ser recalculado por automação a cada abertura.

  1. Resultado calculado persistido (readonly: false, definível só por automação): o valor É

salvo e aparece no detalhe, no relatório e na impressão, mantendo o visual de nota.

  1. Aviso condicional sem programar (modo Condição): regras "se / senão se" declarativas,

avaliadas em runtime contra o valor vivo de outros campos da mesma etapa, com operadores filtrados pelo tipo do campo-gatilho. Permite que um analista de qualidade configure "se Temperatura > 8 então mostrar aviso vermelho 'Fora de faixa — abrir desvio'" sem escrever uma linha de código.

O builder visual oferece dois modos de composição (Texto e Aviso) com quatro variantes de cor (informativo, sucesso, atenção, crítico) — o mesmo formato que os helpers chip/banner geram na automação, garantindo consistência visual entre o que é configurado e o que é calculado.


Cinco caminhos para criar um fluxo

O ImportFlowModalComponent unifica cinco modos de criação, o que reduz drasticamente o atrito de implantação:

ModoPara quemComo funciona
FormulárioUsuário comumFormulário guiado passo a passo
TemplatesImplantação rápida15 fluxos prontos (galeria com descrição e destaque)
CódigoConsultor / TIEditor JSON ou YAML com validação prévia, pré-visualização, download do template e "Copiar para IA"
EtapasDesenho visualWizard para montar as etapas em sequência
Criar com IA (Hagent)Qualquer umChat que faz o levantamento e monta o fluxo ao vivo, refletido na pré-visualização lateral

Templates disponíveis já alinhados a processos reais de mercado:

TemplateDomínio
Fluxo GenéricoPonto de partida
Plano de Ação 5W2HQualidade / melhoria contínua
Pipeline Comercial B2B · B2B SaaS + HardwareComercial (MEDDIC, discovery, proposta, handoff)
Implantação de ClienteProjeto / go-live
Suporte Remoto · Visita TécnicaServiço / field service
Manutenção Preventiva · Manutenção CorretivaManutenção
Calibração de EquipamentoMetrologia (alinhado a RDC 658, ISO 17025, PIC/S)
Expedição de Carga TérmicaCadeia de frio (evidência para RDC 430/2020 — distribuição e transporte)
Recebimento de MateriaisInspeção de remessa termossensível
Transporte de AmostrasCustódia de amostras biológicas
Processo de ComprasSuprimentos (solicitação → pagamento)
Rota de Entregas (Demo)Logística com roteirização

Round-trip de edição: "Editar com IA" carrega a categoria inteira (etapas + campos + automações + config, com IDs preservados) como JSON, deixa o usuário ou a IA ajustar, e aplica tudo num único PUT transacional. As regras dessa transação são precisas e importam para integridade:

  • etapa com id e sem dt_ina → atualização;
  • etapa sem id → inserção (a API cria);
  • etapa com id + dt_ina → remoção lógica (soft delete);
  • etapa omitida do arraynão é tocada (remoção é sempre explícita, nunca por ausência);
  • campo omitido preserva o valor atual; campo presente sobrescreve (inclusive ""/[]/null para

limpar);

  • config (categoria e etapa) é mesclado com o atual antes de enviar, porque a API substitui a

coluna JSON inteira.

Copiar fluxo entre clientes (perfil admin): exporta o fluxo como JSON removendo os vínculos específicos do cliente (base de dados, agenda) e avisa exatamente quais campos precisam ser reconfigurados no destino. Isso viabiliza uma biblioteca interna de processos reutilizáveis.


Auditoria e reversão de versão

Toda alteração de fluxo e de etapa entra na trilha de auditoria com transação, usuário e horário. O módulo expõe isso como histórico de versões navegável (no dashboard, na página da categoria e na página da etapa), com duas ações:

  • Ver alterações — abre a trilha completa da transação (campo a campo, valor antigo → novo) em

modal, sem sair da tela;

  • Reverter — recompõe o mesmo PUT atômico que gerou a transação, gravando os valores

anteriores de cada campo alterado. Campos JSON (config, campos, emails…) voltam completos, sem perda; dt_alt é ignorado. Reverter exige permissão de edição da categoria.

Do ponto de vista de validação de sistema, isso atende diretamente aos requisitos de controle de mudanças e recuperabilidade de configuração: qualquer alteração de POP eletrônico é atribuível, datada, inspecionável e reversível.


Registrar uma etapa

O motor é o StructureCheckpointComponent, aberto como modal em qualquer tela (Kanban, painel, relatório, ficha de item, Minhas Atividades). Ele:

  • renderiza os 29 tipos de campo respeitando hidden, readonly e obrigatoriedade;
  • executa a automação da etapa em todos os momentos descritos em Automação: onFieldChange e onClick;
  • aplica defaults e carrega opções dinâmicas;
  • gerencia captura de câmera/QR/OCR/assinatura de forma segura para Android (fecha editor e retira o

foco antes de abrir a câmera — o sistema pode encerrar a Activity com teclado aberto);

  • garante a coordenada geográfica do registro no momento do save;
  • monta o payload e o entrega ao serviço de persistência, que grava local e sincroniza.

Política de geolocalização (detalhada em) — dois eixos independentes:

EixoOpçõesEfeito
Precisãostrict / relaxedstrict exige acurácia mínima (35 m no app nativo, 85 m no desktop); relaxed aceita qualquer fixo
Fallbackforçar GPS × preferir ponto manualDefine se pode cobrar GPS ou se usa o ponto manual salvo

Regras de proteção que já estão implementadas e são invariantes: a posição é aquecida em background enquanto o operador preenche (o save normalmente não abre carregamento nenhum); nunca grava coordenada (0,0); o seletor manual de mapa só aparece por ação do usuário (nunca no boot); e existe válvula de escape "definir manualmente" mesmo no perfil rígido, para registrar evidência quando o GPS genuinamente não converge (ambiente fechado, câmara fria, subsolo).

Validações no salvamento:

  • campos obrigatórios vazios;
  • image_required da etapa sem nenhuma imagem;
  • etapa.blockSave definido pela automação (com o motivo exibido ao operador);
  • listas e malotes são sanitizados; malote vazio é omitido do payload;
  • moeda é convertida de string exibida para número persistido.

Após salvar: se a etapa gerou malotes, o app oferece imprimir os códigos (código de barras) na hora — fechando o ciclo físico↔digital da embalagem secundária.

Offline: o registro é gravado no banco local e enfileirado; ao reconectar, é enviado. As telas mostram pendências e oferecem "enviar pendentes". A tag ganha marca de pendência local. Cadastros (Bases de Dados) são sincronizados no mesmo momento em que as tags, para que campos database funcionem sem rede.


Relatório da tag

O dossiê da ocorrência — e o principal artefato de evidência. Arquitetura em camadas descrita em.

BlocoConteúdo
Cabeçalho / metadadosIdentificador (ou apelido), descrição, categoria, cliente, equipamento, responsáveis, datas e previsões — editáveis conforme permissão
Timeline de etapasTodas as etapas com status visual (concluída/atual/pulada/pendente), contagem de repetições, quem registrou e quando; cada registro expande as respostas
Registro de etapa inlineCada etapa da timeline oferece registrar/repetir; paradas de rota oferecem registrar por parada e navegação (Waze / Google Maps)
Renderização de valoresRenderizador universal por tipo: imagens em visualizador, PDFs em leitor, tabelas em modal, endereços, rotas, agenda, NF-e, base de dados
MapaMarcadores dos checkpoints com posição real (ocultável por configuração da categoria)
Gráfico IoTCurva contínua de temperatura/umidade por equipamento, com linhas de mínimo/máximo configuradas no produto e marcadores dos checkpoints sobre a curva — cruza a evidência do processo com a telemetria
Tags vinculadasRelação entre ocorrências (ex.: um transporte que agrega várias coletas)
Filtro destacadoAo chegar de uma consulta avançada, os registros que casaram com a busca são destacados e o scroll vai até o primeiro
ImpressãoRelatório imprimível com renderização dedicada por tipo de campo (nada de [object Object])

Bases de Dados (cadastros reutilizáveis)

Um subsistema completo dentro do módulo. Elimina o maior gerador de erro em coleta de campo: a redigitação.

Estrutura

Uma base tem nome, descrição, status e layout — uma lista de campos que usa exatamente o mesmo esquema dos formulários de etapa (CheckpointField + order, description, placeholder). Consequência direta: todo tipo de campo criado para etapas está disponível em cadastros (exceto os que só fazem sentido em etapa: agenda, rota, NF-e, câmera, malote e botão de ação).

Cada item tem _id, os valores por label, metadados de criação/alteração, remoção lógica (deletedAt) e um cálculo de completude (_completeness: completo, campos faltando, percentual) — a base sabe dizer quanto do cadastro está preenchido.

Operação

RecursoDescrição
Grid tipo planilhaEdição em célula com editores por tipo (inline, linha expansível para endereço/agenda/NF-e, toggle, miniatura de imagem, modal para tipos complexos)
Linha de criação (draft)Cadastro rápido direto no grid
Formulário completo do itemReusa o motor de checkpoint — mesma experiência do formulário de etapa, incluindo automação e geolocalização
Campo único (unique_entry)Impede valor repetido entre itens (ex.: CPF, placa, número de série)
Campo "importante"Define a coluna primária: título do item, placeholder de busca e coluna em negrito
Filtro avançadoO mesmo componente do Kanban, aplicado ao layout da base
Busca normalizadaIgnora acentos e pontuação — CPF/CNPJ casam com ou sem máscara
Remoção lógica + restauraçãoItem excluído pode ser restaurado
ImpressãoPágina de impressão do cadastro
QR por itemCada item pode ter QR que abre sua ficha (base-dados/link-tag)

Import/Export Excel

Ferramenta dedicada, com política explícita:

  • Exportação inclui todas as colunas visíveis, com representação plana e legível por tipo

(endereço formatado, emitente + NF, resumo de rota, tabela achatada) — JSON apenas como último recurso. O objetivo declarado é: tipos simples saem prontos para reimportar; tipos complexos saem legíveis para auditoria/backup.

  • Importação é restrita aos tipos com ida-e-volta segura (texto, número, moeda, e-mail,

telefone, URL, datas, seleções, switch, máscara, códigos, endereço). A UI lista quais colunas são "somente exportação" e por quê.

  • Modelo para download com as colunas importáveis.
  • Geocodificação na importação de endereços.
  • Tratamento de erro por linha, com opção de "importar as linhas válidas e reportar as

inválidas".

  • Decisão consciente de integridade: a exportação não oculta a coluna NF-e por permissão —

porque a exportação alimenta a reimportação, e omitir uma coluna faria o ciclo apagar dados que o usuário não vê. Integridade do dado vence sigilo da coluna nesse ponto específico, e isso está documentado como limite conhecido.

Página de destino do QR de um item de cadastro, e um dos padrões de uso mais eficientes do módulo:

  • ficha do item (campos do layout) e bases relacionadas (itens vinculados por campos

database do próprio item, exibidos indentados e navegáveis);

  • tags em andamento relacionadas ao item, agrupadas por categoria;
  • próxima etapa pronta para registrar, com indicação de bloqueio por sequência;
  • confirmação visual "etapa registrada" logo após o registro;
  • sinal ao vivo do equipamento (telemetria via socket) quando o produto está na frota carregada;
  • atalho para iniciar uma nova tag já com o item pré-selecionado no campo de base de dados da

etapa (o contexto viaja por navegação e também por parâmetros de URL, como fallback para recarregamento de página, com controle para não vazar o contexto para a próxima tag);

  • atalho para o painel filtrado por aquele item;
  • edição do item conforme permissão.
Padrão de uso: QR na câmara fria, no freezer, no veículo, no equipamento, na sala. O colaborador lê e vê a ficha do ativo, o processo aberto e o botão da próxima ação. Zero navegação.

Arquitetura offline dos cadastros

Ponto técnico com efeito comercial direto (operação em campo sem sinal):

  • as bases e todos os seus itens são baixados para o banco local no mesmo momento em que as

tags, com TTL de 10 minutos e execução única concorrente;

  • escrita atômica (metadados + itens na mesma transação) — nunca fica com base nova e itens antigos;
  • busca e paginação locais com três modos: offset materializado (ordenação por campo dinâmico),

offset sem estado (primeira página) e keyset (O(pageSize)) para scroll infinito;

  • controle de geração de cache que invalida cursores em voo quando o cache é reescrito — a lista

recarrega do topo em vez de pular/repetir itens;

  • invariante: item removido logicamente nunca é persistido no cache local (mais uma limpeza

única, memoizada, para caches antigos) — o que a tela conta e o que ela mostra saem do mesmo universo.


Agenda

Subsistema de calendário integrado ao fluxo.

Configuração da agenda

ItemDescrição
IdentidadeNome, descrição, cor, grupo, fuso horário, status
Horário de trabalhoFaixas por grupo de dias da semana
Períodos disponíveisJanelas específicas por data
Duração de slotGranularidade do agendamento
Buffers antes/depoisFolga entre compromissos (deslocamento, preparação)
SobreposiçãoPermitir ou não eventos concorrentes
Duração mínima / máxima / padrão, hora padrão de inícioRegras de duração
Tipos de eventoVocabulário próprio do cliente (ex.: Coleta, Entrega, Visita, Manutenção)
Usuários permitidos / padrãoQuem pode usar e quem já vem pré-selecionado
EndereçoHabilitar / exigir endereço no evento
Link de reuniãoHabilitar campo de reunião online
Campos adicionaisLayout de campos próprios do evento — o mesmo esquema de CheckpointField
Script na criação de eventoAutomação onEventCreate(event, user, agenda)

Eventos

Um evento tem título, início/fim, usuários, tipo, descrição, status (rascunho, pendente, confirmado, cancelado, concluído), participantes com e-mail, link de reunião, endereço, vínculo com tag, e os campos adicionais com um snapshot do layout gravado junto — para que qualquer renderizador resolva o tipo de cada campo sem consultar a definição da agenda (importante para histórico correto quando o layout muda).

Como a agenda se conecta ao processo

Três integrações, e é a combinação delas que gera valor:

  1. Campo schedule — a etapa fica vinculada a um evento: a data futura deixa de ser um texto e

passa a ter lembrete, participantes, local, status e visão de calendário.

  1. Origem de paradas de rota — os eventos de um período viram destinos da rota, mantendo o

vínculo (id do evento, horário combinado) para comparar previsto × realizado.

  1. Busca por campos do evento — o filtro avançado consulta os campos adicionais dos eventos,

inclusive subcampos (ex.: Paciente.Nome completo).

A tela de calendário é um calendário completo (dia/semana/mês/lista, criação por arraste conforme permissão, múltiplas agendas visíveis simultaneamente com mini-calendário de navegação, layout master-detail no desktop e otimizado no mobile). Títulos e descrições de evento são renderizados como texto puro (nunca HTML), por serem dados de usuário.


Integrações e extensibilidade

MecanismoDireçãoQuando usar
Webhook por etapaSaídaNotificar ERP/CRM/RPA a cada conclusão de etapa; suporta host + headers (autenticação por token)
E-mailSaídaFixo na etapa ou dinâmico por resposta (etapa.emails) — sem custo
PushSaídaCom título/corpo e variáveis do processo
WhatsAppSaídaCanal com custo, configurado na etapa
fetch na automaçãoEntrada e saídaConsultar ou alimentar qualquer API (pública ou autenticada com o token do usuário) durante o preenchimento
Botão de açãoEntrada e saídaIntegração sob demanda, disparada pelo operador (consultar protocolo, validar documento, reservar recurso)
Widget público embutívelEntradaOpcional, uso minoritário, em PoC: o cliente final abre a solicitação no site do cliente e ela entra no fluxo — Widget público de solicitações (embed no site do cliente)
QR / código de barrasEntradaInício e continuação de processo, identificação de item, leitura de embalagem
NF-eEntradaLeitura estruturada da nota (chave, emitente, destinatário, produtos, valor)
OCREntradaDigitalização de número de série, laudo, etiqueta
Import/Export ExcelAmbasCarga inicial e manutenção de cadastros; extração para auditoria
Telemetria IoTEntradaLeitura do sensor no instante de cada registro + curva contínua no relatório; automação pode ligar/desligar o monitoramento do equipamento
SocketEntradaAtualização em tempo real de Kanban, painel e dashboard

Widget público de solicitações (embed no site do cliente)

Recurso OPCIONAL e de uso minoritário. É mais uma forma de entrada de dados, ao lado das quatro principais (a–d), e só faz sentido para o subconjunto de clientes que quer receber solicitações pelo próprio site. Não é premissa de nenhum fluxo — a esmagadora maioria das implantações nunca o habilita.
O que é

Uma linha de HTML no site do cliente que renderiza o formulário de abertura de uma etapa pública do fluxo. Quem preenche é o cliente final do nosso cliente — sem login, sem app, sem cadastro. A solicitação entra como tag no fluxo, exatamente igual a uma aberta internamente: mesmo Kanban, mesmo SLA, mesmas automações, mesmas notificações, mesmo relatório.

Em termos de arquitetura é apenas um quinto canal de entrada, ao lado da tela de vínculo, do início automático, do QR e da geração em lote. Nada a jusante muda: quem consome a tag não sabe (nem precisa saber) por onde ela entrou.

Como se habilita (duas chaves, ambas já existentes)

O widget não é configurado no widget — é configurado no próprio fluxo, com as duas flags já descritas em e Configuração da etapa:

OndeFlagEfeito
CategoriaPublicável (config.publicavel)Marca o fluxo como elegível à solicitação online
EtapaDisponível para solicitação online (config.public_visible)Marca quais etapas podem ser preenchidas publicamente

As duas são independentes e cumulativas: marcar a categoria não publica nenhuma etapa. Isso permite publicar apenas a etapa de abertura de um fluxo cujas demais etapas são internas.

Com as flags ativas, a tela da categoria e a tela da etapa passam a exibir o botão "copiar código", que gera o snippet pronto (buildTicketsEmbedSnippet), já com o cliente-id do estabelecimento logado:

<script type="module" src="https://hagelab.com.br/tickets/main.js"></script>
<hage-tickets-widget categoria-id="228" etapa-id="1142" cliente-id="5"></hage-tickets-widget>

Sem etapa-id, o widget abre a etapa pública marcada como início. Com etapa-id, vai direto ao formulário daquela etapa.

Parametrização visual (atributos do elemento)

O widget se adapta à identidade visual do site hospedeiro sem CSS externo:

AtributoFunção
categoria-idFluxo alvo (obrigatório)
etapa-idEtapa alvo; ausente = etapa de início pública
cliente-idEstabelecimento — necessário para listar etapas de categorias por tenant; sem ele, só categorias globais
primary-colorCor primária em hex — o widget recalcula sozinho tom, matiz e cor de contraste
background-colorFundo
radiusRaio de borda em px
compactLayout compacto (booleano)
hide-headerOculta o cabeçalho (booleano)
submit-labelRótulo do botão final — porque nem todo fluxo é "solicitação" (pode ser "Agendar coleta", "Abrir chamado", "Enviar amostra")
auth-tokenToken injetado em runtime, nunca compilado no bundle
Fluxo multi-etapa público

Um fluxo pode ter mais de uma etapa pública (ex.: abertura pelo solicitante → confirmação de dados pelo mesmo solicitante). A regra de avanço é deliberadamente conservadora: depois de salvar, o widget só avança quando existe uma etapa pública cuja ordem seja exatamente a atual mais um. Uma etapa pública posterior nunca é usada para pular uma etapa interna — o solicitante não consegue atravessar o processo.

Reuso dos recursos do módulo dentro do widget

O formulário público não é um formulário separado: ele renderiza os campos configurados na etapa, e dois tipos recebem tratamento próprio para não expor dado interno:

TipoComportamento no widget
databaseConsulta pontual à Base de Dados para identificar o solicitante (no protótipo, por CNPJ) e pré-preencher empresa/unidade. Se o CNPJ não é localizado, os campos ficam abertos para preenchimento manual — nunca trava a solicitação
scheduleA agenda interna não é exposta. O campo é adaptado para data/hora; ao enviar, o widget cria o evento na agenda com duração provisória de 60 min e substitui o valor pela identificação retornada. Se o envio da etapa falhar, o evento é cancelado como compensação
Quando faz sentido oferecer (e quando não)

Faz sentido no caso específico de o cliente ter um público externo que hoje solicita por e-mail, telefone ou WhatsApp e precisa ser redigitado: portal de coleta (o laboratório pede a coleta no site da transportadora), abertura de chamado pelo cliente final, agendamento de serviço. O ganho é a solicitação chegar estruturada e já no fluxo, em vez de virar texto a ser transcrito — inclusive disparando as automações de e-mail/webhook da etapa de abertura.

Não faz sentido — e é o caso da maioria — quando a entrada é sempre interna: operação de campo, bancada, conferência, transporte, manutenção programada. Nesses fluxos os canais de a–d cobrem tudo, e habilitar o widget só adiciona superfície pública sem uso.

Do lado do cliente o custo de adoção é baixo (uma tag <script> e um elemento, sem projeto de TI, com cores e rótulos parametrizáveis), mas isso não muda o fato de que é um recurso de nicho.


Playbooks de uso (como combinar as peças)

Esta seção é a mais útil para exploração comercial: mostra que o valor não está em nenhum recurso isolado, mas na composição.

Cadeia de frio — expedição e transporte

Peças: categoria com sequência restrita · etapas de preparação, pré-cooling, carregamento, expedição, entrega · campos number (temperatura), photo somente câmera, signature, address, nfe, malote · equipamento IoT vinculado · automação.

Como a automação eleva o processo:

  • destaca a temperatura no painel e altera a descrição da tag quando sai de 2–8 °C;
  • monta um aviso colorido no formulário orientando o operador ("Fora da faixa — registrar desvio");
  • bloqueia o salvamento se a data de coleta for posterior à de entrega;
  • coloca o equipamento em operação ao iniciar o transporte (passando a notificar os grupos de

alerta sobre qualquer anormalidade) e fora de operação ao capturar a assinatura do recebedor, evitando alarme falso na volta com refrigeração desligada;

  • dispara e-mail ao responsável apenas quando houver desvio.

Resultado: relatório com timeline, foto e assinatura por ponto, curva contínua de temperatura com os marcadores dos checkpoints sobrepostos, e limites de mínimo/máximo do equipamento desenhados — evidência única para auditoria de RDC 430/2020.

Conferência de recebimento com embalagem secundária

Peças: etapa de coleta com campo list (lista de malotes lidos por código) · etapa de recebimento com campo malote e checkbox · automação usando tagFull.

Mecânica: na etapa de recebimento, o script varre o histórico da tag, monta a lista completa do que foi coletado, subtrai o que já foi informado como recebido e calcula o que falta — populando o campo de faltantes e exibindo um banner de atenção. Se sobrar item pendente, define o destinatário de e-mail; se não sobrar nada, define null e não dispara.

Resultado: conferência sem planilha paralela, com prova de qual embalagem chegou e qual não, e alerta automático apenas quando há problema.

Coleta e transporte de amostras com rota

Peças: agenda de coletas com campos adicionais (paciente, guia, tipo de exame) · etapa com campo routing cuja fonte de destinos é a agenda · etapa "conclusão de rota" com foto, assinatura e temperatura · horários padrão de início por dia da semana.

Mecânica: o roteirizador importa os eventos do dia como paradas, sugere a previsão de início pelo horário padrão, otimiza por tempo ou distância (ou mantém a ordem, quando há hora marcada), calcula ETA por parada e previsão de conclusão. Em cada destino, o motorista registra a etapa de conclusão com o formulário completo; o script identifica a parada exata por routingItem e pode ler os dados do agendamento (routingItem.adicionais['Paciente']). Navegação abre no Waze/Maps.

Resultado: roteiro otimizado, comprovação por parada, e comparação ETA da rota × horário combinado com o paciente — base para indicador de pontualidade.

Calibração / metrologia

Peças: base de dados de equipamentos (com número de série unique_entry) · etapas de solicitação, retirada, execução, laudo, aprovação · campos file (laudo PDF), ocr (número de certificado), masked com validador personalizado, date (validade) · etapa de aprovação com setor restrito à Qualidade.

Extras: prazo padrão por etapa gerando SLA de próxima etapa; e-mail à Qualidade ao emitir laudo; webhook ao aprovar, alimentando o ERP; consulta avançada por "validade de calibração até"; BI com tempo médio por etapa e taxa de reprovação por campo de resultado.

Field service (visita técnica e manutenção)

Peças: agenda com buffers de deslocamento · campo schedule na etapa de agendamento · rota para o dia · etapas de saída, chegada, diagnóstico, resolução, aceite do cliente · assinatura do cliente · etapas avulsas para ocorrências no caminho.

Extras: Minhas Atividades como fila do técnico; QR no equipamento levando à ficha e à próxima etapa; botão de ação consultando o histórico do equipamento na API do cliente; push ao solicitante em cada mudança de etapa.

Recebimento fiscal e conciliação

Peças: campo nfe (leitura por chave/QR) · automação gravando a chave como identificador e um apelido legível como título · campo table para conferência item a item · masked (moeda) para divergência de valor · webhook para o ERP.

Resultado: a tag passa a ser localizável pelo código de barras da própria nota, mas exibida como "NF 32298 · Fornecedor X" na interface.

Processos administrativos (compras, plano de ação, comercial)

O módulo não é só de campo. Os templates de Processo de Compras (solicitação → cotação → aprovação → pedido → recebimento → conferência fiscal → pagamento), Plano de Ação 5W2H (planejamento → execução → verificação de eficácia → encerramento) e Pipeline Comercial B2B (prospecção → qualificação → apresentação → proposta → negociação → fechamento) demonstram que qualquer processo com etapas, responsáveis, prazos, aprovações e evidência documental cabe no mesmo motor — com o mesmo Kanban, o mesmo SLA e o mesmo BI.

Etiqueta QR como interface única

Combinação transversal que vale destacar isoladamente, por ser a que mais reduz treinamento:

QR colado em…Aponta para…O operador vê
Ativo / sala / veículochecar-andamento/:duracao/:categoriaO processo em andamento ou um novo já criado
Item de cadastrobase-dados/link-tagFicha do ativo, tags relacionadas e próxima etapa
Malote impressocódigo de barras do maloteConferência da embalagem secundária
Equipamento rastreadortrackFicha do equipamento e envio de posição
Tag gerada em lotefluxo de início com prefixo/produto/descriçãoProcesso pré-configurado pronto para iniciar

Offline-first e sincronização

Requisito de operação de campo, e um diferencial que raramente sobrevive à prova real:

  • Vínculo de tag offline: enfileira a requisição e grava a tag localmente já com categoria e

snapshot de etapas (buscando a configuração de uma tag existente da mesma categoria, ou dos tipos em cache), para que o operador possa continuar registrando etapas imediatamente.

  • Registro de etapa offline: gravado local e enviado ao reconectar; as telas mostram pendências

e oferecem envio manual.

locais — campos database funcionam sem rede.

  • Consulta offline: painel e listagens servem os status operacionais do banco local; os status

que exigem agregação do servidor são escondidos quando não há conexão (em vez de mostrar número errado).

  • Leitura indexada: as tags de uma categoria são lidas por índice composto no banco local

(O(log n)), não por varredura.

  • Recuperação: envio de pendentes, limpeza de dados locais e recriação do banco local

disponíveis na interface (com confirmação, já que pendências seriam perdidas).


Subsídios para validação de sistema (ERU/URS)

Esta seção mapeia as capacidades do módulo aos requisitos típicos de especificação de requisitos do usuário em ambiente regulado. Cada linha é redigida como um requisito verificável.

Rastreabilidade e integridade do registro

#RequisitoComo o módulo atendeReferência
R-01Todo registro deve identificar quem executou, quando e ondeUsuário, data/hora, coordenadas e endereço geocodificado são gravados automaticamente em todo registro de etapaCatálogo de tipos de campo, Registrar uma etapa
R-02A coordenada não pode ser nula, zerada ou arbitráriaInvariante explícita: nunca grava (0,0); acurácia mínima configurável (35 m nativo / 85 m desktop); ponto manual é autoritativo e definido por ação do usuário
R-03O histórico de execução não pode ser alterado pela mudança de configuraçãotag.checkpoints é snapshot no vínculo; a propagação da nova configuração é ação explícita ("Revincular tags")Relação entre as entidades
R-04Cada campo deve ter identidade estável independente do rótuloCheckpointField.id é UUID imutável, preservado no rename, e é a chave de dimensão do BI
R-05O sistema deve suportar evidência objetiva (imagem, assinatura, documento)Foto (com modo somente câmera, sem galeria), assinatura em canvas, arquivo, OCR, NF-e, leitura de códigoCatálogo de tipos de campo
R-06Evidência de imagem pode ser obrigatória por etapaFlag image_required, validada no salvamentoConfiguração da etapa, Registrar uma etapa
R-07Registro sem conexão não pode ser perdidoFila offline com envio ao reconectar e indicação de pendênciaOffline-first e sincronização

Controle de mudanças e configuração

#RequisitoComo o módulo atendeReferência
R-10Toda alteração de configuração de processo deve ser atribuível e datadaTrilha de auditoria por transação, com usuário e horário, navegável na interfaceAuditoria e reversão de versão
R-11Deve ser possível inspecionar o antes/depois de uma alteração"Ver alterações" abre a trilha campo a campo da transaçãoAuditoria e reversão de versão
R-12Deve ser possível reverter uma alteração de configuraçãoReversão recompõe o mesmo PUT atômico com os valores anteriores (campos JSON completos, sem perda)Auditoria e reversão de versão
R-13Remoção de etapa não pode destruir históricoRemoção é lógica (dt_ina); tags paradas na etapa removida ganham coluna virtual somente leitura no KanbanCinco caminhos para criar um fluxo
R-14Alteração de configuração parcial não pode apagar configurações irmãsTodas as escritas de config fazem merge local antes de enviarCinco caminhos para criar um fluxo
R-15Configuração inconsistente não deve ser publicávelValidações de salvamento por tipo de campo (agenda, botão, máscara, rota) e validação obrigatória do scriptConfiguração da etapa

Controle de acesso

#RequisitoComo o módulo atendeReferência
R-20Acesso por função, com granularidade de operação12 códigos de permissão × 4 ações (consultar/inserir/alterar/excluir)
R-21Segregação entre quem desenha o processo e quem o executaCódigos distintos para categorias/etapas (design) e Kanban/Minhas Atividades (execução)
R-22Restrição de visibilidade por área/setorSetores por categoria e por subcategoria; opção de restringir até o histórico
R-23Ação destrutiva/excepcional deve exigir privilégio elevado e justificativaEncerramento forçado exige as quatro ações do Kanban e justificativa obrigatória persistida
R-24Permissão deve ser reavaliada, não presumidaguardPage reavalia a cada entrada na tela; leituras críticas de permissão são reativas (concessão/revogação refletem sem recarregar)
R-25Dado de outro cliente/estabelecimento não deve ser editávelVerificação de estabelecimento no painel torna a tag somente leitura
R-26Informação fiscal pode ser restrita por perfilNF-e é o único tipo com guarda de renderização — não aparece para quem não tem permissão, em nenhuma superfície de exibição

Consistência e qualidade do dado

#RequisitoComo o módulo atendeReferência
R-30Campos obrigatórios devem impedir a conclusão do registroValidação de obrigatoriedade no salvamento, com marcação visualRegistrar uma etapa
R-31Deve haver validação cruzada entre respostasetapa.blockSave bloqueia o salvamento com motivo exibido; recomputado na abertura e a cada alteraçãoAutomação: onFieldChange e onClick
R-32Formato de dados estruturados (documentos, códigos) deve ser validadoMáscaras nativas (CPF/CNPJ/telefone/moeda) + máscara personalizada com validador JSCatálogo de tipos de campo
R-33Duplicidade de identificação deve ser evitávelproibir_duplicidade na categoria; unique_entry em cadastrosOperação
R-34Dados repetidos devem vir de fonte únicaBases de Dados com seleção de item (funcionando offline) em vez de digitaçãoBases de Dados (cadastros reutilizáveis)
R-35Ordem de execução pode ser mandatóriastage_required + restringir_sequencia, com bloqueio visível e explicado ao operadorConfiguração da etapa
R-36Valores monetários devem permitir cálculoMoeda exibida formatada e persistida como númeroCatálogo de tipos de campo

Relato, extração e retenção

#RequisitoComo o módulo atendeReferência
R-40Deve existir relatório por ocorrência, imprimívelRelatório da tag com timeline, evidências, mapa, curva IoT e impressão dedicada por tipo de campoRelatório da tag
R-41Qualquer dado coletado deve ser pesquisávelFiltro avançado sobre todos os campos de todas as etapas, com estratégia por tipo e subcampos
R-42Qualquer dado coletado deve ser mensurávelDimensões dinâmicas de BI por campo, com chave imutável
R-43Deve ser possível extrair dados para análise externaExportação CSV do BI e Excel dos cadastros, com representação legível de tipos complexosImport/Export Excel
R-44Limitações de amostragem devem ser explícitasAviso de truncamento da lista bruta no BI, distinguindo o que vale para o período inteiro

Limites e decisões conhecidas (declarar na validação)

Declarar limites é parte de uma boa especificação. Os seguintes pontos são decisões documentadas, não defeitos:

  1. Exportação de cadastro não aplica a restrição de NF-e — porque a exportação alimenta a

reimportação e omitir coluna causaria perda de dado no ciclo. Integridade prevalece sobre sigilo nesse ponto.

  1. HTML de notas confia na origem — o HTML de campo note é renderizado sem sanitização de

estilo, porque o visual do aviso vem de estilos inline. O HTML é produzido pelo builder visual ou por script de desenvolvedor. Script que monte nota concatenando resposta de API externa deve sanitizar na origem.

  1. Coluna obrigatória em tabela não é validada — a obrigatoriedade da tabela é avaliada no

conjunto, não célula a célula.

  1. Flags dinâmicas em tabela valem por coluna, não por linhareadonly/hidden/required

mutados por script afetam o template da coluna; efeito por linha é suportado para valor e opções.

  1. Opções carregadas por API não são genéricas — hoje só um caso específico é populado

automaticamente; carregar opções dinamicamente se faz via automação (fetch + campo.options).

  1. Detecção de campos tocados pela automação é por expressão regular, não análise sintática:

referência por variável não é detectada (falso negativo aceito em indicador de interface).

  1. Filtro de "Análise de Atrasos" no BI não recorta — não existe parâmetro equivalente na API

para suas fatias, e as categorias de atraso se sobrepõem; a regra do "no prazo" precisa ser definida onde os agregados são calculados.

  1. alias_identificador só pode ser definido por automação — é decisão de produto, para o

identificador funcional nunca ser substituído por um rótulo.

  1. Alguns canais têm custo — WhatsApp é cobrado por mensagem e só é configurável na tela da

etapa (nunca por script), com aviso obrigatório de custo.

Dúvidas frequentes sobre o

HageTag — motor de rastreabilidade assistida

São dois canais independentes. A notificação de etapa dispara quando alguém registra uma etapa e não depende de sensor nenhum: vai por e-mail, push ou WhatsApp, para os destinatários que você definiu, com os campos que escolher expor — e pode ser condicional, saindo apenas quando houve recusa de recebimento, avaria ou divergência. O alerta de IoT depende de equipamento vinculado, vigia continuamente enquanto durar a operação e dispara quando uma leitura viola a faixa. Uma operação totalmente manual usa notificação de etapa normalmente. Quando há IoT, a notificação de encerramento pode ainda levar o relatório com a curva contínua de todos os equipamentos que participaram do processo.

HageTag é o motor de rastreabilidade assistida da HageLab: uma plataforma configurável em que você modela um processo físico como fluxo digital — etapas, campos, responsáveis, evidências e regras de negócio. Além de registrar o que aconteceu, ele orienta o operador durante a execução, valida a regra no ato do registro e pode bloquear o avanço quando uma condição crítica não é satisfeita. Serve para rastreabilidade de amostras, vacinas, hemocomponentes, medicamentos, malotes, cargas, ativos e qualquer processo que tenha etapas, responsáveis e necessidade de prova.

A integração é nos dois sentidos. A telemetria fornece dados físicos contínuos ao processo — temperatura, umidade, localização, abertura de porta — e o HageTag fornece contexto operacional à telemetria, informando quando o equipamento entra e sai de operação. Isso permite vincular a curva de temperatura à operação correta, aplicar alertas apenas quando o equipamento está efetivamente em uso (reduzindo notificação irrelevante de baú parado ou câmara vazia) e automatizar o envio de relatórios contendo a telemetria e as demais evidências do processo.

Não. O HageTag funciona com registro manual: o operador informa a temperatura no formulário e anexa foto do termômetro ou do datalogger como evidência. O sensor entra quando a operação exige medição contínua, quando é preciso comprovar a curva inteira do transporte ou quando a norma exige instrumento calibrado. Nesse caso a medição passa a ser automática e a curva aparece com os checkpoints de cada etapa sobrepostos.

Ele inclui as duas coisas, mas não se resume a elas. O formulário é dinâmico de verdade: campo pode ficar obrigatório ou oculto conforme a resposta de outro campo, valor pode ser calculado, opção pode vir de uma base de dados ou de uma API externa, e a regra pode impedir a conclusão da etapa. São 28 tipos de campo, incluindo foto com câmera obrigatória, assinatura, leitura de QR Code e código de barras, OCR, NF-e, endereço, agenda, roteirização e tabela repetível.

Não, e a distinção é importante. O ERP sabe o que deveria acontecer, o TMS resolve frete e documento fiscal, o LIS cuida da fase analítica do exame e o sistema de vacinação faz a gestão do imunobiológico e o envio ao PNI. O HageTag cobre a camada que nenhum deles cobre: a execução física, a cadeia de custódia, a condição do produto e a evidência auditável de cada etapa. Ele se integra a esses sistemas por API ou webhook.

Depende da operação. RDC 430/2020 para distribuição, armazenagem e transporte de medicamentos; RDC 504/2021 para transporte de material biológico humano; RDC 978/2025 para laboratórios clínicos; RDC 197/2017 para serviços de vacinação; Portaria GM/MS 11.685/2026 e RDC 34/2014 para o ciclo do sangue; UN 3373 para embalagem de substância biológica; e LGPD para dado pessoal sensível. O sistema digitaliza e documenta os requisitos de rastreabilidade e registro — a medição que a norma aceita vem de instrumento calibrado, e o licenciamento continua do estabelecimento.

Sim. O preenchimento do formulário, a foto, a assinatura, a leitura de código e a conferência funcionam offline; os cadastros ficam no próprio aparelho. Ao reconectar, tudo sincroniza. Área rural, subsolo, estrada sem cobertura e condomínio sem sinal são caso de uso previsto, não exceção.

Cada HageTag recebe um identificador próprio, que pode ser impresso como QR Code ou código de barras e colado no item, no malote, na caixa térmica ou no equipamento. A leitura pelo aplicativo identifica o processo sem digitação, registra automaticamente responsável, data, hora, coordenada e endereço geocodificado, e abre a etapa correta. O código também é legível à mão: o alfabeto usado evita caracteres ambíguos.

Não. O fluxo é montado visualmente: você cria a categoria, define etapas, arrasta campos e configura regras sem escrever código. Há também templates prontos, importação de configuração estruturada e um assistente de IA que desenha o processo a partir da sua descrição. Automação em JavaScript existe para quem precisa de regra complexa, validação cruzada entre etapas ou integração com sistema externo — é extensão, não requisito.

Usuário que preencheu, data e hora, coordenada, endereço geocodificado e a leitura do equipamento IoT vinculado entram em todo registro automaticamente, sem campo configurado. Somam-se a isso as evidências que você exigir na etapa: foto com câmera obrigatória, assinatura eletrônica, canhoto, arquivo anexado, leitura de código, nota fiscal e temperatura. Tudo compõe a linha do tempo da HageTag e o relatório imprimível.

Há duas trilhas distintas. A auditoria da operação responde quem executou, quando, onde, o que informou e sob qual condição física. A auditoria da configuração responde quem alterou a regra, quando, o que mudou e qual versão estava valendo — com inspeção campo a campo e possibilidade de reverter a versão. O que já foi coletado permanece exatamente como foi coletado, mesmo depois de o formulário mudar.

Sim, por API e webhook nos dois sentidos: o HageTag pode consultar um sistema externo durante o preenchimento da etapa (confirmando pedido, contrato ou liberação com o operador ainda no local) e pode notificar o seu ERP no momento em que a etapa é concluída. Também lê NF-e por chave de acesso ou QR e permite embutir um widget de solicitação no seu próprio site.

Fale com um Especialista

Solicite uma apresentação
O que você deseja monitorar?

Ou se preferir, chame diretamente no WhatsApp:

Fale conosco

Inicie a transformação digital do seu negócio com a HageTag — motor de rastreabilidade assistida!

Desvende a plataforma que impulsiona sua capacidade de analisar, monitorar e proteger com precisão seus ativos.