Correção do relatório que é gerado para completo

This commit is contained in:
2026-07-22 11:35:59 -03:00
parent d3667ac48a
commit e8f470f878
7 changed files with 318 additions and 15 deletions

View File

@@ -166,20 +166,24 @@ module Analytics
# Todas as visitas do rastreio para as NFs da operação (inclui repetidas,
# como no dump original do SimpliRoute).
def linhas_rastreio
gade = conn.quote_table_name(@tabela)
sql = <<~SQL
SELECT r.*
FROM #{conn.quote_table_name(Entrega.table_name)} r
WHERE r.reference_id::text IN (SELECT nota_fiscal FROM #{gade} WHERE nota_fiscal IS NOT NULL)
ORDER BY r.reference_id, r.checkout NULLS LAST
SQL
conn.select_all(sql).to_a
@linhas_rastreio ||= begin
gade = conn.quote_table_name(@tabela)
sql = <<~SQL
SELECT r.*
FROM #{conn.quote_table_name(Entrega.table_name)} r
WHERE r.reference_id::text IN (SELECT nota_fiscal FROM #{gade} WHERE nota_fiscal IS NOT NULL)
ORDER BY r.reference_id, r.checkout NULLS LAST
SQL
completar_serie(conn.select_all(sql).to_a)
end
end
# { cabeçalho do modelo => coluna real do rastreio (ou nil) }.
def colunas_rastreio
existentes = conn.columns(Entrega.table_name).map(&:name)
RASTREIO_COLUNAS.transform_values { |cands| cands.find { |c| existentes.include?(c) } }
@colunas_rastreio ||= begin
existentes = conn.columns(Entrega.table_name).map(&:name)
RASTREIO_COLUNAS.transform_values { |cands| cands.find { |c| existentes.include?(c) } }
end
end
# ── Aba RESUMO ───────────────────────────────────────────────
@@ -224,6 +228,23 @@ module Analytics
ActiveRecord::Base.connection
end
# O espelho tem a coluna do número de série mas o sync NUNCA a preenche
# (0 de ~6.000 linhas em fev/mar/mai/jul/2026) e a tabela é read-only —
# quem busca o dado na API é o SincronizarSeriesAparelhoJob, que grava em
# series_aparelho. Aqui só completamos as linhas em que o espelho veio
# vazio: se um dia o sync passar a preencher, o valor dele continua valendo.
def completar_serie(linhas)
coluna = colunas_rastreio['Número de Série da Base (Aparelho)']
return linhas if coluna.nil?
pendentes = linhas.reject { |r| r[coluna].present? }
return linhas if pendentes.empty?
series = SerieAparelho.por_tracking(pendentes.map { |r| r['tracking_id'] })
pendentes.each { |r| r[coluna] = series[r['tracking_id']] if series[r['tracking_id']] }
linhas
end
# SELECT das colunas whitelisted; ausentes viram NULL com o mesmo alias.
# O nome real pode diferir da chave (ver ALIAS_GADE) — o alias no SELECT é
# sempre a chave, então quem lê a linha não precisa saber da diferença.