conectiva-boleto_bancario 0.0.2.beta

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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