slovensko-digital/harvester.ecosystem

View on GitHub
app/jobs/metais/sync_project_job.rb

Summary

Maintainability
A
1 hr
Test Coverage
class Metais::SyncProjectJob < ApplicationJob
  queue_as :metais
  
  def perform(json)
    uuid = json['uuid']
    return unless uuid

    project = Metais::Project.find_or_initialize_by(uuid: uuid)
    process_project(project, json)

    Metais::SyncProjectsIsvsJob.perform_later(project)
    Metais::SyncRelatedDocumentsJob.perform_later(project)
  end

  private

  def process_project(project, json)
    ActiveRecord::Base.transaction do
      return unless project.latest_version.nil? || project.latest_version.raw_data != json.to_json

      project.save!
      version = project.versions.build(raw_data: json.to_json)
      parse_project(version, json)
      version.save!
      project.latest_version = version
      project.save!

      Metais::DiffConsecutiveVersionsJob.perform_later(version)
    end
  end

  def parse_project(p, json)
    p.nazov = get_projects_attribute(json, 'Gen_Profil_nazov')
    p.popis = get_projects_attribute(json, 'Gen_Profil_popis')
    p.datum_zacatia = get_projects_attribute(json, 'EA_Profil_Projekt_datum_zacatia')
    p.termin_ukoncenia = get_projects_attribute(json, 'EA_Profil_Projekt_termin_ukoncenia')
    p.schvalovaci_proces = get_projects_attribute(json, 'EA_Profil_Projekt_schvalovaci_proces')
    p.kod_metais = get_projects_attribute(json, 'Gen_Profil_kod_metais')
    p.typ_investicie = get_projects_attribute(json, 'EA_Profil_Projekt_typ_investicie')
    p.zdroj = get_projects_attribute(json, 'Gen_Profil_zdroj')
    p.financna_skupina = get_projects_attribute(json, 'Financny_Profil_Projekt_financna_skupina')
    p.prijimatel = get_projects_attribute(json, 'EA_Profil_Projekt_prijimatel')
    p.faza_projektu = get_projects_attribute(json, 'EA_Profil_Projekt_faza_projektu')
    p.suma_vydavkov = get_projects_attribute(json, 'Financny_Profil_Projekt_suma_vydavkov')
    p.rocne_naklady = get_projects_attribute(json, 'Financny_Profil_Projekt_rocne_naklady')
    p.ref_id = get_projects_attribute(json, 'Gen_Profil_ref_id')
    p.program = get_projects_attribute(json, 'EA_Profil_Projekt_program')
    p.status = get_projects_attribute(json, 'EA_Profil_Projekt_status')

    p.zmena_stavu = get_projects_attribute(json, 'EA_Profil_Projekt_zmena_stavu')
    p.schvalene_rocne_naklady = get_projects_attribute(json, 'Financny_Profil_Projekt_schvalene_rocne_naklady')
    p.schvaleny_rozpocet = get_projects_attribute(json, 'Financny_Profil_Projekt_schvaleny_rozpocet')
    p.datum_nfp = get_projects_attribute(json, 'status_projetku_status_projektu_Datum_NFP')
    p.link_nfp = get_projects_attribute(json, 'status_projetku_status_projektu_link_NFP')
    p.vyhlasenie_vo = get_projects_attribute(json, 'status_projetku_status_projektu_vyhlasenie_VO')
    p.vo = get_projects_attribute(json, 'status_projetku_status_projektu_VO')
    p.zmluva_o_dielo = get_projects_attribute(json, 'status_projetku_status_projektu_zmluva_o_dielo')
    p.zmluva_o_dielo_crz = get_projects_attribute(json, 'status_projetku_status_projektu_zmluva_o_dielo_CRZ')

    p.metais_created_at = json&.dig('metaAttributes')&.dig('createdAt')
  end

  def get_projects_attribute(json, key)
    return json['attributes'].find { |a| a['name'] == key }&.dig('value')
  end
end