formatos-febraban 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 0f3b8433a2ac8020f40c378303a6a3aef0a7fd1f
4
+ data.tar.gz: a22fbbae8821eeff5af8273646170f78ca68918c
5
+ SHA512:
6
+ metadata.gz: 318127f609eb6b2147ba182bb034c2c849abc7fbc2b8d061f3ae823159e5297407656bd0fbd5b2a23ced5d0a148019afe9579c4655242603ea7901c79c12d5e5
7
+ data.tar.gz: a185a24cdf15eb28244247a50398207ca1bd4b0c3b0e0882db1efbccdca4f87b10f7a59e3f416203fed96cd50aff76e2a40532076e0bc2b68f1b0e138ad71b28
@@ -0,0 +1,9 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --format documentation
2
+ --color
@@ -0,0 +1,3 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.2.1
@@ -0,0 +1,13 @@
1
+ # Contributor Code of Conduct
2
+
3
+ As contributors and maintainers of this project, we pledge to respect all people who contribute through reporting issues, posting feature requests, updating documentation, submitting pull requests or patches, and other activities.
4
+
5
+ We are committed to making participation in this project a harassment-free experience for everyone, regardless of level of experience, gender, gender identity and expression, sexual orientation, disability, personal appearance, body size, race, age, or religion.
6
+
7
+ Examples of unacceptable behavior by participants include the use of sexual language or imagery, derogatory comments or personal attacks, trolling, public or private harassment, insults, or other unprofessional conduct.
8
+
9
+ Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct. Project maintainers who do not follow the Code of Conduct may be removed from the project team.
10
+
11
+ Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by opening an issue or contacting one or more of the project maintainers.
12
+
13
+ This Code of Conduct is adapted from the [Contributor Covenant](http:contributor-covenant.org), version 1.0.0, available at [http://contributor-covenant.org/version/1/0/0/](http://contributor-covenant.org/version/1/0/0/)
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in formatos-febraban.gemspec
4
+ gemspec
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2015 josé Ricardo Almeida
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
@@ -0,0 +1,39 @@
1
+ # Formatos::Febraban
2
+
3
+ Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/formatos/febraban`. To experiment with that code, run `bin/console` for an interactive prompt.
4
+
5
+ TODO: Delete this and the text above, and describe your gem
6
+
7
+ ## Installation
8
+
9
+ Add this line to your application's Gemfile:
10
+
11
+ ```ruby
12
+ gem 'formatos-febraban'
13
+ ```
14
+
15
+ And then execute:
16
+
17
+ $ bundle
18
+
19
+ Or install it yourself as:
20
+
21
+ $ gem install formatos-febraban
22
+
23
+ ## Usage
24
+
25
+ TODO: Write usage instructions here
26
+
27
+ ## Development
28
+
29
+ After checking out the repo, run `bin/setup` to install dependencies. Then, run `bin/console` for an interactive prompt that will allow you to experiment.
30
+
31
+ To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release` to create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
32
+
33
+ ## Contributing
34
+
35
+ 1. Fork it ( https://github.com/[my-github-username]/formatos-febraban/fork )
36
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
37
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
38
+ 4. Push to the branch (`git push origin my-new-feature`)
39
+ 5. Create a new Pull Request
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -0,0 +1,79 @@
1
+
2
+ class FormatSection
3
+
4
+ def initialize(master, responsabilidade_banco, responsabilidade_empresa,
5
+ permite_duplicata = true)
6
+
7
+ @master = master
8
+ @section = :nil
9
+ @errors = []
10
+ @responsabilidade_banco = responsabilidade_banco
11
+ @responsabilidade_empresa = responsabilidade_empresa
12
+ @permite_duplicata = permite_duplicata
13
+ end
14
+
15
+ #-------------------------------------------------------------------
16
+ #-------------------------------------------------------------------
17
+ # Gerais
18
+ public
19
+ def section
20
+ @section
21
+ end
22
+
23
+ def master
24
+ @master
25
+ end
26
+
27
+ def errors
28
+ @errors
29
+ end
30
+
31
+ protected
32
+ def get_section_value position
33
+ self.section.get_position_value(position)
34
+ end
35
+
36
+ #-------------------------------------------------------------------
37
+ #-------------------------------------------------------------------
38
+ # Getters
39
+ public
40
+ def is_optional?
41
+ self.section.is_optional?
42
+ end
43
+
44
+ def is_section? section
45
+ self.section.is_section? section
46
+ end
47
+
48
+ def is_banco?
49
+ @responsabilidade_banco
50
+ end
51
+
52
+ def is_empresa?
53
+ @responsabilidade_empresa
54
+ end
55
+
56
+ def is_permite_duplicata?
57
+ @permite_duplicata
58
+ end
59
+
60
+ def get_section_value position
61
+ self.section.get_position_value(position)
62
+ end
63
+
64
+ def get_id
65
+ self.get_section_value(0).to_s
66
+ end
67
+
68
+ def to_s
69
+ self.section.to_s
70
+ end
71
+
72
+ #-------------------------------------------------------------------
73
+ #-------------------------------------------------------------------
74
+ # Setters
75
+ protected
76
+ def set_section_value(position, value)
77
+ self.section.set_position_value(position, value)
78
+ end
79
+ end
@@ -0,0 +1,88 @@
1
+
2
+ class Position
3
+ def initialize(position, length, numbers_only,
4
+ content = "", immutable = false, obligatory = false)
5
+
6
+ @position = position
7
+ @length = length
8
+ @numbers_only = numbers_only
9
+ @content = content
10
+ @immutable = immutable
11
+ @obligatory = obligatory
12
+ end
13
+
14
+ def content
15
+ @content
16
+ end
17
+
18
+ def length
19
+ @length
20
+ end
21
+
22
+ def is_obligatory?
23
+ @obligatory
24
+ end
25
+
26
+ def is_empty?
27
+ @content == ""
28
+ end
29
+
30
+ def is_numbers_only?
31
+ @numbers_only
32
+ end
33
+
34
+ def is_immutable?
35
+ @immutable
36
+ end
37
+
38
+ def is_valid?
39
+ self.is_obligatory? ? !self.is_empty? : true
40
+ end
41
+
42
+ def to_s
43
+ self.content.to_s
44
+ end
45
+
46
+ def to_clean_s
47
+ self.to_s.strip()
48
+ end
49
+
50
+ def set_content content
51
+ if not @immutable
52
+ if self.is_numbers_only? and !self.is_number(content)
53
+ raise "Apenas valores numéricos
54
+ Valor: #{content}"
55
+ end
56
+
57
+ @content = self.adjust_content(content)
58
+ else
59
+ raise "Valor imutável"
60
+ end
61
+ end
62
+
63
+ def adjust_content string
64
+ string = string.to_s
65
+
66
+ if string.length > self.length
67
+ string = self.reduce_string string
68
+
69
+ elsif string.length < self.length
70
+ if self.is_numbers_only?
71
+ string = string.rjust(self.length, "0")
72
+
73
+ else
74
+ string = string.ljust(self.length, " ")
75
+ end
76
+ end
77
+
78
+ string.upcase
79
+ end
80
+
81
+ def reduce_string(string)
82
+ string[0 .. self.length - 1]
83
+ end
84
+
85
+ def is_number value
86
+ true if Float(value) rescue false
87
+ end
88
+ end
@@ -0,0 +1,41 @@
1
+
2
+ class Section
3
+ require_relative 'position'
4
+
5
+ def initialize(position_hash, optional = false)
6
+ @positions = position_hash
7
+ @optional = optional
8
+ end
9
+
10
+ def is_optional?
11
+ @optional
12
+ end
13
+
14
+ def to_s
15
+ self.positions.map{ |k, v| v.to_s }.join()
16
+ end
17
+
18
+ def positions
19
+ @positions.to_a
20
+ end
21
+
22
+ def get_position position
23
+ self.positions[position.to_i][1]
24
+ end
25
+
26
+ def get_position_value position
27
+ self.get_position(position).to_clean_s
28
+ end
29
+
30
+ def is_section? section
31
+ self.positions.select {|b| b[1].content == section }.length > 0
32
+ end
33
+
34
+ def is_valid?
35
+ self.positions.select {|b| b[1].is_valid? == false }.length < 1
36
+ end
37
+
38
+ def set_position_value(position, content)
39
+ @positions[position.to_i].set_content content
40
+ end
41
+ end
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "formatos/febraban"
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ # require "pry"
11
+ # Pry.start
12
+
13
+ require "irb"
14
+ IRB.start
@@ -0,0 +1,7 @@
1
+ #!/bin/bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+
5
+ bundle install
6
+
7
+ # Do any other automated setup that you need to do here
@@ -0,0 +1,24 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'formatos/febraban/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "formatos-febraban"
8
+ spec.version = Formatos::Febraban::VERSION
9
+ spec.authors = ["josé Ricardo Almeida"]
10
+ spec.email = ["jose@trackmob.com.br"]
11
+
12
+ spec.summary = "Formatos bancários EDI FEBRABAN"
13
+ spec.description = "Formatos para envido de dados bancários da FEBRABAN"
14
+ spec.homepage = "https://bitbucket.org/jose_ricardo_almeida/formatos-febraban"
15
+ spec.license = "MIT"
16
+
17
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
18
+ spec.bindir = "exe"
19
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
20
+ spec.require_paths = ["lib"]
21
+
22
+ spec.add_development_dependency "bundler", "~> 1.9"
23
+ spec.add_development_dependency "rake", "~> 10.0"
24
+ end
@@ -0,0 +1,505 @@
1
+
2
+ class Febraban150
3
+ require 'date'
4
+
5
+ # Carrega todas as dependências de Layout
6
+ Dir[File.join(File.dirname(__FILE__), '../..', 'base', '**/*.rb')].sort.each do |file|
7
+ require file
8
+ end
9
+
10
+ # Layout:
11
+ # http://www.febraban.org.br/7Rof7SWg6qmyvwJcFwF7I0aSDf9jyV/sitefebraban/Layout%20D%E9bito%20Vers%E3o%2005%20-%2029022008.pdf
12
+
13
+ # Partes do Layout
14
+ require_relative 'febraban_150_a' # Header - Empresa e Banco
15
+ require_relative 'febraban_150_b' # Cadastro Débito Automático - Banco
16
+ require_relative 'febraban_150_c' # Ocorrências - Empresa
17
+ require_relative 'febraban_150_d' # Alteração da Identificação Cliente/Empresa - Empresa
18
+ require_relative 'febraban_150_e' # Débito em Conta - Empresa
19
+ require_relative 'febraban_150_f' # Retorno do Débito Automático - Banco
20
+ require_relative 'febraban_150_h' # Ocorrência da Alteração Cliente/Empresa - Banco
21
+ require_relative 'febraban_150_i' # Incentivo de Débito Automático - Empresa
22
+ require_relative 'febraban_150_j' # Confirmação de Processamento - Empresa/Banco
23
+ require_relative 'febraban_150_k' # Lei 10833, Cobrança não-cumulativa COFINS - Empresa
24
+ require_relative 'febraban_150_l' # Cronograma de Faturamento Contas/Tributos - Empresa
25
+ require_relative 'febraban_150_t' # Total de Clientes debitados - Banco
26
+ require_relative 'febraban_150_x' # Relação de Agências - Banco
27
+ require_relative 'febraban_150_z' # Footer/Trailler - Empresa/Banco
28
+
29
+ #-------------------------------------------------------------------
30
+ #-------------------------------------------------------------------
31
+ # Construtor
32
+ def initialize file = ""
33
+ @sections = []
34
+
35
+ if file.length > 0
36
+ self.process_file file
37
+ end
38
+ end
39
+
40
+ #-------------------------------------------------------------------
41
+ #-------------------------------------------------------------------
42
+ # Geral
43
+ protected
44
+ def add_section section
45
+ if section.is_valid?
46
+ self.sections << section
47
+ else
48
+ raise "Seção #{section.get_id} está inválida:
49
+ #{section.errors.inspect}
50
+ #{section.to_s}"
51
+ end
52
+ end
53
+
54
+ def add_section_from_business section
55
+ if section.is_empresa?
56
+ self.add_section section
57
+ self
58
+ else
59
+ raise "Seção #{section.get_id} não pode ser criada pela Empresa"
60
+ end
61
+ end
62
+
63
+ #-------------------------------------------------------------------
64
+ #-------------------------------------------------------------------
65
+ # Criação das Partes
66
+ public
67
+
68
+ # Seção A
69
+ def create_header(codigo_remessa, codigo_convenio, nome_empresa,
70
+ codigo_banco, nome_banco, numero_sequencial)
71
+
72
+ if self.get_header.nil?
73
+ data = Time.new
74
+
75
+ section = self.get_new_section("A")
76
+
77
+ section.set_codigo_remessa codigo_remessa
78
+ section.set_codigo_convenio codigo_convenio
79
+ section.set_nome_empresa nome_empresa
80
+ section.set_codigo_banco codigo_banco
81
+ section.set_nome_banco nome_banco
82
+ section.set_data_geracao data.strftime("%Y%m%d")
83
+ section.set_numero_sequencial numero_sequencial
84
+ section.set_versao_layout self.versao_layout
85
+ section.set_identificacao_servico self.identificacao_servico
86
+ section.set_reservado ""
87
+
88
+ self.add_section_from_business section
89
+
90
+ else
91
+ raise "Header já declarado!"
92
+ end
93
+ end
94
+
95
+ # Seção C
96
+ def create_occorencias(id_cliente_empresa, agencia_debito, id_cliente_banco,
97
+ ocorrencia_1, ocorrencia_2, cod_movimento)
98
+
99
+ self.valida_existe_header
100
+
101
+ section = self.get_new_section("C")
102
+
103
+ section.set_id_cliente_empresa id_cliente_empresa
104
+ section.set_agencia_debito agencia_debito
105
+ section.set_id_cliente_banco id_cliente_banco
106
+ section.set_ocorrencia_1 ocorrencia_1
107
+ section.set_ocorrencia_2 ocorrencia_2
108
+ section.set_reservado ""
109
+ section.set_cod_movimento cod_movimento
110
+
111
+ self.add_section_from_business section
112
+ end
113
+
114
+ # Seção D
115
+ def create_alteracao_id(id_cliente_empresa_old, agencia_debito, id_cliente_banco,
116
+ id_cliente_empresa_new, ocorrencia, cod_movimento)
117
+
118
+ self.valida_existe_header
119
+
120
+ section = self.get_new_section("D")
121
+
122
+ section.set_id_cliente_empresa_old id_cliente_empresa_old
123
+ section.set_agencia_debito agencia_debito
124
+ section.set_id_cliente_banco id_cliente_banco
125
+ section.set_id_cliente_empresa_new id_cliente_empresa_new
126
+ section.set_ocorrencia ocorrencia
127
+ section.set_reservado ""
128
+ section.set_cod_movimento cod_movimento
129
+
130
+ self.add_section_from_business section
131
+ end
132
+
133
+ # Seção E
134
+ def create_debito_conta(id_cliente_empresa, agencia_debito, id_cliente_banco,
135
+ data_vencimento, valor_debito, codigo_moeda,
136
+ obs_empresa, tipo_id_cliente, id_cliente,
137
+ cod_movimento)
138
+
139
+ self.valida_existe_header
140
+
141
+ section = self.get_new_section("E")
142
+
143
+ section.set_id_cliente_empresa id_cliente_empresa
144
+ section.set_agencia_debito agencia_debito
145
+ section.set_id_cliente_banco id_cliente_banco
146
+ section.set_data_vencimento data_vencimento
147
+ section.set_valor_debito valor_debito
148
+ section.set_codigo_moeda codigo_moeda
149
+ section.set_obs_empresa obs_empresa
150
+ section.set_tipo_id_cliente tipo_id_cliente
151
+ section.set_id_cliente id_cliente
152
+ section.set_reservado ""
153
+ section.set_cod_movimento cod_movimento
154
+
155
+ self.add_section_from_business section
156
+ end
157
+
158
+ # Seção I
159
+ def create_incentivo_debito(id_cliente_empresa, tipo_id_cliente, id_cliente,
160
+ nome, cidade, estado)
161
+
162
+ self.valida_existe_header
163
+
164
+ section = self.get_new_section("I")
165
+
166
+ section.set_id_cliente_empresa id_cliente_empresa
167
+ section.set_tipo_id_cliente tipo_id_cliente
168
+ section.set_id_cliente id_cliente
169
+ section.set_nome nome
170
+ section.set_cidade cidade
171
+ section.set_estado estado
172
+ section.set_reservado ""
173
+
174
+ self.add_section_from_business section
175
+ end
176
+
177
+ # Seção J
178
+ def create_confirmacao_processo data_processamento
179
+ self.valida_existe_header
180
+ self.valida_existe_trailler
181
+
182
+ raise "Confirmação do processo já executada" if self.get_section("J").length > 0
183
+
184
+ header = this.get_header
185
+ trailler = this.get_trailler
186
+
187
+ section = self.get_new_section("J")
188
+
189
+ section.set_numero_sequencial header.get_numero_sequencial
190
+ section.set_data_geracao header.get_data_geracao
191
+ section.set_total_processados trailler.get_total_registros
192
+ section.set_valor_total trailler.get_valor_total
193
+ section.set_data_processamento data_processamento
194
+ section.set_reservado ""
195
+
196
+ self.add_section_from_business section
197
+ end
198
+
199
+ # Seção J
200
+ def update_confirmacao_processo data_processamento
201
+ self.valida_existe_header
202
+ self.valida_existe_trailler
203
+ self.valida_existe_confirmacao
204
+
205
+ header = this.get_header
206
+ trailler = this.get_trailler
207
+
208
+ section = self.get_confirmacao
209
+
210
+ section.set_numero_sequencial header.get_numero_sequencial
211
+ section.set_data_geracao header.get_data_geracao
212
+ section.set_total_processados trailler.get_total_registros
213
+ section.set_valor_total trailler.get_valor_total
214
+ section.set_data_processamento data_processamento
215
+ end
216
+
217
+ # Seção K
218
+ def create_lei_10883(id_cliente_empresa, agencia_debito, id_cliente_banco,
219
+ tipo_tratamento, valor_debito, codigo_receita,
220
+ tipo_id_cliente, id_cliente)
221
+
222
+ self.valida_existe_header
223
+ valida_existe_section "E"
224
+
225
+ section = self.get_new_section("K")
226
+
227
+ section.set_id_cliente_empresa id_cliente_empresa
228
+ section.set_agencia_debito agencia_debito
229
+ section.set_id_cliente_banco id_cliente_banco
230
+ section.set_tipo_tratamento tipo_tratamento
231
+ section.set_valor_debitado valor_debito
232
+ section.set_codigo_receita codigo_receita
233
+ section.set_tipo_id_cliente tipo_id_cliente
234
+ section.set_id_cliente id_cliente
235
+ section.set_reservado ""
236
+
237
+ self.add_section_from_business section
238
+ end
239
+
240
+ # Seção L
241
+ def create_cronograma_faturamento(data_faturamento, data_vencimento,
242
+ data_remessa_banco, data_remessa_fisica)
243
+
244
+ self.valida_existe_header
245
+
246
+ section = self.get_new_section("L")
247
+
248
+ section.set_data_faturamento data_faturamento
249
+ section.set_data_vencimento_fatura data_vencimento
250
+ section.set_data_remessa_banco data_remessa_banco
251
+ section.set_data_remessa_fisica data_remessa_fisica
252
+ section.set_reservado ""
253
+
254
+ self.add_section_from_business section
255
+ end
256
+
257
+ # Seção Z
258
+ def create_trailler
259
+ self.valida_existe_header
260
+
261
+ if self.get_trailler.nil?
262
+ if self.get_section("E").length > 0
263
+ section = self.get_new_section("Z")
264
+
265
+ section.set_total_registros 0
266
+ section.set_valor_total 0
267
+ section.set_reservado ""
268
+
269
+ self.add_section_from_business section
270
+ self.update_trailler
271
+ else
272
+ raise "Nenhum valor declarado (Seções E)!"
273
+ end
274
+ else
275
+ raise "Trailler já declarado!"
276
+ end
277
+ end
278
+
279
+ # Seção Z
280
+ def update_trailler
281
+ self.valida_existe_trailler
282
+
283
+ if self.get_section("E").length > 0
284
+ section = self.get_trailler
285
+ section.set_total_registros self.sections.length + 1
286
+ section.set_valor_total self.calculate_valor_total
287
+ else
288
+ raise "Nenhum valor declarado (Seções E)!"
289
+ end
290
+ end
291
+
292
+ #-------------------------------------------------------------------
293
+ #-------------------------------------------------------------------
294
+ # Validações
295
+ protected
296
+ def valida_existe_header
297
+ raise "Header (Seção A) ainda não declarado" if self.get_header.nil?
298
+ end
299
+
300
+ def valida_existe_trailler
301
+ raise "Header (Seção Z) ainda não declarado" if self.get_trailler.nil?
302
+ end
303
+
304
+ def valida_existe_confirmacao
305
+ raise "Confirmação (Seção J) ainda não declarada" if self.get_confirmacao.nil?
306
+ end
307
+
308
+ def valida_existe_section section
309
+ raise "nenhum Registro da Seção #{section} foi declarado" if self.get_section(section).length <= 0
310
+ end
311
+
312
+ def valida_lei_10833
313
+ secaoK = self.get_section("K")
314
+
315
+ if secaoK.length > 0
316
+ secaoE = self.get_section("E")
317
+
318
+ raise "Deve haver um registro da Seção K para registro da Seção E.
319
+ Existem #{secaoK.length} registros para K e #{secaoE.length} para a seção E" if secaoK.length == secaoE.length
320
+ end
321
+ end
322
+
323
+ def is_empresa_valid?
324
+ self.valida_existe_header
325
+ self.valida_existe_section "E"
326
+ self.valida_lei_10833
327
+ self.valida_existe_trailler
328
+
329
+ raise "Seção B inválida para Empresas" if self.get_section("B").length > 0
330
+ raise "Seção F inválida para Empresas" if self.get_section("F").length > 0
331
+ raise "Seção H inválida para Empresas" if self.get_section("H").length > 0
332
+ end
333
+
334
+ def is_banco_valid?
335
+ self.valida_existe_header
336
+ self.valida_existe_section "F"
337
+ self.valida_lei_10833
338
+ self.valida_existe_trailler
339
+
340
+ raise "Seção C inválida para Bancos" if self.get_section("C").length > 0
341
+ raise "Seção D inválida para Bancos" if self.get_section("D").length > 0
342
+ raise "Seção E inválida para Bancos" if self.get_section("E").length > 0
343
+ end
344
+
345
+ public
346
+ def is_valid?
347
+ if self.layout_empresa?
348
+ raise "Layout de Empresa inválido!" unless self.is_empresa_valid?
349
+
350
+ elsif self.layout_banco?
351
+ raise "Layout de Banco inválido!" unless self.is_banco_valid?
352
+
353
+ else
354
+ raise "Código de Remessa desconhecido: #{codigo_remessa}"
355
+ end
356
+
357
+ result = self.is_sections_valid?
358
+ end
359
+
360
+ #-------------------------------------------------------------------
361
+ #-------------------------------------------------------------------
362
+ # Getters
363
+ public
364
+ def compara_resultado outro_layout
365
+ if self.layout_empresa?
366
+ raise "Layout de comparação deve ser de Banco" unless outro_layout.layout_banco?
367
+
368
+ elsif self.layout_banco?
369
+ raise "Layout de comparação deve ser de Empresa" unless outro_layout.layout_empresa?
370
+
371
+ else
372
+ raise "Tipo de Layout não definido!"
373
+ end
374
+ end
375
+
376
+ #-------------------------------------------------------------------
377
+ #-------------------------------------------------------------------
378
+ # Getters
379
+ public
380
+ def sections
381
+ @sections.to_a
382
+ end
383
+
384
+ def has_section section
385
+ self.get_section(section).length > 0
386
+ end
387
+
388
+ def get_section section
389
+ self.sections.select {|c| c.is_section?(section) == true }
390
+ end
391
+
392
+ def is_sections_valid?
393
+ self.sections.select {|b| b.is_valid? == false }.length < 1
394
+ end
395
+
396
+ def to_s
397
+ self.sections.map {|a| a.to_s}.join("\n")
398
+ end
399
+
400
+ def get_header
401
+ self.get_section("A").first()
402
+ end
403
+
404
+ def get_trailler
405
+ self.get_section("Z").first()
406
+ end
407
+
408
+ def get_confirmacao
409
+ self.get_section("J").first()
410
+ end
411
+
412
+ def get_valor_total
413
+ self.get_trailler.get_valor_total
414
+ end
415
+
416
+ def versao_layout
417
+ self.get_header.get_versao_layout
418
+ end
419
+
420
+ def identificacao_servico
421
+ self.get_header.get_identificacao_servico
422
+ end
423
+
424
+ def layout_banco?
425
+ self.header.get_codigo_remessa == 2
426
+ end
427
+
428
+ def layout_empresa?
429
+ self.header.get_codigo_remessa == 1
430
+ end
431
+
432
+ #--------------------------------------------------------------------------------------
433
+ #--------------------------------------------------------------------------------------
434
+ # Utilitários
435
+ public
436
+ def save path
437
+ raise "Caminho para salvamento inválido!" unless path.length > 0
438
+ raise "Layout atual inválido!" unless self.is_valid?
439
+
440
+ path += "/" if not path.end_with?("/")
441
+ path += "#{header.get_data_geracao}_#{codigo_remessa}_#{header.get_codigo_banco}_#{self.versao_layout}.bat"
442
+ File.write(path, self.to_s)
443
+ end
444
+
445
+ protected
446
+ def calculate_valor_total
447
+ self.get_section("E").map{|section| section.get_valor_debito }
448
+ end
449
+
450
+ #--------------------------------------------------------------------------------------
451
+ #--------------------------------------------------------------------------------------
452
+ # Carregamento de Arquivo
453
+ protected
454
+ def process_file location
455
+ file = File.new(location, "r")
456
+
457
+ while (line = file.gets)
458
+ process_string line
459
+ end
460
+
461
+ file.close
462
+ end
463
+
464
+ def process_string file
465
+ section_type = file[0,1]
466
+
467
+ section = get_new_section section_type
468
+ section.process_section(file)
469
+
470
+ self.add_section section
471
+ end
472
+
473
+ def get_new_section section_type
474
+ case section_type
475
+ when "A"
476
+ Febraban150A.new(self)
477
+ when "B"
478
+ Febraban150B.new(self)
479
+ when "C"
480
+ Febraban150C.new(self)
481
+ when "D"
482
+ Febraban150D.new(self)
483
+ when "E"
484
+ Febraban150E.new(self)
485
+ when "F"
486
+ Febraban150F.new(self)
487
+ when "H"
488
+ Febraban150H.new(self)
489
+ when "I"
490
+ Febraban150I.new(self)
491
+ when "J"
492
+ Febraban150J.new(self)
493
+ when "K"
494
+ Febraban150K.new(self)
495
+ when "L"
496
+ Febraban150L.new(self)
497
+ when "T"
498
+ Febraban150T.new(self)
499
+ when "X"
500
+ Febraban150X.new(self)
501
+ when "Z"
502
+ Febraban150Z.new(self)
503
+ end
504
+ end
505
+ end