teste #10
@@ -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
|
||||
|
||||
|
||||
@@ -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>' +
|
||||
|
||||
Reference in New Issue
Block a user