extract_sies_data.rb 3.51 KB
#!/usr/bin/ruby

$LOAD_PATH.unshift('/usr/share/rails/activerecord/lib')
$LOAD_PATH.unshift('/usr/share/rails/activesupport/lib')

require 'activerecord'
require 'active_support'
require File.dirname(__FILE__) + "/../" + 'lib/noosfero/core_ext/string.rb'


LIMIT = (ENV['DUMP_ALL'] ? nil : 5)
DUMP_ALL = LIMIT.nil?

# To connect with the database that contains the data to be extracted cofigure it in the 'database_farejador.yml' with the name 'farejador'
ActiveRecord::Base.establish_connection(YAML::load(IO.read(File.dirname(__FILE__) + '/database_farejador.yml'))['farejador'])

class Enterprise < ActiveRecord::Base
  set_table_name 'cons_dadosbasicos'
  set_primary_key :id_sies
  has_many :products, :foreign_key => 'V00', :conditions => "tipo = 'produto'"
  has_many :input_products, :class_name => 'Product', :foreign_key => 'V00', :conditions => "tipo = 'insumo'"
end

class Product < ActiveRecord::Base
  set_table_name 'mapa_produtos'
  belongs_to :category, :foreign_key => 'id_prod'
end

class Category < ActiveRecord::Base
  set_table_name 'lista_produtos'
end

class Macroregion < ActiveRecord::Base
  set_table_name 'macrorregioes'
end

class State < ActiveRecord::Base
  set_table_name 'estados'
  set_primary_key :id_UF
  has_one :macroregion, :foreign_key => 'UF'

  def cities
    City.find(:all, :conditions => [ "id < 6000000 and id like '?%'", id_UF])
  end
end

class City < ActiveRecord::Base
  set_table_name 'cidades_ibge'
end

class Dumper
  def initialize
    @seq = 0
    @seqs = {}
  end

  def pretty(str, alt = nil)
    if alt.nil?
      str
    else
      str + ' (' + alt + ')'
    end
  end

  def dump_category(cat, parent = nil)
    
    @seqs[cat] = @seq
    puts <<-EOF
cat#{@seq} = new_cat(#{pretty(cat.nome, cat.nome_alt).inspect}, #{parent ? 'cat' + @seqs[parent].to_s : 'nil' })
categories[#{cat.id}] = cat#{@seq}.id
    EOF
    @seq += 1

    Category.find(:all, :conditions => { :id_mae => cat.id }).each do |child|
      dump_category(child, cat) if (DUMP_ALL || (@seq <= LIMIT))
    end

  end

  def dump_enterprise(ent)
    email = nil
    contato = nil
    if (ent.corel =~ /@/)
      email = ent.corel
    else
      contato = ent.corel
    end

    endereco = ent.end
    if ent.cep
      endereco << " CEP: " << ent.cep
    end

    puts "new_ent({ :name => #{ent.nome.inspect}, :identifier => #{ent.nome.to_slug.inspect}, :contact_phone => #{ent.tel.inspect}, :address => #{endereco.inspect}, :lat => #{ent.lat.inspect}, :lng => #{ent.long.inspect}, :geocode_precision => #{ent.geomodificou.inspect}, :data => { :id_sies => #{ent.id_sies.inspect} }, :organization_info => OrganizationInfo.new(:contact_email => #{email.inspect}) }, #{ent.products.map{|p| { :name => p.category.nome , :product_category_id => p.category.id } }.inspect}, #{ent.input_products.map{|p| {:product_category_id => p.category.id} }.inspect})"
  end

  def dump_city(city)
    puts "Region.create!(:name => #{city.cidade.inspect}, :parent => STATES[#{city.id.to_s[0..1]}], :lat => #{city.latitude}, :lng => #{city.longitude})"
  end

end

dumper = Dumper.new

puts <<-EOF
#!/usr/bin/env ruby
require File.dirname(__FILE__) + '/../config/environment'
require File.dirname(__FILE__) + '/fbes_populate_helper.rb'

GetText.locale = 'pt_BR'

EOF

puts "categories = {}"
Category.find(:all, :conditions => 'id_mae is null or id_mae = -1', :limit => LIMIT).each do |cat|
  dumper.dump_category(cat, nil)
end

Enterprise.find(:all, :limit => LIMIT).each do |ent|
  dumper.dump_enterprise(ent)
end

City.find(:all, :limit => LIMIT).each do |city|
  dumper.dump_city(city)
end