tordist 0.1.7 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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