1) Cadastro do produtor — funcionamento offline, QR Code e sincronização

Documentação exclusiva do aplicativo G10 Bio UTG.

Offline-first SQLite Cadastro do produtor QR Code Fila de sincronização Aprovação no ERP

Resumo do fluxo

A UTG cadastra o produtor no aplicativo, mesmo sem internet. O cadastro é salvo primeiro no SQLite e recebe um client_event_id e um pairing_code gerados localmente.

Assim que o cadastro é salvo, o aplicativo da UTG exibe um QR Code contendo o mesmo pairing_code. O produtor lê esse QR Code no aplicativo G10 Bio Produtor.

Os dois aplicativos armazenam seus registros em filas locais e enviam os dados ao ERP quando houver internet. O ERP cruza os dois envios pelo pairing_code e somente disponibiliza a aprovação quando o cadastro da UTG e a leitura do produtor tiverem sido recebidos.

Princípios obrigatórios

  • O cadastro deve funcionar sem internet.
  • O registro deve ser salvo no SQLite antes de qualquer tentativa de envio.
  • O QR Code deve ser exibido imediatamente após o salvamento local.
  • O pairing_code deve ser criado no aparelho da UTG e ser único.
  • O client_event_id deve impedir duplicidade nos reenvios.
  • O cadastro deve permanecer na fila até a confirmação da API.
  • O aplicativo da UTG não aprova o dispositivo do produtor.
  • A aprovação ou rejeição será feita por um funcionário no ERP.

Pré-requisito do aplicativo da UTG

Este endpoint é protegido. O aplicativo da UTG já deve possuir:

X-APP-KEY: <APP_KEY_FIXA_DO_APP_UTG>
X-DEVICE-TOKEN: <DEVICE_TOKEN_DA_UTG>

O DEVICE_TOKEN identifica qual UTG está utilizando o aplicativo. Por isso, o corpo da requisição não deve aceitar um id_utg informado livremente pelo aparelho.

Fluxo no aplicativo da UTG

  1. O usuário abre a função de cadastrar produtor.
  2. Preenche os dados cadastrais disponíveis.
  3. O aplicativo gera um client_event_id único.
  4. O aplicativo gera um pairing_code único.
  5. Salva o cadastro no SQLite.
  6. Inclui o registro na fila de sincronização.
  7. Exibe o QR Code contendo o pairing_code.
  8. O produtor lê o QR Code usando o aplicativo Produtor.
  9. Havendo internet, o aplicativo tenta enviar o cadastro.
  10. Em caso de falha, mantém o registro na fila para nova tentativa.
  11. Após confirmação da API, remove apenas a pendência da fila.
  12. Mantém localmente o cadastro e a situação do vínculo.

Dados salvos no SQLite

client_event_id
pairing_code
nome
documento
telefone
email
endereco
numero
bairro
cep
cidade
uf
latitude
longitude
dados_cadastro_json
status_envio
status_vinculo
tentativas_envio
ultima_tentativa_em
criado_em
atualizado_em

Geração do pairing_code

O código deve ser gerado localmente antes da sincronização. Ele será o vínculo entre o cadastro enviado pela UTG e a leitura enviada pelo aplicativo do produtor.

Exemplo:
bio_prod_550e8400-e29b-41d4-a716-446655440000

Comportamento offline

O cadastro e a exibição do QR Code não dependem de internet.

SEM INTERNET
→ gerar client_event_id
→ gerar pairing_code
→ salvar cadastro no SQLite
→ inserir na fila local
→ exibir QR Code
→ aguardar próxima sincronização

O produtor também poderá ler e salvar o QR Code offline. Os dois envios podem chegar ao ERP em ordens diferentes.

Endpoint: enviar cadastro do produtor

POST https://institutog10bio.com.br/router/action.php

Headers

X-APP-KEY: <APP_KEY_FIXA_DO_APP_UTG>
X-DEVICE-TOKEN: <DEVICE_TOKEN_DA_UTG>

Body

action=apiG10bio_utg
f=receber_cadastro_produtor
client_event_id=<UUID_GERADO_PELO_APP>
pairing_code=<CODIGO_EXIBIDO_NO_QRCODE>
dados_cadastro=<JSON_DO_PRODUTOR>

Exemplo de dados_cadastro

{
  "nome": "José da Silva",
  "documento": "12345678900",
  "telefone": "16999999999",
  "email": "jose@email.com",
  "endereco": "Sítio Boa Esperança",
  "numero": "S/N",
  "bairro": "Zona Rural",
  "cep": "13660000",
  "cidade": "Porto Ferreira",
  "uf": "SP",
  "latitude": -21.8532000,
  "longitude": -47.4795000
}

O JSON pode receber outros campos do cadastro, desde que sejam documentados e preservados pela API.

Resposta: cadastro recebido e aguardando produtor — HTTP 200

{
  "success": true,
  "msg": "Cadastro recebido e aguardando leitura do produtor.",
  "data": {
    "status": "AGUARDANDO_PRODUTOR",
    "client_event_id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
    "pairing_code": "bio_prod_xxxxxxxxxxxxxxxxx",
    "cadastro_id": 45,
    "producer_request_received": false
  }
}

Após essa resposta, remover o registro da fila de envio. Manter o cadastro salvo localmente com o status AGUARDANDO_PRODUTOR.

Resposta: cadastro pronto para aprovação — HTTP 200

{
  "success": true,
  "msg": "Cadastro recebido e pronto para aprovação.",
  "data": {
    "status": "PRONTO_APROVACAO",
    "client_event_id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
    "pairing_code": "bio_prod_xxxxxxxxxxxxxxxxx",
    "cadastro_id": 45,
    "producer_request_received": true
  }
}

Essa resposta indica que a leitura do aplicativo Produtor já havia chegado ao ERP e os dois registros foram relacionados.

Idempotência e reenvio

O mesmo client_event_id pode ser reenviado quando houver falha de comunicação. A API não deve criar outro cadastro.

MESMO client_event_id + MESMO pairing_code
→ retornar o registro já recebido

MESMO client_event_id + pairing_code DIFERENTE
→ HTTP 409 request_conflict

O aplicativo só deve remover o item da fila quando receber uma resposta de sucesso da API.

Ordem de chegada dos dados

Cadastro da UTG chega primeiro

UTG envia cadastro
→ status AGUARDANDO_PRODUTOR
→ produtor envia leitura depois
→ ERP relaciona pelo pairing_code
→ status PRONTO_APROVACAO

Leitura do produtor chega primeiro

Produtor envia leitura
→ solicitação permanece PENDENTE
→ UTG envia cadastro depois
→ ERP relaciona pelo pairing_code
→ status PRONTO_APROVACAO

Regra para aparecer no ERP

A solicitação só pode ser apresentada como pronta para aprovação quando existirem os dois lados:

Cadastro enviado pelo aplicativo da UTG
+
Leitura do QR Code enviada pelo aplicativo do Produtor
+
Mesmo pairing_code
=
PRONTO_APROVACAO

Enquanto apenas um dos lados tiver chegado, o ERP deve informar que o vínculo ainda está incompleto.

O que acontece após a aprovação no ERP

  1. O ERP valida o cadastro enviado pela UTG.
  2. Localiza ou cria o produtor na tabela clientes.
  3. Cria ou confirma o vínculo em programas_utgs_produtores.
  4. Gera o DEVICE_TOKEN definitivo do aparelho do produtor.
  5. Atualiza a solicitação para APROVADO.
  6. O aplicativo Produtor recebe o token pelo endpoint consultar_status_vinculo.
  7. O aplicativo da UTG poderá receber o novo status em uma sincronização posterior.

Erros comuns

Em falhas de rede ou erro temporário do servidor, manter o item na fila e tentar novamente.

Regra da fila local

status_envio = PENDENTE
→ tentar enviar quando houver internet

HTTP 200 / success = true
→ remover da fila de envio
→ manter cadastro salvo no SQLite
→ atualizar status_vinculo retornado pela API

ERRO DE REDE OU HTTP 5xx
→ manter na fila
→ incrementar tentativas_envio
→ registrar ultima_tentativa_em

HTTP 400, 403 ou 409
→ manter o cadastro local
→ marcar como ERRO_VALIDACAO
→ exibir a mensagem para correção

NÃO IMPLEMENTAR no aplicativo da UTG

  • Aprovação ou rejeição do aparelho do produtor.
  • Criação direta do DEVICE_TOKEN do produtor.
  • Inserção direta em tabelas do ERP.
  • Envio livre de id_utg no corpo da requisição.
  • Uso do documento do produtor como pairing_code.
  • Dependência de internet para salvar o cadastro ou exibir o QR Code.
  • Remoção do registro local antes da confirmação da API.
  • Reaproveitamento do mesmo pairing_code para produtores diferentes.

Checklist de implementação

  • Cadastro salvo primeiro no SQLite.
  • client_event_id único por cadastro.
  • pairing_code único por produtor.
  • QR Code exibido imediatamente após salvar.
  • Fila local com tentativas de reenvio.
  • APP_KEY e DEVICE_TOKEN enviados nos headers.
  • JSON completo preservado em dados_cadastro.
  • Tratamento idempotente do reenvio.
  • Status local atualizado com a resposta da API.
  • Aprovação mantida exclusivamente no ERP.