rubycnab240 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
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: []