br_boleto 1.2.2 → 2.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 +4 -4
- data/.gitignore +1 -0
- data/Gemfile.lock +1 -1
- data/README.markdown +278 -98
- data/br_boleto.gemspec +5 -3
- data/lib/br_boleto/active_model_base.rb +1 -1
- data/lib/br_boleto/association/have_conta.rb +109 -0
- data/lib/br_boleto/association/have_pagador.rb +38 -0
- data/lib/br_boleto/association/have_pagamentos.rb +44 -0
- data/lib/br_boleto/boleto/base.rb +50 -379
- data/lib/br_boleto/boleto/caixa.rb +28 -143
- data/lib/br_boleto/boleto/sicoob.rb +24 -144
- data/lib/br_boleto/conta/base.rb +288 -0
- data/lib/br_boleto/conta/caixa.rb +109 -0
- data/lib/br_boleto/conta/sicoob.rb +64 -0
- data/lib/br_boleto/helper/default_codes.rb +33 -0
- data/lib/br_boleto/helper/format_value.rb +1 -0
- data/lib/br_boleto/helper/number.rb +30 -0
- data/lib/br_boleto/pagador.rb +82 -0
- data/lib/br_boleto/remessa/base.rb +28 -50
- data/lib/br_boleto/remessa/cnab240/base.rb +22 -131
- data/lib/br_boleto/remessa/cnab240/caixa.rb +16 -62
- data/lib/br_boleto/remessa/cnab240/helper/header_arquivo.rb +7 -7
- data/lib/br_boleto/remessa/cnab240/helper/header_lote.rb +6 -6
- data/lib/br_boleto/remessa/cnab240/helper/segmento_p.rb +22 -22
- data/lib/br_boleto/remessa/cnab240/helper/segmento_q.rb +16 -16
- data/lib/br_boleto/remessa/cnab240/helper/segmento_r.rb +3 -3
- data/lib/br_boleto/remessa/cnab240/helper/segmento_s.rb +3 -3
- data/lib/br_boleto/remessa/cnab240/helper/trailer_arquivo.rb +3 -3
- data/lib/br_boleto/remessa/cnab240/helper/trailer_lote.rb +3 -3
- data/lib/br_boleto/remessa/cnab240/sicoob.rb +36 -73
- data/lib/br_boleto/remessa/cnab400/base.rb +95 -0
- data/lib/br_boleto/remessa/cnab400/helper/detalhe.rb +136 -0
- data/lib/br_boleto/remessa/cnab400/helper/header.rb +114 -0
- data/lib/br_boleto/remessa/cnab400/helper/trailer.rb +50 -0
- data/lib/br_boleto/remessa/cnab400/sicoob.rb +249 -0
- data/lib/br_boleto/remessa/lote.rb +1 -23
- data/lib/br_boleto/remessa/pagamento.rb +188 -51
- data/lib/br_boleto/retorno/base.rb +9 -0
- data/lib/br_boleto/retorno/cnab240/base.rb +2 -10
- data/lib/br_boleto/retorno/cnab400/base.rb +48 -0
- data/lib/br_boleto/retorno/cnab400/sicoob.rb +42 -0
- data/lib/br_boleto/retorno/pagamento.rb +12 -6
- data/lib/br_boleto/string_methods.rb +8 -2
- data/lib/br_boleto/validations.rb +19 -0
- data/lib/br_boleto/version.rb +3 -3
- data/lib/br_boleto.rb +38 -8
- data/lib/config/locales/br-boleto-en.yml +89 -0
- data/lib/config/locales/br-boleto-pt-BR.yml +89 -0
- data/test/br_boleto/association/have_conta_test.rb +319 -0
- data/test/br_boleto/association/have_pagador_test.rb +110 -0
- data/test/br_boleto/association/have_pagamentos_test.rb +113 -0
- data/test/br_boleto/boleto/base_test.rb +127 -201
- data/test/br_boleto/boleto/caixa_test.rb +58 -72
- data/test/br_boleto/boleto/sicoob_test.rb +88 -147
- data/test/br_boleto/conta/base_test.rb +490 -0
- data/test/br_boleto/conta/caixa_test.rb +154 -0
- data/test/br_boleto/conta/sicoob_test.rb +144 -0
- data/test/br_boleto/helper/number_test.rb +29 -0
- data/test/br_boleto/pagador_test.rb +158 -0
- data/test/br_boleto/remessa/base_test.rb +37 -62
- data/test/br_boleto/remessa/cnab240/base_test.rb +75 -95
- data/test/br_boleto/remessa/cnab240/caixa_test.rb +61 -96
- data/test/br_boleto/remessa/cnab240/helper/header_arquivo_test.rb +11 -11
- data/test/br_boleto/remessa/cnab240/helper/header_lote_test.rb +8 -8
- data/test/br_boleto/remessa/cnab240/helper/segmento_p_test.rb +17 -15
- data/test/br_boleto/remessa/cnab240/helper/segmento_q_test.rb +13 -13
- data/test/br_boleto/remessa/cnab240/helper/segmento_r_test.rb +2 -2
- data/test/br_boleto/remessa/cnab240/helper/segmento_s_test.rb +3 -3
- data/test/br_boleto/remessa/cnab240/helper/trailer_arquivo_test.rb +1 -1
- data/test/br_boleto/remessa/cnab240/helper/trailer_lote_test.rb +1 -1
- data/test/br_boleto/remessa/cnab240/sicoob_test.rb +136 -131
- data/test/br_boleto/remessa/cnab400/base_test.rb +263 -0
- data/test/br_boleto/remessa/cnab400/sicoob_test.rb +179 -0
- data/test/br_boleto/remessa/lote_test.rb +2 -41
- data/test/br_boleto/remessa/pagamento_test.rb +186 -188
- data/test/br_boleto/retorno/base_test.rb +0 -1
- data/test/br_boleto/retorno/cnab240/base_test.rb +12 -11
- data/test/br_boleto/retorno/cnab240/caixa_test.rb +11 -11
- data/test/br_boleto/retorno/cnab240/sicoob_test.rb +11 -11
- data/test/br_boleto/retorno/cnab400/sicoob_test.rb +227 -0
- data/test/br_boleto/retorno/pagamento_test.rb +6 -6
- data/test/factories/boleto/base.rb +9 -7
- data/test/factories/boleto/boleto_caixa.rb +2 -9
- data/test/factories/boleto/boleto_sicoob.rb +10 -8
- data/test/factories/conta/base.rb +10 -0
- data/test/factories/conta/caixa.rb +15 -0
- data/test/factories/conta/sicoob.rb +16 -0
- data/test/factories/pagador.rb +15 -0
- data/test/factories/remessa/base.rb +0 -6
- data/test/factories/remessa/cnab240/base.rb +0 -10
- data/test/factories/remessa/cnab240/caixa.rb +1 -6
- data/test/factories/remessa/cnab240/sicoob.rb +1 -10
- data/test/factories/remessa/cnab400/base.rb +8 -0
- data/test/factories/remessa/cnab400/sicoob.rb +8 -0
- data/test/factories/remessa/pagamento.rb +8 -7
- data/test/fixtures/remessa/cnab240/sicoob.rem +8 -0
- data/test/{files → fixtures}/retorno/cnab240/caixa.ret +0 -0
- data/test/{files → fixtures}/retorno/cnab240/padrao240.ret +0 -0
- data/test/fixtures/retorno/cnab400/sicoob.ret +7 -0
- data/test/inheritance/boleto_test.rb +4 -1
- data/test/inheritance/sicoob_test.rb +23 -7
- data/test/test_helper.rb +70 -0
- metadata +63 -6
|
@@ -46,7 +46,7 @@ module BrBoleto
|
|
|
46
46
|
# 3 posições
|
|
47
47
|
#
|
|
48
48
|
def segmento_q_posicao_001_a_003
|
|
49
|
-
codigo_banco
|
|
49
|
+
conta.codigo_banco
|
|
50
50
|
end
|
|
51
51
|
|
|
52
52
|
# Lote de Serviço: Número seqüencial para identificar univocamente um lote de serviço.
|
|
@@ -56,7 +56,7 @@ module BrBoleto
|
|
|
56
56
|
# 4 posições
|
|
57
57
|
#
|
|
58
58
|
def segmento_q_posicao_004_a_007(numero_do_lote)
|
|
59
|
-
numero_do_lote.
|
|
59
|
+
"#{numero_do_lote}".adjust_size_to(4, '0', :right)
|
|
60
60
|
end
|
|
61
61
|
|
|
62
62
|
# Tipo do registro -> Padrão 3
|
|
@@ -70,7 +70,7 @@ module BrBoleto
|
|
|
70
70
|
# 5 posições
|
|
71
71
|
#
|
|
72
72
|
def segmento_q_posicao_009_a_013(sequencial)
|
|
73
|
-
sequencial.
|
|
73
|
+
"#{sequencial}".adjust_size_to(5, '0', :right)
|
|
74
74
|
end
|
|
75
75
|
|
|
76
76
|
# Cód. Segmento do Registro Detalhe
|
|
@@ -98,84 +98,84 @@ module BrBoleto
|
|
|
98
98
|
# 1 posição
|
|
99
99
|
#
|
|
100
100
|
def segmento_q_posicao_018_a_018(pagamento)
|
|
101
|
-
pagamento.
|
|
101
|
+
pagamento.pagador.tipo_cpf_cnpj(1)
|
|
102
102
|
end
|
|
103
103
|
|
|
104
104
|
# Número de Inscrição
|
|
105
105
|
# 15 posições
|
|
106
106
|
#
|
|
107
107
|
def segmento_q_posicao_019_a_033(pagamento)
|
|
108
|
-
|
|
108
|
+
"#{pagamento.pagador.cpf_cnpj}".adjust_size_to(15, '0', :right)
|
|
109
109
|
end
|
|
110
110
|
|
|
111
111
|
# Nome do sacado
|
|
112
112
|
# 40 posições
|
|
113
113
|
#
|
|
114
114
|
def segmento_q_posicao_034_a_073(pagamento)
|
|
115
|
-
pagamento.
|
|
115
|
+
"#{pagamento.pagador.nome}".adjust_size_to(40)
|
|
116
116
|
end
|
|
117
117
|
|
|
118
118
|
# Endereço sacado
|
|
119
119
|
# 40 posições
|
|
120
120
|
#
|
|
121
121
|
def segmento_q_posicao_074_a_113(pagamento)
|
|
122
|
-
pagamento.
|
|
122
|
+
"#{pagamento.pagador.endereco}".adjust_size_to(40)
|
|
123
123
|
end
|
|
124
124
|
|
|
125
125
|
# Bairro do sacado
|
|
126
126
|
# 15 posições
|
|
127
127
|
#
|
|
128
128
|
def segmento_q_posicao_114_a_128(pagamento)
|
|
129
|
-
pagamento.
|
|
129
|
+
"#{pagamento.pagador.bairro}".adjust_size_to(15)
|
|
130
130
|
end
|
|
131
131
|
|
|
132
132
|
# CEP (prefixo)
|
|
133
133
|
# 5 posições
|
|
134
134
|
#
|
|
135
135
|
def segmento_q_posicao_129_a_133(pagamento)
|
|
136
|
-
pagamento.
|
|
136
|
+
"#{pagamento.pagador.cep}"[0..4]
|
|
137
137
|
end
|
|
138
138
|
|
|
139
139
|
# CEP sufixo
|
|
140
140
|
# 3 posições
|
|
141
141
|
#
|
|
142
142
|
def segmento_q_posicao_134_a_136(pagamento)
|
|
143
|
-
pagamento.
|
|
143
|
+
"#{pagamento.pagador.cep}"[5..7]
|
|
144
144
|
end
|
|
145
145
|
|
|
146
146
|
# Cidade
|
|
147
147
|
# 15 posições
|
|
148
148
|
#
|
|
149
149
|
def segmento_q_posicao_137_a_151(pagamento)
|
|
150
|
-
pagamento.
|
|
150
|
+
"#{pagamento.pagador.cidade}".adjust_size_to(15)
|
|
151
151
|
end
|
|
152
152
|
|
|
153
153
|
# Unidade da Federação
|
|
154
154
|
# 2 posuções
|
|
155
155
|
#
|
|
156
156
|
def segmento_q_posicao_152_a_153(pagamento)
|
|
157
|
-
pagamento.
|
|
157
|
+
"#{pagamento.pagador.uf}".adjust_size_to(2)
|
|
158
158
|
end
|
|
159
159
|
|
|
160
160
|
# Tipo de Inscrição
|
|
161
161
|
# 1 posição
|
|
162
162
|
#
|
|
163
163
|
def segmento_q_posicao_154_a_154(pagamento)
|
|
164
|
-
pagamento.tipo_documento_avalista(1)
|
|
164
|
+
pagamento.pagador.tipo_documento_avalista(1)
|
|
165
165
|
end
|
|
166
166
|
|
|
167
|
-
#
|
|
167
|
+
# CNPF/CNPJ Avalista
|
|
168
168
|
# 15 posições
|
|
169
169
|
#
|
|
170
170
|
def segmento_q_posicao_155_a_169(pagamento)
|
|
171
|
-
|
|
171
|
+
"#{pagamento.pagador.documento_avalista}".adjust_size_to(15, '0', :right)
|
|
172
172
|
end
|
|
173
173
|
|
|
174
174
|
# Nome do avalista
|
|
175
175
|
# 40 posições
|
|
176
176
|
#
|
|
177
177
|
def segmento_q_posicao_170_a_209(pagamento)
|
|
178
|
-
"#{pagamento.nome_avalista}".adjust_size_to(40)
|
|
178
|
+
"#{pagamento.pagador.nome_avalista}".adjust_size_to(40)
|
|
179
179
|
end
|
|
180
180
|
|
|
181
181
|
# Cód. Bco. Corresp. na Compensação
|
|
@@ -52,7 +52,7 @@ module BrBoleto
|
|
|
52
52
|
# 3 posições
|
|
53
53
|
#
|
|
54
54
|
def segmento_r_posicao_001_a_003
|
|
55
|
-
codigo_banco
|
|
55
|
+
conta.codigo_banco
|
|
56
56
|
end
|
|
57
57
|
|
|
58
58
|
# Lote de Serviço: Número seqüencial para identificar univocamente um lote de serviço.
|
|
@@ -62,7 +62,7 @@ module BrBoleto
|
|
|
62
62
|
# 4 posições
|
|
63
63
|
#
|
|
64
64
|
def segmento_r_posicao_004_a_007(numero_do_lote)
|
|
65
|
-
numero_do_lote.
|
|
65
|
+
"#{numero_do_lote}".adjust_size_to(4, '0', :right)
|
|
66
66
|
end
|
|
67
67
|
|
|
68
68
|
# Tipo do registro -> Padrão 3
|
|
@@ -76,7 +76,7 @@ module BrBoleto
|
|
|
76
76
|
# 5 posições
|
|
77
77
|
#
|
|
78
78
|
def segmento_r_posicao_009_a_013(sequencial)
|
|
79
|
-
sequencial.
|
|
79
|
+
"#{sequencial}".adjust_size_to(5, '0', :right)
|
|
80
80
|
end
|
|
81
81
|
|
|
82
82
|
# Cód. Segmento do Registro Detalhe
|
|
@@ -36,7 +36,7 @@ module BrBoleto
|
|
|
36
36
|
# 3 posições
|
|
37
37
|
#
|
|
38
38
|
def segmento_s_posicao_001_a_003
|
|
39
|
-
codigo_banco
|
|
39
|
+
conta.codigo_banco
|
|
40
40
|
end
|
|
41
41
|
|
|
42
42
|
# Lote de Serviço: Número seqüencial para identificar univocamente um lote de serviço.
|
|
@@ -46,7 +46,7 @@ module BrBoleto
|
|
|
46
46
|
# 4 posições
|
|
47
47
|
#
|
|
48
48
|
def segmento_s_posicao_004_a_007(numero_do_lote)
|
|
49
|
-
numero_do_lote.
|
|
49
|
+
"#{numero_do_lote}".adjust_size_to(4, '0', :right)
|
|
50
50
|
end
|
|
51
51
|
|
|
52
52
|
# Tipo do registro -> Padrão 3
|
|
@@ -60,7 +60,7 @@ module BrBoleto
|
|
|
60
60
|
# 5 posições
|
|
61
61
|
#
|
|
62
62
|
def segmento_s_posicao_009_a_013(sequencial)
|
|
63
|
-
sequencial.
|
|
63
|
+
"#{sequencial}".adjust_size_to(5, '0', :right)
|
|
64
64
|
end
|
|
65
65
|
|
|
66
66
|
# Cód. Segmento do Registro Detalhe
|
|
@@ -30,7 +30,7 @@ module BrBoleto
|
|
|
30
30
|
# 3 posições
|
|
31
31
|
#
|
|
32
32
|
def trailer_arquivo_posicao_001_a_003
|
|
33
|
-
codigo_banco
|
|
33
|
+
conta.codigo_banco
|
|
34
34
|
end
|
|
35
35
|
|
|
36
36
|
# Lote de Serviço -> Padrão 9999
|
|
@@ -65,14 +65,14 @@ module BrBoleto
|
|
|
65
65
|
# 6 posições
|
|
66
66
|
#
|
|
67
67
|
def trailer_arquivo_posicao_018_a_023(nro_lotes)
|
|
68
|
-
nro_lotes.
|
|
68
|
+
"#{nro_lotes}".adjust_size_to(6, '0', :right)
|
|
69
69
|
end
|
|
70
70
|
|
|
71
71
|
# Quantidade de Registros do Arquivo
|
|
72
72
|
# 6 posições
|
|
73
73
|
#
|
|
74
74
|
def trailer_arquivo_posicao_024_a_029(sequencial)
|
|
75
|
-
sequencial.
|
|
75
|
+
"#{sequencial}".adjust_size_to(6, '0', :right)
|
|
76
76
|
end
|
|
77
77
|
|
|
78
78
|
# Qtde de Contas p/ Conc. (Lotes)
|
|
@@ -28,7 +28,7 @@ module BrBoleto
|
|
|
28
28
|
# 3 posições
|
|
29
29
|
#
|
|
30
30
|
def trailer_lote_posicao_001_a_003
|
|
31
|
-
codigo_banco
|
|
31
|
+
conta.codigo_banco
|
|
32
32
|
end
|
|
33
33
|
|
|
34
34
|
# Lote de Serviço: Número seqüencial para identificar univocamente um lote de serviço.
|
|
@@ -38,7 +38,7 @@ module BrBoleto
|
|
|
38
38
|
# 4 posições
|
|
39
39
|
#
|
|
40
40
|
def trailer_lote_posicao_004_a_007(numero_do_lote)
|
|
41
|
-
numero_do_lote.
|
|
41
|
+
"#{numero_do_lote}".adjust_size_to(4, '0', :right)
|
|
42
42
|
end
|
|
43
43
|
|
|
44
44
|
# Tipo do registro -> Padrão 5
|
|
@@ -59,7 +59,7 @@ module BrBoleto
|
|
|
59
59
|
# 6 posições
|
|
60
60
|
#
|
|
61
61
|
def trailer_lote_posicao_018_a_023(nro_registros)
|
|
62
|
-
nro_registros.
|
|
62
|
+
"#{nro_registros}".adjust_size_to(6, '0', :right)
|
|
63
63
|
end
|
|
64
64
|
|
|
65
65
|
# Complemento trailer diferente para cada banco
|
|
@@ -3,82 +3,33 @@ module BrBoleto
|
|
|
3
3
|
module Remessa
|
|
4
4
|
module Cnab240
|
|
5
5
|
class Sicoob < BrBoleto::Remessa::Cnab240::Base
|
|
6
|
+
def conta_class
|
|
7
|
+
BrBoleto::Conta::Sicoob
|
|
8
|
+
end
|
|
6
9
|
|
|
7
|
-
#
|
|
8
|
-
#
|
|
9
|
-
#
|
|
10
|
-
|
|
11
|
-
#
|
|
12
|
-
# 3 / 03 = Garantia caicionada
|
|
13
|
-
#
|
|
14
|
-
attr_accessor :modalidade_carteira
|
|
15
|
-
|
|
16
|
-
|
|
10
|
+
# Tipo Formulário - 01 posição (15 a 15):
|
|
11
|
+
# "1" -auto-copiativo
|
|
12
|
+
# "3" -auto-envelopável
|
|
13
|
+
# "4" -A4 sem envelopamento
|
|
14
|
+
# "6" -A4 sem envelopamento 3 vias
|
|
17
15
|
attr_accessor :tipo_formulario
|
|
18
|
-
# Tipo Formulário - 01 posição (15 a 15):
|
|
19
|
-
# "1" -auto-copiativo
|
|
20
|
-
# "3" -auto-envelopável
|
|
21
|
-
# "4" -A4 sem envelopamento
|
|
22
|
-
# "6" -A4 sem envelopamento 3 vias
|
|
23
|
-
|
|
24
|
-
attr_accessor :parcela
|
|
25
|
-
# Parcela - 02 posições (11 a 12) - "01" se parcela única
|
|
26
16
|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
validates :conta_corrente, length: {maximum: 12, message: 'deve ter no máximo 12 dígitos.'}
|
|
35
|
-
validates :agencia, length: {is: 4, message: 'deve ter 4 dígitos.'}
|
|
36
|
-
validates :modalidade_carteira, length: {is: 2, message: 'deve ter 2 dígitos.'}
|
|
17
|
+
#################### VALIDAÇÕES DA CONTA #####################
|
|
18
|
+
def valid_modalidade_required; true end # <= Modalidade é obrigatória
|
|
19
|
+
def valid_codigo_cedente_required; true end # <= Código do cedente/beneficiário/convenio deve ser obrigatorio
|
|
20
|
+
def valid_conta_corrente_required; true end # <= Conta corrente obrigatória
|
|
21
|
+
def valid_conta_corrente_maximum; 12 end # <= Máximo de digitos da conta corrente
|
|
22
|
+
def valid_modalidade_length; 2 end # <= Modalidade deve ter 2 digitos
|
|
23
|
+
##############################################################
|
|
37
24
|
|
|
25
|
+
validates :tipo_formulario, presence: true
|
|
26
|
+
|
|
38
27
|
def default_values
|
|
39
28
|
super.merge({
|
|
40
|
-
|
|
41
|
-
distribuicao_boleto: '2',
|
|
42
|
-
especie_titulo: '02', # 02 = DM Duplicata mercantil
|
|
43
|
-
tipo_formulario: '4',
|
|
44
|
-
parcela: '01',
|
|
45
|
-
modalidade_carteira: '01',
|
|
46
|
-
forma_cadastramento: '0'
|
|
29
|
+
tipo_formulario: '4'
|
|
47
30
|
})
|
|
48
31
|
end
|
|
49
32
|
|
|
50
|
-
def convenio
|
|
51
|
-
"#{@convenio}".adjust_size_to(20)
|
|
52
|
-
end
|
|
53
|
-
|
|
54
|
-
def codigo_banco
|
|
55
|
-
'756'
|
|
56
|
-
end
|
|
57
|
-
|
|
58
|
-
def nome_banco
|
|
59
|
-
'SICOOB'.ljust(30, ' ')
|
|
60
|
-
end
|
|
61
|
-
|
|
62
|
-
def versao_layout_arquivo
|
|
63
|
-
'081'
|
|
64
|
-
end
|
|
65
|
-
|
|
66
|
-
def versao_layout_lote
|
|
67
|
-
'040'
|
|
68
|
-
end
|
|
69
|
-
|
|
70
|
-
def digito_agencia
|
|
71
|
-
# utilizando a agencia com 4 digitos
|
|
72
|
-
# para calcular o digito
|
|
73
|
-
BrBoleto::Calculos::Modulo11FatorDe2a9RestoZero.new(agencia).to_s
|
|
74
|
-
end
|
|
75
|
-
|
|
76
|
-
def digito_conta
|
|
77
|
-
# utilizando a conta corrente com 5 digitos
|
|
78
|
-
# para calcular o digito
|
|
79
|
-
BrBoleto::Calculos::Modulo11FatorDe2a9RestoZero.new(conta_corrente).to_s
|
|
80
|
-
end
|
|
81
|
-
|
|
82
33
|
def codigo_convenio
|
|
83
34
|
# CAMPO TAMANHO
|
|
84
35
|
# num. convenio 20 BRANCOS
|
|
@@ -96,7 +47,11 @@ module BrBoleto
|
|
|
96
47
|
# conta corrente 12
|
|
97
48
|
# digito conta 1
|
|
98
49
|
# digito agencia/conta 1
|
|
99
|
-
"#{agencia.
|
|
50
|
+
result = "#{conta.agencia}".adjust_size_to(5, '0', :right)
|
|
51
|
+
result << "#{conta.agencia_dv}"
|
|
52
|
+
result << "#{conta.conta_corrente}".adjust_size_to(12, '0', :right)
|
|
53
|
+
result << "#{conta.conta_corrente_dv}"
|
|
54
|
+
result.adjust_size_to(20)
|
|
100
55
|
end
|
|
101
56
|
|
|
102
57
|
def complemento_header_arquivo
|
|
@@ -107,9 +62,13 @@ module BrBoleto
|
|
|
107
62
|
# CAMPO TAMANHO
|
|
108
63
|
# conta corrente 12
|
|
109
64
|
# digito conta 1
|
|
110
|
-
# digito agencia/conta 1
|
|
65
|
+
# digito agencia/conta 1 # Branco
|
|
111
66
|
# ident. titulo no banco 20
|
|
112
|
-
"#{conta_corrente.
|
|
67
|
+
result = "#{conta.conta_corrente}".adjust_size_to(12, '0', :right)
|
|
68
|
+
result << "#{conta.conta_corrente_dv}".adjust_size_to(1)
|
|
69
|
+
result << " "
|
|
70
|
+
result << "#{formata_nosso_numero(pagamento)}"
|
|
71
|
+
result
|
|
113
72
|
end
|
|
114
73
|
|
|
115
74
|
# Tipo de cobrança
|
|
@@ -119,7 +78,7 @@ module BrBoleto
|
|
|
119
78
|
# É APENAS PARA QUESTÃO DE INFORMAÇÃO CASO PRECISE PARA OUTRAS COISAS.
|
|
120
79
|
#
|
|
121
80
|
def tipo_cobranca_formatada
|
|
122
|
-
case "#{
|
|
81
|
+
case "#{conta.modalidade}".rjust(2, "0")
|
|
123
82
|
when '01', '02'
|
|
124
83
|
:simples
|
|
125
84
|
when '03'
|
|
@@ -142,8 +101,12 @@ module BrBoleto
|
|
|
142
101
|
# "4" -A4 sem envelopamento
|
|
143
102
|
# "6" -A4 sem envelopamento 3 vias
|
|
144
103
|
# Em branco - 05 posições (16 a 20)
|
|
145
|
-
def formata_nosso_numero(
|
|
146
|
-
"#{nosso_numero.
|
|
104
|
+
def formata_nosso_numero(pagamento)
|
|
105
|
+
result = "#{pagamento.nosso_numero}".adjust_size_to(10, '0', :right)
|
|
106
|
+
result << "#{pagamento.parcela}".adjust_size_to(2, '0', :right)
|
|
107
|
+
result << "#{conta.modalidade}".adjust_size_to(2, '0', :right)
|
|
108
|
+
result << "#{tipo_formulario}".adjust_size_to(1, '1')
|
|
109
|
+
result.adjust_size_to(20)
|
|
147
110
|
end
|
|
148
111
|
|
|
149
112
|
def complemento_trailer_lote(lote, nr_lote)
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
|
2
|
+
require 'br_boleto/remessa/cnab400/helper/header'
|
|
3
|
+
require 'br_boleto/remessa/cnab400/helper/detalhe'
|
|
4
|
+
require 'br_boleto/remessa/cnab400/helper/trailer'
|
|
5
|
+
|
|
6
|
+
module BrBoleto
|
|
7
|
+
module Remessa
|
|
8
|
+
module Cnab400
|
|
9
|
+
class Base < BrBoleto::Remessa::Base
|
|
10
|
+
# Utilizado para montar o header
|
|
11
|
+
include BrBoleto::Remessa::Cnab400::Helper::Header
|
|
12
|
+
# Utilizado para montar oS DETALHES
|
|
13
|
+
include BrBoleto::Remessa::Cnab400::Helper::Detalhe
|
|
14
|
+
# Utilizado para montar o trailer do arquivo
|
|
15
|
+
include BrBoleto::Remessa::Cnab400::Helper::Trailer
|
|
16
|
+
|
|
17
|
+
include BrBoleto::HavePagamentos
|
|
18
|
+
|
|
19
|
+
# Informacoes da conta do cedente
|
|
20
|
+
# Este metodo deve ser sobrescrevido na classe do banco
|
|
21
|
+
# Tamanho: 20
|
|
22
|
+
def informacoes_da_conta(local)
|
|
23
|
+
raise NotImplementedError.new('Sobreescreva este método na classe referente ao banco que você esta criando')
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
# Informações do banco
|
|
27
|
+
# Padrão:
|
|
28
|
+
# 077 a 079 = Código do banco com 3 posições
|
|
29
|
+
# 080 a 094 = Nome do banco com 15 posições
|
|
30
|
+
# Tamanho: 018
|
|
31
|
+
def informacoes_do_banco
|
|
32
|
+
"#{conta.codigo_banco}#{conta.nome_banco}".adjust_size_to(18)
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
# Complemento do registro
|
|
36
|
+
# Vai na posição 101 até 394
|
|
37
|
+
# Tamanho: 294
|
|
38
|
+
def complemento_registro
|
|
39
|
+
raise NotImplementedError.new('Sobreescreva este método na classe referente ao banco que você esta criando')
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
# Nosso numero do pagamento e outras informações
|
|
43
|
+
# Vai na posição 063 até 076
|
|
44
|
+
# Tamanho: 14
|
|
45
|
+
def dados_do_pagamento(pagamento)
|
|
46
|
+
raise NotImplementedError.new("Sobreescreva o metodo #dados_do_pagamento para a class #{self}")
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
# Informações referente a cobrança do pagamento
|
|
50
|
+
def informacoes_do_pagamento(pagamento, sequencial)
|
|
51
|
+
raise NotImplementedError.new("Sobreescreva o metodo #informacoes_do_pagamento para a class #{self}")
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
# Informações referente aos juros e multas do pagamento
|
|
55
|
+
# Posição 161 a 218
|
|
56
|
+
# Tamanho: 58
|
|
57
|
+
def detalhe_multas_e_juros_do_pagamento(pagamento, sequencial)
|
|
58
|
+
raise NotImplementedError.new("Sobreescreva o metodo #detalhe_multas_e_juros_do_pagamento para a class #{self}")
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
# Informações referente aos dados do sacado/pagador
|
|
62
|
+
# Posição 219 a 394
|
|
63
|
+
# Tamanho: 176
|
|
64
|
+
def informacoes_do_sacado(pagamento, sequencial)
|
|
65
|
+
raise NotImplementedError.new("Sobreescreva o metodo #informacoes_do_sacado para a class #{self}")
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
# Gera os dados para o arquivo remessa
|
|
69
|
+
#
|
|
70
|
+
def dados_do_arquivo
|
|
71
|
+
return if self.invalid?
|
|
72
|
+
|
|
73
|
+
# contador dos registros do lote
|
|
74
|
+
contador = 1
|
|
75
|
+
|
|
76
|
+
# Metodo 'monta_header' implementado no module -> BrBoleto::Remessa::Cnab400::Helper::Header
|
|
77
|
+
arquivo = [monta_header]
|
|
78
|
+
contador += 1
|
|
79
|
+
|
|
80
|
+
pagamentos.each do |pagamento|
|
|
81
|
+
arquivo << monta_detalhe(pagamento, contador)
|
|
82
|
+
contador += 1
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
# Metodo 'monta_trailer' implementado no module -> BrBoleto::Remessa::Cnab400::Helper::Trailer
|
|
86
|
+
arquivo << monta_trailer(contador)
|
|
87
|
+
|
|
88
|
+
retorno = arquivo.join("\n")
|
|
89
|
+
ActiveSupport::Inflector.transliterate(retorno).upcase
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
end
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
module BrBoleto
|
|
2
|
+
module Remessa
|
|
3
|
+
module Cnab400
|
|
4
|
+
module Helper
|
|
5
|
+
module Detalhe
|
|
6
|
+
# Monta o registro segmento P do arquivo
|
|
7
|
+
#
|
|
8
|
+
# @param pagamento [BrBoleto::Remessa::Pagamento]
|
|
9
|
+
# objeto contendo os detalhes do boleto (valor, vencimento, sacado, etc)
|
|
10
|
+
# @param nr_lote [Integer]
|
|
11
|
+
# numero do lote que o segmento esta inserido
|
|
12
|
+
# @param sequencial [Integer]
|
|
13
|
+
# numero sequencial do registro no lote
|
|
14
|
+
#
|
|
15
|
+
# @return [String]
|
|
16
|
+
#
|
|
17
|
+
def monta_detalhe(pagamento, sequencial)
|
|
18
|
+
# campos com * na frente nao foram implementados
|
|
19
|
+
# # DESCRICAO TAMANHO
|
|
20
|
+
detalhe = ''
|
|
21
|
+
|
|
22
|
+
detalhe << detalhe_posicao_001_001 # Identificação do Registro Detalhe
|
|
23
|
+
detalhe << detalhe_posicao_002_003 # Tipo de inscrição do beneficiario
|
|
24
|
+
detalhe << detalhe_posicao_004_017 # CNPJ do beneficiario
|
|
25
|
+
detalhe << detalhe_posicao_018_037 # Informações da conta
|
|
26
|
+
detalhe << detalhe_posicao_038_062 # Numero de controle do participante
|
|
27
|
+
detalhe << detalhe_posicao_063_076(pagamento, sequencial) # Nosso número com DV
|
|
28
|
+
detalhe << detalhe_posicao_077_108(pagamento, sequencial) # Diferente para cada banco
|
|
29
|
+
detalhe << detalhe_posicao_109_110(pagamento, sequencial) # Comando/Movimento
|
|
30
|
+
detalhe << detalhe_posicao_111_120(pagamento, sequencial) # Seu número
|
|
31
|
+
detalhe << detalhe_posicao_121_160(pagamento, sequencial) # Informações do pagamento
|
|
32
|
+
detalhe << detalhe_posicao_161_218(pagamento, sequencial) # Informações de multa e juros
|
|
33
|
+
detalhe << detalhe_posicao_219_394(pagamento, sequencial) # Informações do sacado/pagador
|
|
34
|
+
detalhe << detalhe_posicao_395_400(pagamento, sequencial) # Sequencial
|
|
35
|
+
detalhe.upcase
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
# Identificação do Registro Detalhe
|
|
39
|
+
# Padrão: 1
|
|
40
|
+
# Tipo: Numero
|
|
41
|
+
# Tamanho: 001
|
|
42
|
+
def detalhe_posicao_001_001
|
|
43
|
+
'1'
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
# Tipo de inscrição do beneficiario
|
|
47
|
+
# 01 = CPF
|
|
48
|
+
# 02 = CNPJ
|
|
49
|
+
# Tipo: Numero
|
|
50
|
+
# Tamanho: 002
|
|
51
|
+
def detalhe_posicao_002_003
|
|
52
|
+
conta.tipo_cpf_cnpj
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
# CNPJ/CPF do beneficiário
|
|
56
|
+
# Tipo: Numero
|
|
57
|
+
# Tamanho: 014
|
|
58
|
+
def detalhe_posicao_004_017
|
|
59
|
+
"#{conta.cpf_cnpj}".adjust_size_to(14, '0', :right)
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
# Informações da conta
|
|
63
|
+
# Tipo: Numero
|
|
64
|
+
# Tamanho: 20
|
|
65
|
+
def detalhe_posicao_018_037
|
|
66
|
+
informacoes_da_conta(:detalhe)
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
# Numero de controle do participante
|
|
70
|
+
# Padrão: " " Brancos
|
|
71
|
+
# Tipo: String
|
|
72
|
+
# Tamanho: 25
|
|
73
|
+
def detalhe_posicao_038_062
|
|
74
|
+
''.adjust_size_to(25)
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
# Nosso numero e informações do pagaemnto
|
|
78
|
+
# Tamanho: 14
|
|
79
|
+
def detalhe_posicao_063_076(pagamento, sequencial)
|
|
80
|
+
dados_do_pagamento(pagamento)
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
# Diferente para cada banco
|
|
84
|
+
# Tipo: X N
|
|
85
|
+
# Tamanho: 32
|
|
86
|
+
def detalhe_posicao_077_108(pagamento, sequencial)
|
|
87
|
+
raise NotImplementedError.new("Sobreescreva o metodo #detalhe_posicao_077_108 para a class #{self}")
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
# Comando/Movimento
|
|
91
|
+
# Tipo: N
|
|
92
|
+
# Padrão: '01' = Registro de títulos
|
|
93
|
+
# Tamanho: 2
|
|
94
|
+
def detalhe_posicao_109_110(pagamento, sequencial)
|
|
95
|
+
"#{pagamento.identificacao_ocorrencia}".adjust_size_to(2, '0', :right)
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
# Seu número
|
|
99
|
+
# Tipo: N
|
|
100
|
+
# Tamanho: 10
|
|
101
|
+
def detalhe_posicao_111_120(pagamento, sequencial)
|
|
102
|
+
"#{pagamento.numero_documento}".adjust_size_to(10, '0', :right)
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
# Informações do pagamento
|
|
106
|
+
# Tipo: XN
|
|
107
|
+
# Tamanho: 40
|
|
108
|
+
def detalhe_posicao_121_160(pagamento, sequencial)
|
|
109
|
+
informacoes_do_pagamento(pagamento, sequencial)
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
# Informações de multa e juros
|
|
113
|
+
# Tipo: XN
|
|
114
|
+
# Tamanho: 58
|
|
115
|
+
def detalhe_posicao_161_218(pagamento, sequencial)
|
|
116
|
+
detalhe_multas_e_juros_do_pagamento(pagamento, sequencial)
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
# Informações do sacado
|
|
120
|
+
# Tipo: XN
|
|
121
|
+
# Tamanho: 176
|
|
122
|
+
def detalhe_posicao_219_394(pagamento, sequencial)
|
|
123
|
+
informacoes_do_sacado(pagamento, sequencial)
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
# Sequencial do registro
|
|
127
|
+
# Tipo: N
|
|
128
|
+
# Tamanho: 6
|
|
129
|
+
def detalhe_posicao_395_400(pagamento, sequencial)
|
|
130
|
+
"#{sequencial}".adjust_size_to(6, '0', :right)
|
|
131
|
+
end
|
|
132
|
+
end
|
|
133
|
+
end
|
|
134
|
+
end
|
|
135
|
+
end
|
|
136
|
+
end
|