﻿# ====================================================================
# SUB-3756 — Formulário de evento v2 (tipo, quantidade, dose)
# ====================================================================
# Login: rode `requestCode` + `verifyCode` no restclient.http e cole o token abaixo,
# ou gere um direto com:  node tmp/token.js <profileId>
#
# Todas as rotas exigem os headers `apiKey` e `Authorization: Bearer`.

@host = http://localhost:3000
@apiKey = 80c830989a1be5e43fa7
@token = COLE_O_TOKEN_AQUI

# Talhão do milho, 3 ha (troque pelo seu, vindo de form-data.plots)
@plotId = 272
@eventoId = 1

# --------------------------------------------------------------------
# 1. O CONTRATO — é o que o Front consome pra montar o formulário.
#    Diz, por tipo: campos obrigatórios, opcionais, inaplicáveis e
#    quais ficam atrás de "detalhes".
# --------------------------------------------------------------------
###
# @name tiposDeEvento
GET {{host}}/eventos/tipos
apiKey: {{apiKey}}
Authorization: Bearer {{token}}

###
# @name formData
# Talhões, safras, culturas, produtos, status, categorias + o contrato acima.
GET {{host}}/eventos/form-data
apiKey: {{apiKey}}
Authorization: Bearer {{token}}

# --------------------------------------------------------------------
# 2. CRIAÇÃO — um caso por regra de negócio
# --------------------------------------------------------------------

###
# @name colheita
# Quantidade + unidade (não existia). Safra sai do talhão. Título gerado.
# Status vem da data (passada = Feito). Responsável = titular da conta.
POST {{host}}/eventos
Content-Type: application/json
apiKey: {{apiKey}}
Authorization: Bearer {{token}}

{
  "tipo": "colheita",
  "plotId": {{plotId}},
  "data": "2026-08-05",
  "quantidade": 800,
  "quantidadeUnidade": "kg",
  "atributos": { "classificacao": "primeira" }
}

###
# @name venda
# "colhi 800 pés e vendi a R$ 2,50" — antes gravava só o total.
# Agora quantidade e preço unitário ficam gravados e o total é calculado.
POST {{host}}/eventos
Content-Type: application/json
apiKey: {{apiKey}}
Authorization: Bearer {{token}}

{
  "tipo": "venda",
  "plotId": {{plotId}},
  "data": "2026-08-06",
  "quantidade": 800,
  "quantidadeUnidade": "kg",
  "precoUnitario": 2.50,
  "comprador": "Ceasa",
  "formaPagamento": "Pix"
}

###
# @name despesaGeral
# Evento de nível fazenda: SEM talhão. Fica fora do custo/ha (decisão 09/08).
POST {{host}}/eventos
Content-Type: application/json
apiKey: {{apiKey}}
Authorization: Bearer {{token}}

{
  "tipo": "despesa_geral",
  "data": "2026-08-07",
  "description": "Conta de energia da bomba",
  "valor": 480.90
}

###
# @name capinaSemCusto
# Mesmo tipo, natureza diferente: essa semana o produtor fez sozinho.
POST {{host}}/eventos
Content-Type: application/json
apiKey: {{apiKey}}
Authorization: Bearer {{token}}

{
  "tipo": "tratos_culturais",
  "subtipo": "capina",
  "plotId": {{plotId}},
  "data": "2026-08-04"
}

###
# @name capinaComDiarista
# ...e essa semana pagou 6 diárias. Custo = 6 × 120 = 720.
# Categorias mudam de [Manejo] para [Manejo, Financeiro] sozinhas.
PATCH {{host}}/eventos/{{eventoId}}
Content-Type: application/json
apiKey: {{apiKey}}
Authorization: Bearer {{token}}

{
  "naturezaFinanceira": "despesa",
  "maoObraResponsavel": "Zé",
  "maoObraDiarias": 6,
  "maoObraValorDiaria": 120
}

###
# @name eventoFuturo
# Data futura → status "Planejado" automaticamente.
POST {{host}}/eventos
Content-Type: application/json
apiKey: {{apiKey}}
Authorization: Bearer {{token}}

{
  "tipo": "irrigacao",
  "plotId": {{plotId}},
  "data": "2026-12-01",
  "quantidade": 3,
  "quantidadeUnidade": "h",
  "atributos": { "metodo": "Gotejo" }
}

# --------------------------------------------------------------------
# 3. AUTOCOMPLETE — é daqui que sai o agroProductId/agroPestId.
#    Sem o id do produto não há faixa de bula: a dose sai como "sem_faixa".
# --------------------------------------------------------------------

###
# @name buscaLivrePraga
# SEM filtro: devolve QUALQUER praga com "corda" no nome — quatro espécies distintas de
# corda-de-viola, e NENHUMA delas é a registrada para o 2,4 CROP em milho.
# É exatamente o problema que o filtro abaixo resolve. `filtradoPor` vem null.
GET {{host}}/eventos/catalogo/pragas?busca=corda&limit=10
apiKey: {{apiKey}}
Authorization: Bearer {{token}}

###
# @name pragasDoProduto
# COM filtro: só os alvos registrados em bula para o produto 5, na cultura do talhão 272
# (milho). Devolve 6 itens — lista curta, `busca` é opcional, o select pode abrir cheio.
GET {{host}}/eventos/catalogo/pragas?agroProductId=5&plotId={{plotId}}
apiKey: {{apiKey}}
Authorization: Bearer {{token}}

###
# @name pragasDoProdutoComBusca
# Mesmo filtro + texto: sobra só a Corda-de-viola CERTA (#477, Ipomoea grandifolia).
GET {{host}}/eventos/catalogo/pragas?agroProductId=5&plotId={{plotId}}&busca=corda
apiKey: {{apiKey}}
Authorization: Bearer {{token}}

###
# @name buscaLivreProduto
GET {{host}}/eventos/catalogo/produtos?busca=2,4 CROP&limit=10
apiKey: {{apiKey}}
Authorization: Bearer {{token}}

###
# @name produtosDaPraga
# Caminho inverso: quem começa pela praga. 234 produtos registrados para corda-de-viola
# em milho — lista grande, mantenha o autocomplete com `busca`.
GET {{host}}/eventos/catalogo/produtos?agroPestId=477&plotId={{plotId}}&busca=crop&limit=10
apiKey: {{apiKey}}
Authorization: Bearer {{token}}

# --------------------------------------------------------------------
# 4. DOSE — calculada no backend, validada contra a bula
#    Talhão 272 é de milho. Produto 2,4 CROP 806 SL (5) + Corda-de-viola
#    (477) tem faixa registrada de 0,5 a 1,5 L/ha para milho.
# --------------------------------------------------------------------

###
# @name dosePreviewDentro
# SEMPRE mande plotId: a faixa depende da CULTURA, que sai do talhão. Sem ele o
# preview pode mostrar um número diferente do que vai ser gravado.
# 1 L em 2 ha = 0,5 L/ha → dentro de 0,5–1,5.
POST {{host}}/eventos/dose/preview
Content-Type: application/json
apiKey: {{apiKey}}
Authorization: Bearer {{token}}

{
  "plotId": {{plotId}},
  "quantidade": 1,
  "quantidadeUnidade": "L",
  "areaTratadaHa": 2,
  "agroProductId": 5,
  "agroPestId": 477
}

###
# @name dosePreviewAcima
# 4 L em 2 ha = 2 L/ha → acima de 0,5–1,5. Devolve `alerta` preenchido.
POST {{host}}/eventos/dose/preview
Content-Type: application/json
apiKey: {{apiKey}}
Authorization: Bearer {{token}}

{
  "plotId": {{plotId}},
  "quantidade": 4,
  "quantidadeUnidade": "L",
  "areaTratadaHa": 2,
  "agroProductId": 5,
  "agroPestId": 477
}

###
# @name dosePreviewConversaoDeUnidade
# 1000 mL em 2 ha = 0,5 L/ha. O backend converte antes de comparar — sem isso,
# 1000/2 seria lido como 500 L/ha e a aplicação sairia "absurdamente acima".
POST {{host}}/eventos/dose/preview
Content-Type: application/json
apiKey: {{apiKey}}
Authorization: Bearer {{token}}

{
  "plotId": {{plotId}},
  "quantidade": 1000,
  "quantidadeUnidade": "mL",
  "areaTratadaHa": 2,
  "agroProductId": 5,
  "agroPestId": 477
}

###
# @name dosePreviewSemAreaInformada
# Sem areaTratadaHa: usa a área do talhão (3 ha) e devolve qual usou.
POST {{host}}/eventos/dose/preview
Content-Type: application/json
apiKey: {{apiKey}}
Authorization: Bearer {{token}}

{
  "plotId": {{plotId}},
  "quantidade": 3,
  "quantidadeUnidade": "L",
  "agroProductId": 5,
  "agroPestId": 477
}

###
# @name dosePreviewEntradaInversa
# Informa a DOSE e recebe a QUANTIDADE. O que fica gravado é sempre a quantidade.
POST {{host}}/eventos/dose/preview
Content-Type: application/json
apiKey: {{apiKey}}
Authorization: Bearer {{token}}

{
  "plotId": {{plotId}},
  "doseInformada": 1.0,
  "doseInformadaUnidade": "L/ha",
  "quantidadeUnidade": "L",
  "areaTratadaHa": 2,
  "agroProductId": 5,
  "agroPestId": 477
}

###
# @name aplicacaoForaDeBula
# Mesmos parâmetros do dosePreviewAcima → o evento grava a MESMA dose e o MESMO status.
# Grava normalmente e devolve `alertaDose`: INFORMA, NÃO BLOQUEIA.
POST {{host}}/eventos
Content-Type: application/json
apiKey: {{apiKey}}
Authorization: Bearer {{token}}

{
  "tipo": "aplicacao",
  "plotId": {{plotId}},
  "data": "2026-08-09",
  "product": "2,4 CROP 806 SL",
  "agroProductId": 5,
  "praga": "Corda-de-viola",
  "agroPestId": 477,
  "quantidade": 4,
  "quantidadeUnidade": "L",
  "areaTratadaHa": 2,
  "equipamento": "Costal",
  "responsavelAplicacao": "João",
  "epi": true,
  "naturezaFinanceira": "despesa",
  "valor": 350
}

# --------------------------------------------------------------------
# 5. VALIDAÇÕES — todas devem responder 400
# --------------------------------------------------------------------

###
# @name erroDespesaComTalhao
# Despesa geral é evento de fazenda, não aceita talhão.
POST {{host}}/eventos
Content-Type: application/json
apiKey: {{apiKey}}
Authorization: Bearer {{token}}

{ "tipo": "despesa_geral", "plotId": {{plotId}}, "valor": 10 }

###
# @name erroAplicacaoSemTalhao
POST {{host}}/eventos
Content-Type: application/json
apiKey: {{apiKey}}
Authorization: Bearer {{token}}

{ "tipo": "aplicacao", "quantidade": 1 }

###
# @name erroNaturezaIncompativel
# Venda só aceita receita.
POST {{host}}/eventos
Content-Type: application/json
apiKey: {{apiKey}}
Authorization: Bearer {{token}}

{ "tipo": "venda", "plotId": {{plotId}}, "naturezaFinanceira": "despesa", "valor": 10 }

# --------------------------------------------------------------------
# 6. CONSULTAS NOVAS
# --------------------------------------------------------------------

###
# @name foraDeBula
# Relatório de conformidade: aplicações fora da faixa registrada no período.
GET {{host}}/eventos/conformidade/fora-de-bula?dataInicio=2026-01-01&dataFim=2026-12-31
apiKey: {{apiKey}}
Authorization: Bearer {{token}}

###
# @name indicadores
# Produtividade/ha, custo por unidade colhida, preço médio de venda.
# `custoFazenda` vem separado de `custoPorHa` — sem rateio nesta entrega.
GET {{host}}/eventos/indicadores?dataInicio=2026-01-01&dataFim=2026-12-31
apiKey: {{apiKey}}
Authorization: Bearer {{token}}

###
# @name buscarPorTipo
POST {{host}}/eventos/search
Content-Type: application/json
apiKey: {{apiKey}}
Authorization: Bearer {{token}}

{ "tipoEvento": "venda", "limit": 10 }

###
# @name filaDeRevisao
# Eventos migrados cujo tipo não foi inferível — precisam de revisão humana.
POST {{host}}/eventos/search
Content-Type: application/json
apiKey: {{apiKey}}
Authorization: Bearer {{token}}

{ "revisaoPendente": true, "limit": 50 }

###
# @name aplicacoesForaDaFaixa
POST {{host}}/eventos/search
Content-Type: application/json
apiKey: {{apiKey}}
Authorization: Bearer {{token}}

{ "doseStatus": "acima", "limit": 20 }

# --------------------------------------------------------------------
# 7. COMPATIBILIDADE — o painel ANTIGO continua funcionando
# --------------------------------------------------------------------

###
# @name legadoSemTipo
# Sem `tipo`: o backend infere pelo título. Sem `naturezaFinanceira`: deduz do `cost`.
POST {{host}}/eventos
Content-Type: application/json
apiKey: {{apiKey}}
Authorization: Bearer {{token}}

{
  "plotId": {{plotId}},
  "title": "Aplicação de fungicida",
  "cost": 420,
  "data": "2026-08-03",
  "status": 48
}

###
# @name legadoSemPista
# Título sem pista nenhuma → tipo "outro" + revisaoPendente: true.
POST {{host}}/eventos
Content-Type: application/json
apiKey: {{apiKey}}
Authorization: Bearer {{token}}

{ "plotId": {{plotId}}, "title": "teste 1", "data": "2026-08-03" }
