bovespa_ingestion 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (37) hide show
  1. data/Gemfile +11 -0
  2. data/Gemfile.lock +49 -0
  3. data/README.md +51 -0
  4. data/Rakefile +37 -0
  5. data/VERSION +1 -0
  6. data/archives/SeriesHistoricas_Layout.pdf +0 -0
  7. data/bin/carregar_historico +22 -0
  8. data/bovespa_ingestion.gemspec +80 -0
  9. data/config/environment.rb +10 -0
  10. data/db/config.yml +22 -0
  11. data/db/migrate/20111221001450_create_historico.rb +15 -0
  12. data/db/migrate/20111222192119_create_ativos.rb +28 -0
  13. data/db/migrate/20111223004105_change_ativos.rb +10 -0
  14. data/db/migrate/20111223023840_add_quantidade_ativos_to_historico_ativos.rb +9 -0
  15. data/db/migrate/20111223131703_add_prazo_termo_to_ativo.rb +9 -0
  16. data/db/migrate/20111223213342_alter_reference_historico_ativo.rb +13 -0
  17. data/db/migrate/20111223214919_remove_data_importacao.rb +9 -0
  18. data/db/schema.rb +51 -0
  19. data/lib/historico_ativos/ativo.rb +6 -0
  20. data/lib/historico_ativos/carrega_historico.rb +32 -0
  21. data/lib/historico_ativos/header.rb +5 -0
  22. data/lib/historico_ativos/historico.rb +17 -0
  23. data/lib/historico_ativos/parser_ativo.rb +114 -0
  24. data/lib/historico_ativos/parser_header.rb +32 -0
  25. data/lib/historico_ativos/parser_trailer.rb +17 -0
  26. data/lib/historico_ativos/trailer.rb +5 -0
  27. data/lib/historico_ativos.rb +9 -0
  28. data/sample/DemoCotacoesHistoricas12022003.txt +553 -0
  29. data/sample/sample_cota_hist_2003.txt +4 -0
  30. data/spec/historico_ativos/ativo_spec.rb +12 -0
  31. data/spec/historico_ativos/carrega_historico_spec.rb +77 -0
  32. data/spec/historico_ativos/historico_spec.rb +40 -0
  33. data/spec/historico_ativos/parser_ativo_spec.rb +91 -0
  34. data/spec/historico_ativos/parser_header_spec.rb +31 -0
  35. data/spec/historico_ativos/parser_trailer_spec.rb +24 -0
  36. data/spec/spec_helper.rb +1 -0
  37. metadata +124 -0
data/Gemfile ADDED
@@ -0,0 +1,11 @@
1
+ source :rubygems
2
+
3
+ gem 'rake'
4
+ gem 'activerecord', ">=3"
5
+ gem 'standalone_migrations'
6
+
7
+ group :dev do
8
+ gem 'rspec', "~>2"
9
+ gem 'sqlite3'
10
+ gem 'jeweler', "~> 1.6.4"
11
+ end
data/Gemfile.lock ADDED
@@ -0,0 +1,49 @@
1
+ GEM
2
+ remote: http://rubygems.org/
3
+ specs:
4
+ activemodel (3.1.3)
5
+ activesupport (= 3.1.3)
6
+ builder (~> 3.0.0)
7
+ i18n (~> 0.6)
8
+ activerecord (3.1.3)
9
+ activemodel (= 3.1.3)
10
+ activesupport (= 3.1.3)
11
+ arel (~> 2.2.1)
12
+ tzinfo (~> 0.3.29)
13
+ activesupport (3.1.3)
14
+ multi_json (~> 1.0)
15
+ arel (2.2.1)
16
+ builder (3.0.0)
17
+ diff-lcs (1.1.3)
18
+ git (1.2.5)
19
+ i18n (0.6.0)
20
+ jeweler (1.6.4)
21
+ bundler (~> 1.0)
22
+ git (>= 1.2.5)
23
+ rake
24
+ multi_json (1.0.4)
25
+ rake (0.9.2.2)
26
+ rspec (2.7.0)
27
+ rspec-core (~> 2.7.0)
28
+ rspec-expectations (~> 2.7.0)
29
+ rspec-mocks (~> 2.7.0)
30
+ rspec-core (2.7.1)
31
+ rspec-expectations (2.7.0)
32
+ diff-lcs (~> 1.1.2)
33
+ rspec-mocks (2.7.0)
34
+ sqlite3 (1.3.5)
35
+ standalone_migrations (1.0.5)
36
+ activerecord (>= 3)
37
+ rake
38
+ tzinfo (0.3.31)
39
+
40
+ PLATFORMS
41
+ ruby
42
+
43
+ DEPENDENCIES
44
+ activerecord (>= 3)
45
+ jeweler (~> 1.6.4)
46
+ rake
47
+ rspec (~> 2)
48
+ sqlite3
49
+ standalone_migrations
data/README.md ADDED
@@ -0,0 +1,51 @@
1
+ Bovespa Ingestion
2
+ =============
3
+
4
+ An importer/parser of BM&F Bovespa historical stock quotations files.
5
+
6
+ Introduction
7
+ ------------
8
+
9
+ Installing
10
+ ----------
11
+
12
+ Install bundler:
13
+
14
+ $ gem install bundler
15
+
16
+ Enter the cloned dir and fetch dependencies:
17
+
18
+ $ bundler install
19
+
20
+ Contributing
21
+ ------------
22
+
23
+ 1) Fork this git repository
24
+
25
+ 2) Push your changes to your own repository
26
+
27
+ 3) Send a pull request
28
+
29
+ Running
30
+ -------
31
+
32
+ Run the test application:
33
+
34
+ $ bin/carregar_historico
35
+
36
+ Testing
37
+ -------
38
+
39
+ We use rspec, so:
40
+
41
+ $ rspec spec
42
+
43
+ or simply:
44
+
45
+ $ rake
46
+
47
+ Prerequisites
48
+ -------------
49
+
50
+ Tested with Ruby 1.9.2
51
+
data/Rakefile ADDED
@@ -0,0 +1,37 @@
1
+ require 'rake'
2
+ require 'rspec/core/rake_task'
3
+
4
+ begin
5
+ require 'tasks/standalone_migrations'
6
+ rescue LoadError => e
7
+ puts "gem install standalone_migrations to get db:migrate:* tasks! (Error: #{e})"
8
+ end
9
+
10
+ RSpec::Core::RakeTask.new 'rspec' do |t|
11
+ t.pattern = 'spec/historico_ativos/*_spec.rb'
12
+ t.rspec_opts = ['--tty', '--color', '--format documentation']
13
+ end
14
+
15
+ task :default => [:rspec]
16
+
17
+ # rake install -> install gem locally (for tests)
18
+ # rake release -> push to github and release to gemcutter
19
+ # rake version:bump:patch -> increase version and add a git-tag
20
+ begin
21
+ require 'jeweler'
22
+ rescue LoadError => e
23
+ $stderr.puts "Jeweler, or one of its dependencies, is not available:"
24
+ $stderr.puts "#{e.class}: #{e.message}"
25
+ $stderr.puts "Install it with: sudo gem install jeweler"
26
+ else
27
+ Jeweler::Tasks.new do |gem|
28
+ gem.name = 'bovespa_ingestion'
29
+ gem.summary = "An importer of historical quotations from BM&F Bovespa"
30
+ gem.email = "seixasfelipe@gmail.com"
31
+ gem.homepage = "http://github.com/seixasfelipe/bovespa-ingestion"
32
+ gem.authors = ["Felipe Seixas", "Rodrigo Fraga"]
33
+ end
34
+
35
+ Jeweler::GemcutterTasks.new
36
+ end
37
+
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.1.0
@@ -0,0 +1,22 @@
1
+ #!/usr/bin/env ruby
2
+ $LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
3
+ require 'historico_ativos'
4
+
5
+ module HistoricoAtivos
6
+
7
+ sample_file = 'sample/sample_cota_hist_2003.txt'
8
+ sample_file = ARGV[0] if ARGV.size > 0
9
+
10
+ puts "Carregando historico do arquivo: #{sample_file}"
11
+
12
+ start_time = Time.now
13
+
14
+ loader = CarregaHistorico.new ParserHeader.new, ParserTrailer.new, ParserAtivo.new
15
+ historico = loader.load sample_file
16
+ loader.persist historico
17
+
18
+ end_time = Time.now
19
+ elapsed_time = (end_time - start_time) * 1000.0
20
+
21
+ puts "Historico carregado em #{elapsed_time} ms!"
22
+ end
@@ -0,0 +1,80 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = %q{bovespa_ingestion}
8
+ s.version = "0.1.0"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Felipe Seixas", "Rodrigo Fraga"]
12
+ s.date = %q{2011-12-26}
13
+ s.default_executable = %q{carregar_historico}
14
+ s.email = %q{seixasfelipe@gmail.com}
15
+ s.executables = ["carregar_historico"]
16
+ s.extra_rdoc_files = [
17
+ "README.md"
18
+ ]
19
+ s.files = [
20
+ "Gemfile",
21
+ "Gemfile.lock",
22
+ "README.md",
23
+ "Rakefile",
24
+ "VERSION",
25
+ "archives/SeriesHistoricas_Layout.pdf",
26
+ "bin/carregar_historico",
27
+ "bovespa_ingestion.gemspec",
28
+ "config/environment.rb",
29
+ "db/config.yml",
30
+ "db/migrate/20111221001450_create_historico.rb",
31
+ "db/migrate/20111222192119_create_ativos.rb",
32
+ "db/migrate/20111223004105_change_ativos.rb",
33
+ "db/migrate/20111223023840_add_quantidade_ativos_to_historico_ativos.rb",
34
+ "db/migrate/20111223131703_add_prazo_termo_to_ativo.rb",
35
+ "db/migrate/20111223213342_alter_reference_historico_ativo.rb",
36
+ "db/migrate/20111223214919_remove_data_importacao.rb",
37
+ "db/schema.rb",
38
+ "lib/historico_ativos.rb",
39
+ "lib/historico_ativos/ativo.rb",
40
+ "lib/historico_ativos/carrega_historico.rb",
41
+ "lib/historico_ativos/header.rb",
42
+ "lib/historico_ativos/historico.rb",
43
+ "lib/historico_ativos/parser_ativo.rb",
44
+ "lib/historico_ativos/parser_header.rb",
45
+ "lib/historico_ativos/parser_trailer.rb",
46
+ "lib/historico_ativos/trailer.rb",
47
+ "sample/DemoCotacoesHistoricas12022003.txt",
48
+ "sample/sample_cota_hist_2003.txt",
49
+ "spec/historico_ativos/ativo_spec.rb",
50
+ "spec/historico_ativos/carrega_historico_spec.rb",
51
+ "spec/historico_ativos/historico_spec.rb",
52
+ "spec/historico_ativos/parser_ativo_spec.rb",
53
+ "spec/historico_ativos/parser_header_spec.rb",
54
+ "spec/historico_ativos/parser_trailer_spec.rb",
55
+ "spec/spec_helper.rb"
56
+ ]
57
+ s.homepage = %q{http://github.com/seixasfelipe/bovespa-ingestion}
58
+ s.require_paths = ["lib"]
59
+ s.rubygems_version = %q{1.6.2}
60
+ s.summary = %q{An importer of historical quotations from BM&F Bovespa}
61
+
62
+ if s.respond_to? :specification_version then
63
+ s.specification_version = 3
64
+
65
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
66
+ s.add_runtime_dependency(%q<rake>, [">= 0"])
67
+ s.add_runtime_dependency(%q<activerecord>, [">= 3"])
68
+ s.add_runtime_dependency(%q<standalone_migrations>, [">= 0"])
69
+ else
70
+ s.add_dependency(%q<rake>, [">= 0"])
71
+ s.add_dependency(%q<activerecord>, [">= 3"])
72
+ s.add_dependency(%q<standalone_migrations>, [">= 0"])
73
+ end
74
+ else
75
+ s.add_dependency(%q<rake>, [">= 0"])
76
+ s.add_dependency(%q<activerecord>, [">= 3"])
77
+ s.add_dependency(%q<standalone_migrations>, [">= 0"])
78
+ end
79
+ end
80
+
@@ -0,0 +1,10 @@
1
+ require 'active_record'
2
+ require 'yaml'
3
+
4
+ config_path = ::File.expand_path('../../db/config.yml', __FILE__)
5
+ db_config = YAML.load_file(config_path)
6
+
7
+ ActiveRecord::Base.establish_connection(
8
+ db_config['development']
9
+ )
10
+
data/db/config.yml ADDED
@@ -0,0 +1,22 @@
1
+ development:
2
+ adapter: sqlite3
3
+ database: db/development.sqlite3
4
+ pool: 5
5
+ timeout: 5000
6
+
7
+ production:
8
+ adapter: mysql
9
+ encoding: utf8
10
+ reconnect: false
11
+ database: somedatabase_dev
12
+ pool: 5
13
+ username: root
14
+ password:
15
+ socket: /var/run/mysqld/mysqld.sock
16
+
17
+ test: &test
18
+ adapter: sqlite3
19
+ database: db/test.sqlite3
20
+ pool: 5
21
+ timeout: 5000
22
+
@@ -0,0 +1,15 @@
1
+ class CreateHistorico < ActiveRecord::Migration
2
+ def self.up
3
+ create_table :historico_ativos do |t|
4
+ t.string :nome_arquivo
5
+ t.string :codigo_origem
6
+ t.date :data_geracao
7
+ t.date :data_importacao
8
+ t.timestamps
9
+ end
10
+ end
11
+
12
+ def self.down
13
+ drop_table :historico_ativos
14
+ end
15
+ end
@@ -0,0 +1,28 @@
1
+ class CreateAtivos < ActiveRecord::Migration
2
+ def self.up
3
+ create_table :ativos do |t|
4
+ t.date :data
5
+ t.string :codigo_bdi
6
+ t.string :codigo
7
+ t.string :tipo_mercado
8
+ t.string :nome
9
+ t.string :especificacao
10
+ t.string :moeda_referencia
11
+ t.decimal :preco_abertura
12
+ t.decimal :preco_maximo
13
+ t.decimal :preco_minimo
14
+ t.decimal :preco_medio
15
+ t.decimal :preco_ultimo
16
+ t.decimal :preco_melhor_oferta_compra
17
+ t.decimal :preco_melhor_oferta_venda
18
+ t.decimal :total_negocios
19
+ t.decimal :quantidade_titulos_negociados
20
+ t.decimal :volume_negocios
21
+ t.timestamps
22
+ end
23
+ end
24
+
25
+ def self.down
26
+ drop_table :ativos
27
+ end
28
+ end
@@ -0,0 +1,10 @@
1
+ class ChangeAtivos < ActiveRecord::Migration
2
+ def self.up
3
+ add_column :ativos, :historico_ativo_id, :integer
4
+ add_index :ativos, :historico_ativo_id
5
+ end
6
+
7
+ def self.down
8
+ remove_column :ativos, :historico_ativo_id
9
+ end
10
+ end
@@ -0,0 +1,9 @@
1
+ class AddQuantidadeAtivosToHistoricoAtivos < ActiveRecord::Migration
2
+ def self.up
3
+ add_column :historico_ativos, :quantidade_ativos, :integer
4
+ end
5
+
6
+ def self.down
7
+ remove_column :historico_ativos, :quantidade_ativos
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ class AddPrazoTermoToAtivo < ActiveRecord::Migration
2
+ def self.up
3
+ add_column :ativos, :prazo_termo, :integer
4
+ end
5
+
6
+ def self.down
7
+ remove_column :ativos, :prazo_termo
8
+ end
9
+ end
@@ -0,0 +1,13 @@
1
+ class AlterReferenceHistoricoAtivo < ActiveRecord::Migration
2
+ def self.up
3
+ remove_index :ativos, :historico_ativo_id
4
+ rename_column :ativos, :historico_ativo_id, :historico_id
5
+ add_index :ativos, :historico_id
6
+ end
7
+
8
+ def self.down
9
+ remove_index :ativos, :historico_id
10
+ rename_column :ativos, :historico_id, :historico_ativo_id
11
+ add_index :ativos, :historico_ativo_id
12
+ end
13
+ end
@@ -0,0 +1,9 @@
1
+ class RemoveDataImportacao < ActiveRecord::Migration
2
+ def self.up
3
+ remove_column :historico_ativos, :data_importacao
4
+ end
5
+
6
+ def self.down
7
+ add_column :historico_ativos, :data_importacao, :date
8
+ end
9
+ end
data/db/schema.rb ADDED
@@ -0,0 +1,51 @@
1
+ # encoding: UTF-8
2
+ # This file is auto-generated from the current state of the database. Instead
3
+ # of editing this file, please use the migrations feature of Active Record to
4
+ # incrementally modify your database, and then regenerate this schema definition.
5
+ #
6
+ # Note that this schema.rb definition is the authoritative source for your
7
+ # database schema. If you need to create the application database on another
8
+ # system, you should be using db:schema:load, not running all the migrations
9
+ # from scratch. The latter is a flawed and unsustainable approach (the more migrations
10
+ # you'll amass, the slower it'll run and the greater likelihood for issues).
11
+ #
12
+ # It's strongly recommended to check this file into your version control system.
13
+
14
+ ActiveRecord::Schema.define(:version => 20111223214919) do
15
+
16
+ create_table "ativos", :force => true do |t|
17
+ t.date "data"
18
+ t.string "codigo_bdi"
19
+ t.string "codigo"
20
+ t.string "tipo_mercado"
21
+ t.string "nome"
22
+ t.string "especificacao"
23
+ t.string "moeda_referencia"
24
+ t.decimal "preco_abertura"
25
+ t.decimal "preco_maximo"
26
+ t.decimal "preco_minimo"
27
+ t.decimal "preco_medio"
28
+ t.decimal "preco_ultimo"
29
+ t.decimal "preco_melhor_oferta_compra"
30
+ t.decimal "preco_melhor_oferta_venda"
31
+ t.decimal "total_negocios"
32
+ t.decimal "quantidade_titulos_negociados"
33
+ t.decimal "volume_negocios"
34
+ t.datetime "created_at"
35
+ t.datetime "updated_at"
36
+ t.integer "historico_id"
37
+ t.integer "prazo_termo"
38
+ end
39
+
40
+ add_index "ativos", ["historico_id"], :name => "index_ativos_on_historico_id"
41
+
42
+ create_table "historico_ativos", :force => true do |t|
43
+ t.string "nome_arquivo"
44
+ t.string "codigo_origem"
45
+ t.date "data_geracao"
46
+ t.datetime "created_at"
47
+ t.datetime "updated_at"
48
+ t.integer "quantidade_ativos"
49
+ end
50
+
51
+ end
@@ -0,0 +1,6 @@
1
+ module HistoricoAtivos
2
+ class Ativo < ActiveRecord::Base
3
+ belongs_to :historico
4
+
5
+ end
6
+ end
@@ -0,0 +1,32 @@
1
+ module HistoricoAtivos
2
+ class CarregaHistorico
3
+
4
+ attr_accessor :parser_header, :parser_trailer, :parser_ativo
5
+
6
+ def initialize(parser_header, parser_trailer, parser_ativo)
7
+ @parser_header = parser_header
8
+ @parser_trailer = parser_trailer
9
+ @parser_ativo = parser_ativo
10
+ end
11
+
12
+ def load(filepath)
13
+ return false unless File.exists?(filepath)
14
+
15
+ file = File.open(filepath, "r")
16
+
17
+ historico = Historico.new
18
+
19
+ file.each { |line|
20
+ historico.import_header @parser_header.parse(line) if line.start_with?("00")
21
+ historico.ativos << @parser_ativo.parse(line) if line.start_with?("01")
22
+ historico.import_trailer @parser_trailer.parse(line) if line.start_with?("99")
23
+ }
24
+
25
+ historico
26
+ end
27
+
28
+ def persist(historico)
29
+ historico.save
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,5 @@
1
+ module HistoricoAtivos
2
+ class Header
3
+ attr_accessor :nome_arquivo, :codigo_origem, :data_geracao
4
+ end
5
+ end
@@ -0,0 +1,17 @@
1
+ module HistoricoAtivos
2
+ class Historico < ActiveRecord::Base
3
+ set_table_name "historico_ativos"
4
+
5
+ has_many :ativos
6
+
7
+ def import_header(header)
8
+ self.nome_arquivo = header.nome_arquivo
9
+ self.data_geracao = header.data_geracao
10
+ self.codigo_origem = header.codigo_origem
11
+ end
12
+
13
+ def import_trailer(trailer)
14
+ self.quantidade_ativos = trailer.quantidade_ativos
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,114 @@
1
+ require 'date'
2
+ require 'bigdecimal'
3
+
4
+ module HistoricoAtivos
5
+ class ParserAtivo
6
+ def parse(row)
7
+ read_ativo(row) if row.start_with?("01")
8
+ end
9
+
10
+ def read_ativo(row)
11
+ ativo = Ativo.new
12
+ ativo.data = read_data row
13
+ ativo.codigo_bdi = read_codigo_bdi row
14
+ ativo.codigo = read_codigo row
15
+ ativo.tipo_mercado = read_tipo_mercado row
16
+ ativo.nome = read_nome row
17
+ ativo.especificacao = read_especificacao row
18
+ ativo.prazo_termo = read_prazo_termo row
19
+ ativo.moeda_referencia = read_moeda_referencia row
20
+ ativo.preco_abertura = read_preco_abertura row
21
+ ativo.preco_maximo = read_preco_maximo row
22
+ ativo.preco_minimo = read_preco_minimo row
23
+ ativo.preco_medio = read_preco_medio row
24
+ ativo.preco_ultimo = read_preco_ultimo row
25
+ ativo.preco_melhor_oferta_compra = read_preco_melhor_oferta_compra row
26
+ ativo.preco_melhor_oferta_venda = read_preco_melhor_oferta_venda row
27
+ ativo.total_negocios = read_total_negocios row
28
+ ativo.quantidade_titulos_negociados= read_quantidade_titulos_negociados row
29
+ ativo.volume_negocios = read_volume_negocios row
30
+ ativo
31
+ end
32
+
33
+ def read_data(row)
34
+ year = row[2..5]
35
+ month = row[6..7]
36
+ day = row[8..9]
37
+ Date.new(year.to_i, month.to_i, day.to_i)
38
+ end
39
+
40
+ def read_codigo_bdi(row)
41
+ row[10..11].to_i
42
+ end
43
+
44
+ def read_codigo(row)
45
+ row[12..23].strip
46
+ end
47
+
48
+ def read_tipo_mercado(row)
49
+ row[24..26].to_i
50
+ end
51
+
52
+ def read_nome(row)
53
+ row[27..38].strip
54
+ end
55
+
56
+ def read_especificacao(row)
57
+ row[39..48].strip
58
+ end
59
+
60
+ def read_prazo_termo(row)
61
+ row[49..51].to_i
62
+ end
63
+
64
+ def read_moeda_referencia(row)
65
+ row[52..55].strip
66
+ end
67
+
68
+ def read_preco_abertura(row)
69
+ converts_to_big_decimal row[56..68].to_i
70
+ end
71
+
72
+ def read_preco_maximo(row)
73
+ converts_to_big_decimal row[69..81].to_i
74
+ end
75
+
76
+ def read_preco_minimo(row)
77
+ converts_to_big_decimal row[82..94].to_i
78
+ end
79
+
80
+ def read_preco_medio(row)
81
+ converts_to_big_decimal row[95..107].to_i
82
+ end
83
+
84
+ def read_preco_ultimo(row)
85
+ converts_to_big_decimal row[108..120].to_i
86
+ end
87
+
88
+ def read_preco_melhor_oferta_compra(row)
89
+ converts_to_big_decimal row[121..133].to_i
90
+ end
91
+
92
+ def read_preco_melhor_oferta_venda(row)
93
+ converts_to_big_decimal row[134..146].to_i
94
+ end
95
+
96
+ def read_total_negocios(row)
97
+ row[147..151].to_i
98
+ end
99
+
100
+ def read_quantidade_titulos_negociados(row)
101
+ BigDecimal.new(row[152..169])
102
+ end
103
+
104
+ def read_volume_negocios(row)
105
+ BigDecimal.new(row[170..187])
106
+ end
107
+
108
+ def converts_to_big_decimal(preco)
109
+ preco_s = preco.to_s
110
+ preco_s.insert(preco_s.size - 2, '.')
111
+ BigDecimal.new(preco_s)
112
+ end
113
+ end
114
+ end
@@ -0,0 +1,32 @@
1
+ require 'date'
2
+
3
+ module HistoricoAtivos
4
+ class ParserHeader
5
+ def parse(row)
6
+ read_header row if row.start_with?("00")
7
+ end
8
+
9
+ def read_header(row)
10
+ header = Header.new
11
+ header.nome_arquivo = read_nome_arquivo row
12
+ header.codigo_origem = read_codigo_origem row
13
+ header.data_geracao = read_data_geracao row
14
+ header
15
+ end
16
+
17
+ def read_nome_arquivo(row)
18
+ row[02..14].strip
19
+ end
20
+
21
+ def read_codigo_origem(row)
22
+ row[15..22].strip
23
+ end
24
+
25
+ def read_data_geracao(row)
26
+ year = row[23..26]
27
+ month = row[27..28]
28
+ day = row[29..30]
29
+ Date.new(year.to_i, month.to_i, day.to_i)
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,17 @@
1
+ module HistoricoAtivos
2
+ class ParserTrailer
3
+ def parse(row)
4
+ read_trailer row if row.start_with?("99")
5
+ end
6
+
7
+ def read_trailer(row)
8
+ trailer = Trailer.new
9
+ trailer.quantidade_ativos = read_quantidade_ativos row
10
+ trailer
11
+ end
12
+
13
+ def read_quantidade_ativos(row)
14
+ total = row[31..41].to_i
15
+ end
16
+ end
17
+ end