brcobranca 4.1.0 → 5.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (55) hide show
  1. checksums.yaml +4 -4
  2. data/.coveralls.yml +1 -1
  3. data/.rspec +1 -0
  4. data/.rubocop.yml +1 -1
  5. data/.travis.yml +2 -1
  6. data/Gemfile +4 -4
  7. data/Gemfile.lock +65 -53
  8. data/README.md +18 -5
  9. data/brcobranca.gemspec +8 -6
  10. data/lib/brcobranca/boleto/banco_brasil.rb +25 -27
  11. data/lib/brcobranca/boleto/base.rb +13 -6
  12. data/lib/brcobranca/boleto/bradesco.rb +4 -1
  13. data/lib/brcobranca/boleto/caixa.rb +14 -4
  14. data/lib/brcobranca/boleto/hsbc.rb +26 -26
  15. data/lib/brcobranca/boleto/santander.rb +6 -3
  16. data/lib/brcobranca/boleto/sicredi.rb +3 -5
  17. data/lib/brcobranca/boleto/template/rghost.rb +7 -5
  18. data/lib/brcobranca/boleto/template/rghost_carne.rb +1 -2
  19. data/lib/brcobranca/calculo.rb +19 -93
  20. data/lib/brcobranca/formatacao_string.rb +21 -0
  21. data/lib/brcobranca/remessa/base.rb +59 -0
  22. data/lib/brcobranca/remessa/cnab240/banco_brasil.rb +117 -0
  23. data/lib/brcobranca/remessa/cnab240/base.rb +379 -0
  24. data/lib/brcobranca/remessa/cnab240/caixa.rb +103 -0
  25. data/lib/brcobranca/remessa/cnab400/base.rb +112 -0
  26. data/lib/brcobranca/remessa/cnab400/bradesco.rb +128 -0
  27. data/lib/brcobranca/remessa/cnab400/itau.rb +149 -0
  28. data/lib/brcobranca/remessa/pagamento.rb +159 -0
  29. data/lib/brcobranca/retorno/base.rb +1 -0
  30. data/lib/brcobranca/retorno/retorno_cnab400.rb +0 -2
  31. data/lib/brcobranca/version.rb +1 -1
  32. data/lib/brcobranca.rb +33 -17
  33. data/spec/brcobranca/banco_bradesco_spec.rb +0 -2
  34. data/spec/brcobranca/banco_brasil_spec.rb +0 -2
  35. data/spec/brcobranca/banco_caixa_spec.rb +0 -2
  36. data/spec/brcobranca/banco_hsbc_spec.rb +0 -3
  37. data/spec/brcobranca/banco_itau_spec.rb +0 -1
  38. data/spec/brcobranca/banco_santander_spec.rb +14 -14
  39. data/spec/brcobranca/banco_sicredi_spec.rb +0 -2
  40. data/spec/brcobranca/base_spec.rb +11 -0
  41. data/spec/brcobranca/boletos_em_lote_spec.rb +0 -2
  42. data/spec/brcobranca/core_ext_spec.rb +104 -58
  43. data/spec/brcobranca/remessa/base_spec.rb +87 -0
  44. data/spec/brcobranca/remessa/cnab240/banco_brasil_spec.rb +200 -0
  45. data/spec/brcobranca/remessa/cnab240/base_spec.rb +88 -0
  46. data/spec/brcobranca/remessa/cnab240/caixa_spec.rb +137 -0
  47. data/spec/brcobranca/remessa/cnab400/base_spec.rb +51 -0
  48. data/spec/brcobranca/remessa/cnab400/bradesco_spec.rb +174 -0
  49. data/spec/brcobranca/remessa/cnab400/itau_spec.rb +160 -0
  50. data/spec/brcobranca/remessa/pagamento_spec.rb +197 -0
  51. data/spec/brcobranca/retorno_cbr643_spec.rb +0 -2
  52. data/spec/brcobranca/rghost_spec.rb +0 -2
  53. data/spec/shared_examples/cnab240.rb +206 -0
  54. data/spec/shared_examples/cnab400.rb +85 -0
  55. 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