Implantação da criação de romaneios

This commit is contained in:
2026-08-27 19:51:38 -03:00
parent b3464e3acd
commit e2b74068d5
13 changed files with 497 additions and 39 deletions

View File

@@ -146,4 +146,73 @@ puts ' Compare com o espelho, no console do app:'
puts " Entrega.da_conta_gade.no_periodo(Date.parse('#{data}'), Date.parse('#{data}'))" \
'.distinct.count(:vehicle)'
puts
# ── 4. O plano tem NOME? ────────────────────────────────────────────────────
# POR QUE ISTO IMPORTA: a operação NÃO trabalha por data — ela identifica o
# plano pelo NOME ("EMAD 09.2026" e afins), que é inclusive o texto impresso no
# canto do romaneio. Hoje a tela pede a data porque é o único filtro que
# sabemos que a API aceita (/v1/routes/visits/?planned_date=). Para trocar por
# uma BUSCA POR NOME é preciso primeiro descobrir se existe endpoint de planos
# e qual campo carrega o nome — é o que esta seção responde.
#
# As URLs abaixo são CANDIDATAS: a única rota /v1/plans/ que o app já usa é
# /v1/plans/visits/<id>/detail/, então sabemos que o namespace existe, mas não
# se ele lista planos. 404/403 aqui é resposta válida — significa "não dá por
# esse caminho", e a busca por nome teria que ser feita filtrando as visitas.
puts
puts '[4] procurando um endpoint de PLANOS (para buscar por nome em vez de data)'
CHAVES_NOME = /name|title|label|descri|plan/i.freeze
candidatas = [
'/v1/plans/',
"/v1/plans/?planned_date=#{data}",
'/v1/routes/plans/',
"/v1/routes/plans/?planned_date=#{data}"
]
achou_algum = false
candidatas.each do |caminho|
codigo, corpo, seg = get(caminho)
puts " GET #{caminho}"
puts " HTTP #{codigo} · #{corpo.bytesize} bytes · #{seg.round(2)}s"
dados = json(corpo)
# A API é Django REST: ora devolve lista, ora {"results": [...]}.
itens = dados.is_a?(Array) ? dados : (dados.is_a?(Hash) ? Array(dados['results']) : [])
if itens.empty?
puts " sem itens (#{corpo.slice(0, 120)})"
next
end
achou_algum = true
item = itens.first
next unless item.is_a?(Hash)
puts " itens: #{itens.size}"
puts " chaves: #{item.keys.sort.join(', ')}"
nomes = item.select { |k, v| k.to_s.match?(CHAVES_NOME) && !v.nil? && v.to_s.strip != '' }
if nomes.empty?
puts ' => nenhum campo de nome PREENCHIDO neste item'
else
puts ' => campos de nome preenchidos:'
nomes.each { |k, v| puts " #{k} = #{v.inspect.slice(0, 90)}" }
puts " => primeiros nomes: #{itens.filter_map { |i| i.is_a?(Hash) ? nomes.keys.filter_map { |k| i[k] }.first : nil }.first(5).inspect}"
end
end
# Plano B: se não há endpoint de planos, o nome pode vir na própria visita.
unless achou_algum
puts ' nenhum endpoint de planos respondeu com itens.'
puts ' procurando um campo de nome na VISITA (plano B — filtrar visitas pelo nome):'
nomes_visita = primeira.select { |k, v| k.to_s.match?(CHAVES_NOME) && !v.nil? && v.to_s.strip != '' }
if nomes_visita.empty?
puts ' (nenhum) => busca por nome NÃO é possível pela API; a data continua sendo'
puts ' o único filtro, e o nome fica só como rótulo do PDF.'
else
nomes_visita.each { |k, v| puts " #{k} = #{v.inspect.slice(0, 90)}" }
end
end
puts
puts 'Anote o resultado no cabeçalho deste arquivo antes de commitar.'