tordist 0.1.7 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d0f408646122356b5dca6959c2fce0f52720c4ae6bd6f8876bd958075846669f
4
- data.tar.gz: e5c70e971ab5c74c55860c7353bcd065efc0b26e9ef8e072ac3dfe6b24861939
3
+ metadata.gz: 74b7a4a2b3f563c666fb2053a1fd11ff7d07b6d022ad8fea2707bf10d5d168dd
4
+ data.tar.gz: 5f61a923488e53b4b20c8e61d440c53fcb9ff30ff173a62e1b7c56a1737b1506
5
5
  SHA512:
6
- metadata.gz: 3b0ea8898a07a0a4b3ead91c0108ef65e6593d5f0d1865f31589c97de78a6d00cd19e4f34d99a4ae3d44dd465fb6171cdba16575cde62727fcf0fdde8fa4270f
7
- data.tar.gz: 3e4e876d324514ea3fb3f453accf9debb876c097c12cf03df91dbff66a13763bd4b5991aea8e80a97ffb5a8915a98b036ea8486ba6dc919cdca3fd8bd536af77
6
+ metadata.gz: 6349543cfa561b67459deaa09de702a7ead97be28d0c9c424eedc7b92c854b0296d64812437685e8de29625797b89d7b6b4227b21cf86c342670731a7f051c65
7
+ data.tar.gz: 5adbdaba0e0f361f502fc2119076ce093d7bacbb32e2744345dbad20d7ab540d1b99752d7389aed161fe1a26415256f60b5d107b98aebe096e4c46059efd8f7c
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- tordist (0.1.6)
4
+ tordist (0.1.7)
5
5
  attr_extras
6
6
 
7
7
  GEM
@@ -73,4 +73,4 @@ DEPENDENCIES
73
73
  tordist!
74
74
 
75
75
  BUNDLED WITH
76
- 1.16.0
76
+ 1.16.2
data/Guardfile CHANGED
@@ -3,6 +3,7 @@
3
3
 
4
4
  ## Uncomment and set this to only include directories you want to watch
5
5
  # directories %w(app lib config test spec feature)
6
+ directories %w(lib spec)
6
7
 
7
8
  ## Uncomment to clear the screen before every task
8
9
  # clearing :on
data/README.md CHANGED
@@ -34,6 +34,19 @@ To install this gem onto your local machine, run `bundle exec rake install`. To
34
34
 
35
35
  Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/tordist.
36
36
 
37
+ ## Publish
38
+
39
+ eh soh vc dar gem build
40
+ e o nome da gem com .gemspec
41
+ tipo gem build tordist.gemspec
42
+ na real o processo eh
43
+ 1) faz a alteracao
44
+ 2) buillda (com o comando acima)
45
+ 3) publica com gem push tordist-0.4.gem (por exemplo)
46
+ talvez vc tenha q ter permissao no gemspec
47
+ no gemspec no rubygem (edited)
48
+
37
49
  ## License
38
50
 
39
51
  The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
52
+
@@ -1,3 +1,5 @@
1
1
  require "tordist/version"
2
2
  require "tordist/generator"
3
+ require "tordist/base_generator"
4
+ require "tordist/generator2018"
3
5
  require "tordist/transaction"
@@ -0,0 +1,78 @@
1
+ class Tordist::BaseGenerator
2
+
3
+ class GenField
4
+
5
+ def value(obj)
6
+ raise 'not implemented'
7
+ end
8
+
9
+ def value_or_default(obj)
10
+ v = obj.send(@opts[:prop]) if @opts.has_key? :prop
11
+ if v != nil
12
+ return v
13
+ end
14
+ if @opts.has_key? :default
15
+ return @opts[:default]
16
+ end
17
+ end
18
+ end
19
+
20
+ class FixField
21
+ def initialize(name, content, type, start_position, end_position, opts)
22
+ @content = opts[:default]
23
+ end
24
+ def value(obj)
25
+ @content
26
+ end
27
+ end
28
+
29
+ class StrField < GenField
30
+ def initialize(name, description, type, start_position, end_position, opts)
31
+ @size = end_position - start_position + 1
32
+ @opts = opts
33
+ end
34
+ def value(obj)
35
+ value_or_default(obj).to_s.ljust(@size, ' ')
36
+ end
37
+ end
38
+
39
+ class IntField < GenField
40
+ def initialize(name, description, type, start_position, end_position, opts)
41
+ @size = end_position - start_position + 1
42
+ @name = name
43
+ @opts = opts
44
+ end
45
+ def value(obj)
46
+ #puts "parse #{@name} => #{value_or_default(obj)}" if @opts[:debug]
47
+ value_or_default(obj).to_i.abs().to_s.rjust(@size, '0')
48
+ end
49
+ end
50
+
51
+ class DecField < GenField
52
+ def initialize(name, description, type, start_position, end_position, opts)
53
+ m = type.match(/N\(([0-9]+)\)V([0-9]+)/)
54
+ int = m[1].to_i
55
+ dec = m[2].to_i
56
+ tot = int + dec + 1
57
+ @opts = opts
58
+ @formatter = "%0#{tot}.#{dec}f".to_s
59
+ end
60
+ def value(obj)
61
+ (@formatter % value_or_default(obj).abs()).gsub("." , "")
62
+ end
63
+ end
64
+
65
+ class SigField < GenField
66
+ def initialize(name, description, type, start_position, end_position, opts)
67
+ m = type.match(/N\(([0-9]+)\)V([0-9]+)/)
68
+ int = m[1].to_i
69
+ dec = m[2].to_i
70
+ tot = int + dec + 1
71
+ @opts = opts
72
+ @formatter = "%+0#{tot}.#{dec}f".to_s
73
+ end
74
+ def value(obj)
75
+ (@formatter % value_or_default(obj).abs()).gsub("." , "")
76
+ end
77
+ end
78
+ end
@@ -11,33 +11,44 @@ class Tordist::Generator
11
11
  end
12
12
 
13
13
  def header
14
- return fill_with_chars(92, "H#{header_date}#{fill_with_chars(5, @clearing_id, :preceding, "0")}TORDISTM", :following, " ")+"\r\n"
14
+ "H#{header_date}#{@clearing_id.rjust(5,'0')}#{file_name}#{distribution_type}".ljust(92," ") +"\r\n"
15
15
  end
16
16
 
17
17
  def body
18
18
  body_string = ""
19
19
  @transactions.each do |transaction|
20
20
  @transaction = transaction
21
- body_string = body_string + "#{type}#{symbol}#{@transaction.broker_alias_code}#{client_digit}#{quantity}#{price}#{@transaction.side}#{liquidation_portfolio}#{nil_user}#{client}#{client_digit}#{liquidation_type}#{bvmf}#{increase_percentage}#{deadline}#{order_number}#{broker}\r\n"
21
+ body_string = body_string + "#{type}#{symbol}#{@transaction.broker_alias_code.rjust(7,'0')}#{client_digit}#{quantity}#{price}#{@transaction.side}#{liquidation_portfolio}#{nil_user}#{client}#{client_digit}#{liquidation_type}#{bvmf}#{increase_percentage}#{deadline}#{order_number}#{broker}\r\n"
22
22
  end
23
23
  return body_string
24
24
  end
25
25
 
26
26
  protected
27
+
28
+ def file_name
29
+ 'TORDIST'
30
+ end
31
+
32
+ def distribution_type
33
+ # 05 – TIPO DA DISTRIBUIÇÃO
34
+ # “P” – PERCENTUAL, “M” – PREÇO MÉDIO POR LOTE, “D” – PREÇO DIGITADO, “O” – PREÇO MÉDIO POR ORDEM, “R” – PREÇO DIGITADO POR ORDEM.
35
+ 'M'
36
+ end
27
37
 
28
38
  def header_date
29
39
  @transactions.first.date.strftime("%d/%m/%Y")
30
40
  end
31
41
 
32
42
  def symbol
33
- fill_with_chars(12, @transaction.symbol, :following, " ")
43
+ @transaction.symbol.ljust(12, ' ')
34
44
  end
35
45
 
36
46
  def quantity
37
- fill_with_chars(12, @transaction.quantity.abs.to_i.to_s, :preceding, "0")
47
+ @transaction.quantity.abs.to_i.to_s.rjust(12, '0')
38
48
  end
39
49
 
40
50
  def type
51
+ # FIXO “B”
41
52
  "B"
42
53
  end
43
54
 
@@ -46,7 +57,8 @@ class Tordist::Generator
46
57
  end
47
58
 
48
59
  def price
49
- fill_with_chars(11, "", :preceding, "0")
60
+ # SOMENTE PARA TIPO DE DISTRIBUIÇÃO "D"
61
+ ''.rjust(11,'0')
50
62
  end
51
63
 
52
64
  def liquidation_portfolio
@@ -54,15 +66,15 @@ class Tordist::Generator
54
66
  end
55
67
 
56
68
  def nil_user
57
- fill_with_chars(5, "", :following, "0")
69
+ ''.rjust(5,"0")
58
70
  end
59
71
 
60
72
  def client
61
- fill_with_chars(9, "", :following, "0")
73
+ ''.rjust(9,'0')
62
74
  end
63
75
 
64
76
  def client_digit
65
- fill_with_chars(1, "", :following, "0")
77
+ '0'
66
78
  end
67
79
 
68
80
  def liquidation_type
@@ -70,35 +82,23 @@ class Tordist::Generator
70
82
  end
71
83
 
72
84
  def bvmf
73
- fill_with_chars(2, "1", :following, " ")
85
+ '1 '
74
86
  end
75
87
 
76
88
  def increase_percentage
77
- fill_with_chars(12, "+", :following, "0")
89
+ '+'.ljust(12,'0')
78
90
  end
79
91
 
80
92
  def deadline
81
- fill_with_chars(4, "", :following, "0")
93
+ ''.rjust(4,'0')
82
94
  end
83
95
 
84
96
  def order_number
85
- fill_with_chars(9, "", :following, "0")
97
+ ''.rjust(9,'0')
86
98
  end
87
99
 
88
100
  def broker
89
- fill_with_chars(5, @transaction.broker, :preceding, "0")
101
+ @transaction.broker.rjust(5,'0')
90
102
  end
91
103
 
92
- def fill_with_chars(total_size, text, direction, char)
93
- size = total_size - text.size
94
- char_text = ""
95
- for i in 1..size
96
- char_text = char_text + char
97
- end
98
- if (direction == :following)
99
- return text + char_text
100
- elsif (direction == :preceding)
101
- return char_text + text
102
- end
103
- end
104
- end
104
+ end
@@ -0,0 +1,74 @@
1
+ class Tordist::Generator2018 < Tordist::BaseGenerator
2
+
3
+ def initialize(clearing_id)
4
+ @clearing_id = clearing_id.to_s
5
+ @line_length = 108
6
+ @layout = [
7
+ FixField.new('1 - TIPO DE REGISTRO', 'FIXO B', 'X(01)', 1, 1, default: 'B'),
8
+ StrField.new('2 - CODIGO DE NEGOCIACAO', 'CODIGO DE NEGOCIACAO NA BOVESPA', 'X(12)', 2, 13, prop: :symbol),
9
+ IntField.new('3 - CODIGO DO CLIENTE', '', 'N(7)', 14, 20, prop: :broker_alias_code),
10
+ IntField.new('4 - DIGITO DO CLIENTE', '', 'N(01)', 21, 21, default: 0),
11
+ IntField.new(
12
+ '5 - QUANTIDADE / PERCENTUAL',
13
+ 'PARA TIPO DE DISTRIBUIÇÃO = “D” OU “M” QUANTIDADE DO CLIENTE; PARA TIPO DE DISTRIBUIÇÃO = “P” PERCENTUAL A SER DISTRIBUIDO PARA O CLIENTE.',
14
+ 'N(12)', 22, 33, prop: :quantity
15
+ ),
16
+ DecField.new('6 - PRECO DO NEGOCIO', 'SOMENTE PARA TIPO DE DISTRIBUICAO "D"', 'N(09)V02', 34, 44, default: 0),
17
+ StrField.new('7 - NATUREZA DA OPERACAO', '“C” = COMPRA OU “V” = VENDA', 'X(1)', 45, 45, prop: :side),
18
+ IntField.new('8 - CARTEIRA DE LIQUIDACAO', '', 'N(3)', 46, 48, default: 216),
19
+ IntField.new('9 - USUARIO', 'CUSTODIANTE OU USUÁRIO DE ARBITRAGEM', 'N(05)', 49, 53, default: 0),
20
+ IntField.new('10 - CLIENTE', 'CLIENTE NO CUSTODIANTE OU NO USUÁRIO DA ARBITRAGEM', 'N(9)', 54, 62, default: 0),
21
+ IntField.new('11 - DÍGITO DO CLIENTE', 'DÍGITO DO CLIENTE NO CUSTODIANTE OU NO USUÁRIO DA ARBITRAGEM', 'N(1)', 63, 63, default: 0),
22
+ StrField.new('12 - TIPO DE LIQUIDACAO', '“C” = CUSTODIANTE OU “A” = ARBITRAGEM', 'X(1)', 64, 64, default: 'C'),
23
+ StrField.new('13 - BOLSA DO NEGOCIO', '“1 ” = BOVESPA - "5" = SOMA', 'X(2)', 65, 66, default: '1'),
24
+ SigField.new(
25
+ '14 - PERCENTUAL DE ACRÉSCIMO OU REDUÇÃO DO CUSTO DE CLEARING',
26
+ 'A PRIMEIRA POSIÇÃO DEVE CONTER O SINAL DE NEGATIVO PARA DESCONTO E O SINAL DE POSITIVO PARA ACRÉSCIMO. NO CASO DE CUSTO TOTAL UTILIZE SINAL POSITIVO. PARA ASSUMIR O DO CADASTRO DE CLIENTES DO SINACOR, DEIXAR ESTA INFORMAÇÃO EM BRANCO OU PREENCHER COM ZERO',
27
+ 'N(04)V08', 67, 78,
28
+ default: 0
29
+ ),
30
+ IntField.new('15 - PRAZO DO TERMO', 'PRAZO DO TERMO. NA AUSÊNCIA DO PRAZO OU NÃO TERMO, PREENCHER COM ZEROS.', 'N(4)', 79, 82, default: 0),
31
+ IntField.new('16 - NUMERO DA ORDEM', 'NUMERO DA ORDEM A SER DISTRIBUIDA', 'N(09)', 83, 91, default: 0),
32
+ SigField.new(
33
+ '17 - PERCENTUAL DE ACRESCIMO OU REDUCAO DO CUSTO DE EXECUCAO',
34
+ 'A PRIMEIRA POSIÇÃO DEVE CONTER O SINAL DE NEGATIVO PARA DESCONTO E O SINAL DE POSITIVO PARA ACRÉSCIMO. NO CASO DE CUSTO TOTAL UTILIZE SINAL POSITIVO. PARA ASSUMIR O DO CADASTRO DE CLIENTES DO SINACOR, DEIXAR ESTA INFORMAÇÃO EM BRANCO OU PREENCHER COM ZERO',
35
+ 'N(04)V08', 92, 103,
36
+ default: 0
37
+ ),
38
+ IntField.new('18 - CORRETORA ORIGEM', 'CÓDIGO DO PARTICIPANTE ORIGEM DO NEGÓCIO', 'N(05)', 104, 108, prop: :broker)
39
+ ]
40
+ end
41
+
42
+ def generate(transactions)
43
+ lines = []
44
+ lines << header(transactions)
45
+ transactions.each do |transaction|
46
+ line = @layout.map {|field| field.value(transaction) }.join
47
+ if line.length != @line_length
48
+ raise "line length error: #{line}"
49
+ end
50
+ lines << line
51
+ end
52
+ lines << ''
53
+ lines.join("\r\n")
54
+ end
55
+
56
+ def header(transactions)
57
+ "H#{header_date(transactions)}#{@clearing_id.rjust(5,'0')}#{file_name}#{distribution_type}".ljust(@line_length," ")
58
+ end
59
+
60
+ def header_date(transactions)
61
+ transactions.first.date.strftime("%d/%m/%Y")
62
+ end
63
+
64
+ def file_name
65
+ 'TORDIST'
66
+ end
67
+
68
+ def distribution_type
69
+ 'M'
70
+ end
71
+
72
+
73
+
74
+ end
@@ -12,7 +12,7 @@ class Tordist::Transaction
12
12
  end
13
13
 
14
14
  def broker_alias_code
15
- @row[:broker_alias_code].rjust(7,'0')
15
+ @row[:broker_alias_code]
16
16
  end
17
17
 
18
18
  def side
@@ -1,3 +1,3 @@
1
1
  module Tordist
2
- VERSION = "0.1.7"
2
+ VERSION = "0.2.0"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tordist
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.7
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Investtools
@@ -113,7 +113,9 @@ files:
113
113
  - bin/console
114
114
  - bin/setup
115
115
  - lib/tordist.rb
116
+ - lib/tordist/base_generator.rb
116
117
  - lib/tordist/generator.rb
118
+ - lib/tordist/generator2018.rb
117
119
  - lib/tordist/transaction.rb
118
120
  - lib/tordist/version.rb
119
121
  - tordist.gemspec