brcobranca 4.1.0 → 5.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.coveralls.yml +1 -1
- data/.rspec +1 -0
- data/.rubocop.yml +1 -1
- data/.travis.yml +2 -1
- data/Gemfile +4 -4
- data/Gemfile.lock +65 -53
- data/README.md +18 -5
- data/brcobranca.gemspec +8 -6
- data/lib/brcobranca/boleto/banco_brasil.rb +25 -27
- data/lib/brcobranca/boleto/base.rb +13 -6
- data/lib/brcobranca/boleto/bradesco.rb +4 -1
- data/lib/brcobranca/boleto/caixa.rb +14 -4
- data/lib/brcobranca/boleto/hsbc.rb +26 -26
- data/lib/brcobranca/boleto/santander.rb +6 -3
- data/lib/brcobranca/boleto/sicredi.rb +3 -5
- data/lib/brcobranca/boleto/template/rghost.rb +7 -5
- data/lib/brcobranca/boleto/template/rghost_carne.rb +1 -2
- data/lib/brcobranca/calculo.rb +19 -93
- data/lib/brcobranca/formatacao_string.rb +21 -0
- data/lib/brcobranca/remessa/base.rb +59 -0
- data/lib/brcobranca/remessa/cnab240/banco_brasil.rb +117 -0
- data/lib/brcobranca/remessa/cnab240/base.rb +379 -0
- data/lib/brcobranca/remessa/cnab240/caixa.rb +103 -0
- data/lib/brcobranca/remessa/cnab400/base.rb +112 -0
- data/lib/brcobranca/remessa/cnab400/bradesco.rb +128 -0
- data/lib/brcobranca/remessa/cnab400/itau.rb +149 -0
- data/lib/brcobranca/remessa/pagamento.rb +159 -0
- data/lib/brcobranca/retorno/base.rb +1 -0
- data/lib/brcobranca/retorno/retorno_cnab400.rb +0 -2
- data/lib/brcobranca/version.rb +1 -1
- data/lib/brcobranca.rb +33 -17
- data/spec/brcobranca/banco_bradesco_spec.rb +0 -2
- data/spec/brcobranca/banco_brasil_spec.rb +0 -2
- data/spec/brcobranca/banco_caixa_spec.rb +0 -2
- data/spec/brcobranca/banco_hsbc_spec.rb +0 -3
- data/spec/brcobranca/banco_itau_spec.rb +0 -1
- data/spec/brcobranca/banco_santander_spec.rb +14 -14
- data/spec/brcobranca/banco_sicredi_spec.rb +0 -2
- data/spec/brcobranca/base_spec.rb +11 -0
- data/spec/brcobranca/boletos_em_lote_spec.rb +0 -2
- data/spec/brcobranca/core_ext_spec.rb +104 -58
- data/spec/brcobranca/remessa/base_spec.rb +87 -0
- data/spec/brcobranca/remessa/cnab240/banco_brasil_spec.rb +200 -0
- data/spec/brcobranca/remessa/cnab240/base_spec.rb +88 -0
- data/spec/brcobranca/remessa/cnab240/caixa_spec.rb +137 -0
- data/spec/brcobranca/remessa/cnab400/base_spec.rb +51 -0
- data/spec/brcobranca/remessa/cnab400/bradesco_spec.rb +174 -0
- data/spec/brcobranca/remessa/cnab400/itau_spec.rb +160 -0
- data/spec/brcobranca/remessa/pagamento_spec.rb +197 -0
- data/spec/brcobranca/retorno_cbr643_spec.rb +0 -2
- data/spec/brcobranca/rghost_spec.rb +0 -2
- data/spec/shared_examples/cnab240.rb +206 -0
- data/spec/shared_examples/cnab400.rb +85 -0
- metadata +34 -4
@@ -0,0 +1,379 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
module Brcobranca
|
3
|
+
module Remessa
|
4
|
+
module Cnab240
|
5
|
+
class Base < Brcobranca::Remessa::Base
|
6
|
+
# documento do cedente (CPF/CNPJ)
|
7
|
+
attr_accessor :documento_cedente
|
8
|
+
# convenio do cedente
|
9
|
+
attr_accessor :convenio
|
10
|
+
# mensagem 1
|
11
|
+
attr_accessor :mensagem_1
|
12
|
+
# mensagem 2
|
13
|
+
attr_accessor :mensagem_2
|
14
|
+
# codigo da carteira
|
15
|
+
# opcoes:
|
16
|
+
# 1 - cobranca simples
|
17
|
+
# 2 - cobranca caucionada
|
18
|
+
# 3 - cobranca descontada
|
19
|
+
# 7 – modalidade Simples quando carteira 17 (apenas Banco do Brasil)
|
20
|
+
attr_accessor :codigo_carteira
|
21
|
+
# forma de cadastramento dos titulos (campo nao tratado pelo Banco do Brasil)
|
22
|
+
# opcoes:
|
23
|
+
# 1 - com cadastramento (cobrança registrada)
|
24
|
+
# 2 - sem cadastramento (cobrança sem registro)
|
25
|
+
attr_accessor :forma_cadastramento
|
26
|
+
# identificacao da emissao do boleto (verificar opcoes nas classes referentes aos bancos)
|
27
|
+
attr_accessor :emissao_boleto
|
28
|
+
# identificacao da distribuicao do boleto (verificar opcoes nas classes referentes aos bancos)
|
29
|
+
attr_accessor :distribuicao_boleto
|
30
|
+
# especie do titulo (verificar o padrao nas classes referentes aos bancos)
|
31
|
+
attr_accessor :especie_titulo
|
32
|
+
|
33
|
+
validates_presence_of :documento_cedente, :convenio, message: 'não pode estar em branco.'
|
34
|
+
validates_length_of :codigo_carteira, is: 1, message: 'deve ter 1 dígito.'
|
35
|
+
validates_length_of :forma_cadastramento, is: 1, message: 'deve ter 1 dígito.'
|
36
|
+
validates_length_of :emissao_boleto, is: 1, message: 'deve ter 1 dígito.'
|
37
|
+
validates_length_of :distribuicao_boleto, is: 1, message: 'deve ter 1 dígito.'
|
38
|
+
|
39
|
+
def initialize(campos = {})
|
40
|
+
campos = { codigo_carteira: '1',
|
41
|
+
forma_cadastramento: '1' }.merge!(campos)
|
42
|
+
super(campos)
|
43
|
+
end
|
44
|
+
|
45
|
+
# Tipo de inscricao do cedente
|
46
|
+
# (pessoa fisica ou juridica)
|
47
|
+
#
|
48
|
+
# @return [String]
|
49
|
+
#
|
50
|
+
def tipo_inscricao
|
51
|
+
documento_cedente.to_s.delete('./-').size <= 11 ? '1' : '2'
|
52
|
+
end
|
53
|
+
|
54
|
+
# Data de geracao do arquivo
|
55
|
+
#
|
56
|
+
# @return [String]
|
57
|
+
#
|
58
|
+
def data_geracao
|
59
|
+
Date.today.strftime('%d%m%Y')
|
60
|
+
end
|
61
|
+
|
62
|
+
# Hora de geracao do arquivo
|
63
|
+
#
|
64
|
+
# @return [String]
|
65
|
+
#
|
66
|
+
def hora_geracao
|
67
|
+
Time.now.strftime('%H%M%S')
|
68
|
+
end
|
69
|
+
|
70
|
+
# Monta o registro header do arquivo
|
71
|
+
#
|
72
|
+
# @return [String]
|
73
|
+
#
|
74
|
+
def monta_header_arquivo
|
75
|
+
header_arquivo = '' # CAMPO TAMANHO
|
76
|
+
header_arquivo << cod_banco # codigo do banco 3
|
77
|
+
header_arquivo << '0000' # lote do servico 4
|
78
|
+
header_arquivo << '0' # tipo de registro 1
|
79
|
+
header_arquivo << ''.rjust(9, ' ') # uso exclusivo FEBRABAN 9
|
80
|
+
header_arquivo << tipo_inscricao # tipo inscricao 1
|
81
|
+
header_arquivo << documento_cedente.to_s.rjust(14, '0') # numero de inscricao 14
|
82
|
+
header_arquivo << codigo_convenio # codigo do convenio no banco 20
|
83
|
+
header_arquivo << info_conta # informacoes da conta 20
|
84
|
+
header_arquivo << empresa_mae.format_size(30) # nome da empresa 30
|
85
|
+
header_arquivo << nome_banco # nome do banco 30
|
86
|
+
header_arquivo << ''.rjust(10, ' ') # uso exclusivo FEBRABAN 10
|
87
|
+
header_arquivo << '1' # codigo remessa 1
|
88
|
+
header_arquivo << data_geracao # data geracao 8
|
89
|
+
header_arquivo << hora_geracao # hora geracao 6
|
90
|
+
header_arquivo << sequencial_remessa.to_s.rjust(6, '0') # numero seq. arquivo 6
|
91
|
+
header_arquivo << versao_layout # num. versao 3
|
92
|
+
header_arquivo << ''.rjust(5, '0') # densidade gravacao 5
|
93
|
+
header_arquivo << ''.rjust(20, '0') # uso exclusivo 20
|
94
|
+
header_arquivo << ''.rjust(20, '0') # uso exclusivo 20
|
95
|
+
header_arquivo << complemento_header # complemento do arquivo 29
|
96
|
+
header_arquivo.upcase
|
97
|
+
end
|
98
|
+
|
99
|
+
# Monta o registro header do lote
|
100
|
+
#
|
101
|
+
# @param nro_lote [Integer]
|
102
|
+
# numero do lote no arquivo (iterar a cada novo lote)
|
103
|
+
#
|
104
|
+
# @return [String]
|
105
|
+
#
|
106
|
+
def monta_header_lote(nro_lote)
|
107
|
+
header_lote = '' # CAMPO TAMANHO
|
108
|
+
header_lote << cod_banco # codigo banco 3
|
109
|
+
header_lote << nro_lote.to_s.rjust(4, '0') # lote servico 4
|
110
|
+
header_lote << '1' # tipo de registro 1
|
111
|
+
header_lote << 'R' # tipo de operacao 1
|
112
|
+
header_lote << '01' # tipo de servico 2
|
113
|
+
header_lote << '00' # uso exclusivo 2
|
114
|
+
header_lote << versao_layout # num.versao layout 3
|
115
|
+
header_lote << ' ' # uso exclusivo 1
|
116
|
+
header_lote << tipo_inscricao # tipo de inscricao 1
|
117
|
+
header_lote << documento_cedente.to_s.rjust(15, '0') # inscricao cedente 15
|
118
|
+
header_lote << convenio_lote # codigo do convenio 20
|
119
|
+
header_lote << info_conta # informacoes conta 20
|
120
|
+
header_lote << empresa_mae.ljust(30, ' ') # nome empresa 30
|
121
|
+
header_lote << mensagem_1.to_s.format_size(40) # 1a mensagem 40
|
122
|
+
header_lote << mensagem_2.to_s.format_size(40) # 2a mensagem 40
|
123
|
+
header_lote << sequencial_remessa.to_s.rjust(8, '0') # numero remessa 8
|
124
|
+
header_lote << data_geracao # data gravacao 8
|
125
|
+
header_lote << ''.rjust(8, '0') # data do credito 8
|
126
|
+
header_lote << ''.rjust(33, ' ') # complemento 33
|
127
|
+
header_lote.upcase
|
128
|
+
end
|
129
|
+
|
130
|
+
# Monta o registro segmento P do arquivo
|
131
|
+
#
|
132
|
+
# @param pagamento [Brcobranca::Remessa::Pagamento]
|
133
|
+
# objeto contendo os detalhes do boleto (valor, vencimento, sacado, etc)
|
134
|
+
# @param nro_lote [Integer]
|
135
|
+
# numero do lote que o segmento esta inserido
|
136
|
+
# @param sequencial [Integer]
|
137
|
+
# numero sequencial do registro no lote
|
138
|
+
#
|
139
|
+
# @return [String]
|
140
|
+
#
|
141
|
+
def monta_segmento_p(pagamento, nro_lote, sequencial)
|
142
|
+
# campos com * na frente nao foram implementados
|
143
|
+
# # DESCRICAO TAMANHO
|
144
|
+
segmento_p = cod_banco # codigo banco 3
|
145
|
+
segmento_p << nro_lote.to_s.rjust(4, '0') # lote de servico 4
|
146
|
+
segmento_p << '3' # tipo de registro 1
|
147
|
+
segmento_p << sequencial.to_s.rjust(5, '0') # num. sequencial do registro no lote 5
|
148
|
+
segmento_p << 'P' # cod. segmento 1
|
149
|
+
segmento_p << ' ' # uso exclusivo 1
|
150
|
+
segmento_p << '01' # cod. movimento remessa 2
|
151
|
+
segmento_p << agencia.to_s.rjust(5, '0') # agencia 5
|
152
|
+
segmento_p << digito_agencia.to_s # dv agencia 1
|
153
|
+
segmento_p << complemento_p(pagamento) # informacoes da conta 34
|
154
|
+
segmento_p << codigo_carteira # codigo da carteira 1
|
155
|
+
segmento_p << forma_cadastramento # forma de cadastro do titulo 1
|
156
|
+
segmento_p << '2' # tipo de documento 1
|
157
|
+
segmento_p << emissao_boleto # identificaco emissao 1
|
158
|
+
segmento_p << distribuicao_boleto # indentificacao entrega 1
|
159
|
+
segmento_p << pagamento.nosso_numero.to_s.rjust(11, '0') # numro do documento 11
|
160
|
+
segmento_p << ''.rjust(4, ' ') # uso exclusivo 4
|
161
|
+
segmento_p << pagamento.data_vencimento.strftime('%d%m%Y') # data de venc. 8
|
162
|
+
segmento_p << pagamento.formata_valor(15) # valor documento 15
|
163
|
+
segmento_p << ''.rjust(5, '0') # agencia cobradora 5
|
164
|
+
segmento_p << '0' # dv agencia cobradora 1
|
165
|
+
segmento_p << especie_titulo # especie do titulo 2
|
166
|
+
segmento_p << aceite # aceite 1
|
167
|
+
segmento_p << pagamento.data_emissao.strftime('%d%m%Y') # data de emissao titulo 8
|
168
|
+
segmento_p << '0' # cod. do juros 1 *
|
169
|
+
segmento_p << ''.rjust(8, '0') # data juros 8 *
|
170
|
+
segmento_p << ''.rjust(15, '0') # valor juros 15 *
|
171
|
+
segmento_p << pagamento.cod_desconto # cod. do desconto 1
|
172
|
+
segmento_p << pagamento.formata_data_desconto('%d%m%Y') # data desconto 8
|
173
|
+
segmento_p << pagamento.formata_valor_desconto(15) # valor desconto 15
|
174
|
+
segmento_p << pagamento.formata_valor_iof(15) # valor IOF 15
|
175
|
+
segmento_p << pagamento.formata_valor_abatimento(15) # valor abatimento 15
|
176
|
+
segmento_p << ''.rjust(25, ' ') # identificacao titulo empresa 25 *
|
177
|
+
segmento_p << '0' # cod. para protesto 1 *
|
178
|
+
segmento_p << '00' # dias para protesto 2 *
|
179
|
+
segmento_p << '0' # cod. para baixa 1 *
|
180
|
+
segmento_p << '000' # dias para baixa 2 *
|
181
|
+
segmento_p << '09' # cod. da moeda 2
|
182
|
+
segmento_p << ''.rjust(10, '0') # uso exclusivo 10
|
183
|
+
segmento_p << ' ' # uso exclusivo 1
|
184
|
+
segmento_p.upcase
|
185
|
+
end
|
186
|
+
|
187
|
+
# Monta o registro segmento Q do arquivo
|
188
|
+
#
|
189
|
+
# @param pagamento [Brcobranca::Remessa::Pagamento]
|
190
|
+
# objeto contendo os detalhes do boleto (valor, vencimento, sacado, etc)
|
191
|
+
# @param nro_lote [Integer]
|
192
|
+
# numero do lote que o segmento esta inserido
|
193
|
+
# @param sequencial [Integer]
|
194
|
+
# numero sequencial do registro no lote
|
195
|
+
#
|
196
|
+
# @return [String]
|
197
|
+
#
|
198
|
+
def monta_segmento_q(pagamento, nro_lote, sequencial)
|
199
|
+
segmento_q = '' # CAMPO TAMANHO
|
200
|
+
segmento_q << cod_banco # codigo banco 3
|
201
|
+
segmento_q << nro_lote.to_s.rjust(4, '0') # lote de servico 4
|
202
|
+
segmento_q << '3' # tipo de registro 1
|
203
|
+
segmento_q << sequencial.to_s.rjust(5, '0') # num. sequencial do registro no lote 5
|
204
|
+
segmento_q << 'Q' # cod. segmento 1
|
205
|
+
segmento_q << ' ' # uso exclusivo 1
|
206
|
+
segmento_q << '01' # cod. movimento remessa 2
|
207
|
+
segmento_q << pagamento.identificacao_sacado(1) # tipo insc. sacado 1
|
208
|
+
segmento_q << pagamento.documento_sacado.to_s.rjust(15, '0') # documento sacado 14
|
209
|
+
segmento_q << pagamento.nome_sacado.format_size(40) # nome cliente 40
|
210
|
+
segmento_q << pagamento.endereco_sacado.format_size(40) # endereco cliente 40
|
211
|
+
segmento_q << pagamento.bairro_sacado.format_size(15) # bairro 15
|
212
|
+
segmento_q << pagamento.cep_sacado[0..4] # cep 5
|
213
|
+
segmento_q << pagamento.cep_sacado[5..7] # sufixo cep 3
|
214
|
+
segmento_q << pagamento.cidade_sacado.format_size(15) # cidade 15
|
215
|
+
segmento_q << pagamento.uf_sacado # uf 2
|
216
|
+
segmento_q << pagamento.identificacao_avalista(1) # identificacao do sacador 1
|
217
|
+
segmento_q << pagamento.documento_avalista.to_s.rjust(15, '0') # documento sacador 15
|
218
|
+
segmento_q << pagamento.nome_avalista.format_size(40) # nome avalista 40
|
219
|
+
segmento_q << ''.rjust(3, '0') # cod. banco correspondente 3
|
220
|
+
segmento_q << ''.rjust(20, ' ') # nosso numero banco correspondente 20
|
221
|
+
segmento_q << ''.rjust(8, ' ') # uso exclusivo 8
|
222
|
+
segmento_q.upcase
|
223
|
+
end
|
224
|
+
|
225
|
+
# Monta o registro trailer do lote
|
226
|
+
#
|
227
|
+
# @param nro_lote [Integer]
|
228
|
+
# numero do lote no arquivo (iterar a cada novo lote)
|
229
|
+
#
|
230
|
+
# @param nro_registros [Integer]
|
231
|
+
# numero de registros(linhas) no lote (contando header e trailer)
|
232
|
+
#
|
233
|
+
# @return [String]
|
234
|
+
#
|
235
|
+
def monta_trailer_lote(nro_lote, nro_registros)
|
236
|
+
trailer_lote = '' # CAMPO # TAMANHO
|
237
|
+
trailer_lote << cod_banco # codigo banco 3
|
238
|
+
trailer_lote << nro_lote.to_s.rjust(4, '0') # lote de servico 4
|
239
|
+
trailer_lote << '5' # tipo de servico 1
|
240
|
+
trailer_lote << ''.rjust(9, ' ') # uso exclusivo 9
|
241
|
+
trailer_lote << nro_registros.to_s.rjust(6, '0') # qtde de registros lote 6
|
242
|
+
trailer_lote << complemento_trailer # uso exclusivo 217
|
243
|
+
end
|
244
|
+
|
245
|
+
# Monta o registro trailer do arquivo
|
246
|
+
#
|
247
|
+
# @param nro_lotes [Integer]
|
248
|
+
# numero de lotes no arquivo
|
249
|
+
# @param sequencial [Integer]
|
250
|
+
# numero de registros(linhas) no arquivo
|
251
|
+
#
|
252
|
+
# @return [String]
|
253
|
+
#
|
254
|
+
def monta_trailer_arquivo(nro_lotes, sequencial)
|
255
|
+
# CAMPO TAMANHO
|
256
|
+
# codigo banco 3
|
257
|
+
# lote de servico 4
|
258
|
+
# tipo de registro 1
|
259
|
+
# uso FEBRABAN 9
|
260
|
+
# nro de lotes 6
|
261
|
+
# nro de registros(linhas) 6
|
262
|
+
# uso FEBRABAN 211
|
263
|
+
"#{cod_banco}99999#{''.rjust(9, ' ')}#{nro_lotes.to_s.rjust(6, '0')}#{sequencial.to_s.rjust(6, '0')}#{''.rjust(211, ' ')}"
|
264
|
+
end
|
265
|
+
|
266
|
+
# Monta um lote para o arquivo
|
267
|
+
#
|
268
|
+
# @param pagamento [Brcobranca::Remessa::Pagamento]
|
269
|
+
# objeto contendo os detalhes do boleto (valor, )
|
270
|
+
#
|
271
|
+
# @param nro_lote [Integer]
|
272
|
+
# numero do lote no arquivo
|
273
|
+
#
|
274
|
+
# @return [Array]
|
275
|
+
#
|
276
|
+
def monta_lote(pagamento, nro_lote)
|
277
|
+
fail Brcobranca::RemessaInvalida.new(pagamento) if pagamento.invalid?
|
278
|
+
|
279
|
+
# contador dos registros do lote
|
280
|
+
contador = 1
|
281
|
+
|
282
|
+
lote = [monta_header_lote(nro_lote)]
|
283
|
+
contador += 1
|
284
|
+
|
285
|
+
lote << monta_segmento_p(pagamento, nro_lote, contador)
|
286
|
+
contador += 1
|
287
|
+
|
288
|
+
lote << monta_segmento_q(pagamento, nro_lote, contador)
|
289
|
+
contador += 1
|
290
|
+
|
291
|
+
lote << monta_trailer_lote(nro_lote, contador)
|
292
|
+
|
293
|
+
lote
|
294
|
+
end
|
295
|
+
|
296
|
+
# Gera o arquivo remessa
|
297
|
+
#
|
298
|
+
# @return [String]
|
299
|
+
#
|
300
|
+
def gera_arquivo
|
301
|
+
fail Brcobranca::RemessaInvalida.new(self) if self.invalid?
|
302
|
+
|
303
|
+
# contador dos registros do lote
|
304
|
+
contador = 1
|
305
|
+
|
306
|
+
arquivo = [monta_header_arquivo]
|
307
|
+
contador += 1
|
308
|
+
|
309
|
+
pagamentos.each_with_index do |pagamento, index|
|
310
|
+
novo_lote = monta_lote(pagamento, (index + 1))
|
311
|
+
arquivo.push novo_lote
|
312
|
+
novo_lote.each { |_lote| contador += 1 }
|
313
|
+
end
|
314
|
+
|
315
|
+
arquivo << monta_trailer_arquivo(pagamentos.count, contador)
|
316
|
+
|
317
|
+
retorno = arquivo.join("\n")
|
318
|
+
retorno
|
319
|
+
end
|
320
|
+
|
321
|
+
# Complemento do registro
|
322
|
+
#
|
323
|
+
# Este metodo deve ser sobrescrevido na classe do banco
|
324
|
+
#
|
325
|
+
def complemento_header
|
326
|
+
fail Brcobranca::NaoImplementado.new('Sobreescreva este método na classe referente ao banco que você esta criando')
|
327
|
+
end
|
328
|
+
|
329
|
+
# Numero da versao do layout
|
330
|
+
#
|
331
|
+
# Este metodo deve ser sobrescrevido na classe do banco
|
332
|
+
#
|
333
|
+
def versao_layout
|
334
|
+
fail Brcobranca::NaoImplementado.new('Sobreescreva este método na classe referente ao banco que você esta criando')
|
335
|
+
end
|
336
|
+
|
337
|
+
# Informacoes do convenio para o lote
|
338
|
+
#
|
339
|
+
# Este metodo deve ser sobrescrevido na classe do banco
|
340
|
+
#
|
341
|
+
def convenio_lote
|
342
|
+
fail Brcobranca::NaoImplementado.new('Sobreescreva este método na classe referente ao banco que você esta criando')
|
343
|
+
end
|
344
|
+
|
345
|
+
# Nome do banco
|
346
|
+
#
|
347
|
+
# Este metodo deve ser sobrescrevido na classe do banco
|
348
|
+
#
|
349
|
+
def nome_banco
|
350
|
+
fail Brcobranca::NaoImplementado.new('Sobreescreva este método na classe referente ao banco que você esta criando')
|
351
|
+
end
|
352
|
+
|
353
|
+
# Codigo do banco
|
354
|
+
#
|
355
|
+
# Este metodo deve ser sobrescrevido na classe do banco
|
356
|
+
#
|
357
|
+
def cod_banco
|
358
|
+
fail Brcobranca::NaoImplementado.new('Sobreescreva este método na classe referente ao banco que você esta criando')
|
359
|
+
end
|
360
|
+
|
361
|
+
# Informacoes da conta do cedente
|
362
|
+
#
|
363
|
+
# Este metodo deve ser sobrescrevido na classe do banco
|
364
|
+
#
|
365
|
+
def info_conta
|
366
|
+
fail Brcobranca::NaoImplementado.new('Sobreescreva este método na classe referente ao banco que você esta criando')
|
367
|
+
end
|
368
|
+
|
369
|
+
# Codigo do convenio
|
370
|
+
#
|
371
|
+
# Este metodo deve ser sobrescrevido na classe do banco
|
372
|
+
#
|
373
|
+
def codigo_convenio
|
374
|
+
fail Brcobranca::NaoImplementado.new('Sobreescreva este método na classe referente ao banco que você esta criando')
|
375
|
+
end
|
376
|
+
end
|
377
|
+
end
|
378
|
+
end
|
379
|
+
end
|
@@ -0,0 +1,103 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
module Brcobranca
|
3
|
+
module Remessa
|
4
|
+
module Cnab240
|
5
|
+
class Caixa < Brcobranca::Remessa::Cnab240::Base
|
6
|
+
# digito da agencia
|
7
|
+
attr_accessor :digito_agencia
|
8
|
+
# versao do aplicativo da CAIXA
|
9
|
+
attr_accessor :versao_aplicativo
|
10
|
+
# modalidade da carteira
|
11
|
+
# opcoes:
|
12
|
+
# 11: título Registrado emissão CAIXA
|
13
|
+
# 14: título Registrado emissão Cedente
|
14
|
+
# 21: título Sem Registro emissão CAIXA
|
15
|
+
attr_accessor :modalidade_carteira
|
16
|
+
# identificacao da emissao do boleto (attr na classe base)
|
17
|
+
# opcoes:
|
18
|
+
# ‘1’ = Banco Emite
|
19
|
+
# ‘2’ = Cliente Emite ou para Bloqueto Pré-Impresso Registrado (entrega do bloqueto pelo Cedente)
|
20
|
+
# ‘4’ = Banco Reemite
|
21
|
+
# ‘5’ = Banco Não Reemite
|
22
|
+
#
|
23
|
+
# identificacao da distribuicao do boleto (attr na classe base)
|
24
|
+
# opcoes:
|
25
|
+
# ‘0’ = Postagem pelo Cedente
|
26
|
+
# ‘1’ = Sacado via Correios
|
27
|
+
# ‘2’ = Cedente via Agência CAIXA
|
28
|
+
# ‘3’ = Sacado via e-mail
|
29
|
+
# ‘4’ = Sacado via SMS
|
30
|
+
|
31
|
+
validates_presence_of :versao_aplicativo, :digito_agencia, message: 'não pode estar em branco.'
|
32
|
+
validates_length_of :convenio, maximum: 6, message: 'não deve ter mais de 6 dígitos.'
|
33
|
+
validates_length_of :versao_aplicativo, maximum: 4, message: 'não deve ter mais de 4 dígitos.'
|
34
|
+
validates_length_of :digito_agencia, is: 1, message: 'deve ter 1 dígito.'
|
35
|
+
validates_length_of :modalidade_carteira, is: 2, message: 'deve ter 2 dígitos.'
|
36
|
+
|
37
|
+
def initialize(campos = {})
|
38
|
+
# Modalidade carteira: 14 (título Registrado emissão Cedente)
|
39
|
+
campos = { modalidade_carteira: '14',
|
40
|
+
emissao_boleto: '2',
|
41
|
+
distribuicao_boleto: '0',
|
42
|
+
especie_titulo: '99' }.merge!(campos)
|
43
|
+
super(campos)
|
44
|
+
end
|
45
|
+
|
46
|
+
def convenio=(valor)
|
47
|
+
@convenio = valor.to_s.rjust(6, '0') if valor
|
48
|
+
end
|
49
|
+
|
50
|
+
def versao_aplicativo=(valor)
|
51
|
+
@versao_aplicativo = valor.to_s.rjust(4, '0') if valor
|
52
|
+
end
|
53
|
+
|
54
|
+
def cod_banco
|
55
|
+
'104'
|
56
|
+
end
|
57
|
+
|
58
|
+
def nome_banco
|
59
|
+
'CAIXA ECONOMICA FEDERAL'.ljust(30, ' ')
|
60
|
+
end
|
61
|
+
|
62
|
+
def versao_layout
|
63
|
+
'050'
|
64
|
+
end
|
65
|
+
|
66
|
+
def codigo_convenio
|
67
|
+
''.rjust(20, '0')
|
68
|
+
end
|
69
|
+
|
70
|
+
def convenio_lote
|
71
|
+
"#{convenio.rjust(6, '0')}#{''.rjust(14, ' ')}"
|
72
|
+
end
|
73
|
+
|
74
|
+
def info_conta
|
75
|
+
# CAMPO # TAMANHO
|
76
|
+
# agencia 5
|
77
|
+
# digito agencia 1
|
78
|
+
# cod. convenio 6
|
79
|
+
# uso CAIXA 7
|
80
|
+
# uso CAIXA 1
|
81
|
+
"#{agencia.to_s.rjust(5, '0')}#{digito_agencia}#{convenio}#{''.rjust(7, '0')}0"
|
82
|
+
end
|
83
|
+
|
84
|
+
def complemento_header
|
85
|
+
"#{versao_aplicativo.rjust(4, '0')}#{''.rjust(25, ' ')}"
|
86
|
+
end
|
87
|
+
|
88
|
+
def complemento_trailer
|
89
|
+
"#{''.rjust(69, '0')}#{''.rjust(148, ' ')}"
|
90
|
+
end
|
91
|
+
|
92
|
+
def complemento_p(pagamento)
|
93
|
+
# CAMPO TAMANHO
|
94
|
+
# convenio 6
|
95
|
+
# uso CAIXA 11
|
96
|
+
# modalidade carteira 2
|
97
|
+
# ident. titulo 15
|
98
|
+
"#{convenio.rjust(6, '0')}#{''.rjust(11, '0')}#{modalidade_carteira}#{pagamento.nosso_numero.to_s.rjust(15, '0')}"
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
@@ -0,0 +1,112 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
module Brcobranca
|
3
|
+
module Remessa
|
4
|
+
module Cnab400
|
5
|
+
class Base < Brcobranca::Remessa::Base
|
6
|
+
validates_presence_of :carteira, :digito_conta, message: 'não pode estar em branco.'
|
7
|
+
validates_length_of :digito_conta, maximum: 1, message: 'deve ter 1 dígito.'
|
8
|
+
|
9
|
+
# Data da geracao do arquivo seguindo o padrao DDMMAA
|
10
|
+
#
|
11
|
+
# @return [String]
|
12
|
+
#
|
13
|
+
def data_geracao
|
14
|
+
Date.today.strftime('%d%m%y')
|
15
|
+
end
|
16
|
+
|
17
|
+
# Header do arquivo remessa
|
18
|
+
#
|
19
|
+
# @return [String]
|
20
|
+
#
|
21
|
+
def monta_header
|
22
|
+
# CAMPO TAMANHO VALOR
|
23
|
+
# tipo do registro [1] 1
|
24
|
+
# operacao [1] 1
|
25
|
+
# literal remessa [7] REMESSA
|
26
|
+
# cod. servico [15] COBRANCA
|
27
|
+
# info. conta [20]
|
28
|
+
# empresa mae [30]
|
29
|
+
# cod. banco [3]
|
30
|
+
# nome banco [15]
|
31
|
+
# data geracao [6] formato DDMMAA
|
32
|
+
# complemento registro [294]
|
33
|
+
# num. sequencial [6] 000001
|
34
|
+
"11REMESSA01COBRANCA #{info_conta}#{empresa_mae.to_s.ljust(30, ' ')}#{cod_banco}#{nome_banco}#{data_geracao}#{complemento}000001"
|
35
|
+
end
|
36
|
+
|
37
|
+
# Trailer do arquivo remessa
|
38
|
+
#
|
39
|
+
# @param sequencial
|
40
|
+
# num. sequencial do registro no arquivo
|
41
|
+
#
|
42
|
+
# @return [String]
|
43
|
+
#
|
44
|
+
def monta_trailer(sequencial)
|
45
|
+
# CAMPO TAMANHO VALOR
|
46
|
+
# identificacao registro [1] 9
|
47
|
+
# complemento [393]
|
48
|
+
# num. sequencial [6]
|
49
|
+
"9#{''.rjust(393, ' ')}#{sequencial.to_s.rjust(6, '0')}"
|
50
|
+
end
|
51
|
+
|
52
|
+
# Registro detalhe do arquivo remessa
|
53
|
+
#
|
54
|
+
# Este metodo deve ser sobrescrevido na classe do banco
|
55
|
+
#
|
56
|
+
def monta_detalhe(_pagamento, _sequencial)
|
57
|
+
fail Brcobranca::NaoImplementado.new('Sobreescreva este método na classe referente ao banco que você esta criando')
|
58
|
+
end
|
59
|
+
|
60
|
+
# Gera o arquivo com os registros
|
61
|
+
#
|
62
|
+
# @return [String]
|
63
|
+
def gera_arquivo
|
64
|
+
fail Brcobranca::RemessaInvalida.new(self) unless self.valid?
|
65
|
+
|
66
|
+
# contador de registros no arquivo
|
67
|
+
contador = 1
|
68
|
+
ret = [monta_header]
|
69
|
+
pagamentos.each do |pagamento|
|
70
|
+
contador += 1
|
71
|
+
ret << monta_detalhe(pagamento, contador)
|
72
|
+
end
|
73
|
+
ret << monta_trailer(contador + 1)
|
74
|
+
retorno = ret.join("\n")
|
75
|
+
retorno
|
76
|
+
end
|
77
|
+
|
78
|
+
# Informacoes referentes a conta do cedente
|
79
|
+
#
|
80
|
+
# Este metodo deve ser sobrescrevido na classe do banco
|
81
|
+
#
|
82
|
+
def info_conta
|
83
|
+
fail Brcobranca::NaoImplementado.new('Sobreescreva este método na classe referente ao banco que você esta criando')
|
84
|
+
end
|
85
|
+
|
86
|
+
# Numero do banco na camara de compensacao
|
87
|
+
#
|
88
|
+
# Este metodo deve ser sobrescrevido na classe do banco
|
89
|
+
#
|
90
|
+
def cod_banco
|
91
|
+
fail Brcobranca::NaoImplementado.new('Sobreescreva este método na classe referente ao banco que você esta criando')
|
92
|
+
end
|
93
|
+
|
94
|
+
# Nome por extenso do banco cobrador
|
95
|
+
#
|
96
|
+
# Este metodo deve ser sobrescrevido na classe do banco
|
97
|
+
#
|
98
|
+
def nome_banco
|
99
|
+
fail Brcobranca::NaoImplementado.new('Sobreescreva este método na classe referente ao banco que você esta criando')
|
100
|
+
end
|
101
|
+
|
102
|
+
# Complemento do registro header
|
103
|
+
#
|
104
|
+
# Este metodo deve ser sobrescrevido na classe do banco
|
105
|
+
#
|
106
|
+
def complemento
|
107
|
+
fail Brcobranca::NaoImplementado.new('Sobreescreva este método na classe referente ao banco que você esta criando')
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|