Objetivo desta tela
Exibir ao produtor um resumo dos dados cadastrados no ERP e a área destinada para aplicação, representada por uma geocerca no mapa.
O app deve renderizar a geocerca usando os pontos do array poligono. Não deve receber
uma imagem pronta do mapa. O mapa deve ser montado dinamicamente no aplicativo.
Quando atualizar esses dados?
A tela Seus Dados deve usar os dados salvos no banco offline local do app. A atualização desses dados acontece pela rotina de sincronização.
- O app chama
f=sincronizacao_offline. -
Se vier pendência com
tipo_conteudo=atualizar_dados_geocerca, o app chamaf=meus_dados_geocerca. - O app salva os dados retornados no banco offline local.
- Após salvar com sucesso, o app chama
f=confirmar_pendencia_sync. - A tela Seus Dados exibe os dados locais atualizados.
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>
Body
action=apiG10
f=meus_dados_geocerca
O app não deve enviar id_cliente. O ERP identifica o cliente pelo
X-DEVICE-TOKEN.
Resposta esperada da API
{
"success": true,
"msg": "Dados do cliente carregados com sucesso.",
"data": {
"device": {
"device_id": 8,
"device_name": "Tablet do Trator",
"account_type": "produtor"
},
"cliente": {
"id_cliente": 123,
"razao_social": "FAZENDA MODELO",
"cidade": "Bebedouro",
"uf": "SP",
"segmento": "Citros",
"variedade_planta": "Pera Rio",
"porta_enxerto": "Cravo",
"idade_pomar": "8 anos",
"qtde_planta": "2500",
"capacidade_tanque": "2000",
"qtde_tanque_aplic": "2",
"qtde_planta_tanque": "1250",
"area_irrigada": "Sim",
"plano_manejo": "Convencional"
},
"g10": {
"id_g10": 10,
"id_fase": 3,
"fase": "Andamento",
"status": 0
},
"geocercas": [
{
"id_geocerca": 5,
"descricao": "Área destinada para aplicação",
"total_pontos": 4,
"centro": {
"latitude": -21.853900,
"longitude": -47.479800
},
"poligono": [
{
"latitude": -21.853901,
"longitude": -47.479801,
"ordem": 1
},
{
"latitude": -21.853950,
"longitude": -47.479700,
"ordem": 2
},
{
"latitude": -21.854020,
"longitude": -47.479750,
"ordem": 3
},
{
"latitude": -21.854000,
"longitude": -47.479850,
"ordem": 4
}
],
"criado_em": "2026-04-24 10:00:00",
"atualizado_em": "2026-04-24 11:30:00"
}
]
}
}
Campos retornados — Device
| Campo | Descrição |
|---|---|
device.device_id |
ID do aparelho registrado no ERP. |
device.device_name |
Nome/apelido do aparelho, informado no pareamento. |
device.account_type |
Tipo da conta: produtor, produtor_funcionario ou
colaborador.
|
Campos retornados — Cliente
| Campo | Descrição |
|---|---|
cliente.id_cliente |
ID do cliente/produtor no ERP. |
cliente.razao_social |
Nome ou razão social do produtor. |
cliente.cidade / cliente.uf |
Localização do produtor. |
cliente.segmento |
Segmento/cultura do cliente, exemplo: Citros. |
cliente.variedade_planta |
Variedade da planta cadastrada no ERP. |
cliente.porta_enxerto |
Porta-enxerto cadastrado. |
cliente.idade_pomar |
Idade do pomar/cultura. |
cliente.qtde_planta |
Quantidade de plantas cadastradas. |
cliente.capacidade_tanque |
Capacidade do tanque de aplicação. |
cliente.qtde_tanque_aplic |
Quantidade de tanques usados na aplicação. |
cliente.qtde_planta_tanque |
Quantidade de plantas por tanque. |
cliente.area_irrigada |
Informação sobre área irrigada. |
cliente.plano_manejo |
Plano de manejo informado no cadastro. |
Campos retornados — G10
| Campo | Descrição |
|---|---|
g10.id_g10 |
ID da participação do cliente no G10. |
g10.id_fase |
ID da fase atual no ERP. |
g10.fase |
Nome da fase atual, exemplo: Pré-adesão, Implantação, Andamento, Conversão ou Pós-G10. |
g10.status |
Status da participação G10. |
Campos retornados — Geocercas
| Campo | Descrição |
|---|---|
geocercas[].id_geocerca |
ID da geocerca no ERP. |
geocercas[].descricao |
Descrição da área, exemplo: Área destinada para aplicação. |
geocercas[].total_pontos |
Total de pontos que formam o polígono. |
geocercas[].centro.latitude |
Latitude sugerida para centralizar o mapa. |
geocercas[].centro.longitude |
Longitude sugerida para centralizar o mapa. |
geocercas[].poligono |
Lista ordenada de pontos da geocerca. |
geocercas[].poligono[].latitude |
Latitude do ponto do polígono. |
geocercas[].poligono[].longitude |
Longitude do ponto do polígono. |
geocercas[].poligono[].ordem |
Ordem do ponto no desenho da geocerca. |
geocercas[].atualizado_em |
Data/hora da última alteração da geocerca no ERP. |
Como salvar no app
O app deve salvar o retorno no banco offline local. A tela Seus Dados deve ler primeiro os dados locais, para funcionar mesmo sem internet.
Estrutura sugerida no app
cliente_local
- id_cliente
- razao_social
- cidade
- uf
- segmento
- variedade_planta
- porta_enxerto
- idade_pomar
- qtde_planta
- capacidade_tanque
- qtde_tanque_aplic
- qtde_planta_tanque
- area_irrigada
- plano_manejo
- updated_at
g10_local
- id_g10
- id_fase
- fase
- status
- updated_at
geocercas_local
- id_geocerca
- descricao
- total_pontos
- centro_latitude
- centro_longitude
- criado_em
- atualizado_em
geocerca_pontos_local
- id_geocerca
- latitude
- longitude
- ordem
Exibição da geocerca no React Native
Em React Native, o app normalmente deve usar um componente de mapa nativo, como
react-native-maps. O app deve transformar o array poligono em coordenadas
e passar para o componente Polygon.
Instalação recomendada
npm install react-native-maps
Tipos TypeScript sugeridos
type DeviceData = {
device_id: number;
device_name: string;
account_type: 'produtor' | 'produtor_funcionario' | 'colaborador';
};
type ClienteData = {
id_cliente: number;
razao_social: string;
cidade: string;
uf: string;
segmento: string;
variedade_planta: string;
porta_enxerto: string;
idade_pomar: string;
qtde_planta: string;
capacidade_tanque: string;
qtde_tanque_aplic: string;
qtde_planta_tanque: string;
area_irrigada: string;
plano_manejo: string;
};
type G10Data = {
id_g10: number;
id_fase: number;
fase: string;
status: number;
};
type GeoPoint = {
latitude: number;
longitude: number;
ordem: number;
};
type GeocercaData = {
id_geocerca: number;
descricao: string;
total_pontos: number;
centro: {
latitude: number;
longitude: number;
} | null;
poligono: GeoPoint[];
criado_em: string;
atualizado_em: string;
};
type MeusDadosGeocercaResponse = {
success: boolean;
msg: string;
data: {
device: DeviceData;
cliente: ClienteData;
g10: G10Data;
geocercas: GeocercaData[];
};
};
Exemplo de consumo da API
type ApiConfig = {
appKey: string;
deviceToken: string;
};
export async function buscarMeusDadosGeocerca(config: ApiConfig) {
const body = new URLSearchParams();
body.append('action', 'apiG10');
body.append('f', 'meus_dados_geocerca');
const response = await fetch('https://agroecologia.grupoekos.com.br/router/action.php', {
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
'X-APP-KEY': config.appKey,
'X-DEVICE-TOKEN': config.deviceToken,
},
body: body.toString(),
});
const json = await response.json() as MeusDadosGeocercaResponse;
if (!response.ok || !json.success) {
throw new Error(json.msg || 'Erro ao buscar dados/geocerca.');
}
return json.data;
}
Exemplo de componente React Native
import React from 'react';
import { View, Text } from 'react-native';
import MapView, { Polygon, PROVIDER_GOOGLE } from 'react-native-maps';
type GeoPoint = {
latitude: number;
longitude: number;
ordem: number;
};
type GeocercaData = {
id_geocerca: number;
descricao: string;
total_pontos: number;
centro: {
latitude: number;
longitude: number;
} | null;
poligono: GeoPoint[];
};
type Props = {
geocerca: GeocercaData;
};
export function MapaGeocerca({ geocerca }: Props) {
if (!geocerca || !geocerca.centro || geocerca.poligono.length < 3) {
return (
<View>
<Text>Área de aplicação ainda não cadastrada.</Text>
</View>
);
}
const coordinates = [...geocerca.poligono]
.sort((a, b) => a.ordem - b.ordem)
.map((p) => ({
latitude: Number(p.latitude),
longitude: Number(p.longitude),
}));
return (
<MapView
provider={PROVIDER_GOOGLE}
mapType="satellite"
style={{ width: '100%', height: 320 }}
initialRegion={{
latitude: geocerca.centro.latitude,
longitude: geocerca.centro.longitude,
latitudeDelta: 0.01,
longitudeDelta: 0.01,
}}
>
<Polygon
coordinates={coordinates}
strokeColor="red"
fillColor="rgba(255, 255, 0, 0.35)"
strokeWidth={2}
/>
</MapView>
);
}
ordem antes de renderizar o polígono.
Observação sobre Google Maps
Em páginas web, o Google Maps é carregado com a tag abaixo:
<script src="https://maps.googleapis.com/maps/api/js?key=<AQUI>&v=weekly&language=pt-BR&libraries=drawing"></script>
Em React Native, essa tag <script> normalmente não é usada diretamente.
O app deve usar o SDK nativo do Google Maps através de uma biblioteca como
react-native-maps. A chave do Google Maps deve ser configurada no projeto Android/iOS,
conforme a biblioteca usada pelo desenvolvedor.
A biblioteca drawing é usada no ERP/web para desenhar e editar polígonos.
No app mobile, a necessidade principal é apenas exibir a geocerca já cadastrada.
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=meus_dados_geocerca"
Erros comuns
missing_app_key: o headerX-APP-KEYnão foi enviado.invalid_api_key: a chave do app é inválida.missing_device_token: o headerX-DEVICE-TOKENnão foi enviado.device_token_not_found: o aparelho não está pareado ou o token é inválido.g10_participacao_not_found: o cliente ainda não possui participação G10.cliente_not_found: o cliente vinculado ao aparelho não foi localizado.