formatos-febraban 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +9 -0
- data/.rspec +2 -0
- data/.travis.yml +3 -0
- data/CODE_OF_CONDUCT.md +13 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +21 -0
- data/README.md +39 -0
- data/Rakefile +1 -0
- data/base/format_section.rb +79 -0
- data/base/position.rb +88 -0
- data/base/section.rb +41 -0
- data/bin/console +14 -0
- data/bin/setup +7 -0
- data/formatos-febraban.gemspec +24 -0
- data/formats/febraban150/febraban_150.rb +505 -0
- data/formats/febraban150/febraban_150_a.rb +210 -0
- data/formats/febraban150/febraban_150_b.rb +132 -0
- data/formats/febraban150/febraban_150_c.rb +149 -0
- data/formats/febraban150/febraban_150_d.rb +149 -0
- data/formats/febraban150/febraban_150_e.rb +226 -0
- data/formats/febraban150/febraban_150_f.rb +271 -0
- data/formats/febraban150/febraban_150_h.rb +149 -0
- data/formats/febraban150/febraban_150_i.rb +151 -0
- data/formats/febraban150/febraban_150_j.rb +130 -0
- data/formats/febraban150/febraban_150_k.rb +188 -0
- data/formats/febraban150/febraban_150_l.rb +114 -0
- data/formats/febraban150/febraban_150_t.rb +74 -0
- data/formats/febraban150/febraban_150_x.rb +214 -0
- data/formats/febraban150/febraban_150_z.rb +74 -0
- data/lib/formatos/febraban.rb +7 -0
- data/lib/formatos/febraban/version.rb +5 -0
- metadata +103 -0
checksums.yaml
ADDED
@@ -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
|
data/.gitignore
ADDED
data/.rspec
ADDED
data/.travis.yml
ADDED
data/CODE_OF_CONDUCT.md
ADDED
@@ -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
data/LICENSE.txt
ADDED
@@ -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.
|
data/README.md
ADDED
@@ -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
|
data/Rakefile
ADDED
@@ -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
|
data/base/position.rb
ADDED
@@ -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
|
data/base/section.rb
ADDED
@@ -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
|
data/bin/console
ADDED
@@ -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
|
data/bin/setup
ADDED
@@ -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
|