br_boleto 0.1.0

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 (46) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +15 -0
  3. data/Gemfile.lock +145 -0
  4. data/History.txt +4 -0
  5. data/LICENSE +20 -0
  6. data/README.markdown +156 -0
  7. data/Rakefile +8 -0
  8. data/br_boleto.gemspec +26 -0
  9. data/lib/br_boleto.rb +87 -0
  10. data/lib/br_boleto/calculos/digitos.rb +35 -0
  11. data/lib/br_boleto/calculos/fator_vencimento.rb +129 -0
  12. data/lib/br_boleto/calculos/fatores_de_multiplicacao.rb +67 -0
  13. data/lib/br_boleto/calculos/linha_digitavel.rb +158 -0
  14. data/lib/br_boleto/calculos/modulo10.rb +83 -0
  15. data/lib/br_boleto/calculos/modulo11.rb +54 -0
  16. data/lib/br_boleto/calculos/modulo11_fator3197.rb +88 -0
  17. data/lib/br_boleto/calculos/modulo11_fator_de2a7.rb +97 -0
  18. data/lib/br_boleto/calculos/modulo11_fator_de2a9.rb +83 -0
  19. data/lib/br_boleto/calculos/modulo11_fator_de2a9_resto_zero.rb +29 -0
  20. data/lib/br_boleto/calculos/modulo11_fator_de9a2.rb +65 -0
  21. data/lib/br_boleto/calculos/modulo11_fator_de9a2_resto_x.rb +55 -0
  22. data/lib/br_boleto/calculos/modulo_numero_de_controle.rb +117 -0
  23. data/lib/br_boleto/core/boleto.rb +558 -0
  24. data/lib/br_boleto/core/sicoob.rb +169 -0
  25. data/lib/br_boleto/version.rb +8 -0
  26. data/test/br_boleto/calculos/digitos_test.rb +15 -0
  27. data/test/br_boleto/calculos/fator_vencimento_test.rb +56 -0
  28. data/test/br_boleto/calculos/fatores_de_multiplicacao_test.rb +66 -0
  29. data/test/br_boleto/calculos/linha_digitavel_test.rb +58 -0
  30. data/test/br_boleto/calculos/modulo10_test.rb +54 -0
  31. data/test/br_boleto/calculos/modulo11_fator3197_test.rb +43 -0
  32. data/test/br_boleto/calculos/modulo11_fator_de2a7_test.rb +44 -0
  33. data/test/br_boleto/calculos/modulo11_fator_de2a9_resto_zero_test.rb +40 -0
  34. data/test/br_boleto/calculos/modulo11_fator_de2a9_test.rb +68 -0
  35. data/test/br_boleto/calculos/modulo11_fator_de9a2_resto_x_test.rb +38 -0
  36. data/test/br_boleto/calculos/modulo11_fator_de9a2_test.rb +32 -0
  37. data/test/br_boleto/calculos/modulo11_test.rb +28 -0
  38. data/test/br_boleto/calculos/modulo_numero_de_controle_test.rb +38 -0
  39. data/test/br_boleto/core/boleto_test.rb +221 -0
  40. data/test/br_boleto/core/sicoob_test.rb +138 -0
  41. data/test/factories/boleto.rb +22 -0
  42. data/test/factories/boleto_sicoob.rb +23 -0
  43. data/test/inheritance/boleto_test.rb +15 -0
  44. data/test/inheritance/sicoob_test.rb +25 -0
  45. data/test/test_helper.rb +37 -0
  46. metadata +151 -0
@@ -0,0 +1,54 @@
1
+ module BrBoleto
2
+ module Calculos
3
+ # Classe que possue a convenção de calculo do modulo 11.
4
+ # O que muda para cada classe é a forma de verificar o total do cálculo.
5
+ #
6
+ # @abstract Precisa implementar { #fatores, #calculate } nas subclasses.
7
+ #
8
+ class Modulo11 < String
9
+ # Número que será feito o cálculo do módulo 11.
10
+ #
11
+ attr_reader :number
12
+
13
+ # @param [String ou Integer] number (Corresponde ao número a ser calculado pelo Módulo 11)
14
+ # @return [String]
15
+ #
16
+ def initialize(number)
17
+ @number = number
18
+
19
+ super(calculate.to_s)
20
+ end
21
+
22
+ # @return [Array] Fatores que serão multiplicados por cada digito do
23
+ # número passado como argumento no initialize.
24
+ # @raise [NotImplementedError] Precisa implementar na subclasse
25
+ #
26
+ def fatores
27
+ raise NotImplementedError, "Not implemented #fatores in subclass."
28
+ end
29
+
30
+ # @return [Fixnum]
31
+ # @raise [NotImplementedError] Precisa implementar na subclasse
32
+ #
33
+ def calculate
34
+ raise NotImplementedError, "Not implemented #calculate in subclass."
35
+ end
36
+
37
+ # Realiza o cálculo retornando o resto da divisão do cálculo dos fatores por 11.
38
+ #
39
+ # @return [Fixnum] Resto da divisão por 11.
40
+ #
41
+ def mod_division
42
+ @mod_division ||= FatoresDeMultiplicacao.new(@number, fatores: fatores).sum % 11
43
+ end
44
+
45
+ # Subtrai 11 do resto da divisão para se ter o total do módulo 11.
46
+ #
47
+ # @return [Fixnum]
48
+ #
49
+ def total
50
+ @total ||= 11 - mod_division
51
+ end
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,88 @@
1
+ module BrBoleto
2
+ module Calculos
3
+ # === Módulo 11 Fator 3197
4
+ #
5
+ # === Passos
6
+ #
7
+ # 1) Tomando-se os algarismos multiplique-os, iniciando-se da direita para a esquerda,
8
+ # pela seqüência numérica (3, 1, 9 ,7, 3, 1, 9 ,7 ... e assim por diante).
9
+ #
10
+ # 2) Some o resultado de cada produto efetuado e determine o total como (N).
11
+ #
12
+ # 3) Divida o total (N) por 11 e determine o resto obtido da divisão como Mod 11(N).
13
+ #
14
+ # 4) Calcule o dígito verificador (DAC) através da expressão:
15
+ #
16
+ # DIGIT = 11 - Mod 11 (n)
17
+ #
18
+ # <b>OBS.:</b> Se o resto da divisão for “1” ou "0", o resultado deve ser = 0
19
+ #
20
+ # ==== Exemplo
21
+ #
22
+ # Considerando o seguinte número: '306900008281900010005'.
23
+ #
24
+ # 1) Multiplicando a seqüência de multiplicadores:
25
+ #
26
+ # 3 0 6 9 0 0 0 0 8 2 8 1 9 0 0 0 1 0 0 0 5
27
+ # * * * * * * * * * * * * * * * * * * * * *
28
+ # 3 1 9 7 3 1 9 7 3 1 9 7 3 1 9 7 3 1 9 7 3
29
+ #
30
+ # 2) Soma-se o resultado dos produtos obtidos no item “1” acima:
31
+ #
32
+ # 9 0 54 63 0 0 0 0 24 2 72 7 27 0 0 0 3 0 0 0 15
33
+ # # => 204
34
+ #
35
+ # 3) Determina-se o resto da Divisão:
36
+ #
37
+ # 204 % 11
38
+ # # => 55
39
+ # Como é maior que 10, então pega-se 60-55 = 5
40
+ # Por exemplo, se fosse 27, então pegaria 30-27 = 3
41
+ #
42
+ # 4) Calcula-se o DAC:
43
+ #
44
+ # 11 - 5
45
+ # # => 6 =============> Resultado final retornado.
46
+ #
47
+ # @param [String]: Corresponde ao número a ser calculado o Módulo 11 no fator de 2 a 7.
48
+ # @return [String] Retorna o resultado do cálculo descrito acima.
49
+ #
50
+ # @example
51
+ #
52
+ # BrBoleto::Calculos::Modulo11FatorDe2a7.new('20')
53
+ # # => '5'
54
+ #
55
+ # BrBoleto::Calculos::Modulo11FatorDe2a7.new('64')
56
+ # # => '7'
57
+ #
58
+ # BrBoleto::Calculos::Modulo11FatorDe2a7.new('26')
59
+ # # => '4'
60
+ #
61
+ # BrBoleto::Calculos::Modulo11FatorDe2a7.new('6')
62
+ # # => 'P'
63
+ #
64
+ # BrBoleto::Calculos::Modulo11FatorDe2a7.new('14')
65
+ # # => '0'
66
+ #
67
+ class Modulo11Fator3197 < Modulo11
68
+ # Sequência numérica 3197 que será feito a multiplicação de cada dígito
69
+ # do número passado no #initialize.
70
+ #
71
+ # @return [Array] Sequência numérica
72
+ #
73
+ def fatores
74
+ [3,7,9,1]
75
+ end
76
+
77
+ # @return [Fixnum]
78
+ #
79
+ def calculate
80
+ if mod_division.equal?(1) or mod_division.equal?(0)
81
+ 0
82
+ else
83
+ total
84
+ end
85
+ end
86
+ end
87
+ end
88
+ end
@@ -0,0 +1,97 @@
1
+ module BrBoleto
2
+ module Calculos
3
+ # === Módulo 11 Fator de 2 a 7
4
+ #
5
+ # === Passos
6
+ #
7
+ # 1) Tomando-se os algarismos multiplique-os, iniciando-se da direita para a esquerda,
8
+ # pela seqüência numérica de 2 a 7 (2, 3, 4, 5, 6, 7 ... e assim por diante).
9
+ #
10
+ # 2) Some o resultado de cada produto efetuado e determine o total como (N).
11
+ #
12
+ # 3) Divida o total (N) por 11 e determine o resto obtido da divisão como Mod 11(N).
13
+ #
14
+ # 4) Calcule o dígito verificador (DAC) através da expressão:
15
+ #
16
+ # DIGIT = 11 - Mod 11 (n)
17
+ #
18
+ # <b>OBS.:</b> Se o resto da divisão for “1”, desprezar a diferença entre o divisor
19
+ # menos o resto que será “10” e considerar o dígito como “P”.
20
+ #
21
+ # <b>OBS.:</b> Se o resto da divisão for “0”, desprezar o cálculo de subtração entre
22
+ # divisor e resto, e considerar o “0” como dígito.
23
+ #
24
+ # ==== Exemplo
25
+ #
26
+ # Considerando o seguinte número: '89234560'.
27
+ #
28
+ # 1) Multiplicando a seqüência de multiplicadores:
29
+ #
30
+ # 1 9 0 0 0 0 0 0 0 0 0 0 2
31
+ # * * * * * * * * * * * * *
32
+ # 2 7 6 5 4 3 2 7 6 5 4 3 2
33
+ #
34
+ # 2) Soma-se o resultado dos produtos obtidos no item “1” acima:
35
+ #
36
+ # 2 + 63 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 4
37
+ # # => 69
38
+ #
39
+ # 3) Determina-se o resto da Divisão:
40
+ #
41
+ # 69 % 11
42
+ # # => 3
43
+ #
44
+ # 4) Calcula-se o DAC:
45
+ #
46
+ # 11 - 3
47
+ # # => 8 =============> Resultado final retornado.
48
+ #
49
+ # @param [String]: Corresponde ao número a ser calculado o Módulo 11 no fator de 2 a 7.
50
+ # @return [String] Retorna o resultado do cálculo descrito acima.
51
+ #
52
+ # @example
53
+ #
54
+ # BrBoleto::Calculos::Modulo11FatorDe2a7.new('20')
55
+ # # => '5'
56
+ #
57
+ # BrBoleto::Calculos::Modulo11FatorDe2a7.new('64')
58
+ # # => '7'
59
+ #
60
+ # BrBoleto::Calculos::Modulo11FatorDe2a7.new('26')
61
+ # # => '4'
62
+ #
63
+ # BrBoleto::Calculos::Modulo11FatorDe2a7.new('6')
64
+ # # => 'P'
65
+ #
66
+ # BrBoleto::Calculos::Modulo11FatorDe2a7.new('14')
67
+ # # => '0'
68
+ #
69
+ class Modulo11FatorDe2a7 < Modulo11
70
+ # Sequência numérica de 2 a 7 que será feito a multiplicação de cada dígito
71
+ # do número passado no #initialize.
72
+ #
73
+ # @return [Array] Sequência numérica
74
+ #
75
+ def fatores
76
+ [2, 3, 4, 5, 6, 7]
77
+ end
78
+
79
+ # Calcula o número pelos fatores de multiplicação de 2 a 7.
80
+ # Depois calcula o resto da divisão por 11 e subtrai por 11.
81
+ # Se o resultado desse cálculo for igual a 11, considere DAC = 0.
82
+ # Se o resultado desse cálculo for igual a 10, considere DAC = P.
83
+ #
84
+ # @return [Fixnum]
85
+ #
86
+ def calculate
87
+ return 0 if total.equal?(11)
88
+
89
+ if total == 10
90
+ 'P'
91
+ else
92
+ total
93
+ end
94
+ end
95
+ end
96
+ end
97
+ end
@@ -0,0 +1,83 @@
1
+ # encoding: utf-8
2
+ module BrBoleto
3
+ module Calculos
4
+ # === Módulo 11 Fator de 2 a 9
5
+ #
6
+ # === Passos
7
+ #
8
+ # 1) Tomando-se os algarismos multiplique-os, iniciando-se da direita para a esquerda,
9
+ # pela seqüência numérica de 2 a 9 (2, 3, 4, 5, 6, 7, 8, 9 ... e assim por diante).
10
+ #
11
+ # 2) Some o resultado de cada produto efetuado e determine o total como (N).
12
+ #
13
+ # 3) Divida o total (N) por 11 e determine o resto obtido da divisão como Mod 11(N).
14
+ #
15
+ # 4) Calcule o dígito verificador (DAC) através da expressão:
16
+ #
17
+ # DIGIT = 11 - Mod 11 (n)
18
+ #
19
+ # <b>OBS.:</b> Se o resultado desta expressão for igual a 0, 1, 10 ou 11, considere DAC = 1.
20
+ #
21
+ # ==== Exemplo
22
+ #
23
+ # Considerando o seguinte número: '89234560'.
24
+ #
25
+ # 1) Multiplicando a seqüência de multiplicadores:
26
+ #
27
+ # 8 9 2 3 4 5 6 0
28
+ # * * * * * * * *
29
+ # 9 8 7 6 5 4 3 2
30
+ #
31
+ # 2) Soma-se o resultado dos produtos obtidos no item “1” acima:
32
+ #
33
+ # 72 + 72 + 14 + 18 + 20 + 20 + 18 + 0
34
+ # # => 234
35
+ #
36
+ # 3) Determina-se o resto da Divisão:
37
+ #
38
+ # 234 % 11
39
+ # # => 3
40
+ #
41
+ # 4) Calcula-se o DAC:
42
+ #
43
+ # 11 - 3
44
+ # # => 8 =============> Resultado final retornado.
45
+ #
46
+ # @param [String]: Corresponde ao número a ser calculado o Módulo 11 no fator de 2 a 9.
47
+ # @return [String] Retorna o resultado do cálculo descrito acima.
48
+ #
49
+ # @example
50
+ #
51
+ # BrBoleto::Calculos::Modulo11FatorDe2a9.new('1')
52
+ # # => '9'
53
+ #
54
+ # BrBoleto::Calculos::Modulo11FatorDe2a9.new('91')
55
+ # # => '4'
56
+ #
57
+ # BrBoleto::Calculos::Modulo11FatorDe2a9.new('189')
58
+ # # => '9'
59
+ #
60
+ class Modulo11FatorDe2a9 < Modulo11
61
+ # Sequência numérica de 2 a 9 que será feito a multiplicação de cada dígito
62
+ # do número passado no #initialize.
63
+ #
64
+ # @return [Array] Sequência numérica
65
+ #
66
+ def fatores
67
+ [2, 3, 4, 5, 6, 7, 8, 9]
68
+ end
69
+
70
+ # Calcula o número pelos fatores de multiplicação de 2 a 9.
71
+ # Depois calcula o resto da divisão por 11 e subtrai por 11.
72
+ # Se o resultado desse cálculo for igual a 0, 1, 10 ou 11, considere DAC = 1.
73
+ #
74
+ # @return [Fixnum]
75
+ #
76
+ def calculate
77
+ return 1 if total > 9
78
+
79
+ total
80
+ end
81
+ end
82
+ end
83
+ end
@@ -0,0 +1,29 @@
1
+ module BrBoleto
2
+ module Calculos
3
+ # Classe responsável por calcular o módulo 11 com fatores de 2 a 9.
4
+ # <b>Essa classe difere da outra com Modulo11FatorDe2a9, no momento de verificar o resto da divisão por 11.</b>
5
+ #
6
+ # <b>Para mais detalhes veja a classe Modulo11FatorDe2a9.</b>
7
+ #
8
+ class Modulo11FatorDe2a9RestoZero < Modulo11FatorDe2a9
9
+ # Realiza o cálculo do módulo 11 com fatores de 2 a 9.
10
+ #
11
+ # === Resto Da divisão por 11
12
+ #
13
+ # * Se o resto da divisão por 11 for igual a 10, o digito será '1' (um),
14
+ # * Se o resto da divisão por 11 for igual a 1 (um) ou 0 (zero) o digito será 0 (zero).
15
+ #
16
+ # Qualquer “RESTO” diferente de “0, 1 ou 10”, subtrair o resto de 11 para obter o digíto.
17
+ #
18
+ # @return [Fixnum] Resultado da subtração ou resultado da verificação do resto da divisão.
19
+ #
20
+ def calculate
21
+ if mod_division.equal?(1) or mod_division.equal?(0)
22
+ 0
23
+ else
24
+ total
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,65 @@
1
+ module BrBoleto
2
+ module Calculos
3
+ # === Módulo 11 Fator de 9 a 2
4
+ #
5
+ # === Passos
6
+ #
7
+ # 1) Tomando-se os algarismos multiplique-os, iniciando-se da direita para a esquerda,
8
+ # pela seqüência numérica de 9 a 2 (9, 8, 7, 6, 5, 4, 3, 2 ... e assim por diante).
9
+ #
10
+ # 2) Some o resultado de cada produto efetuado e determine o total como (N).
11
+ #
12
+ # 3) Divida o total (N) por 11 e determine o resto obtido da divisão como Mod 11(N).
13
+ #
14
+ # ==== Exemplo Normal
15
+ #
16
+ # Considerando o seguinte número: '89234560'.
17
+ #
18
+ # 1) Multiplicando a seqüência de multiplicadores:
19
+ #
20
+ # 8 9 2 3 4 5 6 0
21
+ # * * * * * * * *
22
+ # 2 3 4 5 6 7 8 9
23
+ #
24
+ # 2) Soma-se o resultado dos produtos obtidos no item “1” acima:
25
+ #
26
+ # 16 + 27 + 8 + 15 + 24 + 35 + 48 + 0
27
+ # # => 173
28
+ #
29
+ # 3) Determina-se o resto da Divisão:
30
+ #
31
+ # 173 % 11
32
+ # # => 8 =============> Resultado final retornado.
33
+ #
34
+ # @param [String]: Corresponde ao número a ser calculado o Módulo 11 no fator de 9 a 2.
35
+ # @return [String] Retorna o resultado do cálculo descrito acima.
36
+ #
37
+ # @example
38
+ #
39
+ # BrBoleto::Calculos::Modulo11FatorDe9a2.new('12345')
40
+ # # => '5'
41
+ #
42
+ # BrBoleto::Calculos::Modulo11FatorDe9a2.new('246')
43
+ # # => '1'
44
+ #
45
+ class Modulo11FatorDe9a2 < Modulo11
46
+ # Sequência numérica de 9 a 2 que será feito a multiplicação de cada dígito
47
+ # do número passado no #initialize.
48
+ #
49
+ # @return [Array] Sequência numérica
50
+ #
51
+ def fatores
52
+ [9, 8, 7, 6, 5, 4, 3, 2]
53
+ end
54
+
55
+ # Calcula o número pelos fatores de multiplicação de 9 a 2.
56
+ # Depois calcula o resto da divisão por 11.
57
+ #
58
+ # @return [Fixnum]
59
+ #
60
+ def calculate
61
+ mod_division
62
+ end
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,55 @@
1
+ module BrBoleto
2
+ module Calculos
3
+ # === Módulo 11 Fator de 9 a 2 - Resto 10, sendo X
4
+ # <b>Essa classe difere da outra com Modulo11FatorDe9a2, no momento de verificar o resto da divisão por 11.</b>
5
+ #
6
+ # <b>Para mais detalhes veja a classe Modulo11FatorDe9a2.</b>
7
+ #
8
+ # ==== Exemplo 10 como resto da divisão
9
+ #
10
+ # Considerando o seguinte número: '100008'.
11
+ #
12
+ # 1) Multiplicando a seqüência de multiplicadores:
13
+ #
14
+ # 1 0 0 0 0 8
15
+ # * * * * * *
16
+ # 4 5 6 7 8 9
17
+ #
18
+ # 2) Soma-se o resultado dos produtos obtidos no item “1” acima:
19
+ #
20
+ # 4 + 0 + 0 + 0 + 0 + 72
21
+ # # => 76
22
+ #
23
+ # 3) Determina-se o resto da Divisão:
24
+ #
25
+ # 76 % 11
26
+ # # => 10
27
+ #
28
+ # 4) Quando o resultado for '10', o dígito será:
29
+ #
30
+ # resultado == 10
31
+ # # => 'X' =============> Resultado final retornado.
32
+ #
33
+ # @example
34
+ #
35
+ # BrBoleto::Calculos::Modulo11FatorDe9a2RestoX.new('184122')
36
+ # # => 'X'
37
+ #
38
+ class Modulo11FatorDe9a2RestoX < Modulo11FatorDe9a2
39
+ # Calcula o número pelos fatores de multiplicação de 9 a 2.
40
+ # Depois calcula o resto da divisão por 11.
41
+ # Se o resultado desse cálculo for igual a 10, então o DAC = X.
42
+ # Se o resultado desse cálculo for menor que 10, retornar o resultado.
43
+ #
44
+ # @return [Fixnum]
45
+ #
46
+ def calculate
47
+ if mod_division.equal?(10)
48
+ 'X'
49
+ else
50
+ mod_division
51
+ end
52
+ end
53
+ end
54
+ end
55
+ end