diff --git a/app/controllers/admin/edicao_lancamentos_controller.rb b/app/controllers/admin/edicao_lancamentos_controller.rb index fa70edc..3d0472b 100644 --- a/app/controllers/admin/edicao_lancamentos_controller.rb +++ b/app/controllers/admin/edicao_lancamentos_controller.rb @@ -32,8 +32,10 @@ class Admin::EdicaoLancamentosController < ApplicationController entrega = Entrega.por_nf(nf).first return render_erro("NF #{nf} não encontrada na base de rastreio.") if entrega.nil? - id = client.resolver_id(entrega) - visita = client.visita(id) + id = client.resolver_id(entrega) + visita = client.visita(id) + # Segunda fonte de imagens (POD). Não é obrigatória: se falhar, vem {}. + detalhe = client.detalhe_visita(id) render json: { ok: true, @@ -52,11 +54,9 @@ class Admin::EdicaoLancamentosController < ApplicationController planned_date: visita['planned_date'], contato: visita['contact_name'], telefone: visita['contact_phone'], - # Fotos do card: fachada vem do rastreio (mesma foto do mapa de operações); - # pictures/assinatura vêm da API. Só URLs http(s) chegam ao . - foto_fachada: url_imagem(entrega.try(:foto_da_fachada)), - pictures: Array(visita['pictures']).filter_map { |u| url_imagem(u) }, - signature: url_imagem(visita['signature']), + # Galeria unificada — TODAS as fotos do lançamento, de todas as fontes, + # cada uma etiquetada para o ADM saber o que está conferindo. + fotos: fotos_do_lancamento(entrega, visita, detalhe), motorista: entrega.driver, veiculo: entrega.vehicle }, @@ -218,6 +218,31 @@ class Admin::EdicaoLancamentosController < ApplicationController url.match?(%r{\Ahttps?://}i) ? url : nil end + # Reúne as imagens das TRÊS fontes numa lista única e etiquetada: + # 1. espelho de rastreio -> foto da fachada (mesma do mapa de operações) + # 2. visita da API -> pictures[] + signature + # 3. detalhe do POD -> pictures[] + signature (costuma ser mais completo) + # + # A mesma foto costuma aparecer em mais de uma fonte, então deduplica por URL + # mantendo a primeira etiqueta (a ordem abaixo é a mais informativa). + def fotos_do_lancamento(entrega, visita, detalhe) + brutas = [] + brutas << [entrega.try(:foto_da_fachada), 'fachada', 'Rastreio'] + + [[visita, 'Visita'], [detalhe, 'Comprovante']].each do |fonte, origem| + Array(fonte['pictures']).each { |u| brutas << [u, 'entrega', origem] } + brutas << [fonte['signature'], 'assinatura', origem] + end + + vistas = Set.new + brutas.filter_map do |valor, tipo, origem| + url = url_imagem(valor) + next if url.nil? || !vistas.add?(url) + + { url: url, tipo: tipo, origem: origem } + end + end + # Sem token não há o que fazer — avisa e volta. def garantir_configurado return if SimpliRoute.configurado? diff --git a/app/services/simpli_route/client.rb b/app/services/simpli_route/client.rb index 282b6dd..8936ad0 100644 --- a/app/services/simpli_route/client.rb +++ b/app/services/simpli_route/client.rb @@ -84,6 +84,17 @@ module SimpliRoute [] end + # Detalhe do comprovante de entrega (POD): traz foto, assinatura, hora e GPS. + # É uma fonte MAIS COMPLETA de imagens que `visita(id)` — a visita crua às + # vezes vem com `pictures` vazio mesmo havendo foto registrada no checkout. + # Best-effort: se o endpoint não existir/responder, devolve {} e a tela segue + # com o que a visita tiver. + def detalhe_visita(id) + get("/v1/plans/visits/#{id}/detail/") || {} + rescue Error + {} + end + private def get(path) diff --git a/app/views/admin/edicao_lancamentos/show.html.erb b/app/views/admin/edicao_lancamentos/show.html.erb index 606e222..d5a23b2 100644 --- a/app/views/admin/edicao_lancamentos/show.html.erb +++ b/app/views/admin/edicao_lancamentos/show.html.erb @@ -71,14 +71,12 @@
- <%# Coluna esquerda — fotos %> + <%# Coluna esquerda — galeria com TODAS as fotos do lançamento %>
-

Foto da fachada

-
- +

+ Fotos do lançamento +

+
<%# Coluna direita — campos click-to-edit %> @@ -105,6 +103,38 @@
+ + <%# Visualizador de foto — amplia e navega entre todas as imagens do lançamento %> +