Objetivo deste fluxo
Registrar o recebimento do Kit de Aplicação no ERP a partir do app, usando o QR Code colado
na caixa. O app envia QR do kit + data/hora + geolocalização + client_event_id e a API
valida com base no DEVICE_TOKEN (identifica o cliente automaticamente). A idempotência é
controlada pelo client_event_id.
Como funciona no app (passo a passo)
- O usuário entra no menu Entrega → Kit de Aplicação (disponível para produtor e colaborador).
- O app exibe: “Escaneie o QRCode do kit de aplicação”.
- Ao ler o QRCode, o app deve gerar um
client_event_idúnico para este evento. - O app deve salvar localmente os dados do recebimento e registrar o item na fila/outbox com status pendente de sincronização.
- Se houver internet, o app tenta sincronizar imediatamente enviando
X-APP-KEY,X-DEVICE-TOKEN, conteúdo do QRCode, data/hora, geolocalização eclient_event_id. - Se a API responder HTTP 200 com
success=true, o app deve marcar o evento como sincronizado e removê-lo da fila local. - Se a API responder HTTP 200 com
already_registered=true, o app também deve considerar o evento concluído e removê-lo da fila local. - Se a API responder erro ou houver falha de conexão, o app deve manter o evento salvo localmente
para novo envio posterior, reutilizando o mesmo
client_event_id.
Endpoint
POST
https://agroecologia.grupoekos.com.br/router/action.php
Headers obrigatórios
X-APP-KEY: <APP_KEY_FIXA_DO_APP>
X-DEVICE-TOKEN: <DEVICE_TOKEN_DO_APARELHO>
X-APP-KEY: chave fixa embutida no app (camada extra contra chamadas externas).X-DEVICE-TOKEN: token do dispositivo pareado. A API usa isso para identificar o cliente e validar o acesso.
Body (via router)
Enviar no body (form-url-encoded ou JSON, conforme padrão do router), com:
action=apiG10
f=receber_kit_aplicacao
client_event_id=<UUID>
qrcode=<CONTEUDO_DO_QR>
data=YYYY-MM-DD
hora=HH:MM:SS
latitude=<LAT>
longitude=<LON>
Campos que devem ser enviados
| Campo | Obrigatório | Exemplo | Descrição |
|---|---|---|---|
qrcode |
Sim | KIT_3f9a2c... (conteúdo lido) |
Conteúdo do QRCode colado na caixa do kit (string lida pelo scanner). |
data |
Sim | 2026-03-11 |
Data do recebimento informada pelo app (recomendado ISO: YYYY-MM-DD). |
hora |
Sim | 14:32:10 |
Hora do recebimento informada pelo app (HH:MM:SS). |
latitude |
Sim | -20.9487 |
Latitude capturada no momento do recebimento (GPS do aparelho). |
longitude |
Sim | -48.4790 |
Longitude capturada no momento do recebimento (GPS do aparelho). |
client_event_id |
Sim | 550e8400-e29b-41d4-a716-446655440000 |
ID único gerado pelo app (UUID). O mesmo ID deve ser reutilizado em todos os reenvios do mesmo evento. |
Respostas esperadas da API
Sucesso (HTTP 200)
Quando a validação estiver ok e o recebimento for registrado, a API retorna:
{
"success": true,
"msg": "Recebimento do kit registrado com sucesso.",
"data": {
"qrcode": "KIT_...",
"cliente_id": 123,
"device_id": 999,
"account_type": "produtor",
"client_event_id": "550e8400-e29b-41d4-a716-446655440000"
}
}
Ao receber esta resposta, o app deve considerar o evento sincronizado com sucesso, marcar o item como enviado e removê-lo da fila local.
Reenvio idempotente (HTTP 200)
Se o app reenviar o mesmo evento (mesmo client_event_id), o servidor não duplica o
registro e retorna:
{
"success": true,
"msg": "Evento já registrado (idempotente).",
"data": {
"already_registered": true,
"client_event_id": "550e8400-e29b-41d4-a716-446655440000"
}
}
Ao receber esta resposta, o app também deve considerar o evento concluído, marcando o item como enviado e removendo-o da fila local.
Erro (HTTP != 200)
Em caso de erro, a API retorna success=false com um error curto e um
msg amigável:
{
"success": false,
"error": "invalid_qrcode",
"msg": "QR Code do kit inválido ou não encontrado.",
"data": {}
}
- Se for erro de autenticação (
401/403): orientar o usuário a reparear ou contatar suporte. - Se for erro de QRCode (
404/409): orientar tentar novamente e conferir o QRCode. - Se for erro inesperado (
500): orientar contatar o suporte.
success=true ou already_registered=true = remover da fila
local
Modo de operação do app (offline-first)
- O app deve sempre trabalhar em offline-first, mesmo quando houver internet disponível.
- O evento deve nascer primeiro no banco local do aparelho, antes da tentativa de envio.
- O app deve manter uma fila/outbox dos eventos pendentes de sincronização.
- O ERP usa o
client_event_idpara idempotência: se esse ID já existir no servidor, o evento já foi processado com sucesso. - O mesmo
client_event_iddeve ser reutilizado em todas as tentativas do mesmo recebimento. - Somente após resposta positiva da API o item deve sair do banco local/fila de sincronização.
Exemplo de chamada (cURL)
curl -i -X POST "https://agroecologia.grupoekos.com.br/router/action.php" \
-H "Content-Type: application/x-www-form-urlencoded; charset=UTF-8" \
-H "X-APP-KEY: APP_KEY_FIXA_DO_APP" \
-H "X-DEVICE-TOKEN: dev_xxxxxxxxxxxxxxxxx" \
--data "action=apiG10&f=receber_kit_aplicacao&client_event_id=550e8400-e29b-41d4-a716-446655440000&qrcode=KIT_ABC123&data=2026-03-11&hora=14:32:10&latitude=-20.9487&longitude=-48.4790"