Fluxo resumido
-
ERP cria um pedido de serviço (análise) e gera um QRCode
coleta_analiseapontando parapedidos. - App abre “Iniciar coleta” e escaneia o QRCode do recipiente.
-
App gera um
client_event_idúnico para este evento, salva localmente os dados da coleta e registra o item na fila/outbox com status pendente de envio. -
App tenta sincronizar com a API enviando
data,hora,latitude,longitude,qrcodeeclient_event_id e até 2 fotos da coleta (foto_1 e foto_2).. -
API valida autenticação, valida o QRCode, identifica o pedido, processa a coleta e
controla a idempotência pelo
client_event_id. -
Se a API responder
success=true, o app deve marcar o evento como sincronizado e removê-lo da fila local. Se a API responder erro, o evento deve permanecer salvo localmente para novo envio posterior usando o mesmoclient_event_id.
Endpoint: Procedimento da coleta
POST https://agroecologia.grupoekos.com.br/router/action.php
Headers
X-APP-KEY: <APP_KEY_FIXA_DO_APP>
X-DEVICE-TOKEN: <DEVICE_TOKEN>
Body
action=apiG10
f=coleta_analise
client_event_id=<UUID>
qrcode=<CONTEUDO_DO_QR>
data=YYYY-MM-DD
hora=HH:MM:SS
latitude=<LAT>
longitude=<LON>
foto_1=(ARQUIVO_OU_BASE64)
foto_2=(ARQUIVO_OU_BASE64)
Respostas esperadas da API
Sucesso (HTTP 200)
{
"success": true,
"msg": "Coleta de análise registrada com sucesso.",
"data": {
"qrcode": "CA_...",
"cliente_id": 123,
"device_id": 999,
"account_type": "produtor",
"client_event_id": "550e8400-e29b-41d4-a716-446655440000",
"codigo_referencia": "SE1001",
"descricao_referencia": "ANÁLISE DE SOLO"
}
}
Reenvio idempotente (HTTP 200)
{
"success": true,
"msg": "Evento já registrado (idempotente).",
"data": {
"already_registered": true,
"client_event_id": "550e8400-e29b-41d4-a716-446655440000"
}
}
Erro (HTTP != 200)
{
"success": false,
"error": "invalid_qrcode",
"msg": "QR Code da coleta inválido ou não encontrado.",
"data": {}
}
client_event_id.
O app deve reutilizar o mesmo client_event_id em todos os reenvios do mesmo evento.
Modo de operação do app (offline-first)
- O app deve sempre trabalhar em offline-first, mesmo quando houver internet disponível.
- Ao escanear o QRCode, o app deve primeiro salvar o evento em banco local no aparelho.
-
No mesmo momento, deve gerar um
client_event_idúnico e associá-lo ao evento local. - O evento deve entrar em uma fila/outbox de sincronização para envio ao ERP.
- Se o envio falhar por timeout, queda de internet ou erro transitório, o evento deve permanecer salvo localmente e continuar pendente de sincronização.
-
Em cada novo envio do mesmo evento, o app deve reutilizar exatamente o mesmo
client_event_id. -
Quando a API responder
success=true, o app deve marcar o evento como sincronizado e removê-lo da fila local. -
Quando a API responder
success=truecomalready_registered=true, o app também deve considerar o evento como concluído, removendo-o da fila local. -
Somente respostas com
success=falsedevem manter o evento pendente para novo envio, conforme a política de retry do aplicativo.
Como a API identifica a análise
A API consulta o pedido (pedidos) e busca o item de serviço de análise em
pedidos_itens.id_produto_referencia, relacionando com produtos_referencia
e produtos.
produtos.id_categoriadeve ser 5 (Serviços)produtos.id_subcategoriadeve ser 5 (Análises)-
Campos retornados ao app:
produtos_referencia.codigo_referenciaeprodutos_referencia.descricao_referencia.
Regras das fotos - atualizado 23/04/26.
Quando houver fotos da coleta, elas também devem ser salvas localmente no aparelho antes de qualquer tentativa de envio. Essas fotos devem permanecer vinculadas ao mesmo client_event_id do evento de coleta. Se a sincronização falhar, o evento e suas fotos devem continuar pendentes para novo envio posterior.
- Tamanho máximo recomendado: 5 MB por foto
- Nos reenvios do mesmo evento, o app deve reutilizar o mesmo client_event_id e reenviar novamente as fotos vinculadas àquele evento, quando existirem.