AyuntamientoMadrid/transparencia

View on GitHub
lib/importers/profiles_importer.rb

Summary

Maintainability
B
6 hrs
Test Coverage
module Importers
  class ProfilesImporter < BaseImporter
    JOB_LEVEL_CODES = {
      'C' => 'councillor',
      'D' => 'director',
      'E' => 'temporary_worker'
    }.freeze

    def import!
      each_row(col_sep: ",") do |row|
        person = Person.new
        if row[:n_personal].present?
          person = Person.where(councillor_code: row[:n_personal]).first!
        else
          person.first_name = row[:nombre]
          person.last_name = row[:apellidos]
          person.admin_first_name = transliterate(row[:nombre])
          person.admin_last_name = transliterate(row[:apellidos])
          person.role = row[:cargo]
          person.job_level = JOB_LEVEL_CODES[row[:codigo_cargo]]
          # councillors should have a personal code and be managed on the other side of this if/else
          throw person if person.job_level == 'councillor'
        end

        profiled_at = Time.zone.parse(row[:fecha])

        if person.profiled_at.blank? || person.profiled_at < profiled_at

          person.profiled_at = profiled_at

          puts "Importing profile for #{person.name}"

          person.twitter  = row[:cuenta_de_twitter]
          person.facebook = row[:cuenta_de_facebook]
          person.unit     = row[:unidad]

          parse_studies(person, row)
          parse_courses(person, row)
          parse_languages(person, row)
          parse_career(person, row)
          parse_political_posts(person, row)

          person.publications       = row[:publicaciones]
          person.teaching_activity  = row[:actividad]
          person.special_mentions   = row[:distinciones]
          person.other              = row[:otra_informacion]

          person.save
        end
      end
    end

    private

      def parse_studies(person, row)
        person.profile['studies'] = []
        (1..4).each do |index|
          col = row.index("#{index}_titulacion_oficial".to_sym)
          person.add_study(row[col], row[col+1], row[col+2], row[col+3])
        end
        studies_comment_col = row.index(:"4_titulacion_oficial")+4
        person.studies_comment = row[studies_comment_col]
      end

      def parse_courses(person, row)
        person.profile['courses'] = []
        (1..4).each do |index|
          col = row.index("#{index}_nombre_del_curso".to_sym)
          person.add_course(row[col], row[col+1], row[col+2], row[col+3])
        end
        courses_comment_col = row.index(:"4_nombre_del_curso")+4
        person.courses_comment = row[courses_comment_col]
      end

      def parse_languages(person, row)
        person.profile['languages'] = []
        person.add_language('Inglés',   row[:ingles])   if row[:ingles].present?
        person.add_language('Francés',  row[:frances])  if row[:frances].present?
        person.add_language('Alemán',   row[:aleman])   if row[:aleman].present?
        person.add_language('Italiano', row[:italiano]) if row[:italiano].present?

        person.add_language(row[:otro_idioma], row[:nivel_otro_idioma])
      end

      def parse_career(person, row)
        person.profile['public_jobs'] = []
        (1..4).each do |index|
          col = row.index("#{index}_puesto_desempenado".to_sym)
          person.add_public_job(row[col], row[col+1], row[col+2], row[col+3])
        end

        person.profile['private_jobs'] = []
        (1..4).each do |index|
          col = row.index("#{index}_cargoactividad".to_sym)
          person.add_private_job(row[col], row[col+1], row[col+2], row[col+3])
        end

        career_comment_col = row.index(:"4_cargoactividad")+4
        person.career_comment = row[career_comment_col]

        person.public_jobs_level      = row[:grado_consolidado]
        person.public_jobs_body       = row[:cuerpo_o_escala_de_la_administracion]
        person.public_jobs_start_year = row[:ano_de_ingreso]
      end

      def parse_political_posts(person, row)
        person.profile['political_posts'] = []
        (1..4).each do |index|
          col = row.index("#{index}_cargo".to_sym)
          person.add_political_post(row[col], row[col+1], row[col+2], row[col+3])
        end
        political_posts_comment_col = row.index(:"4_cargo")+4
        person.political_posts_comment = row[political_posts_comment_col]
      end


  end
end