br_boleto 1.2.2 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|