8) Seus Dados e Geocerca

Esta página documenta a tela Seus Dados do aplicativo. A tela deve exibir os dados básicos do cliente/produtor, dados de plantio, participação G10 e a geocerca da área destinada para aplicação.

A atualização desses dados é disparada pela Sincronização Off-line. Quando a rota f=sincronizacao_offline retornar uma pendência com tipo_conteudo=atualizar_dados_geocerca, o app deve chamar f=meus_dados_geocerca, salvar o retorno no banco local e depois confirmar a pendência.

Tela: Seus Dados Menu: produtor + produtor_funcionario Endpoint: meus_dados_geocerca Retorno: cliente + G10 + geocercas Mapa: polígonos Offline-first

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.

  1. O app chama f=sincronizacao_offline.
  2. Se vier pendência com tipo_conteudo=atualizar_dados_geocerca, o app chama f=meus_dados_geocerca.
  3. O app salva os dados retornados no banco offline local.
  4. Após salvar com sucesso, o app chama f=confirmar_pendencia_sync.
  5. A tela Seus Dados exibe os dados locais atualizados.
A explicação completa das pendências fica na seção 4) Sincronização Off-line.

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>
  );
}
O app deve ordenar os pontos por 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 header X-APP-KEY não foi enviado.
  • invalid_api_key: a chave do app é inválida.
  • missing_device_token: o header X-DEVICE-TOKEN nã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.