Sistema de Rastreabilidade com HageTag

A HageTag é a única solução que garante rastreabilidade completa do sensor ao laudo. Integrada ao ecossistema HageLab, ela cria uma cadeia de custódia digital validada, registrando automaticamente cada etapa da operação por meio de QR Codes inteligentes, automações em tempo real e registros protegidos por Blockchain.

Conceito Fundamental

Entenda as HageTags

A base da tecnologia HageLab para controle, rastreamento e automação de processos físicos e digitais.

O que é uma HageTag?

Uma HageTag é a identidade digital única de qualquer ativo, item ou processo no sistema. Ela conecta o objeto do mundo real (seja uma carga, um malote ou uma ordem de serviço) ao seu fluxo de dados na nuvem.

Estrutura e Vínculo

Cada tag está vinculada a uma Categoria que define suas regras e etapas. Ela armazena histórico ordenado, responsável atual, geolocalização, prazos previstos e status do checkpoint.

Versatilidade IoT e Manual

Pode operar via QR Code/Barra lido por aplicativo móvel ou integrada a sensores IoT (telemetria), transmitindo temperatura, umidade e GPS de forma automática sem intervenção humana.

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. Acompanhar no Kanban/BI: Visualização em tempo real do status das tags em quadros Kanban, indicadores em dashboards e alertas operacionais.
  • 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).

Com IoT vs Sem IoT

Com IoT (Telemetria): Quando vinculada a um equipamento físico, o sistema capta dados automaticamente (temperatura, umidade, localização GPS, abertura de portas). Qualquer anormalidade notifica os grupos de alertas imediatamente.

Sem IoT (Checkpoints Manuais): O avanço ocorre por coleta manual. Os operadores preenchem formulários dinâmicos com fotos, assinaturas digitais, leitura de QR Codes/OCR, gerando registros offline com GPS, data e autor rastreáveis.

O que você ganha com essa solução

  • Visibilidade total: Saiba a localização exata de cada processo.
  • Decisão ágil: Evite gargalos ou desvios de rota na sua operação.
  • Checklists dinâmicos: Condicionais personalizadas por operação.
  • Redução de erros: Padronize a coleta de informações da equipe.
  • Segurança da informação: Evidências digitais com validade auditável.
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.

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

Para Desenvolvedores & IA

Especificações Técnicas de Automação (onFieldChange)

Documentação completa com todas as variáveis globais, tipos de dados e funções disponíveis para configuração de scripts avançados na HageTag.

1. Postura Esperada da IA

POSTURA ESPERADA (atue como consultor, não como mero transcritor):
  • O usuário normalmente NÃO sabe tudo o que o sistema permite. Cabe a você enxergar oportunidades de
    melhorar o processo dele com automações de onFieldChange e propô-las proativamente.
  • Antes de gerar qualquer JSON/YAML/script final, descubra o processo real do usuário. Não transforme
    uma descrição vaga em configuração definitiva. Faça perguntas curtas, uma rodada por vez, até ter
    dados suficientes para criar algo preciso.
  • SEMPRE pense em como o onFieldChange pode tornar o fluxo melhor: menos digitação, menos erros,
    preenchimento automático, validações condicionais, reaproveitamento de etapas anteriores (tagFull),
    destaque no painel (campo.important) e notificações no momento certo.
  • SEMPRE valide o desenho proposto (campos + regras de onFieldChange + notificações) com o usuário,
    em linguagem simples, ANTES de entregar o código.
  • SEMPRE pergunte se ele quer ser notificado por e-mail em alguma etapa/situação a partir de uma
    resposta do formulário. Se ele escolher um canal com CUSTO (WhatsApp e similares), avise sobre o
    custo e peça confirmação explícita antes de configurar.
  • Faça perguntas curtas quando faltar informação. Não presuma; confirme.

2. Levantamento Obrigatório Antes de Gerar

LEVANTAMENTO OBRIGATÓRIO ANTES DE GERAR O PROCESSO OU SCRIPT:

  PASSO 0 — PERGUNTE PRIMEIRO O NÍVEL DE DETALHAMENTO (obrigatório, antes de qualquer outra pergunta):
  Pergunte ao usuário qual nível de detalhamento ele quer para o processo:

    • SIMPLIFICADO — o essencial para funcionar. Faça POUCAS perguntas (foque só no objetivo, nas
      etapas principais e nos campos indispensáveis). Gere um processo ENXUTO.
    • MÉDIO — equilíbrio entre simplicidade e controle. Faça um conjunto MODERADO de perguntas.
    • DETALHADO — máxima rastreabilidade e controle. Faça TODAS as perguntas relevantes abaixo.

  CALIBRE TUDO PELO NÍVEL ESCOLHIDO. Em seguida, faça as perguntas abaixo na medida do nível escolhido:

  1) Objetivo do processo: qual resultado o fluxo precisa garantir e qual problema ele resolve?
  2) Etapas reais: quais fases existem hoje, quem executa cada uma e o que marca início/fim?
  3) Dados coletados: quais informações são obrigatórias, quais são opcionais e quais podem ser
     calculadas automaticamente?
  4) Regras e exceções: quando ocultar/exigir campos, reprovar, alertar, bloquear avanço ou destacar
     algo no painel?
  5) Dados repetidos: existem clientes, produtos, setores, equipamentos, transportadoras, locais,
     contratos ou tabelas que deveriam virar Base de Dados?
  6) Agenda e prazos: há visitas, coletas, entregas, retornos, vencimentos, SLA ou tarefas futuras que
     deveriam virar Agenda em vez de simples campo de data?
  7) Notificações: quem deve ser avisado, por e-mail, em qual situação? Peça nome e e-mail reais.
  8) Evidências: precisa de foto, assinatura, arquivo, OCR, QR code, código de barras, NF-e, endereço ou
     geolocalização?
  9) Relatórios e painel: quais campos precisam aparecer na linha do tempo, no dashboard/Kanban ou em
     relatórios compartilhados?
  10) Integrações: há API externa, planilha, ERP, CRM ou outro sistema que precise consultar ou receber
      dados?

3. Gatilhos de Execução do Script

O script possui suporte nativo para operações assíncronas (async/await) e exibe um indicador de carregamento automaticamente durante a execução.

GATILHOS DE EXECUÇÃO:
  • Ao ABRIR o formulário: executa uma vez com a variável "campo" vazia (campo.label fica
    '' / indefinido) para inicializações; e depois uma vez para cada campo pré-preenchido.
  • Ao ALTERAR dados: roda a cada alteração de valor, onde a variável "campo" representa
    exatamente o input modificado.
  • Prevenção de loop/processamento: toda regra deve ser protegida por uma condicional
    (ex: if (campo.label === 'Nome')) para evitar reprocessamento a cada tecla digitada.

4. Tipos de Campos e Formatos (campo.value)

TIPOS DE CAMPO DISPONÍVEIS:

  text            — texto curto (uma linha)
  number          — número
  date            — data ('AAAA-MM-DD')
  datetime-local  — data e hora ISO
  email           — endereço de e-mail
  tel             — telefone
  textarea        — texto longo (múltiplas linhas). Marque readonly:true quando o valor for
                    calculated e precisar SER SALVO.
  note            — NUNCA é salvo — instrução exibida ao operador ENQUANTO preenche: texto
                    simples OU HTML. Se for HTML, o rótulo é ocultado automaticamente.
  select          — lista suspensa (escolha única) — exige options: []
  radio           — opções em linha (escolha única) — exige options: []
  checkbox        — múltipla escolha — exige options: []
  switch          — chave liga/desliga (boolean)
  list            — lista de itens livres (aceita leitura QR/barcode)
  malote          — embalagem secundária. Retorna objeto { id: string, data: string[] }
  photo           — captura ou upload de foto (base64)
  signature       — assinatura digital (base64)
  barcode         — leitura de código de barras ou QRcode
  qrcode-ocr      — leitura de QR code ou OCR
  ocr             — reconhecimento de texto em imagem
  table           — sub-formulário repetível por linha (aceita colunas configuráveis em table[])
  file            — upload de arquivo (array de { file: base64, name: string })
  address         — endereço com geolocalização ({ formatted_address, logradouro, bairro,
                    cidade, estado, cep, lat, lng })
  nfe             — leitura de NF-e ({ numero, chave_acesso, emitente, destinatario,
                    resumida: { produtos: [] }, valor_total })
  schedule        — vínculo com evento de agenda (exige agendaId)
  database        — vínculo com item de Base de Dados (exige baseDadosId, baseDadosNome,
                    baseDadosLayout[])
  routing         — roteiro de paradas (rota) ({ origin, items[] })
  action-button   — botão de ação que executa JS (campo.onClick) ao ser clicado pelo operador
  masked          — texto com máscara automática (maskType: 'cpf', 'cnpj', 'cpf_cnpj',
                    'currency', 'phone')
Tipo de Campo Formato de Recebimento / Armazenamento
text, textarea, email, tel, barcode, qrcode-ocr, ocr String (Texto puro)
number String (Exige conversão via Number(campo.value) para uso em cálculos)
date String no formato 'AAAA-MM-DD'
datetime-local String no formato ISO 8601 (ex: '2025-01-30T14:00:00.000Z')
select, radio String (Exige a configuração prévia da propriedade options: [])
checkbox, list Array de strings (string[])
switch Boolean (true para ligado, false para desligado)
photo, signature String contendo imagem em base64
file Array de objetos { file: base64, name: string }
address Objeto: { formatted_address, logradouro, bairro, cidade, estado, cep, lat, lng }
nfe Objeto: { numero, chave_acesso, emitente, destinatario, resumida: { produtos: [] }, valor_total }
malote Objeto: { id: string, data: string[] }
schedule Number (ID do evento da agenda selecionado)
database Objeto do item mapeado com ._id e ._label
routing Objeto: { origin, items: [] }
table Array de linhas, onde cada linha é um array de colunas { label, type, value }
action-button String gerada ao executar o campo.onClick (Disparado somente via clique)
masked String formatada visualmente conforme máscara (cpf, currency, etc)
note String simples ou HTML. Não é salva. Oculta o rótulo se contiver HTML.

5. Variável Global: etapa (Leitura/Escrita)

PROPRIEDADES DA VARIÁVEL ETAPA:
  etapa.campos        — array com todos os campos do formulário atual (mutáveis).
  etapa.identificador — string contendo o nome/descrição da etapa.
  etapa.emails        — objeto { Nome: 'email@dominio.com' } para e-mails condicionais.
                        Atribuir null cancela.
  etapa.blockSave     — string para exibir o motivo e impedir salvamento. Atribuir null
                        libera o salvamento.
PropriedadeDescrição
.campos Array contendo todos os campos do formulário atual, sendo cada item completamente mutável.
.identificador String contendo o nome/descrição da etapa.
.emails Objeto { Nome: 'email@dominio.com' } para disparar e-mails condicionais. Atribuir null cancela.
.blockSave Atribuir uma string exibe o motivo e impede o salvamento. Atribuir true bloqueia genérico. null libera a tela.
Nunca invente nem presuma um endereço de e-mail. Sempre que for usar um e-mail — em etapa.emails ou em qualquer outro lugar — pergunte ao usuário qual endereço utilizar e o nome do destinatário. Os endereços que aparecem nos exemplos desta página (gestor@empresa.com, responsavel@empresa.com) são apenas ilustrativos.

6. Propriedades do campo

PROPRIEDADES DO CAMPO:
  campo.label      — string do nome do campo (ex: 'Resultado').
  campo.value      — valor atual preenchido ou modificado.
  campo.type       — string com o tipo do campo (ex: 'select', 'number').
  campo.required   — boolean (true = obrigatório).
  campo.hidden     — boolean (true = oculto).
  campo.important  — boolean (true = destaque no dashboard/kanban).
  campo.share_info — boolean (true = exibido na linha do tempo pública).
  campo.readonly   — boolean (true = bloqueia edições manuais).
  campo.options    — array com as opções para campos select, radio, checkbox.
PropriedadeDescrição
.labelString do nome do campo. Usada em testes (if (campo.label === 'X') ou !campo.label).
.valueValor atual preenchido ou modificado.
.typeString com a tipagem original do campo.
.requiredBoolean. Define o preenchimento como obrigatório.
.hiddenBoolean. Oculta dinamicamente o campo do operador.
.importantBoolean. Exibe a informação em destaque no painel Dashboard/Kanban.
.share_infoBoolean. Exibe o conteúdo preenchido na linha do tempo pública.
.readonlyBoolean. Bloqueia edições manuais (usado para resultados automáticos salvos).
.optionsArray contendo as opções para campos select, radio, checkbox.

7. Variável Global: tag (Leitura/Escrita)

PROPRIEDADES DA VARIÁVEL TAG:
  tag.descricao       — string de descrição livre editável da tag atual.
  tag.identificador   — código de identificação global da tag.
  tag.tipo_checkpoint — number com o ID da etapa sendo registrada no momento.
  tag.produto         — objeto com dados IoT vinculados (.imei, .temp_max, .sck).
  tag.prev_next_step  — string ISO 8601 para forçar o prazo da próxima etapa. Aceita null
                        para remover prazos.
PropriedadeDescrição
.descricaoString de descrição livre editável da tag atual.
.identificadorCódigo de identificação global da tag.
.tipo_checkpointNumber com o ID da etapa sendo registrada no momento.
.produtoObjeto com dados IoT vinculados (.imei, .temp_max). O nó .sck possui o snapshot exato dos sensores (lat, lng, temperatura).
.prev_next_stepString ISO 8601 para forçar o prazo da próxima etapa. Aceita null para remover prazos.

8. Histórico e Contexto (Somente Leitura)

HISTÓRICO E CONTEXTO:
  • user: informações do usuário logado (.sub [ID], .nome, .empresa, .estabelecimento, .token).
  • tagFull: objeto com o histórico completo da tag armazenado offline.
  • tagFull.info: array listando todos os registros concluídos no passado
    (ex: tagFull?.ultima_etapa?.adicionais?.['Lote']).

9. Agendas e Bases de Dados

Dois recursos que deixam o processo mais organizado e se conectam ao formulário por meio de campos específicos.

AGENDAS E BASES DE DADOS:
  • BASE DE DADOS (campo "database"): tabela reutilizável de itens cadastrados uma única vez
    — produtos, clientes, transportadoras, setores, equipamentos. Em vez de redigitar os
    mesmos dados em toda etapa, o operador seleciona um item e campo.value vira um objeto
    label→valor com todos os campos daquele item.
  • AGENDA (campo "schedule"): vincula a etapa a um evento com data/hora, participantes,
    local e lembretes. Use sempre que houver uma data FUTURA com algo a ser feito: coleta,
    entrega, visita, manutenção, retorno, vencimento.

QUANDO PROPOR:
  • Dados repetidos ou padronizáveis → proponha uma Base de Dados e um campo "database".
  • Etapa com data a cumprir → proponha uma Agenda e um campo "schedule" em vez de um campo
    "date"/"datetime-local" simples, para aproveitar lembretes, participantes e a visão de
    calendário.
Nunca invente IDs. Se a base ou a agenda já existir, vincule o campo usando o baseDadosId / agendaId real. Se ainda não existir, oriente o usuário a criá-la primeiro nas telas de Bases de Dados / Agendas — só então vincule o campo.

10. Regras Funcionais Extras & Boas Práticas

REGRAS FUNCIONAIS EXTRAS & BOAS PRÁTICAS:
  • Persistência de Bloqueios: Ao usar etapa.blockSave, o bloqueio continua existindo até
    que a incompatibilidade mude e o script o defina explicitamente como null.
  • Mensagens de Orientação (Sem Salvar): Para alertas coloridos na tela sem poluir o banco
    de dados, modifique o HTML do campo do tipo note. Para campos gravados, utilize
    textarea com .readonly = true.
  • Notificações Pagas (WhatsApp): Disparos via WhatsApp possuem custo por mensagem e não
    são executados dinamicamente via script; devem ser configurados na interface da
    plataforma.
Modelos: Galeria de Exemplos

1. Campo Obrigatório Condicional

Exige o "Número do Laudo" somente se o resultado for definido como "Reprovado".

// Quando "Resultado" muda:
if (campo.label === 'Resultado') {
  const laudo = etapa.campos.find(c => c.label === 'Número do Laudo');
  if (laudo) {
    laudo.required = campo.value === 'Reprovado';
    laudo.hidden   = campo.value !== 'Reprovado';
  }
}

2. Mostrar / Ocultar Campo

Exibe e torna obrigatório o campo "Observação" apenas em caso de "Não Conforme".

if (campo.label === 'Conformidade') {
  const obs = etapa.campos.find(c => c.label === 'Observação');
  if (obs) {
    obs.hidden   = campo.value !== 'Não Conforme';
    obs.required = campo.value === 'Não Conforme';
  }
}

3. Cálculo de Prazos Automático

Gera a previsão de conclusão adicionando dias ou horas baseados na data informada.

if (campo.label === 'Data de Coleta' && campo.value) {
  const d = new Date(campo.value);
  d.setDate(d.getDate() + 1); // +1 Dia
  d.setHours(d.getHours() + 10); // +10 Horas
  tag.prev_conclusao = d.toISOString();
}

4. Definir Prazo da Próxima Etapa (prev_next_step)

Sobrescreve o limite para a próxima etapa dinamicamente conforme a urgência do processo.

if (campo.label === 'Prioridade') {
  const agora = new Date();
  const horas = campo.value === 'Urgente' ? 2 : 24;
  agora.setHours(agora.getHours() + horas);
  tag.prev_next_step = agora.toISOString();
}

5. Alertas no Dashboard (Importante)

Se a temperatura lida pelo operador fugir da faixa ideal, o registro ganha destaque no Kanban.

if (campo.label === 'Temperatura') {
  const v = Number(campo.value); 
  campo.important = (v < 2 || v > 8); // Fora de 2-8°C
  tag.descricao   = campo.important ? 'ALERTA: ' + v + '°C' : '';
}

6. Nota Informativa com HTML (Não Salva)

Monta um status colorido temporário em um campo tipo 'note' para orientação durante o preenchimento.

if (campo.label === 'Temperatura') {
  const status = etapa.campos.find(c => c.label === 'Status');
  const v = Number(campo.value);
  if (status) {
    status.value = (v < 2 || v > 8)
      ? '<b style="color:#c0392b">⚠ Fora da faixa (2–8°C)</b>'
      : '<b style="color:#27ae60">✓ Dentro da faixa</b>';
  }
}

7. Preenchimento Automático

Recalcula valores acumulados ou totais de acordo com as alterações nos campos envolvidos.

if (campo.label === 'Quantidade' || campo.label === 'Preço Unitário') {
  const qtd   = etapa.campos.find(c => c.label === 'Quantidade');
  const preco = etapa.campos.find(c => c.label === 'Preço Unitário');
  const total = etapa.campos.find(c => c.label === 'Total');
  if (qtd && preco && total) {
    total.value = Number(qtd.value) * Number(preco.value);
  }
}

8. Atualizar Descrição da Tag

Define dinamicamente o título/descrição da tag exibido nos quadros Kanban e relatórios.

if (campo.label === 'Produto') {
  tag.descricao = 'Entrega: ' + campo.value;
}

9. Consulta Externa via Fetch (API Pública)

Consome dados de uma API pública externa e preenche os resultados no formulário.

if (campo.label === 'Status') {
  const valores = { ativo: 10, inativo: 20, pendente: 30 };
  const valorBase = valores[campo.value] ?? 0;
  const numero = etapa.campos.find(c => c.label === 'Número');

  const resp = await fetch('https://economia.awesomeapi.com.br/json/last/USD-BRL');
  const data = await resp.json();
  const dolar = parseFloat(data.USDBRL.bid);

  if (numero) numero.value = (valorBase * dolar).toFixed(2);
}

10. Integração API (Fetch Autenticado)

Carrega opções de um campo Select (Colaboradores) baseando-se no setor escolhido consumindo sua API.

if (campo.label === 'Setor' && campo.value) {
  const colaborador = etapa.campos.find(c => c.label === 'Colaborador');
  if (colaborador) {
    const resp = await fetch('https://sua-api.com.br/colab?setor=' + campo.value, {
      headers: { 'Authorization': 'Bearer ' + user.token },
    });
    const data = await resp.json();
    colaborador.options = data.map(c => c.nome);
  }
}

11. Controle de Itens Faltantes a partir de Etapa Anterior (tagFull)

Mapeia itens registrados no passado e calcula divergências/faltantes enviando e-mail se necessário.

if (!campo.label || campo.label === 'Recebimento malotes') {
  const checkpointId = 539;
  const faltantes = etapa.campos.find(c => c.label === 'Malotes faltantes');
  const recebimento = etapa.campos.find(c => c.label === 'Recebimento malotes');

  const todosMalotes = [...new Set(
    (tagFull?.info ?? [])
      .filter(item => item.tipo_checkpoint === checkpointId)
      .flatMap(item => {
        const lista = item.checkpoint?.campos?.find(c => c.label === 'Lista de malotes');
        return Array.isArray(lista?.value) ? lista.value : [];
      })
      .map(v => String(v).trim())
      .filter(Boolean)
  )];

  const recebidos = Array.isArray(recebimento?.value)
    ? recebimento.value
    : (recebimento?.value ? [recebimento.value] : []);
  const recebidosSet = new Set(recebidos.map(v => String(v).trim()).filter(Boolean));

  const listaFaltantes = todosMalotes.filter(m => !recebidosSet.has(m));

  if (faltantes) {
    faltantes.options = listaFaltantes;
    faltantes.value = [...listaFaltantes];
  }

  etapa.emails = listaFaltantes.length ? { Responsavel: 'responsavel@empresa.com' } : null;
}

12. Botão de Ação (onClick)

Script executado pontualmente apenas ao clicar no botão de ação da etapa.

const numero = etapa.campos.find(c => c.label === 'Número do protocolo');
if (!numero?.value) {
  campo.value = 'Informe o número do protocolo antes de consultar.';
  return;
}

const resp = await fetch('https://api.example.com/protocolo/' + numero.value, {
  headers: { 'Authorization': 'Bearer ' + user.token },
});
const data = await resp.json();

const resultado = etapa.campos.find(c => c.label === 'Status do protocolo');
if (resultado) resultado.value = data.status ?? 'Não encontrado';

campo.value = 'Consultado em ' + new Date().toLocaleString();

etapa.emails = data.status === 'Pendente crítico'
  ? { Responsavel: 'responsavel@empresa.com' }
  : null;

13. Ativar/Pausar Produto IoT (Telemetria)

Liga ou desliga o sensor do produto ao concluir etapas para evitar envio de alertas falsos de temperatura na garagem.

const produtoId = tag.produto?.id ?? tagFull?.produto?.id;

// Inicia operação (Status 1)
if (campo.label === 'Início da viagem' && campo.value && produtoId) {
  await fetch('https://hagelab.com.br/api/produtos/definir-operacao/' + produtoId + '/1', {
    method: 'PUT', headers: { 'Authorization': 'Bearer ' + user.token }
  });
}

// Encerra operação (Status 0)
if (campo.label === 'Assinatura Recebedor' && campo.value && produtoId) {
  await fetch('https://hagelab.com.br/api/produtos/definir-operacao/' + produtoId + '/0', {
    method: 'PUT', headers: { 'Authorization': 'Bearer ' + user.token }
  });
}

14. Enviar E-mail com Base em Resposta

Atribui destinatários para envio automático de relatório da etapa.

if (campo.label === 'Resultado' && campo.value === 'Reprovado') {
  etapa.emails = { Gestor: 'gestor@empresa.com' };
}

15. Bloquear Salvamento

Valida respostas incompatíveis e impede o avanço da tag.

if (!campo.label || campo.label === 'Data coleta' || campo.label === 'Data entrega') {
  const coleta  = etapa.campos.find(c => c.label === 'Data coleta');
  const entrega = etapa.campos.find(c => c.label === 'Data entrega');
  
  if (coleta?.value && entrega?.value && new Date(coleta.value) > new Date(entrega.value)) {
    etapa.blockSave = 'Data de coleta não pode ser posterior à de entrega.';
  } else {
    etapa.blockSave = null; // Libera salvamento
  }
}

Dúvidas frequentes sobre o

Sistema de Rastreabilidade com HageTag

A solução de Rastreabilidade com Tags da HageLab utiliza tags com QR codes para criar checkpoints e checklists personalizados em cada etapa logística. Essas tags podem ser escaneadas por dispositivos móveis, permitindo um registro rápido e preciso das atividades realizadas. Dessa forma, você terá visibilidade instantânea sobre o status e a localização dos seus ativos, além de poder monitorar o cumprimento de procedimentos específicos em cada etapa.

A rastreabilidade em tempo real proporcionada pelas tags oferece diversos benefícios para a sua operação. Você terá maior visibilidade sobre o fluxo de suas atividades, podendo identificar possíveis gargalos, atrasos ou desvios no processo logístico. Além disso, a rastreabilidade em tempo real permite uma tomada de decisão ágil e embasada em informações atualizadas, melhorando a eficiência operacional e garantindo a satisfação dos clientes.

Sim, nossa solução de Rastreabilidade com Tags permite a personalização dos checkpoints e checklists de acordo com as necessidades da sua operação. Você pode definir quais etapas e procedimentos devem ser registrados nas tags, adaptando-os de acordo com os requisitos específicos do seu negócio. Dessa forma, você terá um controle preciso e alinhado com suas necessidades operacionais.

As tags especiais para relatórios de curto tempo permitem que você acesse informações atualizadas sobre a condição e o status dos seus ativos em intervalos regulares. Esses relatórios fornecem dados precisos e em tempo real, que são essenciais para uma tomada de decisão ágil. Com base nesses relatórios, você pode identificar problemas, tomar ações corretivas imediatas e otimizar a eficiência da sua operação.

Através das tags de rastreabilidade, você pode registrar e acessar uma variedade de informações importantes para a sua operação. Isso inclui dados sobre o status das atividades, datas e horários de execução, localização geográfica, identificação dos responsáveis e muito mais. Essas informações são armazenadas de forma organizada e podem ser facilmente acessadas para análises e tomadas de decisão.

Não é necessário nenhum equipamento específico para utilizar as tags de rastreabilidade da HageLab. As tags são projetadas para serem facilmente escaneadas por dispositivos móveis, como smartphones ou tablets. Basta ter um dispositivo com um aplicativo leitor de QR code para utilizar as tags e registrar as informações relevantes em cada etapa logística.

A solução de Rastreabilidade com Tags da HageLab oferece um controle preciso e em tempo real sobre as atividades logísticas. Com a rastreabilidade proporcionada pelas tags, você pode identificar rapidamente qualquer desvio ou problema ao longo do processo, evitando erros e extravios. Além disso, o monitoramento constante das atividades por meio das tags ajuda a criar uma cultura de responsabilidade e melhora a eficiência operacional, reduzindo perdas e aumentando a precisão nas operações logísticas.

Sim, a solução de Rastreabilidade com Tags da HageLab é totalmente compatível com dispositivos móveis. Ela pode ser acessada por meio de smartphones ou tablets, permitindo que você realize o registro e o acompanhamento das atividades em qualquer lugar e a qualquer momento. Isso oferece flexibilidade e mobilidade para a sua equipe, mantendo-os conectados e atualizados em tempo real.

Ao utilizar a solução de Rastreabilidade com Tags em conjunto com outras soluções da HageLab, você pode obter uma integração completa em sua operação logística. Isso permite a troca de informações entre as soluções, proporcionando uma visão abrangente e integrada da sua cadeia de suprimentos. Com a integração, você terá acesso a dados consolidados, análises avançadas e poderá tomar decisões estratégicas embasadas em informações precisas e atualizadas.

A integração da solução de Rastreabilidade com Tags da HageLab na sua operação logística existente é feita de forma personalizada e alinhada às suas necessidades. Nossa equipe de especialistas irá auxiliá-lo no processo de integração, desde a configuração dos checkpoints e checklists até a implementação e treinamento da equipe. Assim, você poderá aproveitar todos os benefícios da solução sem interromper suas operações, garantindo uma transição suave e eficiente.

Clique no botão abaixo para preencher o formulário. Nossos especialistas entrarão em contato dentro do horário comercial, de segunda à sexta.

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 Sistema de Rastreabilidade com HageTag!

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