teste #10

Merged
victor merged 10 commits from teste into main 2026-07-22 11:40:17 -03:00
2 changed files with 44 additions and 5 deletions
Showing only changes of commit 2b0a3b52ef - Show all commits

View File

@@ -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

View File

@@ -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 @@
'<span class="text-xs text-gray-500">Visita ' + esc(o.id ?? '—') + '</span>' +
'</div>' +
'<p class="text-xs text-gray-400 mt-1">' +
(o.motorista ? esc(o.motorista) : '<span class="text-gray-600">sem motorista</span>') + ' · ' +
(o.veiculo ? esc(o.veiculo) : '<span class="text-gray-600">sem veículo</span>') +
// "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)
: '<span class="text-gray-600">' + (o.no_painel ? 'sem motorista' : 'motorista não identificado') + '</span>') +
' · ' +
(o.veiculo ? esc(o.veiculo) : '<span class="text-gray-600">' + (o.no_painel ? 'sem veículo' : 'veículo não identificado') + '</span>') +
(fmtHora(o.checkout_time) ? ' · <span class="text-gray-300">checkout ' + esc(fmtHora(o.checkout_time)) + '</span>' : '') +
'</p>' +
(o.aviso ? '<p class="text-xs text-amber-400 mt-1">' + esc(o.aviso) + '</p>' : '') +
'</div>' +