diff --git a/app/controllers/admin/edicao_lancamentos_controller.rb b/app/controllers/admin/edicao_lancamentos_controller.rb index 1135c16..9877618 100644 --- a/app/controllers/admin/edicao_lancamentos_controller.rb +++ b/app/controllers/admin/edicao_lancamentos_controller.rb @@ -167,6 +167,7 @@ class Admin::EdicaoLancamentosController < ApplicationController visitas = do_dia.select { |v| v['reference'].to_s == nf || trackings.include?(v['tracking_id'].to_s) } .uniq { |v| v['id'] } + visitas = com_tracking_id(visitas) achadas = visitas.map { |v| ocorrencia_da_api(v, entrega_de(entregas, v['tracking_id'])) } @@ -183,9 +184,34 @@ class Admin::EdicaoLancamentosController < ApplicationController end def entrega_de(entregas, tracking_id) + return nil if tracking_id.blank? + entregas.find { |e| e.tracking_id.to_s == tracking_id.to_s } end + # Quantas visitas da lista vale a pena detalhar (1 GET cada). Uma NF com mais + # que isso é dado estranho, não plano duplicado. + MAX_DETALHES_LISTA = 5 + + # A lista-por-data nem sempre traz o `tracking_id`, e é ele que liga a visita + # ao espelho — de onde vêm motorista e veículo. Sem esse casamento a NF + # duplicada aparece com as duas linhas sem motorista, que é exatamente o dado + # que distingue uma da outra. Quando faltar, busca a visita completa. + def com_tracking_id(visitas) + visitas.each_with_index.map do |visita, i| + next visita if visita['tracking_id'].present? || i >= MAX_DETALHES_LISTA + + detalhar(visita) + end + end + + # Best-effort: se o detalhe falhar, segue com o que a lista deu. + def detalhar(visita) + client.visita(visita['id']).presence || visita + rescue SimpliRoute::Error + visita + end + # Resumo de um lançamento para a lista de escolha (não carrega fotos/detalhe — # isso só acontece quando o ADM abre um). def ocorrencia_da_api(visita, entrega) @@ -200,8 +226,10 @@ class Admin::EdicaoLancamentosController < ApplicationController motorista: entrega&.driver, veiculo: entrega&.vehicle, editavel: true, - # Está na API mas ainda não no espelho — daí não sabermos motorista/veículo. - aviso: entrega ? nil : 'Ainda não sincronizado no painel' + # Sem linha no espelho não há como saber motorista/veículo: a API não + # devolve esses campos na visita. O ADM diferencia pelo status/checkout. + no_painel: entrega.present?, + aviso: entrega ? nil : 'Ainda não sincronizado no painel — motorista e veículo indisponíveis' } end @@ -217,7 +245,8 @@ class Admin::EdicaoLancamentosController < ApplicationController motorista: entrega.driver, veiculo: entrega.vehicle, editavel: false, - aviso: 'Não localizado na API do SimpliRoute — não é editável' + no_painel: true, + aviso: 'Só no painel — não está entre as visitas desta data no SimpliRoute, então não dá para editar' } end diff --git a/app/views/admin/edicao_lancamentos/show.html.erb b/app/views/admin/edicao_lancamentos/show.html.erb index 82cbbbe..41336fb 100644 --- a/app/views/admin/edicao_lancamentos/show.html.erb +++ b/app/views/admin/edicao_lancamentos/show.html.erb @@ -240,6 +240,11 @@ const d = new Date(v); return isNaN(d) ? String(v).slice(0, 10) : d.toLocaleDateString('pt-BR'); }; + const fmtHora = v => { + if (!v) return null; + const d = new Date(v); + return isNaN(d) ? null : d.toLocaleString('pt-BR', { day: '2-digit', month: '2-digit', hour: '2-digit', minute: '2-digit' }); + }; // Com um lançamento editável só, a lista some — a tela fica igual ao que era // antes. Fica visível se ele não for editável, para explicar o porquê. @@ -265,8 +270,13 @@ 'Visita ' + esc(o.id ?? '—') + '' + '' + '

' + - (o.motorista ? esc(o.motorista) : 'sem motorista') + ' · ' + - (o.veiculo ? esc(o.veiculo) : 'sem veículo') + + // "sem motorista" (o painel sabe e está vazio) é diferente de + // "não identificado" (a visita nem está no painel ainda). + (o.motorista ? esc(o.motorista) + : '' + (o.no_painel ? 'sem motorista' : 'motorista não identificado') + '') + + ' · ' + + (o.veiculo ? esc(o.veiculo) : '' + (o.no_painel ? 'sem veículo' : 'veículo não identificado') + '') + + (fmtHora(o.checkout_time) ? ' · checkout ' + esc(fmtHora(o.checkout_time)) + '' : '') + '

' + (o.aviso ? '

' + esc(o.aviso) + '

' : '') + '' +