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 +4 -4
- data/Gemfile.lock +2 -2
- data/Guardfile +1 -0
- data/README.md +13 -0
- data/lib/tordist.rb +2 -0
- data/lib/tordist/base_generator.rb +78 -0
- data/lib/tordist/generator.rb +26 -26
- data/lib/tordist/generator2018.rb +74 -0
- data/lib/tordist/transaction.rb +1 -1
- data/lib/tordist/version.rb +1 -1
- metadata +3 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 74b7a4a2b3f563c666fb2053a1fd11ff7d07b6d022ad8fea2707bf10d5d168dd
|
4
|
+
data.tar.gz: 5f61a923488e53b4b20c8e61d440c53fcb9ff30ff173a62e1b7c56a1737b1506
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6349543cfa561b67459deaa09de702a7ead97be28d0c9c424eedc7b92c854b0296d64812437685e8de29625797b89d7b6b4227b21cf86c342670731a7f051c65
|
7
|
+
data.tar.gz: 5adbdaba0e0f361f502fc2119076ce093d7bacbb32e2744345dbad20d7ab540d1b99752d7389aed161fe1a26415256f60b5d107b98aebe096e4c46059efd8f7c
|
data/Gemfile.lock
CHANGED
data/Guardfile
CHANGED
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
|
+
|
data/lib/tordist.rb
CHANGED
@@ -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
|
data/lib/tordist/generator.rb
CHANGED
@@ -11,33 +11,44 @@ class Tordist::Generator
|
|
11
11
|
end
|
12
12
|
|
13
13
|
def header
|
14
|
-
|
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
|
-
|
43
|
+
@transaction.symbol.ljust(12, ' ')
|
34
44
|
end
|
35
45
|
|
36
46
|
def quantity
|
37
|
-
|
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
|
-
|
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
|
-
|
69
|
+
''.rjust(5,"0")
|
58
70
|
end
|
59
71
|
|
60
72
|
def client
|
61
|
-
|
73
|
+
''.rjust(9,'0')
|
62
74
|
end
|
63
75
|
|
64
76
|
def client_digit
|
65
|
-
|
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
|
-
|
85
|
+
'1 '
|
74
86
|
end
|
75
87
|
|
76
88
|
def increase_percentage
|
77
|
-
|
89
|
+
'+'.ljust(12,'0')
|
78
90
|
end
|
79
91
|
|
80
92
|
def deadline
|
81
|
-
|
93
|
+
''.rjust(4,'0')
|
82
94
|
end
|
83
95
|
|
84
96
|
def order_number
|
85
|
-
|
97
|
+
''.rjust(9,'0')
|
86
98
|
end
|
87
99
|
|
88
100
|
def broker
|
89
|
-
|
101
|
+
@transaction.broker.rjust(5,'0')
|
90
102
|
end
|
91
103
|
|
92
|
-
|
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
|
data/lib/tordist/transaction.rb
CHANGED
data/lib/tordist/version.rb
CHANGED
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.
|
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
|