rubycnab240 1.0.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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: a99350d0a7515aeb552c40785b3ecf3030a5bf4b
4
+ data.tar.gz: 08bc254becb4859e6f12a2bdada6f38796d9448f
5
+ SHA512:
6
+ metadata.gz: 92ea588c99bfab173e1d1b05a4b91e056254150902dff71eadcfa5c24d4f6742e5aefa3dc48bb39ee7a695075a69b69352ca8bdff9c3496533af6f56f9b0f9ee
7
+ data.tar.gz: 5660efbedc67f2d726acfe8b21f1a3a5758c9d6736ac3bfe759baf6e5b7ac9fdb3f482148e8eff5861ccce047f6737445465ce8cf229f5ccd2890e58d70df174
data/.gitignore ADDED
@@ -0,0 +1,18 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
10
+ .name
11
+ .rakeTasks
12
+ cnab240.iml
13
+ encodings.xml
14
+ misc.xml
15
+ modules.xml
16
+ RubyCnab240.xml
17
+ vcs.xml
18
+ workspace.xml
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in rubycnab240.gemspec
4
+ gemspec
data/README.md ADDED
@@ -0,0 +1,119 @@
1
+ # RubyCnab240
2
+
3
+ A Gem RubyCnab240 permite criar arquivos de remessa de pagamentos no formato RubyCnab240 para o Banco do Brasil (por enquanto) segundo as normas da Febraban
4
+
5
+ ## Instalação
6
+
7
+ Adicione ao seu Gemfile
8
+
9
+ ```ruby
10
+ gem 'rubycnab240'
11
+ ```
12
+
13
+ Depois basta requerir a mesma
14
+
15
+ ```ruby
16
+ require 'rubycnab240'
17
+ ```
18
+
19
+ Ou instale você mesmo:
20
+
21
+ $ gem install rubycnab240
22
+
23
+ ## Uso
24
+
25
+ O arquivo de documentação de referencia encontra-se na pasta Docs. Porém, segue um exemplo funcional abaixo:
26
+
27
+ ```ruby
28
+ #crie o arquivo de remessa
29
+
30
+ r = RubyCnab240::Arquivo.new({
31
+ :codigo_do_banco_na_compensacao => '000', #codigo do seu banco
32
+ :tipo_de_inscricao_da_empresa => '2', #1 para CPF, 2 para CNPJ
33
+ :numero_de_inscricao_da_empresa => '00000000000000', #CNPJ
34
+ :codigo_do_convenio_do_banco => '000000000', #codigo do convenio do banco
35
+ :agencia_mantenedora_da_conta => '00000', #sua agencia
36
+ :digito_verificador_da_agencia => '0', #digito verificador da agencia
37
+ :numero_da_conta_corrente => '000000000000', #numero da conta corrente
38
+ :digito_verificador_da_conta => '0', #digito verificador da conta
39
+ :nome_da_empresa => '______________________________', #nome da empresa
40
+ :nome_do_banco => '___________________', #nome do banco
41
+ :codigo_remessa_retorno => '1', #verificar documentação febraban (pasta docs)
42
+ :numero_sequencial_de_arquivo => '3', #numero sequencial do arquivo (verificar documentaçao pasta docs)
43
+ :para_uso_reservado_da_empresa => 'texto', #(verificar documentaçao pasta docs)
44
+ :data_dos_pagamentos => Date.today #data dos pagamentos em
45
+ })
46
+
47
+ #crie um lote para pagamentos externos ao banco
48
+
49
+ lote_externo = RubyCnab240::Arquivo::Lote.new({
50
+ :forma_de_lancamento => 'EXTERNO',
51
+ :codigo_do_banco_na_compensacao => '000', #codigo identificador de banco exceto banco do brasil
52
+ :codigo_remessa_retorno => '1',
53
+ :numero_sequencial_de_arquivo => '3',
54
+ :para_uso_reservado_da_empresa => '', #texto reservado para empresa
55
+ :campos_opcionais_de_endereco => '' #(verificar documentaçao pasta docs)
56
+ })
57
+ #crie um lote para pagamentos internos ao banco
58
+
59
+ lote_interno = RubyCnab240::Arquivo::Lote.new({
60
+ :forma_de_lancamento => 'INTERNO',
61
+ :codigo_do_banco_na_compensacao => '001', #001 para banco do brasil
62
+ :codigo_remessa_retorno => '1',
63
+ :numero_sequencial_de_arquivo => '3',
64
+ :para_uso_reservado_da_empresa => '', #texto reservado para empresa
65
+ :campos_opcionais_de_endereco => '' #(verificar documentaçao pasta docs)
66
+ })
67
+
68
+ #adicione pagamentos dentro do lote (somentes com favorecidos de outros bancos que nao o banco do brasil)
69
+
70
+ lote_externo << {
71
+ :codigo_do_banco_favorecido => '000', #codigo do banco do favorecido
72
+ :agencia_mantenedora_da_conta_favorecida => '0000', #agencia do favorecido
73
+ :digito_verificador_da_agencia => '0',
74
+ :numero_da_conta_corrente => '',
75
+ :digito_verificador_da_conta => '0',
76
+ :nome_do_favorecido => 'NOME DO FAVORECIDO',
77
+ :numero_doc_atribuido_para_empresa => '000000000001', #a ser utilizaro para identificação posterior
78
+ :valor_do_pagamento => '1000', #valor do pagamento em centavos
79
+ :outras_informacoes => 'OUTRAS INFORMACOES',
80
+ :tipo_de_inscricao_do_favorecido => '1', # 1 para CPF e 2 para CNPJ
81
+ :numero_de_inscricao_do_favorecido => '00000000000', #CPF OU CNPJ
82
+ :complemento_tipo_de_servico => '1' #(verificar documentaçao pasta docs)
83
+ }
84
+
85
+ #adicione pagamentos dentro do lote (somentes com favorecidos do banco do brasil)
86
+
87
+ lote_externo << {
88
+ :codigo_do_banco_favorecido => '001', #codigo do banco do favorecido (001 por ser o banco do brasil)
89
+ :agencia_mantenedora_da_conta_favorecida => '0000', #agencia do favorecido
90
+ :digito_verificador_da_agencia => '0',
91
+ :numero_da_conta_corrente => '',
92
+ :digito_verificador_da_conta => '0',
93
+ :nome_do_favorecido => 'NOME DO FAVORECIDO',
94
+ :numero_doc_atribuido_para_empresa => '000000000001', #a ser utilizaro para identificação posterior
95
+ :valor_do_pagamento => '1000', #valor do pagamento em centavos
96
+ :outras_informacoes => 'OUTRAS INFORMACOES',
97
+ :tipo_de_inscricao_do_favorecido => '1', # 1 para CPF e 2 para CNPJ
98
+ :numero_de_inscricao_do_favorecido => '00000000000', #CPF OU CNPJ
99
+ :complemento_tipo_de_servico => '1' #(verificar documentaçao pasta docs)
100
+ }
101
+
102
+ #adicione os lotes aos arquivo
103
+
104
+ r << lote_interno
105
+ r << lote_externo
106
+
107
+ #crie o arquivo a ser salvo
108
+
109
+ file = File.open('nome_do_arquivo_de_remessa.rem', "w+")
110
+
111
+ #salve o arquivo
112
+
113
+ r.save_to_file(file)
114
+ ```
115
+
116
+ ## Contribua
117
+
118
+ Report de Bugs serão bem vindos no GitHub em https://github.com/Hamdan85/rubycnab240. Fique a vontade para contribuir com mais funcionalidades.
119
+
data/Rakefile ADDED
@@ -0,0 +1,2 @@
1
+ require "bundler/gem_tasks"
2
+ task :default => :spec
data/bin/console ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "rubycnab240"
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,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
Binary file
@@ -0,0 +1,89 @@
1
+ class RubyCnab240::Arquivo::Header < RubyCnab240::Arquivo
2
+ attr_accessor :codigo_do_banco_na_compensacao
3
+ attr_accessor :lote_do_servico
4
+ attr_accessor :tipo_de_registro
5
+ attr_accessor :tipo_de_inscricao_da_empresa
6
+ attr_accessor :numero_de_inscricao_da_empresa
7
+ attr_accessor :codigo_do_convenio_do_banco
8
+ attr_accessor :agencia_mantenedora_da_conta
9
+ attr_accessor :digito_verificador_da_agencia
10
+ attr_accessor :numero_da_conta_corrente
11
+ attr_accessor :digito_verificador_da_conta
12
+ attr_accessor :digito_verificador_da_agencia_e_conta
13
+ attr_accessor :nome_da_empresa
14
+ attr_accessor :nome_do_banco
15
+ attr_accessor :codigo_remessa_retorno
16
+ attr_accessor :numero_sequencial_de_arquivo
17
+ attr_accessor :para_uso_reservado_da_empresa
18
+
19
+ attr_reader :uso_exclusivo_febraban
20
+ attr_reader :uso_exclusivo_febraban2
21
+ attr_reader :uso_exclusivo_febraban3
22
+
23
+ def initialize(fields = {})
24
+ @codigo_do_banco_na_compensacao = fields[:codigo_do_banco_na_compensacao].to_s[0..2].rjust(3, '0') #default: 001
25
+ @lote_do_servico = fields[:lote_do_servico].to_s[0..3].rjust(4, '0')
26
+ @tipo_de_registro = fields[:tipo_de_registro].to_s[0..0].rjust(1, '0')
27
+ @uso_exclusivo_febraban = ' ' * 9
28
+ @tipo_de_inscricao_da_empresa = fields[:tipo_de_inscricao_da_empresa].to_s[0..0].rjust(1, '0') #1 – para CPF e 2 – para CNPJ.
29
+ @numero_de_inscricao_da_empresa = fields[:numero_de_inscricao_da_empresa].to_s[0..13].rjust(14, '0') #Informar número da inscrição (CPF ou CNPJ) da Empresa, alinhado à direita com zeros à esquerda.
30
+
31
+ #bb
32
+ #Preencher com “0009999990126 “, onde 999999 informar o número do convênio de pagamento, alinhado à direita com zeros à esquerda seguido de “0126” para pagamento e demais posições com brancos (espaços).
33
+ @codigo_do_convenio_do_banco = fields[:codigo_do_convenio_do_banco].to_s[0..8].rjust(9, '0') #Informar o convênio de pagamento, completando com zeros à esquerda;
34
+ @bb2 = fields[:bb2] = '0126'
35
+ @bb3 = fields[:bb3] = ' '
36
+ @bb4 = fields[:bb4] = ' '
37
+
38
+ @agencia_mantenedora_da_conta = fields[:agencia_mantenedora_da_conta].to_s[0..4].rjust(5, '0')
39
+ @digito_verificador_da_agencia = fields[:digito_verificador_da_agencia].to_s[0..0].upcase.rjust(1, '0')
40
+ @numero_da_conta_corrente = fields[:numero_da_conta_corrente].to_s[0..11].rjust(12, '0')
41
+ @digito_verificador_da_conta = fields[:digito_verificador_da_conta].to_s[0..0].upcase.rjust(1, '0')
42
+ @digito_verificador_da_agencia_e_conta = '0'
43
+
44
+ @nome_da_empresa = fields[:nome_da_empresa].to_s[0..29].upcase.ljust(30, ' ')
45
+ @nome_do_banco = fields[:nome_do_banco].to_s[0..29].upcase.ljust(30, ' ')
46
+ @uso_exclusivo_febraban2 = ' '
47
+ @codigo_remessa_retorno = '1' #1 – para arquivo remessa. 2 – quando arquivo retorno.
48
+ @data_de_geracao_do_arquivo = Date.today.strftime("%d%m%Y")
49
+ @hora_de_geracao_do_arquivo = Time.now.strftime("%H%M%S")
50
+ @numero_sequencial_de_arquivo = fields[:numero_sequencial_de_arquivo].to_s[0..5].upcase.rjust(6, '0')
51
+ @versao_do_leiaute_de_arquivo = '050'
52
+ @densidade_de_gravacao_de_arquivo = '0' * 5
53
+ @para_uso_reservado_do_banco = ' '
54
+ @para_uso_reservado_da_empresa = fields[:para_uso_reservado_da_empresa].to_s[0..19].rjust(20, ' ') #uso reservado da empresa
55
+ @uso_exclusivo_febraban3 = ' '
56
+ end
57
+
58
+ def to_string
59
+ header = String.new
60
+
61
+ header << @codigo_do_banco_na_compensacao
62
+ header << @lote_do_servico
63
+ header << @tipo_de_registro
64
+ header << @uso_exclusivo_febraban
65
+ header << @tipo_de_inscricao_da_empresa
66
+ header << @numero_de_inscricao_da_empresa
67
+ header << @codigo_do_convenio_do_banco
68
+ header << @bb2
69
+ header << @bb3
70
+ header << @bb4
71
+ header << @agencia_mantenedora_da_conta
72
+ header << @digito_verificador_da_agencia
73
+ header << @numero_da_conta_corrente
74
+ header << @digito_verificador_da_conta
75
+ header << @digito_verificador_da_agencia_e_conta
76
+ header << @nome_da_empresa
77
+ header << @nome_do_banco
78
+ header << @uso_exclusivo_febraban2
79
+ header << @codigo_remessa_retorno
80
+ header << @data_de_geracao_do_arquivo
81
+ header << @hora_de_geracao_do_arquivo
82
+ header << @numero_sequencial_de_arquivo
83
+ header << @versao_do_leiaute_de_arquivo
84
+ header << @densidade_de_gravacao_de_arquivo
85
+ header << @para_uso_reservado_do_banco
86
+ header << @para_uso_reservado_da_empresa
87
+ header << @uso_exclusivo_febraban3
88
+ end
89
+ end
@@ -0,0 +1,115 @@
1
+ class RubyCnab240::Arquivo::Lote < RubyCnab240::Arquivo
2
+ require 'rubycnab240/arquivo/lotes/header'
3
+ require 'rubycnab240/arquivo/lotes/segment'
4
+ require 'rubycnab240/arquivo/lotes/trailer'
5
+
6
+ attr_accessor :lot_header
7
+ attr_accessor :lots
8
+ attr_accessor :lot_trailer
9
+
10
+ def initialize(fields = {})
11
+
12
+ forma_de_lancamento = if fields[:forma_de_lancamento] == 'INTERNO'
13
+ '01'
14
+ else
15
+ '41'
16
+ end
17
+
18
+
19
+ @lot_header = RubyCnab240::Arquivo::Lote::Header.new({
20
+ :codigo_do_banco_na_compensacao => fields[:codigo_do_banco_na_compensacao],
21
+ :lote_do_servico => '0',
22
+ :forma_de_lancamento => forma_de_lancamento,
23
+ :tipo_de_inscricao_da_empresa => @@tipo_de_inscricao_da_empresa,
24
+ :numero_de_inscricao_da_empresa => @@numero_de_inscricao_da_empresa,
25
+ :codigo_do_convenio_do_banco => @@codigo_do_convenio_do_banco,
26
+ :agencia_mantenedora_da_conta => @@agencia_mantenedora_da_conta,
27
+ :digito_verificador_da_agencia => @@digito_verificador_da_agencia,
28
+ :numero_da_conta_corrente => @@numero_da_conta_corrente,
29
+ :digito_verificador_da_conta => @@digito_verificador_da_conta,
30
+ :digito_verificador_da_agencia_e_conta => @@digito_verificador_da_agencia_e_conta,
31
+ :data_do_pagamento => @@data_dos_pagamentos,
32
+ :nome_da_empresa => @@nome_da_empresa,
33
+ :campos_opcionais_de_endereco => fields[:campos_opcionais_de_endereco]
34
+ })
35
+
36
+ @lots = []
37
+
38
+ @lot_trailer = RubyCnab240::Arquivo::Lote::Trailer.new({
39
+ :codigo_do_banco_na_compensacao => fields[:codigo_do_banco_na_compensacao],
40
+ :lote_do_servico => '0',
41
+ :tipo_de_registro => '5',
42
+ :qtd_registros_de_lote => '0',
43
+ :somatorio_dos_valores => '0'
44
+ })
45
+ end
46
+
47
+ def <<(s)
48
+ s[:complemento_tipo_de_servico] = '1'
49
+ s[:codigo_do_banco_na_compensacao] = '001'
50
+
51
+ if self.lot_header.forma_de_lancamento == '01'
52
+ #interno
53
+ codigo_da_camara_centralizadora = '000'
54
+ s[:outras_informacoes] = ' '
55
+ s[:aviso_ao_favorecido] = ' '
56
+ else
57
+ #externo
58
+ codigo_da_camara_centralizadora = '018'
59
+ s[:outras_informacoes] = '01 '
60
+ s[:aviso_ao_favorecido] = '0'
61
+ end
62
+
63
+
64
+ self.lots << RubyCnab240::Arquivo::Lote::Segment::A.new({
65
+ :codigo_do_banco_na_compensacao => s[:codigo_do_banco_na_compensacao],
66
+ :lote_do_servico => self.lot_header.lote_do_servico,
67
+ :tipo_de_registro => '3',
68
+ :numero_sequencial_de_registro_no_lote => (self.lots.size + 1).to_s,
69
+ :codigo_da_camara_centralizadora => codigo_da_camara_centralizadora,
70
+ :codigo_do_banco_favorecido => s[:codigo_do_banco_favorecido],
71
+ :agencia_mantenedora_da_conta_favorecida => s[:agencia_mantenedora_da_conta_favorecida],
72
+ :digito_verificador_da_agencia => s[:digito_verificador_da_agencia],
73
+ :numero_da_conta_corrente => s[:numero_da_conta_corrente],
74
+ :digito_verificador_da_conta => s[:digito_verificador_da_conta],
75
+ :digito_verificador_da_agencia_e_conta => s[:digito_verificador_da_agencia_e_conta],
76
+ :nome_do_favorecido => s[:nome_do_favorecido],
77
+ :numero_doc_atribuido_para_empresa => s[:numero_doc_atribuido_para_empresa],
78
+ :data_do_pagamento => @@data_dos_pagamentos,
79
+ :valor_do_pagamento => s[:valor_do_pagamento],
80
+ :outras_informacoes => s[:outras_informacoes],
81
+ :complemento_tipo_de_servico => s[:complemento_tipo_de_servico],
82
+ :complemento_finalidade_da_ted => s[:complemento_finalidade_da_ted],
83
+ :complemento_finalidade_de_pagamento => s[:complemento_finalidade_de_pagamento],
84
+ :aviso_ao_favorecido => s[:aviso_ao_favorecido]
85
+ })
86
+
87
+ self.lots << RubyCnab240::Arquivo::Lote::Segment::B.new({
88
+ :codigo_do_banco_na_compensacao => s[:codigo_do_banco_na_compensacao],
89
+ :lote_do_servico => self.lot_header.lote_do_servico,
90
+ :tipo_de_registro => '3',
91
+ :numero_sequencial_de_registro_no_lote => (self.lots.size + 1).to_s,
92
+ :tipo_de_inscricao_do_favorecido => s[:tipo_de_inscricao_do_favorecido],
93
+ :numero_de_inscricao_do_favorecido => s[:numero_de_inscricao_do_favorecido],
94
+ :aviso_ao_favorecido => s[:aviso_ao_favorecido]
95
+ })
96
+
97
+ end
98
+
99
+ def to_string
100
+ rubycnab240 = String.new
101
+
102
+ qtd_registros_de_lote = self.lots.size + 2
103
+
104
+ somatorio_dos_valores = self.lots.reject { |l| l.class == RubyCnab240::Arquivo::Lote::Segment::B }.map{|l| l.valor_do_pagamento.to_i }.inject(:+)
105
+
106
+ self.lot_trailer.qtd_registros_de_lote = qtd_registros_de_lote.to_s[0..5].rjust(6, '0')
107
+ self.lot_trailer.somatorio_dos_valores = somatorio_dos_valores.to_s[0..17].rjust(18, '0')
108
+
109
+ rubycnab240 << self.lot_header.to_string + "\n"
110
+ self.lots.each do |lot|
111
+ rubycnab240 << lot.to_string + "\n"
112
+ end
113
+ rubycnab240 << self.lot_trailer.to_string
114
+ end
115
+ end
@@ -0,0 +1,87 @@
1
+ class RubyCnab240::Arquivo::Lote::Header < RubyCnab240::Arquivo::Lote
2
+ attr_accessor :codigo_do_banco_na_compensacao
3
+ attr_accessor :lote_do_servico
4
+ attr_accessor :forma_de_lancamento
5
+ attr_accessor :tipo_de_inscricao_da_empresa
6
+ attr_accessor :numero_de_inscricao_da_empresa
7
+ attr_accessor :codigo_do_convenio_do_banco
8
+ attr_accessor :agencia_mantenedora_da_conta
9
+ attr_accessor :digito_verificador_da_agencia
10
+ attr_accessor :numero_da_conta_corrente
11
+ attr_accessor :digito_verificador_da_conta
12
+ attr_accessor :digito_verificador_da_agencia_e_conta
13
+ attr_accessor :nome_da_empresa
14
+ attr_accessor :campos_opcionais_de_endereco
15
+
16
+ attr_reader :uso_exclusivo_febraban
17
+ attr_reader :tipo_de_registro
18
+ attr_reader :tipo_de_operacao
19
+ attr_reader :tipo_de_servico
20
+ attr_reader :bb2
21
+ attr_reader :bb3
22
+ attr_reader :bb4
23
+ attr_reader :mensagem_1
24
+ attr_reader :uso_exclusivo_febraban2
25
+ attr_reader :codigo_para_ocorrencias_de_retorno
26
+ attr_reader :numero_da_versao_do_leiaute_do_lote
27
+
28
+ def initialize(fields = {})
29
+ @codigo_do_banco_na_compensacao = fields[:codigo_do_banco_na_compensacao].to_s[0..2].rjust(3, '0') #default: 001
30
+ @lote_do_servico = fields[:lote_do_servico].to_s[0..3].rjust(4, '0')
31
+ @tipo_de_registro = fields[:tipo_de_registro] = '1'
32
+ @tipo_de_operacao = fields[:tipo_de_operacao] = 'C'
33
+ @tipo_de_servico = fields[:tipo_de_servico] = '20' #Os tipos de serviços aceitos pelo BB são somente '20' (Pagamento a Fornecedores), '30' (Pagamento de Salários) e '98' (Pagamentos Diversos).
34
+ @forma_de_lancamento = fields[:forma_de_lancamento] || '41' #Formas de lançamentos aceitos pelo BB quando utilizados os segmentos A e B : 01 para Crédito em Conta Corrente, 02 para Pagamento Contra0Recibo, 03 para DOC/TED, 04 para Cartão Salário, 05 para Crédito em Conta Poupança, 10 para Ordem de Pagamento, 41 para TED Outra Titularidade, e 43 para TED Mesma Titularidade. Obs.: no caso da forma de lançamento 03, 41 ou 43, há complementação de informação do campo “Código da Câmara de Compensação”, posições 18 a 20 do segmento A.
35
+ @numero_da_versao_do_leiaute_do_lote = '031' #Campo não criticado pelo sistema. Informar Zeros OU se preferir, informar número da versão do leiaute do Lote que foi utilizado como base para formatação dos campos. Versões disponíveis: 043, 042, 041, 040, 031, 030 ou 020. A versão do Lote quando informada deve estar condizente com a versão do Arquivo (posições 164 a 166 do Header de Arquivo). Ou seja, para utilizar 043 no lote o Header do arquivo deve conter 084, para 042 no lote o Header do arquivo deve conter 083 ou 082, para 041 ou 040 no lote o Header do arquivo deve conter 080, para 031 no lote o Header do arquivo deve conter 050, para 030 no lote o Header do Arquivo deve conter 040, e para 020 no lote o Header do Arquivo deve conter 030.
36
+ @uso_exclusivo_febraban = ' '
37
+ @tipo_de_inscricao_da_empresa = fields[:tipo_de_inscricao_da_empresa].to_s[0..0].rjust(1, '0') #1 – para CPF e 2 – para CNPJ.
38
+ @numero_de_inscricao_da_empresa = fields[:numero_de_inscricao_da_empresa].to_s[0..13].rjust(14, '0') #Informar número da inscrição (CPF ou CNPJ) da Empresa, alinhado à direita com zeros à esquerda.
39
+
40
+ #Codigo do Convenio do Banco
41
+ @codigo_do_convenio_do_banco = fields[:codigo_do_convenio_do_banco].to_s[0..8].rjust(9, '0') #Informar o convênio de pagamento, completando com zeros à esquerda
42
+ @bb2 = fields[:bb2] = '0126'
43
+ @bb3 = fields[:bb3] = ' '
44
+ @bb4 = fields[:bb4] = ' '
45
+
46
+ @agencia_mantenedora_da_conta = fields[:agencia_mantenedora_da_conta].to_s[0..4].rjust(5, '0')
47
+ @digito_verificador_da_agencia = fields[:digito_verificador_da_agencia].to_s[0..0].upcase.rjust(1, '0')
48
+ @numero_da_conta_corrente = fields[:numero_da_conta_corrente].to_s[0..11].rjust(12, '0')
49
+ @digito_verificador_da_conta = fields[:digito_verificador_da_conta].to_s[0..0].upcase.rjust(1, '0')
50
+ @digito_verificador_da_agencia_e_conta = '0'
51
+ @nome_da_empresa = fields[:nome_da_empresa].to_s[0..29].upcase.rjust(30, ' ')
52
+
53
+ @mensagem_1 = fields[:mensagem_1] = ' '
54
+ @campos_opcionais_de_endereco = fields[:campos_opcionais_de_endereco].to_s[0..79].upcase.ljust(80, ' ')
55
+ @uso_exclusivo_febraban2 = ' '
56
+ @codigo_para_ocorrencias_de_retorno = ' '
57
+ end
58
+
59
+ def to_string
60
+ header = String.new
61
+
62
+ header << self.codigo_do_banco_na_compensacao
63
+ header << self.lote_do_servico
64
+ header << self.tipo_de_registro
65
+ header << self.tipo_de_operacao
66
+ header << self.tipo_de_servico
67
+ header << self.forma_de_lancamento
68
+ header << self.numero_da_versao_do_leiaute_do_lote
69
+ header << self.uso_exclusivo_febraban
70
+ header << self.tipo_de_inscricao_da_empresa
71
+ header << self.numero_de_inscricao_da_empresa
72
+ header << self.codigo_do_convenio_do_banco
73
+ header << self.bb2
74
+ header << self.bb3
75
+ header << self.bb4
76
+ header << self.agencia_mantenedora_da_conta
77
+ header << self.digito_verificador_da_agencia
78
+ header << self.numero_da_conta_corrente
79
+ header << self.digito_verificador_da_conta
80
+ header << self.digito_verificador_da_agencia_e_conta
81
+ header << self.nome_da_empresa
82
+ header << self.mensagem_1
83
+ header << self.campos_opcionais_de_endereco
84
+ header << self.uso_exclusivo_febraban2
85
+ header << self.codigo_para_ocorrencias_de_retorno
86
+ end
87
+ end
@@ -0,0 +1,4 @@
1
+ class RubyCnab240::Arquivo::Lote::Segment < RubyCnab240::Arquivo::Lote
2
+ require 'rubycnab240/arquivo/lotes/segments/a'
3
+ require 'rubycnab240/arquivo/lotes/segments/b'
4
+ end
@@ -0,0 +1,112 @@
1
+ class RubyCnab240::Arquivo::Lote::Segment::A < RubyCnab240::Arquivo::Lote::Segment
2
+ attr_accessor :codigo_do_banco_na_compensacao
3
+ attr_accessor :lote_do_servico
4
+ attr_accessor :tipo_de_registro
5
+ attr_accessor :numero_sequencial_de_registro_no_lote
6
+ attr_accessor :codigo_segmento_do_registro_detalhe
7
+ attr_accessor :codigo_da_instrucao_para_movimento
8
+ attr_accessor :codigo_da_camara_centralizadora
9
+ attr_accessor :codigo_do_banco_favorecido
10
+ attr_accessor :agencia_mantenedora_da_conta_favorecida
11
+ attr_accessor :digito_verificador_da_agencia
12
+ attr_accessor :numero_da_conta_corrente
13
+ attr_accessor :digito_verificador_da_conta
14
+ attr_accessor :digito_verificador_da_agencia_e_conta
15
+ attr_accessor :nome_do_favorecido
16
+ attr_accessor :numero_doc_atribuido_para_empresa
17
+ attr_accessor :data_do_pagamento
18
+ attr_accessor :quantidade_da_moeda
19
+ attr_accessor :valor_do_pagamento
20
+ attr_accessor :outras_informacoes
21
+ attr_accessor :complemento_tipo_de_servico
22
+ attr_accessor :complemento_finalidade_da_ted
23
+ attr_accessor :complemento_finalidade_de_pagamento
24
+ attr_accessor :aviso_ao_favorecido
25
+
26
+
27
+ attr_reader :tipo_de_movimento
28
+ attr_reader :verificacao_retorno
29
+ attr_reader :tipo_da_moeda
30
+ attr_reader :dec_quantidade_da_moeda
31
+ attr_reader :numero_do_documento_atribuido_pelo_banco
32
+ attr_reader :data_real_da_efetivacao_do_pagamento
33
+ attr_reader :valor_real_da_efetivacao_do_pagamento
34
+ attr_reader :dec_valor_real_da_efetivacao_do_pagamento
35
+ attr_reader :uso_exclusivo_febraban
36
+ attr_reader :codigo_das_ocorrencias_para_retorno
37
+
38
+ def initialize(fields = {})
39
+ @codigo_do_banco_na_compensacao = fields[:codigo_do_banco_na_compensacao].to_s[0..2].rjust(3, '0') #default: 001
40
+ @lote_do_servico = fields[:lote_do_servico].to_s[0..3].rjust(4, '0')
41
+ @tipo_de_registro = fields[:tipo_de_registro].to_s[0..0].rjust(1, '0')
42
+ @numero_sequencial_de_registro_no_lote = fields[:numero_sequencial_de_registro_no_lote].to_s[0..4].rjust(5, '0')
43
+ @codigo_segmento_do_registro_detalhe = fields[:codigo_segmento_do_registro_detalhe] = 'A'
44
+ @tipo_de_movimento = fields[:tipo_de_movimento] = '0' #“0” para inclusão de pagamento ou “9” para exclusão. O pagamento só poderá ser excluido, quando o mesmo já estiver sendo visualizado no Gerenciador Financeiro.
45
+ @codigo_da_instrucao_para_movimento = fields[:codigo_da_instrucao_para_movimento] = '00' #“00” para inclusão de pagamento ou “99” para exclusão.
46
+ @codigo_da_camara_centralizadora = fields[:codigo_da_camara_centralizadora].to_s[0..2].rjust(3, '0') #Quando de lançamento no Header do Lote for igual a: '03' (DOC/TED) este campo deverá ser preenchido com '700' para DOC (valor até R$ 4.999,99) ou preencher com '018' para TED (valor igual ou acima de 5 mil reais). Quando a forma de lançamento no Header do Lote for igual a: '41' (TED Outra Titularidade) ou '43' (TED Mesma Titularidade), este campo deverá ser preenchido com '018'. Para crédito no Banco do Brasil informar “000” (zeros).
47
+ @codigo_do_banco_favorecido = fields[:codigo_do_banco_favorecido].to_s[0..2].rjust(3, '0')
48
+ @agencia_mantenedora_da_conta_favorecida = fields[:agencia_mantenedora_da_conta_favorecida].to_s[0..4].rjust(5, '0')
49
+ @digito_verificador_da_agencia = fields[:digito_verificador_da_agencia].to_s[0..0].upcase.rjust(1, '0')
50
+ @numero_da_conta_corrente = fields[:numero_da_conta_corrente].to_s[0..11].rjust(12, '0')
51
+ @digito_verificador_da_conta = fields[:digito_verificador_da_conta].to_s[0..0].upcase.rjust(1, '0')
52
+ @digito_verificador_da_agencia_e_conta = fields[:digito_verificador_da_agencia_e_conta].to_s[0..0].upcase.rjust(1, ' ') #As contas do Banco do Brasil não possuem o segundo dígito, nesse caso informar 'branco' (espaço). Para favorecidos de outros bancos que possuem contas com dois dígitos verificadores (DV), preencher este campo com o segundo dígito verificador.
53
+ @nome_do_favorecido = fields[:nome_do_favorecido].to_s[0..29].upcase.ljust(30, ' ')
54
+ @verificacao_retorno = '0' * 11
55
+ @numero_doc_atribuido_para_empresa = fields[:numero_doc_atribuido_para_empresa].to_s[0..8].upcase.rjust(9, '0') #No caso de pagamento de salário, os número colocados nas posições 74 a 79 aparecerão como número do documento no extrato do favorecido, e os números das posições 80 a 85, serão utilizadas como número do documento no extrato do pagador. Obs.: Como os lançamentos ocorridos na conta do pagador são aglutinados num mesmo lote as posições 80 a 85 de todos os detalhes devem ser iguais, caso contrário será considerado apenas o número constante no primeiro registro detalhe de cada lote. As posições 86 a 93 não são tratadas pelo sistema. As informações impostas nessa posição voltarão iguais no arquivo retorno.
56
+ @data_do_pagamento = fields[:data_do_pagamento].to_s[0..7].rjust(8, ' ')
57
+ @tipo_da_moeda = fields[:tipo_da_moeda] = 'BRL'
58
+ @quantidade_da_moeda = fields[:quantidade_da_moeda].to_s[0..9].rjust(10, '0') #Preencher com zeros quando a moeda for Real, no campo 18.3A
59
+ @dec_quantidade_da_moeda = '00000'
60
+ @valor_do_pagamento = fields[:valor_do_pagamento].to_s[0..14].upcase.rjust(15, '0')
61
+ @numero_do_documento_atribuido_pelo_banco = ' ' * 20
62
+ @data_real_da_efetivacao_do_pagamento = '0' * 8
63
+ @valor_real_da_efetivacao_do_pagamento = '0' * 13
64
+ @dec_valor_real_da_efetivacao_do_pagamento = '0' * 2
65
+ @outras_informacoes = fields[:outras_informacoes].to_s[0..39].upcase.ljust(40, ' ') #Para Modalidade de Ordem de Pagamento ('10' nas posições 12 e 13 do Header de Lote), poderá ser informado até dois prepostos. Neste caso, informar na posição 178 a 188 o CPF do 1º preposto e na posição 189 a 199 o CPF do 2º preposto e na posição 200 a 217 informar ZEROS. Caso não haja prepostos, preencher os campos com ZEROS.
66
+ @complemento_tipo_de_servico = fields[:complemento_tipo_de_servico].to_s[0..1].ljust(2, ' ') #Corresponde a Finalidade do DOC. Será repassado para o Banco favorecido conforme informado, sem tratamento.
67
+ @complemento_finalidade_da_ted = fields[:complemento_finalidade_da_ted].to_s[0..4].ljust(5, ' ')
68
+ @complemento_finalidade_de_pagamento = fields[:complemento_finalidade_de_pagamento].to_s[0..1].ljust(2, ' ')
69
+ @uso_exclusivo_febraban = ' '
70
+ @aviso_ao_favorecido = ' ' #O ou 5 – o código 5 (com aviso) somente será tratado caso tenha sido negociado com a agência e conste no cadastramento do serviço a emissão de aviso.
71
+ @codigo_das_ocorrencias_para_retorno = fields[:codigo_das_ocorrencias_para_retorno] = ' '
72
+ end
73
+
74
+ def to_string
75
+ segment = String.new
76
+
77
+ segment << self.codigo_do_banco_na_compensacao
78
+ segment << self.lote_do_servico
79
+ segment << self.tipo_de_registro
80
+ segment << self.numero_sequencial_de_registro_no_lote
81
+ segment << self.codigo_segmento_do_registro_detalhe
82
+ segment << self.tipo_de_movimento
83
+ segment << self.codigo_da_instrucao_para_movimento
84
+ segment << self.codigo_da_camara_centralizadora
85
+ segment << self.codigo_do_banco_favorecido
86
+ segment << self.agencia_mantenedora_da_conta_favorecida
87
+ segment << self.digito_verificador_da_agencia
88
+ segment << self.numero_da_conta_corrente
89
+ segment << self.digito_verificador_da_conta
90
+ segment << self.digito_verificador_da_agencia_e_conta
91
+ segment << self.nome_do_favorecido
92
+ segment << self.verificacao_retorno
93
+ segment << self.numero_doc_atribuido_para_empresa
94
+ segment << self.data_do_pagamento
95
+ segment << self.tipo_da_moeda
96
+ segment << self.quantidade_da_moeda
97
+ segment << self.dec_quantidade_da_moeda
98
+ segment << self.valor_do_pagamento
99
+ segment << self.numero_do_documento_atribuido_pelo_banco
100
+ segment << self.data_real_da_efetivacao_do_pagamento
101
+ segment << self.valor_real_da_efetivacao_do_pagamento
102
+ segment << self.dec_valor_real_da_efetivacao_do_pagamento
103
+ segment << self.outras_informacoes
104
+ segment << self.complemento_tipo_de_servico
105
+ segment << self.complemento_finalidade_da_ted
106
+ segment << self.complemento_finalidade_de_pagamento
107
+ segment << self.uso_exclusivo_febraban
108
+ segment << self.aviso_ao_favorecido
109
+ segment << self.codigo_das_ocorrencias_para_retorno
110
+
111
+ end
112
+ end
@@ -0,0 +1,48 @@
1
+ class RubyCnab240::Arquivo::Lote::Segment::B < RubyCnab240::Arquivo::Lote::Segment
2
+ attr_accessor :codigo_do_banco_na_compensacao
3
+ attr_accessor :lote_do_servico
4
+ attr_accessor :tipo_de_registro
5
+ attr_accessor :numero_sequencial_de_registro_no_lote
6
+ attr_accessor :tipo_de_inscricao_do_favorecido
7
+ attr_accessor :numero_de_inscricao_do_favorecido
8
+ attr_accessor :aviso_ao_favorecido
9
+ attr_accessor :campos_de_endereco_opcionais
10
+
11
+ attr_reader :codigo_segmento_do_registro_detalhe
12
+ attr_reader :uso_exclusivo_do_siape
13
+ attr_reader :uso_exclusivo_febraban
14
+ attr_reader :uso_exclusivo_febraban2
15
+
16
+ def initialize(fields = {})
17
+
18
+ @codigo_do_banco_na_compensacao = fields[:codigo_do_banco_na_compensacao].to_s[0..2].rjust(3, '0') #default: 001
19
+ @lote_do_servico = fields[:lote_do_servico].to_s[0..3].rjust(4, '0')
20
+ @tipo_de_registro = fields[:tipo_de_registro] = '3'
21
+ @numero_sequencial_de_registro_no_lote = fields[:numero_sequencial_de_registro_no_lote].to_s[0..4].rjust(5, '0') #Começar com 00002 e ir incrementando em 1 a cada nova linha do registro detalhe, esse sequencial é continuação do segmento 'A' anterior.
22
+ @codigo_segmento_do_registro_detalhe = 'B'
23
+ @uso_exclusivo_febraban = ' ' * 3
24
+ @tipo_de_inscricao_do_favorecido = fields[:tipo_de_inscricao_do_favorecido].to_s[0..0].rjust(1, '0') #Informação obrigatória para crédito via DOC/TED, saque on0line e ORPAG e caso a empresa queira que o sistema confronte o CPF/CNPJ com a agência/conta do favorecido informada.
25
+ @numero_de_inscricao_do_favorecido = fields[:numero_de_inscricao_do_favorecido].to_s[0..13].rjust(14, '0') #Informação obrigatória para crédito via DOC/TED, saque online, ORPAG e caso a empresa queira que o sistema confronte o CPF/CNPJ com a agência/conta do favorecido informada. Neste último caso, deve ser solicitada para a agência que conste no cadastro do serviço para conferir número de inscrição do favorecido..
26
+ @campos_de_endereco_opcionais = ' ' * 193
27
+ @aviso_ao_favorecido = '0' #O ou 5 – o código 5 (com aviso) somente será tratado caso tenha sido negociado com a agência e conste no cadastramento do serviço a emissão de aviso.
28
+ @uso_exclusivo_do_siape = ' ' * 6
29
+ @uso_exclusivo_febraban2 = ' ' * 8
30
+ end
31
+
32
+ def to_string
33
+ segmento = String.new
34
+
35
+ segmento << self.codigo_do_banco_na_compensacao
36
+ segmento << self.lote_do_servico
37
+ segmento << self.tipo_de_registro
38
+ segmento << self.numero_sequencial_de_registro_no_lote
39
+ segmento << self.codigo_segmento_do_registro_detalhe
40
+ segmento << self.uso_exclusivo_febraban
41
+ segmento << self.tipo_de_inscricao_do_favorecido
42
+ segmento << self.numero_de_inscricao_do_favorecido
43
+ segmento << self.campos_de_endereco_opcionais
44
+ segmento << self.aviso_ao_favorecido
45
+ segmento << self.uso_exclusivo_do_siape
46
+ segmento << self.uso_exclusivo_febraban2
47
+ end
48
+ end
@@ -0,0 +1,43 @@
1
+ class RubyCnab240::Arquivo::Lote::Trailer < RubyCnab240::Arquivo::Lote
2
+ attr_accessor :codigo_do_banco_na_compensacao
3
+ attr_accessor :lote_do_servico
4
+ attr_accessor :qtd_registros_de_lote
5
+ attr_accessor :somatorio_dos_valores
6
+
7
+ attr_reader :tipo_de_registro
8
+ attr_reader :uso_exclusivo_febraban
9
+ attr_reader :somatorio_qtd_de_moedas
10
+ attr_reader :numero_de_aviso_debito
11
+ attr_reader :uso_exclusivo_febraban2
12
+ attr_reader :codigo_das_ocorrencias_para_retorno
13
+
14
+
15
+ def initialize(fields = {})
16
+
17
+ @codigo_do_banco_na_compensacao = fields[:codigo_do_banco_na_compensacao].to_s[0..2].rjust(3, '0') #default: 001
18
+ @lote_do_servico = fields[:lote_do_servico].to_s[0..3].rjust(4, '0')
19
+ @tipo_de_registro = fields[:tipo_de_registro].to_s[0..0].rjust(1, '0')
20
+ @uso_exclusivo_febraban = ' ' * 9
21
+ @qtd_registros_de_lote = fields[:qtd_registros_de_lote].to_s[0..5].rjust(6, '0')
22
+ @somatorio_dos_valores = fields[:somatorio_dos_valores].to_s[0..17].rjust(18, '0')
23
+ @somatorio_qtd_de_moedas = ' ' * 18
24
+ @numero_de_aviso_debito = ' ' * 6
25
+ @uso_exclusivo_febraban2 = ' ' * 165
26
+ @codigo_das_ocorrencias_para_retorno = ' ' * 10
27
+ end
28
+
29
+ def to_string
30
+ trailer = String.new
31
+
32
+ trailer << self.codigo_do_banco_na_compensacao
33
+ trailer << self.lote_do_servico
34
+ trailer << self.tipo_de_registro
35
+ trailer << self.uso_exclusivo_febraban
36
+ trailer << self.qtd_registros_de_lote
37
+ trailer << self.somatorio_dos_valores
38
+ trailer << self.somatorio_qtd_de_moedas
39
+ trailer << self.numero_de_aviso_debito
40
+ trailer << self.uso_exclusivo_febraban2
41
+ trailer << self.codigo_das_ocorrencias_para_retorno
42
+ end
43
+ end
@@ -0,0 +1,37 @@
1
+ class RubyCnab240::Arquivo::Trailer < RubyCnab240::Arquivo
2
+ attr_accessor :codigo_do_banco_na_compensacao
3
+ attr_accessor :qtd_registros_de_lote
4
+ attr_accessor :qtd_registros_do_arquivo
5
+
6
+ attr_reader :lote_do_servico
7
+ attr_reader :tipo_de_registro
8
+ attr_reader :uso_exclusivo_febraban
9
+ attr_reader :qtd_de_contas_para_conc
10
+ attr_reader :uso_exclusivo_febraban2
11
+
12
+ def initialize(fields = {})
13
+
14
+ fields[:qtd_registros_de_lote] = '1'
15
+
16
+ @codigo_do_banco_na_compensacao = fields[:codigo_do_banco_na_compensacao].to_s[0..2].rjust(3, '0') #default: 001
17
+ @lote_do_servico = '9999'
18
+ @tipo_de_registro = '9'
19
+ @uso_exclusivo_febraban = ' ' * 9
20
+ @qtd_registros_de_lote = fields[:qtd_registros_de_lote].to_s[0..5].rjust(6, '0')
21
+ @qtd_registros_do_arquivo = fields[:qtd_registros_do_arquivo].to_s[0..5].rjust(6, '0')
22
+ @qtd_de_contas_para_conc = ' ' * 6
23
+ @uso_exclusivo_febraban2 = ' ' * 205
24
+ end
25
+
26
+ def to_string
27
+ trailer = String.new
28
+ trailer << self.codigo_do_banco_na_compensacao
29
+ trailer << self.lote_do_servico
30
+ trailer << self.tipo_de_registro
31
+ trailer << self.uso_exclusivo_febraban
32
+ trailer << self.qtd_registros_de_lote
33
+ trailer << self.qtd_registros_do_arquivo
34
+ trailer << self.qtd_de_contas_para_conc
35
+ trailer << self.uso_exclusivo_febraban2
36
+ end
37
+ end
@@ -0,0 +1,117 @@
1
+ class RubyCnab240::Arquivo
2
+ require 'rubycnab240/arquivo/header'
3
+ require 'rubycnab240/arquivo/lote'
4
+ require 'rubycnab240/arquivo/trailer'
5
+
6
+ attr_accessor :header
7
+ attr_accessor :lot_header
8
+ attr_accessor :segments
9
+ attr_accessor :lot_trailer
10
+ attr_accessor :trailer
11
+ attr_accessor :data_dos_pagamentos
12
+
13
+ @@tipo_de_inscricao_da_empresa = String.new
14
+ @@numero_de_inscricao_da_empresa = String.new
15
+ @@codigo_do_convenio_do_banco = String.new
16
+ @@agencia_mantenedora_da_conta = String.new
17
+ @@digito_verificador_da_agencia = String.new
18
+ @@numero_da_conta_corrente = String.new
19
+ @@digito_verificador_da_conta = String.new
20
+ @@digito_verificador_da_agencia_e_conta = String.new
21
+ @@nome_da_empresa = String.new
22
+ @@data_dos_pagamentos = String.new
23
+
24
+ def initialize(fields = {})
25
+ fields[:tipo_de_registro] = '0'
26
+ fields[:digito_verificador_da_agencia_e_conta] = '0'
27
+
28
+ @@data_dos_pagamentos = fields[:data_dos_pagamentos] ? fields[:data_dos_pagamentos].strftime("%d%m%Y") : Date.today.strftime("%d%m%Y")
29
+
30
+ @@tipo_de_inscricao_da_empresa = fields[:tipo_de_inscricao_da_empresa]
31
+ @@numero_de_inscricao_da_empresa = fields[:numero_de_inscricao_da_empresa]
32
+ @@codigo_do_convenio_do_banco = fields[:codigo_do_convenio_do_banco]
33
+ @@agencia_mantenedora_da_conta = fields[:agencia_mantenedora_da_conta]
34
+ @@digito_verificador_da_agencia = fields[:digito_verificador_da_agencia]
35
+ @@numero_da_conta_corrente = fields[:numero_da_conta_corrente]
36
+ @@digito_verificador_da_conta = fields[:digito_verificador_da_conta]
37
+ @@digito_verificador_da_agencia_e_conta = fields[:digito_verificador_da_agencia_e_conta]
38
+ @@nome_da_empresa = fields[:nome_da_empresa]
39
+
40
+ @header = RubyCnab240::Arquivo::Header.new({
41
+ :codigo_do_banco_na_compensacao => fields[:codigo_do_banco_na_compensacao],
42
+ :lote_do_servico => '0',
43
+ :tipo_de_registro => fields[:tipo_de_registro],
44
+ :tipo_de_inscricao_da_empresa => @@tipo_de_inscricao_da_empresa,
45
+ :numero_de_inscricao_da_empresa => @@numero_de_inscricao_da_empresa,
46
+ :codigo_do_convenio_do_banco => @@codigo_do_convenio_do_banco,
47
+ :agencia_mantenedora_da_conta => @@agencia_mantenedora_da_conta,
48
+ :digito_verificador_da_agencia => @@digito_verificador_da_agencia,
49
+ :numero_da_conta_corrente => @@numero_da_conta_corrente,
50
+ :digito_verificador_da_conta => @@digito_verificador_da_conta,
51
+ :digito_verificador_da_agencia_e_conta => @@digito_verificador_da_agencia_e_conta,
52
+ :nome_da_empresa => @@nome_da_empresa,
53
+ :nome_do_banco => fields[:nome_do_banco],
54
+ :codigo_remessa_retorno => fields[:codigo_remessa_retorno],
55
+ :numero_sequencial_de_arquivo => fields[:numero_sequencial_de_arquivo],
56
+ :para_uso_reservado_da_empresa => fields[:para_uso_reservado_da_empresa]
57
+ })
58
+
59
+
60
+
61
+ @segments = []
62
+
63
+ @trailer = RubyCnab240::Arquivo::Trailer.new({
64
+ :codigo_do_banco_na_compensacao => fields[:codigo_do_banco_na_compensacao],
65
+ :qtd_registros_de_lote => "0",
66
+ :qtd_registros_do_arquivo => "0"
67
+ })
68
+ end
69
+
70
+ def number_of_segments
71
+ self.segments.size + 1
72
+ end
73
+
74
+ def <<(lote)
75
+ numero_do_lote = (self.segments.size + 1).to_s[0..3].rjust(4, '0')
76
+
77
+ lote.lot_header.lote_do_servico = numero_do_lote
78
+ lote.lot_trailer.lote_do_servico = numero_do_lote
79
+
80
+ self.segments << lote unless lote.class.to_s != "RubyCnab240::Arquivo::Lote"
81
+ end
82
+
83
+ def to_string
84
+
85
+
86
+
87
+ rubycnab240 = String.new
88
+
89
+ qtd_registros_de_lote = self.segments.size
90
+ qtd_registros_do_arquivo = 0
91
+
92
+ self.segments.each do |segment|
93
+ segment.lots.each do |lot|
94
+ qtd_registros_do_arquivo += 1
95
+ lot.lote_do_servico = segment.lot_header.lote_do_servico
96
+ lot.data_do_pagamento = @@data_dos_pagamentos unless lot.class.to_s == "RubyCnab240::Arquivo::Lote::Segment::B"
97
+ end
98
+ end
99
+
100
+ qtd_registros_do_arquivo = qtd_registros_do_arquivo + (2 * self.segments.size) + 2
101
+
102
+ self.trailer.qtd_registros_de_lote = qtd_registros_de_lote.to_s[0..5].rjust(6, '0')
103
+ self.trailer.qtd_registros_do_arquivo = qtd_registros_do_arquivo.to_s[0..5].rjust(6, '0')
104
+
105
+ rubycnab240 << self.header.to_string + "\n"
106
+ self.segments.each do |lot|
107
+ rubycnab240 << lot.to_string + "\n"
108
+ end
109
+ rubycnab240 << self.trailer.to_string + "\n"
110
+ end
111
+
112
+ def save_to_file(file)
113
+ string = self.to_string
114
+
115
+ File.open(file, 'w') { |file| file.write(string) }
116
+ end
117
+ end
@@ -0,0 +1,267 @@
1
+ class RubyCnab240::Retorno
2
+
3
+ attr_accessor :file
4
+ attr_accessor :result
5
+
6
+ def initialize(file)
7
+ @file = file
8
+ @result = []
9
+ end
10
+
11
+ def process
12
+
13
+ lines = []
14
+
15
+ File.foreach(self.file).with_index do |line, line_num|
16
+ lines << { line_num: line_num, text: line }
17
+ end
18
+
19
+ lines.select{ |line| line[:text][13..13] == 'A' }.each do |segment_a|
20
+ self.result << {
21
+ line_num: segment_a[:line_num],
22
+ identification: segment_a[:text][85..92],
23
+ succeded: RubyCnab240::Retorno.success?(segment_a[:text][230..23]),
24
+ return_code: segment_a[:text][230..23],
25
+ return_message: RubyCnab240::Retorno.return_message(segment_a[:text][230..231]),
26
+ date: Date.strptime(segment_a[:text][93..101],"%d%m%Y")
27
+ }
28
+ end
29
+
30
+ self.result
31
+ end
32
+
33
+ def self.return_message(code)
34
+ case code
35
+ when '00'
36
+ 'CREDITO OU DEBITO EFETUADO'
37
+ when '01'
38
+ 'INSUFICIENCIA DE FUNDOS - DEBITO NAO EFETUADO'
39
+ when '02'
40
+ 'CREDITO OU DEBITO CANCELADO PELO PAGADOR/CREDOR'
41
+ when '03'
42
+ 'DEBITO AUTORIZADO PELA AGENCIA - EFETUADO'
43
+ when '88'
44
+ 'REMESSA DUPLICADA'
45
+ when 'AA'
46
+ 'CONTROLE INVALIDO'
47
+ when 'AB'
48
+ 'TIPO DE OPERACAO INVALIDO'
49
+ when 'AC'
50
+ 'TIPO DE SERVICO INVALIDO'
51
+ when 'AD'
52
+ 'FORMA DE LANCAMENTO INVALIDA'
53
+ when 'AE'
54
+ 'TIPO/NUMERO DE INSCRICAO INVALIDO'
55
+ when 'AF'
56
+ 'CODIGO DE CONVENIO INVALIDO'
57
+ when 'AG'
58
+ 'AGENCIA/CONTA CORRENTE/DV INVALIDO'
59
+ when 'AH'
60
+ 'No. SEQUENCIAL DO REGISTRO LOTE INVALIDO'
61
+ when 'AI'
62
+ 'CODIGO DE SEGMENTO DE DETALHE INVALIDO'
63
+ when 'AJ'
64
+ 'TIPO DE MOVIMENTO INVALIDO'
65
+ when 'AK'
66
+ 'CODIGO DE COMPENSACAO DO FAVORECIDO/DEPOSITARIO INVALIDO'
67
+ when 'AL'
68
+ 'BANCO DO FAVORECIDO OU DEPOSITARIO INVALIDO'
69
+ when 'AM'
70
+ 'AGENCIA MANTENEDORA DA C.C. DO FAVOREDICO INVALIDA'
71
+ when 'AO'
72
+ 'NOME DO FAVORECIDO INVALIDO'
73
+ when 'AP'
74
+ 'DATA LANCAMENTO INVALIDA'
75
+ when 'AQ'
76
+ 'TIPO/QUANTIDADE DA MOEDA INVALIDO'
77
+ when 'AR'
78
+ 'VALOR DO LANCAMENTO INVALIDO'
79
+ when 'AS'
80
+ 'AVISO AO FAVORECIDO - IDENTIFICACAO INVALIDA'
81
+ when 'AT'
82
+ 'TIPO/NUMERO DE INSCRICAO DO FAVORECIDO INVALIDO'
83
+ when 'AU'
84
+ 'LOGRADOURO DO FAVORECIDO NAO INFORMADO'
85
+ when 'AV'
86
+ 'No. DO LOCAL DO FAVORECIDO NAO INFORMADO'
87
+ when 'AW'
88
+ 'CIDADE DO FAVORECIDO NAO INFORMADO'
89
+ when 'AX'
90
+ 'CEP/COMPLEMENTO DO FAVORECIDO INVALIDO'
91
+ when 'AY'
92
+ 'SIGLA DO ESTADO DO FAVORECIDO INVALIDO'
93
+ when 'AZ'
94
+ 'CODIGO/NOME DO BANCO DEPOSITARIO INVALIDO'
95
+ when 'BA'
96
+ 'CODIGO/NOME DA AGENCIA DEPOSITARIA NAO INFORMADO'
97
+ when 'BB'
98
+ 'SEU NUMERO INVALIDO'
99
+ when 'BC'
100
+ 'NOSSO NUMERO INVALIDO'
101
+ when 'BD'
102
+ 'CONFIRMACAO DE PAGAMENTO AGENDADO'
103
+ when 'CF'
104
+ 'VALOR DO DOCUMENTO INVALIDO'
105
+ when 'HB'
106
+ 'LOTE NAO ACEITO'
107
+ when 'HC'
108
+ 'CONVENIO COM A EMPRESA INEXISTENTE/INVALIDO PARA O CONTRATO'
109
+ when 'HD'
110
+ 'AGENCIA/CONTA DA EMPRESA INEXISTENTE/INVALIDA P/ CONTRATO'
111
+ when 'HE'
112
+ 'TIPO DE SERVICO INVALIDO P/ CONTRATO'
113
+ when 'HF'
114
+ 'CONTA CORRENTE DA EMPRESA COM SALDO INSUFICIENTE'
115
+ when 'HG'
116
+ 'LOTE DE SERVICO FORA DE SEQUENCIA'
117
+ when 'HH'
118
+ 'LOTE DE SERVICO INVALIDO'
119
+ when 'NA'
120
+ 'CONTA CORRENTE/DV DO FAVORECIDO INVALIDO'
121
+ when 'TA'
122
+ 'LOTE NAO ACEITO - TOTAIS DO LOTE COM DIFERENCA'
123
+ else
124
+ 'IDENTIFICADOR NÃO EXISTENTE OU NÃO RECONHECIDO'
125
+ end
126
+ end
127
+
128
+ def self.success?(code)
129
+ case code
130
+ when '00'
131
+ #'CREDITO OU DEBITO EFETUADO'
132
+ true
133
+ when '01'
134
+ #'INSUFICIENCIA DE FUNDOS - DEBITO NAO EFETUADO'
135
+ false
136
+ when '02'
137
+ #'CREDITO OU DEBITO CANCELADO PELO PAGADOR/CREDOR'
138
+ false
139
+ when '03'
140
+ #'DEBITO AUTORIZADO PELA AGENCIA - EFETUADO'
141
+ true
142
+ when '88'
143
+ #'REMESSA DUPLICADA'
144
+ false
145
+ when 'AA'
146
+ #'CONTROLE INVALIDO'
147
+ false
148
+ when 'AB'
149
+ #'TIPO DE OPERACAO INVALIDO'
150
+ false
151
+ when 'AC'
152
+ #'TIPO DE SERVICO INVALIDO'
153
+ false
154
+ when 'AD'
155
+ #'FORMA DE LANCAMENTO INVALIDA'
156
+ false
157
+ when 'AE'
158
+ #'TIPO/NUMERO DE INSCRICAO INVALIDO'
159
+ false
160
+ when 'AF'
161
+ #'CODIGO DE CONVENIO INVALIDO'
162
+ false
163
+ when 'AG'
164
+ #'AGENCIA/CONTA CORRENTE/DV INVALIDO'
165
+ false
166
+ when 'AH'
167
+ #'No. SEQUENCIAL DO REGISTRO LOTE INVALIDO'
168
+ false
169
+ when 'AI'
170
+ #'CODIGO DE SEGMENTO DE DETALHE INVALIDO'
171
+ false
172
+ when 'AJ'
173
+ #'TIPO DE MOVIMENTO INVALIDO'
174
+ false
175
+ when 'AK'
176
+ #'CODIGO DE COMPENSACAO DO FAVORECIDO/DEPOSITARIO INVALIDO'
177
+ false
178
+ when 'AL'
179
+ #'BANCO DO FAVORECIDO OU DEPOSITARIO INVALIDO'
180
+ false
181
+ when 'AM'
182
+ #'AGENCIA MANTENEDORA DA C.C. DO FAVOREDICO INVALIDA'
183
+ false
184
+ when 'AO'
185
+ #'NOME DO FAVORECIDO INVALIDO'
186
+ false
187
+ when 'AP'
188
+ #'DATA LANCAMENTO INVALIDA'
189
+ false
190
+ when 'AQ'
191
+ #'TIPO/QUANTIDADE DA MOEDA INVALIDO'
192
+ false
193
+ when 'AR'
194
+ #'VALOR DO LANCAMENTO INVALIDO'
195
+ false
196
+ when 'AS'
197
+ #'AVISO AO FAVORECIDO - IDENTIFICACAO INVALIDA'
198
+ false
199
+ when 'AT'
200
+ #'TIPO/NUMERO DE INSCRICAO DO FAVORECIDO INVALIDO'
201
+ false
202
+ when 'AU'
203
+ #'LOGRADOURO DO FAVORECIDO NAO INFORMADO'
204
+ false
205
+ when 'AV'
206
+ #'No. DO LOCAL DO FAVORECIDO NAO INFORMADO'
207
+ false
208
+ when 'AW'
209
+ #'CIDADE DO FAVORECIDO NAO INFORMADO'
210
+ false
211
+ when 'AX'
212
+ #'CEP/COMPLEMENTO DO FAVORECIDO INVALIDO'
213
+ false
214
+ when 'AY'
215
+ #'SIGLA DO ESTADO DO FAVORECIDO INVALIDO'
216
+ false
217
+ when 'AZ'
218
+ #'CODIGO/NOME DO BANCO DEPOSITARIO INVALIDO'
219
+ false
220
+ when 'BA'
221
+ #'CODIGO/NOME DA AGENCIA DEPOSITARIA NAO INFORMADO'
222
+ false
223
+ when 'BB'
224
+ #'SEU NUMERO INVALIDO'
225
+ false
226
+ when 'BC'
227
+ #'NOSSO NUMERO INVALIDO'
228
+ false
229
+ when 'BD'
230
+ #'CONFIRMACAO DE PAGAMENTO AGENDADO'
231
+ false
232
+ when 'CF'
233
+ #'VALOR DO DOCUMENTO INVALIDO'
234
+ false
235
+ when 'HB'
236
+ #'LOTE NAO ACEITO'
237
+ false
238
+ when 'HC'
239
+ #'CONVENIO COM A EMPRESA INEXISTENTE/INVALIDO PARA O CONTRATO'
240
+ false
241
+ when 'HD'
242
+ #'AGENCIA/CONTA DA EMPRESA INEXISTENTE/INVALIDA P/ CONTRATO'
243
+ false
244
+ when 'HE'
245
+ #'TIPO DE SERVICO INVALIDO P/ CONTRATO'
246
+ false
247
+ when 'HF'
248
+ #'CONTA CORRENTE DA EMPRESA COM SALDO INSUFICIENTE'
249
+ false
250
+ when 'HG'
251
+ #'LOTE DE SERVICO FORA DE SEQUENCIA'
252
+ false
253
+ when 'HH'
254
+ #'LOTE DE SERVICO INVALIDO'
255
+ false
256
+ when 'NA'
257
+ #'CONTA CORRENTE/DV DO FAVORECIDO INVALIDO'
258
+ false
259
+ when 'TA'
260
+ #'LOTE NAO ACEITO - TOTAIS DO LOTE COM DIFERENCA'
261
+ false
262
+ else
263
+ #'IDENTIFICADOR NÃO EXISTENTE OU NÃO RECONHECIDO'
264
+ false
265
+ end
266
+ end
267
+ end
@@ -0,0 +1,3 @@
1
+ module RubyCnab240
2
+ VERSION = "1.0.0"
3
+ end
@@ -0,0 +1,6 @@
1
+ require "rubycnab240/version"
2
+
3
+ module RubyCnab240
4
+ require 'rubycnab240/arquivo'
5
+ require 'rubycnab240/retorno'
6
+ end
@@ -0,0 +1,23 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'rubycnab240/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "rubycnab240"
8
+ spec.version = RubyCnab240::VERSION
9
+ spec.authors = ["Gabriel Hamdan"]
10
+ spec.email = ["ghamdan.eng@gmail.com"]
11
+
12
+ spec.summary = "Crie arquivo de remessa de pagamentos CNAB240 - Febraban"
13
+ spec.description = "Crie arquivo de remessa de pagamentos CNAB240 - Febraban"
14
+ spec.homepage = "https://github.com/Hamdan85/rubycnab240"
15
+
16
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
17
+ spec.bindir = "exe"
18
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_development_dependency "bundler", "~> 1.11"
22
+ spec.add_development_dependency "rake", "~> 10.0"
23
+ end
metadata ADDED
@@ -0,0 +1,91 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rubycnab240
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Gabriel Hamdan
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2016-06-06 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.11'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.11'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '10.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '10.0'
41
+ description: Crie arquivo de remessa de pagamentos CNAB240 - Febraban
42
+ email:
43
+ - ghamdan.eng@gmail.com
44
+ executables: []
45
+ extensions: []
46
+ extra_rdoc_files: []
47
+ files:
48
+ - ".gitignore"
49
+ - Gemfile
50
+ - README.md
51
+ - Rakefile
52
+ - bin/console
53
+ - bin/setup
54
+ - docs/PgtVer03BB.xls
55
+ - lib/rubycnab240.rb
56
+ - lib/rubycnab240/arquivo.rb
57
+ - lib/rubycnab240/arquivo/header.rb
58
+ - lib/rubycnab240/arquivo/lote.rb
59
+ - lib/rubycnab240/arquivo/lotes/header.rb
60
+ - lib/rubycnab240/arquivo/lotes/segment.rb
61
+ - lib/rubycnab240/arquivo/lotes/segments/a.rb
62
+ - lib/rubycnab240/arquivo/lotes/segments/b.rb
63
+ - lib/rubycnab240/arquivo/lotes/trailer.rb
64
+ - lib/rubycnab240/arquivo/trailer.rb
65
+ - lib/rubycnab240/retorno.rb
66
+ - lib/rubycnab240/version.rb
67
+ - rubycnab240.gemspec
68
+ homepage: https://github.com/Hamdan85/rubycnab240
69
+ licenses: []
70
+ metadata: {}
71
+ post_install_message:
72
+ rdoc_options: []
73
+ require_paths:
74
+ - lib
75
+ required_ruby_version: !ruby/object:Gem::Requirement
76
+ requirements:
77
+ - - ">="
78
+ - !ruby/object:Gem::Version
79
+ version: '0'
80
+ required_rubygems_version: !ruby/object:Gem::Requirement
81
+ requirements:
82
+ - - ">="
83
+ - !ruby/object:Gem::Version
84
+ version: '0'
85
+ requirements: []
86
+ rubyforge_project:
87
+ rubygems_version: 2.4.6
88
+ signing_key:
89
+ specification_version: 4
90
+ summary: Crie arquivo de remessa de pagamentos CNAB240 - Febraban
91
+ test_files: []