Correção do função de editar lançamento para quer consiga listar todas
This commit is contained in:
@@ -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) }
|
visitas = do_dia.select { |v| v['reference'].to_s == nf || trackings.include?(v['tracking_id'].to_s) }
|
||||||
.uniq { |v| v['id'] }
|
.uniq { |v| v['id'] }
|
||||||
|
visitas = com_tracking_id(visitas)
|
||||||
|
|
||||||
achadas = visitas.map { |v| ocorrencia_da_api(v, entrega_de(entregas, v['tracking_id'])) }
|
achadas = visitas.map { |v| ocorrencia_da_api(v, entrega_de(entregas, v['tracking_id'])) }
|
||||||
|
|
||||||
@@ -183,9 +184,34 @@ class Admin::EdicaoLancamentosController < ApplicationController
|
|||||||
end
|
end
|
||||||
|
|
||||||
def entrega_de(entregas, tracking_id)
|
def entrega_de(entregas, tracking_id)
|
||||||
|
return nil if tracking_id.blank?
|
||||||
|
|
||||||
entregas.find { |e| e.tracking_id.to_s == tracking_id.to_s }
|
entregas.find { |e| e.tracking_id.to_s == tracking_id.to_s }
|
||||||
end
|
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 —
|
# Resumo de um lançamento para a lista de escolha (não carrega fotos/detalhe —
|
||||||
# isso só acontece quando o ADM abre um).
|
# isso só acontece quando o ADM abre um).
|
||||||
def ocorrencia_da_api(visita, entrega)
|
def ocorrencia_da_api(visita, entrega)
|
||||||
@@ -200,8 +226,10 @@ class Admin::EdicaoLancamentosController < ApplicationController
|
|||||||
motorista: entrega&.driver,
|
motorista: entrega&.driver,
|
||||||
veiculo: entrega&.vehicle,
|
veiculo: entrega&.vehicle,
|
||||||
editavel: true,
|
editavel: true,
|
||||||
# Está na API mas ainda não no espelho — daí não sabermos motorista/veículo.
|
# Sem linha no espelho não há como saber motorista/veículo: a API não
|
||||||
aviso: entrega ? nil : 'Ainda não sincronizado no painel'
|
# 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
|
end
|
||||||
|
|
||||||
@@ -217,7 +245,8 @@ class Admin::EdicaoLancamentosController < ApplicationController
|
|||||||
motorista: entrega.driver,
|
motorista: entrega.driver,
|
||||||
veiculo: entrega.vehicle,
|
veiculo: entrega.vehicle,
|
||||||
editavel: false,
|
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
|
end
|
||||||
|
|
||||||
|
|||||||
@@ -240,6 +240,11 @@
|
|||||||
const d = new Date(v);
|
const d = new Date(v);
|
||||||
return isNaN(d) ? String(v).slice(0, 10) : d.toLocaleDateString('pt-BR');
|
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
|
// 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ê.
|
// 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>' +
|
'<span class="text-xs text-gray-500">Visita ' + esc(o.id ?? '—') + '</span>' +
|
||||||
'</div>' +
|
'</div>' +
|
||||||
'<p class="text-xs text-gray-400 mt-1">' +
|
'<p class="text-xs text-gray-400 mt-1">' +
|
||||||
(o.motorista ? esc(o.motorista) : '<span class="text-gray-600">sem motorista</span>') + ' · ' +
|
// "sem motorista" (o painel sabe e está vazio) é diferente de
|
||||||
(o.veiculo ? esc(o.veiculo) : '<span class="text-gray-600">sem veículo</span>') +
|
// "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>' +
|
'</p>' +
|
||||||
(o.aviso ? '<p class="text-xs text-amber-400 mt-1">' + esc(o.aviso) + '</p>' : '') +
|
(o.aviso ? '<p class="text-xs text-amber-400 mt-1">' + esc(o.aviso) + '</p>' : '') +
|
||||||
'</div>' +
|
'</div>' +
|
||||||
|
|||||||
Reference in New Issue
Block a user