diff --git a/app/services/simpli_route/planilha_carga.rb b/app/services/simpli_route/planilha_carga.rb index cfa3e16..68d8d5e 100644 --- a/app/services/simpli_route/planilha_carga.rb +++ b/app/services/simpli_route/planilha_carga.rb @@ -2,8 +2,8 @@ # # Monta as linhas da planilha de carga do SimpliRoute a partir de UMA operação # vigente (tabela gade_entregas_*). Preenche Latitude/Longitude reaproveitando a -# 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. +# geocodificação do MÊS ANTERIOR da mesma operação: casa nome + endereço +# (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). module SimpliRoute @@ -14,8 +14,10 @@ module SimpliRoute nota_fiscal nome_completo endereco_sem_complemento complemento supervisao telefones ].freeze - # Colunas que formam a chave de match com o histórico. - COLUNAS_CHAVE = %w[nome_completo endereco_sem_complemento supervisao].freeze + # Colunas que formam a chave de match com o histórico. Supervisão fica de + # 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). MESES_GRAFIAS = { @@ -122,15 +124,28 @@ module SimpliRoute end end - # Chave de match: nome | endereço | supervisão, normalizados. + # Chave de match: nome | endereço, normalizados. def chave(row) - COLUNAS_CHAVE.map { |c| normaliza(row[c]) }.join('|') + [normaliza(row['nome_completo']), + normaliza_endereco(row['endereco_sem_complemento'])].join('|') end def normaliza(valor) valor.to_s.strip.gsub(/\s+/, ' ').upcase 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 # 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. diff --git a/app/views/admin/planilhas_simpli_route/show.html.erb b/app/views/admin/planilhas_simpli_route/show.html.erb index cd8492c..70a8eb3 100644 --- a/app/views/admin/planilhas_simpli_route/show.html.erb +++ b/app/views/admin/planilhas_simpli_route/show.html.erb @@ -14,7 +14,7 @@
A Latitude/Longitude é reaproveitada do mês anterior da mesma - operação (casando nome + endereço + supervisão). Pacientes novos ou sem + operação (casando nome + endereço). Pacientes novos ou sem correspondência saem sem 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.