Skip to content

Instantly share code, notes, and snippets.

@denoww
Last active March 8, 2026 16:20
Show Gist options
  • Select an option

  • Save denoww/820866e727dfcdf679e0488189cfeb01 to your computer and use it in GitHub Desktop.

Select an option

Save denoww/820866e727dfcdf679e0488189cfeb01 to your computer and use it in GitHub Desktop.
Restaura acessos deletados através da análise de logs em CSV do sistema seucondominio
require 'csv'
require 'csv'
require 'open-uri'
def extrair_linhas_do_arquivo_csv(url)
resultados = []
URI.open(url) do |arquivo|
csv = CSV.new(
arquivo,
headers: true,
encoding: 'bom|utf-8',
header_converters: ->(h) { h.to_s.strip }
)
csv.each do |row|
resp = linha_to_hash(row)
resultados << resp if resp
end
end
resultados
end
def linha_to_hash(row)
acao = row['Ação'] || row['Acao']
codigo = row['Código'] || row['Codigo']
codigo_tipo = row['Código Tipo'] || row['Codigo Tipo']
email = row['Email'] || row['E-mail']
tipo = row['Tipo']
dono_acesso = row['Dono do Acesso']
return nil if [acao, tipo, codigo, dono_acesso, email].all?(&:blank?)
{
email: email&.strip,
acao: acao&.strip,
tipo: tipo&.strip,
codigo: codigo&.strip,
codigo_tipo: codigo_tipo&.strip,
dono_acesso: dono_acesso&.strip,
veiculo_id: row['veiculo_id']&.strip,
utilizador_id: row['utilizador_id']&.strip,
utilizador_key: row['utilizador_key']&.strip,
unidade_id: row['unidade_id']&.strip,
}
end
def get_veiculo(opt)
Portaria::Veiculo.do_cliente(opt[:cliente_id]).where(id: opt[:veiculo_id]).first
# veiculos = unidade.veiculos
# veiculos.find { |v| v.nome == opt[:veiculo_id] }
end
def get_unidade(opt)
Cliente::Unidade.do_cliente(opt[:cliente_id]).where(id: opt[:unidade_id]).first
# veiculos = unidade.veiculos
# veiculos.find { |v| v.nome == opt[:veiculo_id] }
end
def salvar_acesso(acesso_params)
# acesso_params[:type]: "Portaria::Acesso::TagPassivo"
tipo = acesso_params.delete(:tipo)
tipo_obj = Portaria::Acesso::TIPOS.find { |i| tipo.to_s == i[:value] } || {}
acesso_params[:type] ||= tipo_obj[:type]
if acesso_params[:type].blank?
p_red "type não pode ser vazio"
fail ActiveRecord::Rollback
end
acesso = Portaria::Acesso.new(acesso_params)
p_green "--------------"
p_green "acesso_params"
p_green acesso_params
if !acesso.save
p_red "--------------"
p_red "Erro"
p_red acesso.errors.full_messages
fail ActiveRecord::Rollback
end
end
def garantir_portaria_acesso_user_id(utilizador)
if utilizador.portaria_acesso_user_id .blank?
portaria_acesso_user_id = ::Cliente::UtilizadorAcesso.proximo_acesso_user_id utilizador.cliente_id
utilizador.update_columns(portaria_acesso_user_id: portaria_acesso_user_id)
utilizador.reload
end
utilizador
end
def get_utilizador(opt)
utilizador = Cliente::UtilizadorAcesso.get_utilizador(opt[:cliente_id], {id: opt[:utilizador_id], key_utilizador: opt[:utilizador_key])
utilizador = garantir_portaria_acesso_user_id(utilizador)
utilizador
end
def restaurar_tag_passivo(opt)
p_green "restaurar_params"
p_green opt
unidade = get_unidade(opt)
veiculo = get_veiculo(opt)
utilizador = get_utilizador(opt)
if utilizador.blank?
p_red "utilizador não encontrado"
return
end
unidade_id = unidade.id
veiculo_id = veiculo&.id
acesso_params = {
tipo: opt[:tipo],
codigo_tipo: opt[:codigo_tipo],
codigo: opt[:codigo],
unidade_id: unidade_id,
cliente_id: opt[:cliente_id],
veiculo_id: veiculo_id,
}
utilizador_obj = Cliente::UtilizadorAcesso.get_utilizador_obj utilizador
acesso_params.merge!(utilizador_obj)
salvar_acesso(acesso_params)
end
def restaurar_linha(linha, cliente_id)
ApplicationRecord.transaction do
p_yellow "-------------------------------------------"
p_yellow "-------------------------------------------"
p_yellow "log de #{linha[:acao]} em #{linha[:tipo]}"
restaurar_params = linha
restaurar_params[:cliente_id] = cliente_id
case linha[:acao]
when 'apagou'
case linha[:tipo]
when 'tag_passivo'
restaurar_tag_passivo(restaurar_params)
end
end
end
end
############################################
############################################
# COMO USAR
############################################
############################################
cliente_id = 1718;
csv_logs_acessos = 'https://testestreamcam.s3.us-east-1.amazonaws.com/portaria_acessos_logs_582b9d3ea7.csv'
linhas = extrair_linhas_do_arquivo_csv(csv_logs_acessos);
linhas.each do |linha|
restaurar_linha(linha, cliente_id)
end;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment