teste #7
@@ -2,8 +2,8 @@
|
|||||||
#
|
#
|
||||||
# Monta as linhas da planilha de carga do SimpliRoute a partir de UMA operação
|
# Monta as linhas da planilha de carga do SimpliRoute a partir de UMA operação
|
||||||
# vigente (tabela gade_entregas_*). Preenche Latitude/Longitude reaproveitando a
|
# vigente (tabela gade_entregas_*). Preenche Latitude/Longitude reaproveitando a
|
||||||
# geocodificação do MÊS ANTERIOR da mesma operação: casa nome + endereço +
|
# geocodificação do MÊS ANTERIOR da mesma operação: casa nome + endereço
|
||||||
# supervisão e puxa a lat/long do rastreio (db_reem_simplerout_2026) pelo NF antigo.
|
# (normalizado) e puxa a lat/long do rastreio (db_reem_simplerout_2026) pelo NF antigo.
|
||||||
#
|
#
|
||||||
# Tabelas de operação e rastreio são SOMENTE LEITURA (apenas SELECT).
|
# Tabelas de operação e rastreio são SOMENTE LEITURA (apenas SELECT).
|
||||||
module SimpliRoute
|
module SimpliRoute
|
||||||
@@ -14,8 +14,10 @@ module SimpliRoute
|
|||||||
nota_fiscal nome_completo endereco_sem_complemento complemento supervisao telefones
|
nota_fiscal nome_completo endereco_sem_complemento complemento supervisao telefones
|
||||||
].freeze
|
].freeze
|
||||||
|
|
||||||
# Colunas que formam a chave de match com o histórico.
|
# Colunas que formam a chave de match com o histórico. Supervisão fica de
|
||||||
COLUNAS_CHAVE = %w[nome_completo endereco_sem_complemento supervisao].freeze
|
# fora: o cliente renomeia/mescla supervisões entre meses (ex.: "STS SANTA
|
||||||
|
# CECILIA" + "STS SE" → "STS SE_SANTA CECILIA") e a geo é do endereço.
|
||||||
|
COLUNAS_CHAVE = %w[nome_completo endereco_sem_complemento].freeze
|
||||||
|
|
||||||
# Mês (número) -> grafias aceitas nos nomes de tabela (abreviação e extenso).
|
# Mês (número) -> grafias aceitas nos nomes de tabela (abreviação e extenso).
|
||||||
MESES_GRAFIAS = {
|
MESES_GRAFIAS = {
|
||||||
@@ -122,15 +124,28 @@ module SimpliRoute
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
# Chave de match: nome | endereço | supervisão, normalizados.
|
# Chave de match: nome | endereço, normalizados.
|
||||||
def chave(row)
|
def chave(row)
|
||||||
COLUNAS_CHAVE.map { |c| normaliza(row[c]) }.join('|')
|
[normaliza(row['nome_completo']),
|
||||||
|
normaliza_endereco(row['endereco_sem_complemento'])].join('|')
|
||||||
end
|
end
|
||||||
|
|
||||||
def normaliza(valor)
|
def normaliza(valor)
|
||||||
valor.to_s.strip.gsub(/\s+/, ' ').upcase
|
valor.to_s.strip.gsub(/\s+/, ' ').upcase
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Rua/número/bairro (3 primeiros segmentos) + dígitos do CEP: imune às
|
||||||
|
# variações de sufixo que o cliente alterna entre meses
|
||||||
|
# ("São Paulo, São Paulo, 01511-010, Brazil" vs "São Paulo, SP, CEP: 01511-010").
|
||||||
|
# O CEP entra só pelos dígitos finais (7-8) para tolerar hífen fora do
|
||||||
|
# lugar (ex.: "028140-30").
|
||||||
|
def normaliza_endereco(valor)
|
||||||
|
segs = valor.to_s.split(',').map(&:strip)
|
||||||
|
base = normaliza(segs.first(3).join(', '))
|
||||||
|
cep = segs.drop(3).join.gsub(/\D/, '')[/\d{7,8}\z/]
|
||||||
|
[base, cep].compact.join('|')
|
||||||
|
end
|
||||||
|
|
||||||
# Coordenada como Float (com PONTO). O rastreio pode trazer texto com vírgula
|
# Coordenada como Float (com PONTO). O rastreio pode trazer texto com vírgula
|
||||||
# decimal ("-23,62"); coordenadas não usam separador de milhar, então trocar
|
# decimal ("-23,62"); coordenadas não usam separador de milhar, então trocar
|
||||||
# a vírgula por ponto é seguro e garante a saída numérica (ponto) no .xlsx.
|
# a vírgula por ponto é seguro e garante a saída numérica (ponto) no .xlsx.
|
||||||
|
|||||||
@@ -14,7 +14,7 @@
|
|||||||
<div class="p-4 bg-blue-900/20 border border-blue-500/40 rounded-xl text-blue-200/90 text-sm flex items-start gap-2">
|
<div class="p-4 bg-blue-900/20 border border-blue-500/40 rounded-xl text-blue-200/90 text-sm flex items-start gap-2">
|
||||||
<span class="text-base leading-none">ℹ️</span>
|
<span class="text-base leading-none">ℹ️</span>
|
||||||
<p>A <strong>Latitude/Longitude</strong> é reaproveitada do <strong>mês anterior</strong> da mesma
|
<p>A <strong>Latitude/Longitude</strong> é reaproveitada do <strong>mês anterior</strong> da mesma
|
||||||
operação (casando nome + endereço + supervisão). Pacientes <strong>novos</strong> ou sem
|
operação (casando nome + endereço). Pacientes <strong>novos</strong> ou sem
|
||||||
correspondência saem <strong>sem</strong> lat/long — o SimpliRoute geocodifica na importação.
|
correspondência saem <strong>sem</strong> lat/long — o SimpliRoute geocodifica na importação.
|
||||||
Se a operação não tiver mês anterior, a planilha sai inteira sem lat/long.</p>
|
Se a operação não tiver mês anterior, a planilha sai inteira sem lat/long.</p>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
Reference in New Issue
Block a user