Rotina: Coleta de Leite
Captação de leite de produtores rurais: rotas, coleta diária offline, sync, análise de qualidade e faturamento ao produtor.
Módulos Delphi
| Arquivo | Papel |
|---|---|
source/CAP001/UCAP001.pas | Cadastro e consulta de captação de leite |
source/CAP001/UdmCAP001.pas | DataModule — CD_ITEMLEITE, CD_TABDESCLEITE, PC_INDENIZACAO |
source/CAP002/UCAP002.pas | Lançamento de análise de qualidade (CCS, CBT, gordura) |
source/CAP003/UCAP003.pas | Relatórios de captação por rota/produtor/período |
Apps Mobile (Android nativo — CaptacaoMobile)
Localização: source/Mobile/CaptacaoMobile/CaptacaoMobileAPK/
Package: br.com.junsoft.captacaomobile
Arquitetura offline-first
┌─────────────────────────────────────────┐
│ App Android (Java, SDK 21-34) │
│ │
│ SQLite local (BD offline) │
│ ├── rotas, produtores, tickets do dia │
│ ├── movimentos de coleta não sync │
│ └── configuração de equipamento │
│ │
│ GPSLocationListener │
│ └── Registra posição em cada parada │
│ │
│ Sync (quando há conectividade) │
│ ├── RotaSinc → GET /rotas │
│ ├── ProdutorSinc → GET /produtores │
│ ├── MovtoLeiteSinc → POST /movimentos │
│ └── MilkRouteSync → sync completo │
└─────────────────────────────────────────┘
Classes de sincronização
| Classe | Direção | Endpoint |
|---|---|---|
RotaSinc | Download | GET /api/rotas/:cdEmpresa |
ProdutorSinc | Download | GET /api/produtores/:cdRota |
MovtoLeiteSinc | Upload | POST /api/movimentos/leite |
MilkRouteSync | Bidirecional | Orquestrador geral de sync |
API REST Java (CaptacaoMobile)
Localização: source/Server/CaptacaoMobile/
Tecnologia: Spring Boot, WAR para WildFly
DAOs principais
| DAO | Tabela principal | Responsabilidade |
|---|---|---|
RotaDAO | ROTACAPTACAO | Lista rotas por empresa/motorista |
ProdutorDAO | PRODUTORLEITE | Cadastro de produtores por rota |
MovtoLeiteDAO | CAPTACAOLEITE | Recebe e persiste movimentos de coleta |
ProdutorRotaDAO | PRODUTORROTACAP | Ordem de parada na rota |
Portal Web Angular (PortalWebAPP)
Localização: source/JunsoftPortalWeb/PortalWebAPP/src/app/coletas/
| Componente | Função |
|---|---|
ColetaMainService | Estado central, carrega rotas e movimentos |
coleta-list | Lista coletas do dia/período |
coleta-detail | Detalhe por produtor (QT, temperatura, qualidade) |
coleta-rota | Mapa da rota e status de cada parada |
coleta-relatorio | Relatório de produção por produtor/período |
Tabelas do Banco de Dados
CAPTACAOLEITE — Registro de Coleta
DDL: docs/schema/tables/CAPTACAOLEITE.sql
Chave primária: (CD_EMPRESA, NR_CAPTACAOLEITE)
| Campo | Tipo | Descrição |
|---|---|---|
| NR_CAPTACAOLEITE | INTEGER | Sequencial (PK) |
| CD_ROTACAPTACAO | INTEGER | Rota de coleta (FK → ROTACAPTACAO) |
| CD_PRODUTOR | INTEGER | Produtor rural (FK → PRODUTORLEITE) |
| DT_COLETA | DATE | Data da coleta |
| HR_COLETA | TIME | Hora da coleta |
| QT_INFORMADA | NUMERIC(15,3) | Quantidade informada pelo produtor (litros) |
| QT_LEITURA | NUMERIC(15,3) | Quantidade medida pelo medidor do caminhão |
| PC_DIFERENCA | NUMERIC(5,2) | % de diferença (QT_LEITURA vs QT_INFORMADA) |
| QT_TEMPERATURA | NUMERIC(5,2) | Temperatura na coleta (°C) |
| ST_QUALIDADE | CHAR(1) | 'A'=Aprovada, 'R'=Reprovada, 'P'=Pendente análise |
| ST_SINCRONIZADO | CHAR(1) | 'S'=Sincronizado com servidor, 'N'=Apenas local |
| NR_LATITUDE | NUMERIC(10,7) | Latitude GPS da parada |
| NR_LONGITUDE | NUMERIC(10,7) | Longitude GPS da parada |
| DS_OBSERVACAO | VARCHAR(500) | Observações do motorista |
| CD_USUARIO_SYNC | VARCHAR(5) | Motorista/usuário que realizou a coleta |
| DT_SYNC | TIMESTAMP | Data/hora da sincronização |
PRODUTORLEITE — Cadastro do Produtor Rural
DDL: docs/schema/tables/PRODUTORLEITE.sql
Chave primária: (CD_EMPRESA, CD_PRODUTOR)
| Campo | Tipo | Descrição |
|---|---|---|
| CD_PRODUTOR | INTEGER | Código do produtor (FK → PESSOA) |
| NR_INSCRICAOPRODUTOR | VARCHAR(20) | Inscrição estadual rural |
| PC_FATURAMENTO | NUMERIC(5,2) | % a reter para custos (FUNRURAL, etc.) |
| QT_ANIMAIS | INTEGER | Rebanho atual (vacas em lactação) |
| QT_MEDIA_DIA | NUMERIC(10,3) | Produção média diária estimada |
| CD_ITEMLEITE | INTEGER | Produto/item para faturamento (FK → ITEM) |
| CD_TABELAPRECO | INTEGER | Tabela de preço pago ao produtor |
| ST_PRODUTOR | CHAR(1) | 'A'=Ativo, 'I'=Inativo, 'S'=Suspenso |
| DT_INICIO | DATE | Data de início do contrato |
| DT_FIM | DATE | Data de encerramento do contrato |
| ST_RESFRIAMENTO | CHAR(1) | 'P'=Próprio, 'C'=Coletivo, 'N'=Não possui |
| DS_BANCO, NR_AGENCIA, NR_CONTA | — | Dados bancários para pagamento |
ROTACAPTACAO — Rotas de Coleta
DDL: docs/schema/tables/ROTACAPTACAO.sql
Chave primária: (CD_EMPRESA, CD_ROTACAPTACAO)
| Campo | Tipo | Descrição |
|---|---|---|
| CD_ROTACAPTACAO | INTEGER | Código da rota |
| DS_ROTACAPTACAO | VARCHAR(60) | Descrição |
| CD_MOTORISTA | INTEGER | Motorista responsável (FK → PESSOA) |
| CD_VEICULO | INTEGER | Caminhão/veículo (FK → VEICULO) |
| CD_ESTABELECIMENTO | INTEGER | Usina/laticínio de destino (FK → PESSOA) |
| DT_COLETA | CHAR(7) | Dias de coleta: ex 'STQQSSD' (Dom=S, Seg=S, Ter=T...) |
| KM_TOTAL | NUMERIC(10,2) | Quilometragem total da rota |
| ST_ROTA | CHAR(1) | 'A'=Ativa, 'I'=Inativa |
PRODUTORROTACAP — Produtores em Ordem na Rota
DDL: docs/schema/tables/PRODUTORROTACAP.sql
Chave primária: (CD_EMPRESA, CD_ROTACAPTACAO, CD_PRODUTOR)
| Campo | Tipo | Descrição |
|---|---|---|
| NR_ORDEMCOLETA | SMALLINT | Posição na rota (ordem de parada) |
| KM_DISTANCIA | NUMERIC(8,2) | Distância do ponto anterior até este produtor |
| ST_COLETA | CHAR(1) | 'A'=Coleta neste produtor, 'S'=Suspenso temporariamente |
| DS_REFERENCIA | VARCHAR(200) | Ponto de referência / localização |
ANALISELEITE — Análise de Qualidade
DDL: docs/schema/tables/ANALISELEITE.sql
| Campo | Tipo | Descrição |
|---|---|---|
| CD_PRODUTOR | INTEGER | Produtor (FK) |
| DT_COLETA | DATE | Data de referência |
| NR_CCS | INTEGER | Contagem de Células Somáticas (×1000/mL) |
| NR_CBT | INTEGER | Contagem Bacteriana Total (×1000 UFC/mL) |
| PC_GORDURA | NUMERIC(4,2) | % de gordura |
| PC_PROTEINA | NUMERIC(4,2) | % de proteína |
| PC_LACTOSE | NUMERIC(4,2) | % de lactose |
| ST_QUALIDADE | CHAR(1) | 'A'=Aprovada, 'R'=Reprovada |
| VL_BONIFICACAO | NUMERIC(15,2) | Valor de bonificação por qualidade |
| VL_DESCONTO_QUALIDADE | NUMERIC(15,2) | Desconto por padrão abaixo do mínimo |
Regras IN-77 (MAPA): CCS ≤ 500.000/mL e CBT ≤ 300.000 UFC/mL para leite aprovado.
Parâmetros (PARMCAPTACAO)
| Parâmetro | Tipo | Efeito |
|---|---|---|
CD_ITEMLEITE | INTEGER | Item padrão do produto leite no faturamento |
CD_TABDESCLEITE | INTEGER | Tabela de descontos (FUNRURAL, SENAR...) |
PC_INDENIZACAO | NUMERIC | % de indenização sobre o leite rejeitado |
ST_CONTROLETEMP | S/N | 'S' = exige temperatura na coleta |
VL_TEMP_MAX | NUMERIC | Temperatura máxima aceitável (°C) — padrão 7°C |
ST_GPSOBRIGATORIO | S/N | 'S' = exige GPS em cada parada |
PC_DIFMAX | NUMERIC | % máximo de diferença (QT_LIDA vs QT_INFORMADA) tolerado |
Fluxo Completo — Coleta de Leite
┌──────────────────────────────────────────────────────────┐
│ 1. PREPARAÇÃO DA ROTA (Servidor / Desktop) │
│ Técnico configura ROTACAPTACAO + PRODUTORROTACAP │
│ Atribui motorista e veículo │
│ Sync download para o app (RotaSinc + ProdutorSinc) │
└─────────────────────────┬────────────────────────────────┘
│
▼
┌──────────────────────────────────────────────────────────┐
│ 2. COLETA NO CAMPO (App Android — offline) │
│ Motorista segue NR_ORDEMCOLETA na rota │
│ Para cada produtor: │
│ - QT_LEITURA (medidor do caminhão) │
│ - QT_TEMPERATURA (obrigatório se ST_CONTROLETEMP='S') │
│ - GPS: NR_LATITUDE, NR_LONGITUDE │
│ - DS_OBSERVACAO (anomalias, rejeições) │
│ INSERT local no SQLite: ST_SINCRONIZADO='N' │
└─────────────────────────┬────────────────────────────────┘
│
▼
┌──────────────────────────────────────────────────────────┐
│ 3. SINCRONIZAÇÃO (com conectividade) │
│ MovtoLeiteSinc → POST /api/movimentos/leite │
│ Servidor: INSERT CAPTACAOLEITE (ST_SINCRONIZADO='S') │
│ Calcula PC_DIFERENCA = (QT_LEITURA - QT_INFORMADA) │
│ / QT_INFORMADA × 100 │
│ Se |PC_DIFERENCA| > PC_DIFMAX: alerta para revisão │
│ Se QT_TEMPERATURA > VL_TEMP_MAX: ST_QUALIDADE='P' │
└─────────────────────────┬────────────────────────────────┘
│
▼
┌──────────────────────────────────────────────────────────┐
│ 4. ANÁLISE DE QUALIDADE (CAP002) │
│ Laboratório insere resultados: CCS, CBT, gordura │
│ INSERT ANALISELEITE │
│ Se fora dos padrões: ST_QUALIDADE='R' → PC_INDENIZACAO │
│ Cálculo de bonificação (VL_BONIFICACAO) │
└─────────────────────────┬────────────────────────────────┘
│
▼
┌──────────────────────────────────────────────────────────┐
│ 5. FATURAMENTO AO PRODUTOR (mensal) │
│ SUM(QT_LEITURA) por produtor no período │
│ × VL_UNITARIO (tabela de preço do produtor) │
│ + VL_BONIFICACAO (qualidade) │
│ − Deduções (FUNRURAL, SENAR, ILPI, insumos) │
│ conforme CD_TABDESCLEITE │
│ − VL_DESCONTO_QUALIDADE (se reprovado) │
│ Gera CONTAS (TP_CONTAS='E') — pagamento ao produtor │
│ Transferência bancária conforme DS_BANCO do produtor │
└──────────────────────────────────────────────────────────┘
Portal Web — Monitoramento em Tempo Real
O ColetaMainService (Angular) permite:
- Visualizar mapa da rota com status de cada produtor (coletado/pendente/suspenso)
- Comparar QT_INFORMADA vs QT_LEITURA por produtor e rota
- Alertas automáticos de temperatura fora do padrão
- Relatório de produção acumulada por período (CAP003)
- Histórico de qualidade por produtor (CCS/CBT/gordura ao longo do tempo)
Influências em Outros Módulos
→ Contas a Pagar
- Faturamento mensal ao produtor gera título a pagar (
TP_CONTAS='E') - Pagamento via transferência bancária (dados do produtor em PRODUTORLEITE)
→ Emissão NF-e
- Nota Fiscal de Produtor Rural pode ser emitida para cada entrega
- Nota de entrada de leite (TP_NOTA='E') registra o recebimento da usina
→ Estoque e Movimentação
- Cada entrega (ticket de pesagem) gera entrada em MOVESTOQUE (CD_ITEMLEITE)
- Controle de saldo de leite recebido na usina
→ Mobile
- App Android
CaptacaoMobileé o principal ponto de coleta de dados - SQLite local garante operação sem conectividade (zonas rurais sem sinal)
→ APIs Java
CaptacaoMobileJava API: RotaDAO, MovtoLeiteDAO, ProdutorDAO- Endpoint de sync: POST /api/movimentos/leite (recebe batches do app)