tulios-brcobranca-rails2 2.0.8

Sign up to get free protection for your applications and to get access to all the features.
Files changed (55) hide show
  1. data/History.txt +29 -0
  2. data/Manifest.txt +54 -0
  3. data/PostInstall.txt +4 -0
  4. data/README.rdoc +75 -0
  5. data/Rakefile +41 -0
  6. data/brcobranca.gemspec +43 -0
  7. data/lib/brcobranca/arquivos/logos/banespa.jpg +0 -0
  8. data/lib/brcobranca/arquivos/logos/bb.jpg +0 -0
  9. data/lib/brcobranca/arquivos/logos/bradesco.jpg +0 -0
  10. data/lib/brcobranca/arquivos/logos/caixa.jpg +0 -0
  11. data/lib/brcobranca/arquivos/logos/hsbc.jpg +0 -0
  12. data/lib/brcobranca/arquivos/logos/itau.jpg +0 -0
  13. data/lib/brcobranca/arquivos/logos/real.jpg +0 -0
  14. data/lib/brcobranca/arquivos/logos/unibanco.jpg +0 -0
  15. data/lib/brcobranca/arquivos/templates/modelo_generico.eps +0 -0
  16. data/lib/brcobranca/boleto/banco_banespa.rb +85 -0
  17. data/lib/brcobranca/boleto/banco_bradesco.rb +44 -0
  18. data/lib/brcobranca/boleto/banco_brasil.rb +88 -0
  19. data/lib/brcobranca/boleto/banco_caixa.rb +118 -0
  20. data/lib/brcobranca/boleto/banco_hsbc.rb +77 -0
  21. data/lib/brcobranca/boleto/banco_itau.rb +115 -0
  22. data/lib/brcobranca/boleto/banco_real.rb +70 -0
  23. data/lib/brcobranca/boleto/banco_unibanco.rb +79 -0
  24. data/lib/brcobranca/boleto/base.rb +154 -0
  25. data/lib/brcobranca/boleto/template/rghost.rb +153 -0
  26. data/lib/brcobranca/boleto/template/util.rb +34 -0
  27. data/lib/brcobranca/config.rb +9 -0
  28. data/lib/brcobranca/core_ext.rb +287 -0
  29. data/lib/brcobranca/currency.rb +67 -0
  30. data/lib/brcobranca/retorno/base.rb +43 -0
  31. data/lib/brcobranca/retorno/retorno_cbr643.rb +44 -0
  32. data/lib/brcobranca.rb +43 -0
  33. data/spec/arquivos/CBR64310.RET +28 -0
  34. data/spec/brcobranca/banco_banespa_spec.rb +195 -0
  35. data/spec/brcobranca/banco_bradesco_spec.rb +179 -0
  36. data/spec/brcobranca/banco_brasil_spec.rb +353 -0
  37. data/spec/brcobranca/banco_caixa_spec.rb +192 -0
  38. data/spec/brcobranca/banco_hsbc_spec.rb +216 -0
  39. data/spec/brcobranca/banco_itau_spec.rb +202 -0
  40. data/spec/brcobranca/banco_real_spec.rb +145 -0
  41. data/spec/brcobranca/banco_unibanco_spec.rb +193 -0
  42. data/spec/brcobranca/base_spec.rb +240 -0
  43. data/spec/brcobranca/core_ext_spec.rb +275 -0
  44. data/spec/brcobranca/currency_spec.rb +81 -0
  45. data/spec/brcobranca/retorno_cbr643_spec.rb +69 -0
  46. data/spec/brcobranca/rghost_spec.rb +36 -0
  47. data/spec/brcobranca/template/rghost_spec.rb +65 -0
  48. data/spec/brcobranca/template/util_spec.rb +42 -0
  49. data/spec/brcobranca_spec.rb +8 -0
  50. data/spec/rcov.opts +2 -0
  51. data/spec/spec.opts +6 -0
  52. data/spec/spec_helper.rb +10 -0
  53. data/tasks/rcov.rake +12 -0
  54. data/tasks/rspec.rake +21 -0
  55. metadata +202 -0
@@ -0,0 +1,118 @@
1
+ # Banco Caixa
2
+ class BancoCaixa < Brcobranca::Boleto::Base
3
+
4
+ #validates_length_of :convenio, :is => 11, :message => "deve ser igual a 11 dígitos (operacao (3) + convênio (8))."
5
+
6
+ CARTEIRAS = {
7
+ 14 => 'SR' # Cobranca sem Registro
8
+ }
9
+
10
+ # Nova instancia da CaixaEconomica
11
+ # @param (see Brcobranca::Boleto::Base#initialize)
12
+ def initialize(campos={})
13
+ campos = {:carteira => CARTEIRAS[14]}.merge!(campos)
14
+ super(campos)
15
+ end
16
+
17
+ def fator_vencimento
18
+ self.data_vencimento.fator_vencimento.to_s.rjust(4,'0')
19
+ end
20
+
21
+ # Valor total do documento
22
+ # @return [String] 10 caracteres numéricos.
23
+ def valor_documento_formatado
24
+ self.valor_documento.limpa_valor_moeda.to_s.rjust(10,'0')
25
+ end
26
+
27
+ alias :valor_carteira :carteira
28
+ def carteira
29
+ # Em caso de número, formatar para sigla
30
+ return CARTEIRAS[self.valor_carteira] if self.valor_carteira.is_number?
31
+ self.valor_carteira
32
+ end
33
+
34
+ # Codigo do banco emissor (3 dígitos sempre)
35
+ #
36
+ # @return [String] 3 caracteres numéricos.
37
+ def banco
38
+ "104"
39
+ end
40
+
41
+ def banco_dv
42
+ self.banco.modulo10
43
+ end
44
+
45
+ # Número da agência/codigo_cedente do cliente para exibir no boleto.
46
+ # @return [String]
47
+ # @example
48
+ # boleto.agencia_conta_boleto #=> "2391/44335511-5"
49
+ def agencia_conta_boleto
50
+ "#{self.agencia}/#{self.conta_corrente}-#{self.conta_corrente_dv}"
51
+ end
52
+
53
+ # Número seqüencial utilizado para identificar o boleto.
54
+ # Carteira 14 - SR - Cobranca sem Registro:
55
+ # Fixo 2 mais 8 dígitos (ex: 8200000001)
56
+ # @raise [Brcobranca::NaoImplementado] Caso o tipo de convênio não seja suportado pelo Brcobranca.
57
+ #
58
+ def numero_documento
59
+ case self.carteira
60
+ when 'SR'
61
+ "82#{@numero_documento.to_s.rjust(8, '0')}"
62
+ else
63
+ raise Brcobranca::NaoImplementado.new("Tipo de convênio não implementado.")
64
+ end
65
+ end
66
+
67
+ # Dígito verificador do nosso número.
68
+ # @return [String] 1 caracteres numéricos.
69
+ # @see BancoBrasil#numero_documento
70
+ def nosso_numero_dv
71
+ self.numero_documento.modulo11_2to9
72
+ end
73
+
74
+ # Nosso número para exibir no boleto.
75
+ # (numero_documento + nosso_numero_dv)
76
+ # @return [String]
77
+ # @example
78
+ # boleto.nosso_numero_boleto #=> "12345678904"
79
+ def nosso_numero_boleto
80
+ "#{self.numero_documento}#{self.nosso_numero_dv}"
81
+ end
82
+
83
+ def monta_codigo_43_digitos
84
+ "#{codigo_barras_primeira_parte}#{codigo_barras_segunda_parte}"
85
+ end
86
+
87
+ def codigo_barras
88
+ codigo = super()
89
+ raise Brcobranca::BoletoInvalido.new unless codigo
90
+ codigo
91
+ end
92
+
93
+ def codigo_barras_primeira_parte
94
+ "#{self.banco}#{self.moeda}#{self.fator_vencimento}#{valor_documento_formatado}"
95
+ end
96
+
97
+ def codigo_barras_segunda_parte
98
+ self.campo_livre
99
+ end
100
+
101
+ # Para as posições do Campo Livre, informar:
102
+ # - Se carteira Sem Registro: Nosso número com 10 posições e Código do Cedente, ambos
103
+ # sem o DV.
104
+ #
105
+ # Ex.: 82NNNNNNNN AAAA YYYXXXXXXXX
106
+ #
107
+ # Onde: 82 - Identificador da carteira Sem Registro
108
+ # NNNNNNNN - Nosso número do Cliente
109
+ # AAAA - CNPJ da Agência Cedente
110
+ # YYY - Operação Código
111
+ # XXXXXXXX - Código fornecido pela Agência
112
+ #
113
+ # Nota: A operação + o código fornecido pela agência = convênio
114
+ def campo_livre
115
+ "#{self.numero_documento}#{self.agencia}#{self.convenio}"
116
+ end
117
+
118
+ end
@@ -0,0 +1,77 @@
1
+ # Banco HSBC
2
+ class BancoHsbc < Brcobranca::Boleto::Base
3
+
4
+ # Responsável por definir dados iniciais quando se cria uma nova intância da classe BancoBrasil
5
+ def initialize(campos={})
6
+ padrao={:carteira => "CNR", :banco => "399"}
7
+ campos = padrao.merge!(campos)
8
+ super(campos)
9
+ end
10
+
11
+ # Número sequencial utilizado para distinguir os boletos na agência
12
+ def nosso_numero
13
+ if self.data_vencimento.kind_of?(Date)
14
+ self.codigo_servico = 4
15
+ dia = self.data_vencimento.day.to_s.zeros_esquerda(:tamanho => 2)
16
+ mes = self.data_vencimento.month.to_s.zeros_esquerda(:tamanho => 2)
17
+ ano = self.data_vencimento.year.to_s[2..3]
18
+ data = "#{dia}#{mes}#{ano}"
19
+
20
+ numero_documento = "#{self.numero_documento.to_s}#{self.numero_documento.to_s.modulo11_9to2_10_como_zero}#{self.codigo_servico.to_s}"
21
+ soma = numero_documento.to_i + self.conta_corrente.to_i + data.to_i
22
+ numero = "#{numero_documento}#{soma.to_s.modulo11_9to2_10_como_zero}"
23
+ numero
24
+ else
25
+ self.codigo_servico = 5
26
+ numero_documento = "#{self.numero_documento.to_s}#{self.numero_documento.to_s.modulo11_9to2_10_como_zero}#{self.codigo_servico.to_s}"
27
+ soma = numero_documento.to_i + self.conta_corrente.to_i
28
+ numero = "#{numero_documento}#{soma.to_s.modulo11_9to2_10_como_zero}"
29
+ numero
30
+ end
31
+ end
32
+
33
+ # Campo usado apenas na exibição no boleto
34
+ # Deverá ser sobreescrito para cada banco
35
+ def nosso_numero_boleto
36
+ "#{self.nosso_numero}"
37
+ end
38
+
39
+ # Campo usado apenas na exibição no boleto
40
+ # Deverá ser sobreescrito para cada banco
41
+ def agencia_conta_boleto
42
+ "#{self.conta_corrente}"
43
+ end
44
+
45
+ # Responsável por montar uma String com 43 caracteres que será usado na criação do código de barras
46
+ def monta_codigo_43_digitos
47
+ banco = self.banco.zeros_esquerda(:tamanho => 3)
48
+ valor_documento = self.valor_documento.limpa_valor_moeda.zeros_esquerda(:tamanho => 10)
49
+ convenio = self.convenio.to_s
50
+ conta = self.conta_corrente.zeros_esquerda(:tamanho => 7)
51
+
52
+ # Montagem é baseada no tipo de carteira e na presença da data de vencimento
53
+ if self.carteira == "CNR"
54
+ if self.data_vencimento.kind_of?(Date)
55
+ raise "numero_documento pode ser de no máximo 13 caracteres." if (self.numero_documento.to_s.size > 13)
56
+ fator = self.data_vencimento.fator_vencimento
57
+ dias_julianos = self.data_vencimento.to_juliano
58
+ self.codigo_servico = 4
59
+ numero_documento = self.numero_documento.zeros_esquerda(:tamanho => 13)
60
+ numero = "#{banco}#{self.moeda}#{fator}#{valor_documento}#{conta}#{numero_documento}#{dias_julianos}2"
61
+ numero.size == 43 ? numero : nil
62
+ else
63
+ # TODO
64
+ nil
65
+ end
66
+ else
67
+ # TODO
68
+ # raise "numero_documento pode ser de no máximo 6 caracteres." if (self.numero_documento.to_s.size > 6)
69
+ # numero_documento = self.numero_documento.zeros_esquerda(:tamanho => 6)
70
+ # nosso_numero = self.nosso_numero.zeros_esquerda(:tamanho => 9)
71
+ # self.codigo_servico = 5
72
+
73
+ nil
74
+ end
75
+ end
76
+
77
+ end
@@ -0,0 +1,115 @@
1
+ # Banco Itaú
2
+ class BancoItau < Brcobranca::Boleto::Base
3
+ # Usado somente em carteiras especiais com registro para complementar o número do cocumento
4
+ attr_accessor :seu_numero
5
+
6
+ # Responsável por definir dados iniciais quando se cria uma nova intancia da classe BancoItau
7
+ def initialize(campos={})
8
+ padrao={:carteira => "175", :banco => "341"}
9
+ campos = padrao.merge!(campos)
10
+ super(campos)
11
+ end
12
+
13
+ # Retorna dígito verificador do nosso número, calculado com modulo10.
14
+ # Para a grande maioria das carteiras, são considerados para a obtenção do DAC/DV, os dados
15
+ # "AGENCIA(sem DAC/DV)/CONTA(sem DAC/DV)/CARTEIRA/NOSSO NUMERO", calculado pelo criterio do Modulo 10.
16
+ # A excecao, estão as carteiras 126, 131, 146, 150 e 168 cuja obtenção esta baseada apenas nos
17
+ # dados "CARTEIRA/NOSSO NUMERO".
18
+ def nosso_numero_dv
19
+ if %w(126 131 146 150 168).include?(self.carteira)
20
+ "#{self.carteira}#{self.numero_documento}".modulo10
21
+ else
22
+ numero_documento = self.numero_documento.zeros_esquerda(:tamanho => 8)
23
+ "#{self.agencia}#{self.conta_corrente}#{self.carteira}#{numero_documento}".modulo10
24
+ end
25
+ end
26
+
27
+ # Calcula o dígito verificador para conta corrente do Itau.
28
+ # Retorna apenas o dígito verificador da conta ou nil caso seja impossível calcular.
29
+ def agencia_conta_corrente_dv
30
+ "#{self.agencia}#{self.conta_corrente}".modulo10
31
+ end
32
+
33
+ # Campo usado apenas na exibição no boleto
34
+ # Deverá ser sobreescrito para cada banco
35
+ def nosso_numero_boleto
36
+ "#{self.carteira}/#{self.numero_documento}-#{self.nosso_numero_dv}"
37
+ end
38
+
39
+ # Campo usado apenas na exibição no boleto
40
+ # Deverá ser sobreescrito para cada banco
41
+ def agencia_conta_boleto
42
+ "#{self.agencia}-#{self.agencia_dv} / #{self.conta_corrente}-#{self.conta_corrente_dv}"
43
+ end
44
+
45
+ # Responsável por montar uma String com 43 caracteres que será usado na criação do código de barras.
46
+ def monta_codigo_43_digitos
47
+ valor_documento_formatado = self.valor_documento.limpa_valor_moeda.zeros_esquerda(:tamanho => 10)
48
+ fator_vencimento = self.data_vencimento.fator_vencimento
49
+ numero_documento = self.numero_documento.zeros_esquerda(:tamanho => 8)
50
+ return nil if numero_documento.size != 8
51
+
52
+ # Monta a String baseado no tipo de carteira
53
+ case self.carteira.to_i
54
+ when 126, 131, 146, 150, 168
55
+ # CARTEIRAS 126 131 146 150 168
56
+ # 01 a 03 03 9(03) Código do Banco na Câmara de Compensação = '341'
57
+ # 04 a 04 01 9(01) Código da Moeda = '9'
58
+ # 05 a 05 01 9(01) DAC código de Barras MOD 11-2a9
59
+ # 06 a 09 04 9(04) Fator de Vencimento
60
+ # 10 a 19 10 9(08)V(2) Valor
61
+ # 20 a 22 03 9(03) Carteira
62
+ # 23 a 30 08 9(08) Nosso Número
63
+ # 31 a 31 01 9(01) DAC [Carteira/Nosso Número] MOD 10
64
+ # 32 a 35 04 9(04) N.º da Agência cedente
65
+ # 36 a 40 05 9(05) N.º da Conta Corrente
66
+ # 41 a 41 01 9(01) DAC [Agência/Conta Corrente] MOD 10
67
+ # 42 a 44 03 9(03) Zeros
68
+ codigo = "#{self.banco}#{self.moeda}#{fator_vencimento}#{valor_documento_formatado}#{self.carteira}"
69
+ codigo << "#{numero_documento}#{self.nosso_numero_dv}#{self.agencia}#{self.conta_corrente}#{self.agencia_conta_corrente_dv}000"
70
+ codigo
71
+ codigo.size == 43 ? codigo : nil
72
+ when 198, 106, 107, 122, 142, 143, 195, 196
73
+ # CARTEIRAS 198, 106, 107,122, 142, 143, 195 e 196
74
+ # 01 a 03 03 9(3) Código do Banco na Câmara de Compensação = ‘341’
75
+ # 04 a 04 01 9(1) Código da Moeda = '9'
76
+ # 05 a 05 01 9(1) DAC do Código de Barras MOD 11-2a9
77
+ # 06 a 09 04 9(04) Fator de Vencimento
78
+ # 10 a 19 10 9(08) V(2) Valor
79
+ # 20 a 22 03 9(3) Carteira
80
+ # 23 a 30 08 9(8) Nosso Número
81
+ # 31 a 37 07 9(7) Seu Número (Número do Documento)
82
+ # 38 a 42 05 9(5) Código do Cliente (fornecido pelo Banco)
83
+ # 43 a 43 01 9(1) DAC dos campos acima (posições 20 a 42) MOD 10
84
+ # 44 a 44 01 9(1) Zero
85
+ seu_numero = self.seu_numero.zeros_esquerda(:tamanho => 7)
86
+ return nil if seu_numero.size != 7
87
+ convenio = self.convenio.zeros_esquerda(:tamanho => 5)
88
+ return nil if convenio.size != 5
89
+ dv = "#{self.carteira}#{numero_documento}#{seu_numero}#{convenio}".modulo10
90
+
91
+ codigo = "#{self.banco}#{self.moeda}#{fator_vencimento}#{valor_documento_formatado}#{self.carteira}"
92
+ codigo << "#{numero_documento}#{seu_numero}#{convenio}#{dv}0"
93
+ codigo
94
+ codigo.size == 43 ? codigo : nil
95
+ else
96
+ # DEMAIS CARTEIRAS
97
+ # 01 a 03 03 9(03) Código do Banco na Câmara de Compensação = '341'
98
+ # 04 a 04 01 9(01) Código da Moeda = '9'
99
+ # 05 a 05 01 9(01) DAC código de Barras MOD 11-2a9
100
+ # 06 a 09 04 9(04) Fator de Vencimento
101
+ # 10 a 19 10 9(08)V(2) Valor
102
+ # 20 a 22 03 9(03) Carteira
103
+ # 23 a 30 08 9(08) Nosso Número
104
+ # 31 a 31 01 9(01) DAC [Agência /Conta/Carteira/Nosso Número] MOD 10
105
+ # 32 a 35 04 9(04) N.º da Agência cedente
106
+ # 36 a 40 05 9(05) N.º da Conta Corrente
107
+ # 41 a 41 01 9(01) DAC [Agência/Conta Corrente] MOD 10
108
+ # 42 a 44 03 9(03) Zeros
109
+ codigo = "#{self.banco}#{self.moeda}#{fator_vencimento}#{valor_documento_formatado}#{self.carteira}"
110
+ codigo << "#{numero_documento}#{self.nosso_numero_dv}#{self.agencia}#{self.conta_corrente}#{self.agencia_conta_corrente_dv}000"
111
+ codigo
112
+ codigo.size == 43 ? codigo : nil
113
+ end
114
+ end
115
+ end
@@ -0,0 +1,70 @@
1
+ # Banco REAL
2
+ class BancoReal < Brcobranca::Boleto::Base
3
+ # Responsável por definir dados iniciais quando se cria uma nova intancia da classe BancoReal
4
+ def initialize(campos={})
5
+ padrao={:carteira => "57", :banco => "356"}
6
+ campos = padrao.merge!(campos)
7
+ super(campos)
8
+ end
9
+
10
+ # Campo usado apenas na exibição no boleto
11
+ # Deverá ser sobreescrito para cada banco
12
+ def nosso_numero_boleto
13
+ "#{self.numero_documento}-#{self.nosso_numero_dv}"
14
+ end
15
+
16
+ # Campo usado apenas na exibição no boleto
17
+ # Deverá ser sobreescrito para cada banco
18
+ def agencia_conta_boleto
19
+ "#{self.agencia}-#{self.agencia_dv} / #{self.conta_corrente}-#{self.conta_corrente_dv}"
20
+ end
21
+
22
+ # CALCULO DO DIGITO:
23
+ # APLICA-SE OS PESOS 2,1,2,1,.... AOS ALGARISMOS DO NUMERO COMPOSTO POR:
24
+ # NUMERO DO BANCO : COM 7 DIGITOS P/ COBRANCA REGISTRADA
25
+ # ATE 15 DIGITOS P/ COBRANCA SEM REGISTRO
26
+ # CODIGO DA AGENCIA: 4 DIGITOS
27
+ # NUMERO DA CONTA : 7 DIGITOS
28
+ def agencia_conta_corrente_nosso_numero_dv
29
+ case self.carteira.to_i
30
+ when 57
31
+ #agencia é 4 digitos
32
+ agencia = self.agencia.zeros_esquerda(:tamanho => 4)
33
+ #conta é 7 digitos
34
+ conta = self.conta_corrente.zeros_esquerda(:tamanho => 7)
35
+ #nosso número com maximo de 13 digitos
36
+ numero_documento = self.numero_documento.zeros_esquerda(:tamanho => 13)
37
+ "#{numero_documento}#{agencia}#{conta}".modulo10
38
+ else
39
+ #agencia é 4 digitos
40
+ agencia = self.agencia.zeros_esquerda(:tamanho => 4)
41
+ #conta é 7 digitos
42
+ conta = self.conta_corrente.zeros_esquerda(:tamanho => 7)
43
+ #nosso número com maximo de 13 digitos
44
+ numero_documento = self.numero_documento.zeros_esquerda(:tamanho => 7)
45
+ "#{numero_documento}#{agencia}#{conta}".modulo10
46
+ end
47
+ end
48
+
49
+ # Responsável por montar uma String com 43 caracteres que será usado na criação do código de barras
50
+ def monta_codigo_43_digitos
51
+ banco = self.banco.zeros_esquerda(:tamanho => 3)
52
+ valor_documento = self.valor_documento.limpa_valor_moeda.zeros_esquerda(:tamanho => 10)
53
+ conta = self.conta_corrente.zeros_esquerda(:tamanho => 7)
54
+ agencia = self.agencia.zeros_esquerda(:tamanho => 4)
55
+ fator = self.data_vencimento.fator_vencimento
56
+ # Montagem é baseada no tipo de carteira, com registro e sem registro
57
+ case self.carteira.to_i
58
+ # Carteira sem registro
59
+ when 57
60
+ numero_documento = self.numero_documento.zeros_esquerda(:tamanho => 13)
61
+ codigo = "#{banco}#{self.moeda}#{fator}#{valor_documento}#{agencia}#{conta}#{self.agencia_conta_corrente_nosso_numero_dv}#{numero_documento}"
62
+ codigo.size == 43 ? codigo : nil
63
+ else
64
+ # TODO verificar com o banco, pois não consta na documentação
65
+ numero_documento = self.numero_documento.zeros_esquerda(:tamanho => 7)
66
+ codigo = "#{banco}#{self.moeda}#{fator}#{valor_documento}000000#{agencia}#{conta}#{self.agencia_conta_corrente_nosso_numero_dv}#{numero_documento}"
67
+ codigo.size == 43 ? codigo : nil
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,79 @@
1
+ # Banco UNIBANCO
2
+ class BancoUnibanco < Brcobranca::Boleto::Base
3
+ # Responsável por definir dados iniciais quando se cria uma nova intancia da classe BancoUnibanco
4
+ # Com Registro 4
5
+ # Sem Registro 5
6
+ def initialize(campos={})
7
+ padrao={:carteira => "5", :banco => "409"}
8
+ campos = padrao.merge!(campos)
9
+ super(campos)
10
+ end
11
+
12
+ def nosso_numero_dv
13
+ self.numero_documento.modulo11_2to9
14
+ end
15
+
16
+ # Campo usado apenas na exibição no boleto
17
+ # Deverá ser sobreescrito para cada banco
18
+ def nosso_numero_boleto
19
+ "#{self.numero_documento.zeros_esquerda(:tamanho => 14)}-#{self.nosso_numero_dv}"
20
+ end
21
+
22
+ # Campo usado apenas na exibição no boleto
23
+ # Deverá ser sobreescrito para cada banco
24
+ def agencia_conta_boleto
25
+ "#{self.agencia} / #{self.conta_corrente}-#{self.conta_corrente_dv}"
26
+ end
27
+
28
+ # Responsável por montar uma String com 43 caracteres que será usado na criação do código de barras
29
+ def monta_codigo_43_digitos
30
+ banco = self.banco.zeros_esquerda(:tamanho => 3)
31
+ fator = self.data_vencimento.fator_vencimento
32
+ valor_documento = self.valor_documento.limpa_valor_moeda.zeros_esquerda(:tamanho => 10)
33
+ carteira = self.carteira.zeros_esquerda(:tamanho => 1)
34
+
35
+ case carteira.to_i
36
+ when 5
37
+
38
+ # Cobrança sem registro (CÓDIGO DE BARRAS)
39
+ # Posição Tamanho Descrição
40
+ # 1 a 3 3 número de identificação do Unibanco: 409 (número FIXO)
41
+ # 4 1 código da moeda. Real (R$)=9 (número FIXO)
42
+ # 5 1 dígito verificador do CÓDIGO DE BARRAS
43
+ # 6 a 9 4 fator de vencimento
44
+ # 10 a 19 10 valor do título com zeros à esquerda
45
+ # 20 1 código para transação CVT: 5 (número FIXO)(5=7744-5)
46
+ # 21 a 27 7 número do cliente no CÓDIGO DE BARRAS + dígito verificador
47
+ # 28 a 29 2 vago. Usar 00 (número FIXO)
48
+ # 30 a 43 14 Número de referência do cliente
49
+ # 44 1 Dígito verificador
50
+
51
+ convenio = self.convenio.zeros_esquerda(:tamanho => 6)
52
+ numero_documento = self.numero_documento.zeros_esquerda(:tamanho => 14)
53
+ codigo = "#{banco}#{self.moeda}#{fator}#{valor_documento}#{carteira}#{convenio}00#{numero_documento}#{self.nosso_numero_dv}"
54
+ codigo.size == 43 ? codigo : nil
55
+ when 4
56
+
57
+ # Cobrança com registro (CÓDIGO DE BARRAS)
58
+ # Posição Tamanho Descrição
59
+ # 1 a 3 3 Número de identificação do Unibanco: 409 (número FIXO)
60
+ # 4 1 Código da moeda. Real (R$)=9 (número FIXO)
61
+ # 5 1 dígito verificador do CÓDIGO DE BARRAS
62
+ # 6 a 9 4 fator de vencimento em 4 algarismos, conforme tabela da página 14
63
+ # 10 a 19 10 valor do título com zeros à esquerda
64
+ # 20 a 21 2 Código para transação CVT: 04 (número FIXO) (04=5539-5)
65
+ # 22 a 27 6 data de vencimento (AAMMDD)
66
+ # 28 a 32 5 Código da agência + dígito verificador
67
+ # 33 a 43 11 “Nosso Número” (NNNNNNNNNNN)
68
+ # 44 1 Super dígito do “Nosso Número” (calculado com o MÓDULO 11 (de 2 a 9))
69
+
70
+ data = self.data_vencimento.strftime('%y%m%d')
71
+ agencia = self.agencia.zeros_esquerda(:tamanho => 4)
72
+ numero_documento = self.numero_documento.zeros_esquerda(:tamanho => 11)
73
+ codigo = "#{banco}#{self.moeda}#{fator}#{valor_documento}0#{carteira}#{data}#{agencia}#{self.agencia_dv}#{numero_documento}#{self.nosso_numero_dv}"
74
+ codigo.size == 43 ? codigo : nil
75
+ else
76
+ nil
77
+ end
78
+ end
79
+ end