conectiva-boleto_bancario 0.0.2.beta

Sign up to get free protection for your applications and to get access to all the features.
Files changed (52) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +18 -0
  3. data/.rspec +1 -0
  4. data/.rvmrc +1 -0
  5. data/Changelog.markdown +10 -0
  6. data/Gemfile +3 -0
  7. data/LICENSE +22 -0
  8. data/Planning.markdown +137 -0
  9. data/README.markdown +215 -0
  10. data/Rakefile +9 -0
  11. data/TODO.markdown +11 -0
  12. data/boleto_bancario.gemspec +25 -0
  13. data/documentacoes_dos_boletos/Bradesco/Manual_BRADESCO.PDF +0 -0
  14. data/lib/boleto_bancario.rb +85 -0
  15. data/lib/boleto_bancario/calculos/digitos.rb +35 -0
  16. data/lib/boleto_bancario/calculos/fator_vencimento.rb +87 -0
  17. data/lib/boleto_bancario/calculos/fatores_de_multiplicacao.rb +67 -0
  18. data/lib/boleto_bancario/calculos/linha_digitavel.rb +158 -0
  19. data/lib/boleto_bancario/calculos/modulo10.rb +83 -0
  20. data/lib/boleto_bancario/calculos/modulo11.rb +54 -0
  21. data/lib/boleto_bancario/calculos/modulo11_fator_de2a7.rb +97 -0
  22. data/lib/boleto_bancario/calculos/modulo11_fator_de2a9.rb +83 -0
  23. data/lib/boleto_bancario/calculos/modulo11_fator_de2a9_resto_zero.rb +29 -0
  24. data/lib/boleto_bancario/calculos/modulo11_fator_de9a2_resto_x.rb +101 -0
  25. data/lib/boleto_bancario/calculos/modulo_numero_de_controle.rb +117 -0
  26. data/lib/boleto_bancario/core/banco_brasil.rb +532 -0
  27. data/lib/boleto_bancario/core/banrisul.rb +182 -0
  28. data/lib/boleto_bancario/core/boleto.rb +559 -0
  29. data/lib/boleto_bancario/core/bradesco.rb +285 -0
  30. data/lib/boleto_bancario/core/itau.rb +455 -0
  31. data/lib/boleto_bancario/core/santander.rb +273 -0
  32. data/lib/boleto_bancario/version.rb +4 -0
  33. data/spec/boleto_bancario/calculos/digitos_spec.rb +19 -0
  34. data/spec/boleto_bancario/calculos/fator_vencimento_spec.rb +59 -0
  35. data/spec/boleto_bancario/calculos/fatores_de_multiplicacao_spec.rb +69 -0
  36. data/spec/boleto_bancario/calculos/linha_digitavel_spec.rb +57 -0
  37. data/spec/boleto_bancario/calculos/modulo10_spec.rb +53 -0
  38. data/spec/boleto_bancario/calculos/modulo11_fator_de2a7_spec.rb +43 -0
  39. data/spec/boleto_bancario/calculos/modulo11_fator_de2a9_resto_zero_spec.rb +39 -0
  40. data/spec/boleto_bancario/calculos/modulo11_fator_de2a9_spec.rb +67 -0
  41. data/spec/boleto_bancario/calculos/modulo11_fator_de9a2_resto_x_spec.rb +37 -0
  42. data/spec/boleto_bancario/calculos/modulo11_spec.rb +19 -0
  43. data/spec/boleto_bancario/calculos/modulo_numero_de_controle_spec.rb +37 -0
  44. data/spec/boleto_bancario/core/banco_brasil_spec.rb +383 -0
  45. data/spec/boleto_bancario/core/banrisul_spec.rb +130 -0
  46. data/spec/boleto_bancario/core/boleto_spec.rb +161 -0
  47. data/spec/boleto_bancario/core/bradesco_spec.rb +170 -0
  48. data/spec/boleto_bancario/core/itau_spec.rb +336 -0
  49. data/spec/boleto_bancario/core/santander_spec.rb +135 -0
  50. data/spec/shared_examples/boleto_bancario_shared_example.rb +157 -0
  51. data/spec/spec_helper.rb +14 -0
  52. metadata +211 -0
@@ -0,0 +1,25 @@
1
+ # -*- encoding: utf-8 -*-
2
+ require File.expand_path('../lib/boleto_bancario/version', __FILE__)
3
+
4
+ Gem::Specification.new do |gem|
5
+ gem.authors = ["Tomas D'Stefano", "Conectiva Consultoria"]
6
+ gem.email = ["code@conectivaconsultoria.com.br"]
7
+ gem.description = %q{Emissão de Boletos Bancários em Ruby}
8
+ gem.summary = %q{Emissão de Boletos Bancários em Ruby}
9
+ gem.homepage = "https://github.com/conectiva/boleto_bancario"
10
+
11
+ gem.files = `git ls-files`.split($\).reject { |f| File.extname(f) == '.pdf' }
12
+ gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
13
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
14
+ gem.name = "conectiva-boleto_bancario"
15
+ gem.require_paths = ["lib"]
16
+ gem.version = BoletoBancario::VERSION
17
+
18
+ gem.add_dependency "activesupport", "~> 4"
19
+ gem.add_dependency "activemodel", "~> 4"
20
+ gem.add_development_dependency "rspec", "~> 2"
21
+ gem.add_development_dependency "valid_attribute", "~> 1.3"
22
+ gem.add_development_dependency "pry", "~> 0.9"
23
+ gem.add_development_dependency "simplecov", "~> 0.2"
24
+ gem.add_development_dependency "simplecov-html", "~> 0.7"
25
+ end
@@ -0,0 +1,85 @@
1
+ # encoding: utf-8
2
+ require 'boleto_bancario/version'
3
+ require 'active_model'
4
+ require 'active_support/core_ext/class'
5
+ require 'active_support/core_ext/enumerable'
6
+ require 'active_support/core_ext/object'
7
+ require 'active_support/core_ext/string'
8
+
9
+ # Copyright (C) 2012 Tomás D'Stefano <http://successoft.com>
10
+ #
11
+ # @author Tomás D'Stefano <tomas_stefano@successoft.com>
12
+ #
13
+ # == Boleto Bancário
14
+ #
15
+ # Emissão de Boletos Bancários em Ruby. Simples e principalmente, flexível.
16
+ #
17
+ # Essa biblioteca é baseada em outras <b>ótimas</b> bibliotecas.
18
+ # Recomendo analisar muito bem cada solução!
19
+ #
20
+ # * Novo Gateway de Pagamentos da Locaweb: http://www.locaweb.com.br/produtos/gateway-pagamento.html
21
+ # * Brcobranca: https://github.com/kivanio/brcobranca
22
+ # * Boleto Php: http://boletophp.com.br
23
+ # * Stella Caelum: http://stella.caelum.com.br
24
+ #
25
+ # === Coreuições
26
+ #
27
+ # Você pode contribuir de N formas. Seguem elas:
28
+ #
29
+ # * Homologando os boletos junto aos bancos (Super importante!!! :] ).
30
+ # * Fornecendo documentações mais atualizadas dos Bancos.
31
+ # * Escrevendo novos formatos (PDF, PNG), e me avisando para divulgar no Readme.
32
+ # * Refatorando código!! (Sempre bem vindo!)
33
+ # * Fornecendo Feedback construtivo! (Sempre bem vindo!)
34
+ #
35
+ # === Instalação via Rubygems
36
+ #
37
+ # gem install boleto_bancario
38
+ #
39
+ # === Instalar via Bundler
40
+ #
41
+ # Coloque no Gemfile:
42
+ #
43
+ # gem 'boleto_bancario'
44
+ #
45
+ # Depois de colocar no Gemfile:
46
+ #
47
+ # bundle install
48
+ #
49
+ module BoletoBancario
50
+ # Modulo responsável por guardar todas as regras dos campos de
51
+ # todos os Boletos Bancários. <b>Contribuicões com novas documentações dos
52
+ # bancos e homologação dos boletos são extremamente bem vindas!</b>
53
+ #
54
+ # Esse módulo também é responsável por guardar todas as regras de validação dos boletos e
55
+ # contém a forma de chamar os objetos necessários para renderização
56
+ # dos formatos (pdf, html, etc) e internacionalização dos boletos (caso
57
+ # você precise mudar os nomes dos campos nos boletos)
58
+ #
59
+ module Core
60
+ autoload :Boleto, 'boleto_bancario/core/boleto'
61
+ autoload :BancoBrasil, 'boleto_bancario/core/banco_brasil'
62
+ autoload :Banrisul, 'boleto_bancario/core/banrisul'
63
+ autoload :Bradesco, 'boleto_bancario/core/bradesco'
64
+ autoload :Itau, 'boleto_bancario/core/itau'
65
+ autoload :Santander, 'boleto_bancario/core/santander'
66
+ end
67
+
68
+ # Módulo que possui classes que realizam os cálculos dos campos que serão mostrados nos boletos.
69
+ #
70
+ module Calculos
71
+ autoload :FatorVencimento, 'boleto_bancario/calculos/fator_vencimento'
72
+ autoload :FatoresDeMultiplicacao, 'boleto_bancario/calculos/fatores_de_multiplicacao'
73
+ autoload :LinhaDigitavel, 'boleto_bancario/calculos/linha_digitavel'
74
+ autoload :Modulo10, 'boleto_bancario/calculos/modulo10'
75
+ autoload :Modulo11, 'boleto_bancario/calculos/modulo11'
76
+ autoload :Modulo11FatorDe2a9, 'boleto_bancario/calculos/modulo11_fator_de2a9'
77
+ autoload :Modulo11FatorDe2a9RestoZero, 'boleto_bancario/calculos/modulo11_fator_de2a9_resto_zero'
78
+ autoload :Modulo11FatorDe2a7, 'boleto_bancario/calculos/modulo11_fator_de2a7'
79
+ autoload :Modulo11FatorDe9a2RestoX, 'boleto_bancario/calculos/modulo11_fator_de9a2_resto_x'
80
+ autoload :ModuloNumeroDeControle, 'boleto_bancario/calculos/modulo_numero_de_controle'
81
+ autoload :Digitos, 'boleto_bancario/calculos/digitos'
82
+ end
83
+
84
+ include Core
85
+ end
@@ -0,0 +1,35 @@
1
+ # encoding: utf-8
2
+ require 'active_support/core_ext/enumerable'
3
+
4
+ module BoletoBancario
5
+ module Calculos
6
+ # Classe responsável por lidar com os dígitos dos módulos.
7
+ #
8
+ class Digitos
9
+ # @param [Integer] number Número que servirá para os cálculo com os dígitos desse número.
10
+ #
11
+ def initialize(number)
12
+ @number = number
13
+ end
14
+
15
+ # Soma cada dígito do número passado no #initialize.
16
+ # Alguns bancos requerem esse tipo estranho de cálculo em alguns módulos.
17
+ # @return [Fixnum] Resultado da soma de cada dígito.
18
+ #
19
+ # @example
20
+ #
21
+ # Digitos.new(12).sum
22
+ # # => 3
23
+ #
24
+ # Digitos.new(2244).sum
25
+ # # => 12
26
+ #
27
+ # Digitos.new(90123451).sum
28
+ # # => 25
29
+ #
30
+ def sum
31
+ @number.to_s.split('').collect { |number| number.to_i }.sum
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,87 @@
1
+ # encoding: utf-8
2
+ module BoletoBancario
3
+ module Calculos
4
+ # Classe responsável pelo cálculo de Fator de Vencimento do boleto bancário.
5
+ #
6
+ # === Descricão
7
+ #
8
+ # Conforme Carta-circular 002926 do Banco Central do Brasil, de 24/07/2000, recomenda-se a indicação do Fator de Vencimento no Código de Barras.
9
+ # A partir de 02/04/2001, o Banco acolhedor/recebedor não será mais responsável por eventuais diferenças de recebimento de BOLETOs fora do prazo,
10
+ # ou sem a indicação do fator de vencimento.
11
+ #
12
+ # === Forma para obtenção do Fator de Vencimento
13
+ #
14
+ # Calcula-se <b>o número de dias corridos</b> entre a data base (<b>“Fixada” em 07/10/1997</b>) e a do vencimento desejado:
15
+ #
16
+ # Vencimento desejado: 04/07/2000
17
+ # Data base : - 07/10/1997
18
+ # # => 1001
19
+ #
20
+ # === Atenção
21
+ #
22
+ # Caso ocorra divergência entre a data impressa no campo “data de vencimento” e a constante no código de barras,
23
+ # o recebimento se dará da seguinte forma:
24
+ #
25
+ # * Quando pago por sistemas eletrônicos (Home-Banking, Auto-Atendimento, Internet, SISPAG, telefone, etc.), prevalecerá à representada no “código de barras”;
26
+ # * Quando quitado na rede de agências, diretamente no caixa, será considerada a data impressa no campo “vencimento” do BOLETO.
27
+ #
28
+ # @return [String] retorna o resultado do cálculo. <b>Deve conter 4 dígitos</b>.
29
+ #
30
+ # @example
31
+ #
32
+ # FatorVencimento.new(Date.parse("2012-12-02"))
33
+ # #=> "5535"
34
+ #
35
+ # FatorVencimento.new(Date.parse("1997-10-08"))
36
+ # #=> "0001"
37
+ #
38
+ # FatorVencimento.new(Date.parse("2012-12-16"))
39
+ # #=> "5549"
40
+ #
41
+ # FatorVencimento.new(Date.parse("2014-12-15"))
42
+ # #=> "6278"
43
+ #
44
+ class FatorVencimento < String
45
+ attr_reader :base_date
46
+ # @param [Date] expiration_date
47
+ # @param [Date] base_date
48
+ # @return [String] retorna o resultado do cálculo. <b>Deve conter 4 dígitos</b>.
49
+ # @example
50
+ # FatorVencimento.new(Date.parse("2012-09-02"))
51
+ # #=> "5444"
52
+ #
53
+ # FatorVencimento.new(Date.parse("1999-10-01"))
54
+ # #=> "0724"
55
+ #
56
+ # FatorVencimento.new(Date.parse("2022-12-16"))
57
+ # #=> "9201"
58
+ #
59
+ def initialize(expiration_date, base_date = Date.new(1997, 10, 7))
60
+ @base_date = base_date
61
+ @expiration_date = expiration_date
62
+
63
+ if @expiration_date.present?
64
+ super(calculate)
65
+ end
66
+ end
67
+
68
+ # Cálculo da data de vencimento com a data base.
69
+ #
70
+ # @return [String] exatamente 4 dígitos
71
+ #
72
+ def calculate
73
+ expiration_date_minus_base_date.to_s.rjust(4, '0')
74
+ end
75
+
76
+ # @api private
77
+ #
78
+ # Cálculo da data de vencimento com a data base.
79
+ # Chamando #to_i para não retornar um Float.
80
+ # @return [Integer] diff between this two dates.
81
+ #
82
+ def expiration_date_minus_base_date
83
+ (@expiration_date - @base_date).to_i
84
+ end
85
+ end
86
+ end
87
+ end
@@ -0,0 +1,67 @@
1
+ # encoding: utf-8
2
+ module BoletoBancario
3
+ module Calculos
4
+ # Classe responsável por multiplicar cada dígito pelos fatores de multiplicação passado como argumento.
5
+ #
6
+ # Imagine que temos o número <b>'2468'</b> e os fatores de multiplicação <b>[2, 1]</b>.
7
+ #
8
+ # Será calculado da seguinte maneira:
9
+ #
10
+ # 2 4 6 8
11
+ # * * * * ===> Multiplicação
12
+ # 1 2 1 2
13
+ #
14
+ # #=> [2, 8, 6, 16]
15
+ #
16
+ # Você pode passar outros fatores de multiplicação se você precisar.
17
+ # Por exemplo, dado o número '1234567890' e os fatores de multiplicação: <b>[2, 3, 4, 5, 6, 7, 8, 9]</b>.
18
+ # Será calculado da seguinte maneira:
19
+ #
20
+ # 1 2 3 4 5 6 7 8 9 0
21
+ # * * * * * * * * * *
22
+ # 3 2 9 8 7 6 5 4 3 2
23
+ #
24
+ # #=> [3, 4, 27, 32, 35, 36, 35, 32, 27, 0]
25
+ #
26
+ # @param [String] O número que será usado para multiplicar cada dígito.
27
+ # @param [Hash] Os fatores de multiplicação que irão ser calculados na ordem reversa.
28
+ #
29
+ # @example Calculo
30
+ #
31
+ # BoletoBancario::Calculos::FatoresDeMultiplicacao.new(123, fatores: [2, 1])
32
+ # # => [1, 2, 6]
33
+ #
34
+ # BoletoBancario::Calculos::FatoresDeMultiplicacao.new(123, fatores: [2, 3, 4, 5, 6, 7, 8, 9])
35
+ # # => [4, 6, 6]
36
+ #
37
+ # BoletoBancario::Calculos::FatoresDeMultiplicacao.new(809070608090, fatores: [9, 8, 7, 6, 5, 4, 3, 2])
38
+ # # => [48, 0, 72, 0, 14, 0, 24, 0, 48, 0, 72, 0]
39
+ #
40
+ class FatoresDeMultiplicacao < Array
41
+ # @param [String || Integer] number
42
+ # @param [Hash] options
43
+ # @option options [Array] :fatores
44
+ # @return [Array]
45
+ # @example
46
+ #
47
+ # FatoresDeMultiplicacao.new(12, fatores: [2, 1])
48
+ # # => [1, 4]
49
+ #
50
+ # FatoresDeMultiplicacao.new(1864, fatores: [2, 3, 4, 5, 6, 7, 8, 9])
51
+ # # => [5, 32, 18, 8]
52
+ #
53
+ def initialize(number, options)
54
+ @number = number.to_s.reverse.split('')
55
+ @factors = options.fetch(:fatores).cycle.take(@number.size)
56
+ super(calculate)
57
+ end
58
+
59
+ # Para cada número realiza a multiplicação para cada dígito.
60
+ # @return [Array]
61
+ #
62
+ def calculate
63
+ @number.collect.each_with_index { |n, index| n.to_i * @factors[index] }.reverse
64
+ end
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,158 @@
1
+ # encoding: utf-8
2
+ require 'active_support/core_ext/object'
3
+
4
+ module BoletoBancario
5
+ module Calculos
6
+ # Representação numérica do código de barras, mais conhecida como linha digitável! :p
7
+ #
8
+ # A representação numérica do código de barras é composta, por cinco campos.
9
+ # Sendo os três primeiros campos, amarrados por DAC's (dígitos verificadores),
10
+ # todos calculados pelo módulo 10.
11
+ #
12
+ # <b>OBS.:</b> Para mais detalhes deste cálculo, veja a descrição em Modulo10.
13
+ #
14
+ # === Linha Digitável
15
+ #
16
+ # A linha digitável contêm exatamente 47 posições nessa sequência:
17
+ #
18
+ # _____________________________________________________________________________________________________________
19
+ # |Campo | Posição | Tamanho | Descrição |
20
+ # |------|----------|---------|--------------------------------------------------------------------------------|
21
+ # | 1º | 01-03 | 03 | Código do banco (posições 1 a 3 do código de barras) |
22
+ # | | 04 | 01 | Código da moeda (posição 4 do código de barras) |
23
+ # | | 05-09 | 5 | Cinco primeiras posições do campo livre (posições 20 a 24 do código de barras) |
24
+ # | | 10 | 1 | Dígito verificador do primeiro campo (Módulo10) |
25
+ # |------------------------------------------------------------------------------------------------------------|
26
+ # | 2º | 11-20 | 10 | 6º a 15º posições do campo livre (posições 25 a 34 do código de barras) |
27
+ # | | 21 | 01 | Dígito verificador do segundo campo (Módulo10) |
28
+ # |------------------------------------------------------------------------------------------------------------|
29
+ # | 3º | 22-31 | 10 | 16º a 25º posições do campo livre (posições 35 a 44 do código de barras) |
30
+ # | | 32 | 01 | Dígito verificador do terceiro campo (Módulo10) |
31
+ # |------------------------------------------------------------------------------------------------------------|
32
+ # | 4º | 33 | 01 | Dígito verificador do código de barras (posição 5 do código de barras) |
33
+ # |------------------------------------------------------------------------------------------------------------|
34
+ # | 5ª | 34-37 | 04 | Fator de vencimento (posições 6 a 9 do código de barras) |
35
+ # | | 38-47 | 10 | Valor nominal do documento (posições 10 a 19 do código de barras) |
36
+ # -------------------------------------------------------------------------------------------------------------|
37
+ #
38
+ # @return [String] Contêm a representação numérica do código de barras formatado com pontos e espaços.
39
+ #
40
+ # @example
41
+ #
42
+ # LinhaDigitavel.new('34196166700000123451091234567880057123457000')
43
+ # # => '34191.09123 34567.880058 71234.570001 6 16670000012345'
44
+ #
45
+ # LinhaDigitavel.new('99991101200000350007772130530150081897500000')
46
+ # # => '99997.77213 30530.150082 18975.000003 1 10120000035000'
47
+ #
48
+ # LinhaDigitavel.new('39998100100000311551111122222500546666666001')
49
+ # # => '39991.11119 22222.500542 66666.660015 8 10010000031155'
50
+ #
51
+ class LinhaDigitavel < String
52
+ attr_reader :codigo_de_barras
53
+ # @param [String] codigo_de_barras Código de Barras de 44 posições
54
+ # @return [String]
55
+ #
56
+ # Representação numérica do código de barras
57
+ #
58
+ # @example
59
+ #
60
+ # LinhaDigitavel.new('34196166700000123451091234567880057123457000')
61
+ # # => '34191.09123 34567.880058 71234.570001 6 16670000012345'
62
+ #
63
+ # LinhaDigitavel.new('99991101200000350007772130530150081897500000')
64
+ # # => '99997.77213 30530.150082 18975.000003 1 10120000035000'
65
+ #
66
+ # LinhaDigitavel.new('39998100100000311551111122222500546666666001')
67
+ # # => '39991.11119 22222.500542 66666.660015 8 10010000031155'
68
+ #
69
+ # # Retorna uma String vazia caso o código de barras esteja vazio.
70
+ # LinhaDigitavel.new('')
71
+ # # => ''
72
+ #
73
+ # # Retorna uma String vazia caso o código de barras esteja vazio.
74
+ # LinhaDigitavel.new(nil)
75
+ # # => ''
76
+ #
77
+ # # Retorna uma String vazia caso o código de barras seja menor que 44 posições.
78
+ # LinhaDigitavel.new('123456789')
79
+ # # => ''
80
+ #
81
+ # # Retorna uma String vazia caso o código de barras seja maior que 44 posições.
82
+ # LinhaDigitavel.new('12345678901234567890123456789012345678901234567890')
83
+ # # => ''
84
+ #
85
+ def initialize(codigo_de_barras)
86
+ @codigo_de_barras = codigo_de_barras.to_s
87
+
88
+ if @codigo_de_barras.present? and @codigo_de_barras.size == 44
89
+ super(representacao_numerica_do_codigo_de_barras)
90
+ else
91
+ super('')
92
+ end
93
+ end
94
+
95
+ # @return [String] Retorna todos os campos da linha digitável pegando as posições exatas do código de barras.
96
+ #
97
+ def representacao_numerica_do_codigo_de_barras
98
+ "#{primeiro_campo} #{segundo_campo} #{terceiro_campo} #{quarto_campo} #{quinto_campo}"
99
+ end
100
+
101
+ # @api private
102
+ #
103
+ # Retorna o primeiro campo da linha digitável com seu respectivo dígito verificador.
104
+ #
105
+ # @return [String]
106
+ #
107
+ def primeiro_campo
108
+ primeiro_campo_sem_digito = "#{codigo_de_barras[0..3]}#{codigo_de_barras[19..23]}"
109
+ digito_verificador = Modulo10.new(primeiro_campo_sem_digito)
110
+ "#{primeiro_campo_sem_digito}#{digito_verificador}".gsub(/^(.{5})(.{5})/, '\1.\2')
111
+ end
112
+
113
+ # @api private
114
+ #
115
+ # Retorna o segundo campo da linha digitável com seu respectivo dígito verificador.
116
+ #
117
+ # @return [String]
118
+ #
119
+ def segundo_campo
120
+ segundo_campo_sem_digito = "#{codigo_de_barras[24..33]}"
121
+ digito_verificador = Modulo10.new(segundo_campo_sem_digito)
122
+ "#{segundo_campo_sem_digito}#{digito_verificador}".gsub(/(.{5})(.{6})/, '\1.\2')
123
+ end
124
+
125
+ # @api private
126
+ #
127
+ # Retorna o terceiro campo da linha digitável com seu respectivo dígito verificador.
128
+ #
129
+ # @return [String]
130
+ #
131
+ def terceiro_campo
132
+ terceiro_campo_sem_digito = "#{codigo_de_barras[34..46]}"
133
+ digito_verificador = Modulo10.new(terceiro_campo_sem_digito)
134
+ "#{terceiro_campo_sem_digito}#{digito_verificador}".gsub(/(.{5})(.{6})/, '\1.\2')
135
+ end
136
+
137
+ # @api private
138
+ #
139
+ # Retorna o dígito verificador do código de barras (posição 5 do código de barras)
140
+ #
141
+ # @return [String]
142
+ #
143
+ def quarto_campo
144
+ "#{codigo_de_barras[4]}"
145
+ end
146
+
147
+ # @api private
148
+ #
149
+ # Retorna o quinto e último campo da linha digitável.
150
+ #
151
+ # @return [String]
152
+ #
153
+ def quinto_campo
154
+ "#{codigo_de_barras[5..8]}#{codigo_de_barras[9..18]}"
155
+ end
156
+ end
157
+ end
158
+ end