br_boleto 1.2.2 → 2.0.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 (104) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/Gemfile.lock +1 -1
  4. data/README.markdown +278 -98
  5. data/br_boleto.gemspec +5 -3
  6. data/lib/br_boleto/active_model_base.rb +1 -1
  7. data/lib/br_boleto/association/have_conta.rb +109 -0
  8. data/lib/br_boleto/association/have_pagador.rb +38 -0
  9. data/lib/br_boleto/association/have_pagamentos.rb +44 -0
  10. data/lib/br_boleto/boleto/base.rb +50 -379
  11. data/lib/br_boleto/boleto/caixa.rb +28 -143
  12. data/lib/br_boleto/boleto/sicoob.rb +24 -144
  13. data/lib/br_boleto/conta/base.rb +288 -0
  14. data/lib/br_boleto/conta/caixa.rb +109 -0
  15. data/lib/br_boleto/conta/sicoob.rb +64 -0
  16. data/lib/br_boleto/helper/default_codes.rb +33 -0
  17. data/lib/br_boleto/helper/format_value.rb +1 -0
  18. data/lib/br_boleto/helper/number.rb +30 -0
  19. data/lib/br_boleto/pagador.rb +82 -0
  20. data/lib/br_boleto/remessa/base.rb +28 -50
  21. data/lib/br_boleto/remessa/cnab240/base.rb +22 -131
  22. data/lib/br_boleto/remessa/cnab240/caixa.rb +16 -62
  23. data/lib/br_boleto/remessa/cnab240/helper/header_arquivo.rb +7 -7
  24. data/lib/br_boleto/remessa/cnab240/helper/header_lote.rb +6 -6
  25. data/lib/br_boleto/remessa/cnab240/helper/segmento_p.rb +22 -22
  26. data/lib/br_boleto/remessa/cnab240/helper/segmento_q.rb +16 -16
  27. data/lib/br_boleto/remessa/cnab240/helper/segmento_r.rb +3 -3
  28. data/lib/br_boleto/remessa/cnab240/helper/segmento_s.rb +3 -3
  29. data/lib/br_boleto/remessa/cnab240/helper/trailer_arquivo.rb +3 -3
  30. data/lib/br_boleto/remessa/cnab240/helper/trailer_lote.rb +3 -3
  31. data/lib/br_boleto/remessa/cnab240/sicoob.rb +36 -73
  32. data/lib/br_boleto/remessa/cnab400/base.rb +95 -0
  33. data/lib/br_boleto/remessa/cnab400/helper/detalhe.rb +136 -0
  34. data/lib/br_boleto/remessa/cnab400/helper/header.rb +114 -0
  35. data/lib/br_boleto/remessa/cnab400/helper/trailer.rb +50 -0
  36. data/lib/br_boleto/remessa/cnab400/sicoob.rb +249 -0
  37. data/lib/br_boleto/remessa/lote.rb +1 -23
  38. data/lib/br_boleto/remessa/pagamento.rb +188 -51
  39. data/lib/br_boleto/retorno/base.rb +9 -0
  40. data/lib/br_boleto/retorno/cnab240/base.rb +2 -10
  41. data/lib/br_boleto/retorno/cnab400/base.rb +48 -0
  42. data/lib/br_boleto/retorno/cnab400/sicoob.rb +42 -0
  43. data/lib/br_boleto/retorno/pagamento.rb +12 -6
  44. data/lib/br_boleto/string_methods.rb +8 -2
  45. data/lib/br_boleto/validations.rb +19 -0
  46. data/lib/br_boleto/version.rb +3 -3
  47. data/lib/br_boleto.rb +38 -8
  48. data/lib/config/locales/br-boleto-en.yml +89 -0
  49. data/lib/config/locales/br-boleto-pt-BR.yml +89 -0
  50. data/test/br_boleto/association/have_conta_test.rb +319 -0
  51. data/test/br_boleto/association/have_pagador_test.rb +110 -0
  52. data/test/br_boleto/association/have_pagamentos_test.rb +113 -0
  53. data/test/br_boleto/boleto/base_test.rb +127 -201
  54. data/test/br_boleto/boleto/caixa_test.rb +58 -72
  55. data/test/br_boleto/boleto/sicoob_test.rb +88 -147
  56. data/test/br_boleto/conta/base_test.rb +490 -0
  57. data/test/br_boleto/conta/caixa_test.rb +154 -0
  58. data/test/br_boleto/conta/sicoob_test.rb +144 -0
  59. data/test/br_boleto/helper/number_test.rb +29 -0
  60. data/test/br_boleto/pagador_test.rb +158 -0
  61. data/test/br_boleto/remessa/base_test.rb +37 -62
  62. data/test/br_boleto/remessa/cnab240/base_test.rb +75 -95
  63. data/test/br_boleto/remessa/cnab240/caixa_test.rb +61 -96
  64. data/test/br_boleto/remessa/cnab240/helper/header_arquivo_test.rb +11 -11
  65. data/test/br_boleto/remessa/cnab240/helper/header_lote_test.rb +8 -8
  66. data/test/br_boleto/remessa/cnab240/helper/segmento_p_test.rb +17 -15
  67. data/test/br_boleto/remessa/cnab240/helper/segmento_q_test.rb +13 -13
  68. data/test/br_boleto/remessa/cnab240/helper/segmento_r_test.rb +2 -2
  69. data/test/br_boleto/remessa/cnab240/helper/segmento_s_test.rb +3 -3
  70. data/test/br_boleto/remessa/cnab240/helper/trailer_arquivo_test.rb +1 -1
  71. data/test/br_boleto/remessa/cnab240/helper/trailer_lote_test.rb +1 -1
  72. data/test/br_boleto/remessa/cnab240/sicoob_test.rb +136 -131
  73. data/test/br_boleto/remessa/cnab400/base_test.rb +263 -0
  74. data/test/br_boleto/remessa/cnab400/sicoob_test.rb +179 -0
  75. data/test/br_boleto/remessa/lote_test.rb +2 -41
  76. data/test/br_boleto/remessa/pagamento_test.rb +186 -188
  77. data/test/br_boleto/retorno/base_test.rb +0 -1
  78. data/test/br_boleto/retorno/cnab240/base_test.rb +12 -11
  79. data/test/br_boleto/retorno/cnab240/caixa_test.rb +11 -11
  80. data/test/br_boleto/retorno/cnab240/sicoob_test.rb +11 -11
  81. data/test/br_boleto/retorno/cnab400/sicoob_test.rb +227 -0
  82. data/test/br_boleto/retorno/pagamento_test.rb +6 -6
  83. data/test/factories/boleto/base.rb +9 -7
  84. data/test/factories/boleto/boleto_caixa.rb +2 -9
  85. data/test/factories/boleto/boleto_sicoob.rb +10 -8
  86. data/test/factories/conta/base.rb +10 -0
  87. data/test/factories/conta/caixa.rb +15 -0
  88. data/test/factories/conta/sicoob.rb +16 -0
  89. data/test/factories/pagador.rb +15 -0
  90. data/test/factories/remessa/base.rb +0 -6
  91. data/test/factories/remessa/cnab240/base.rb +0 -10
  92. data/test/factories/remessa/cnab240/caixa.rb +1 -6
  93. data/test/factories/remessa/cnab240/sicoob.rb +1 -10
  94. data/test/factories/remessa/cnab400/base.rb +8 -0
  95. data/test/factories/remessa/cnab400/sicoob.rb +8 -0
  96. data/test/factories/remessa/pagamento.rb +8 -7
  97. data/test/fixtures/remessa/cnab240/sicoob.rem +8 -0
  98. data/test/{files → fixtures}/retorno/cnab240/caixa.ret +0 -0
  99. data/test/{files → fixtures}/retorno/cnab240/padrao240.ret +0 -0
  100. data/test/fixtures/retorno/cnab400/sicoob.ret +7 -0
  101. data/test/inheritance/boleto_test.rb +4 -1
  102. data/test/inheritance/sicoob_test.rb +23 -7
  103. data/test/test_helper.rb +70 -0
  104. metadata +63 -6
@@ -23,51 +23,34 @@ module BrBoleto
23
23
  #
24
24
  #
25
25
  class Caixa < Base
26
- #Modalidades de cobranças válidas conforme a documentação
27
- def self.modalidade_cobranca_validas
28
- %w(1 2)
29
- end
30
26
 
31
- def deve_validar_modalidade_cobranca?
32
- true
27
+ def conta_class
28
+ BrBoleto::Conta::Caixa
33
29
  end
34
30
 
35
- # Tamanho máximo de uma agência na Caixa Econômica Federal.
36
- # <b>Método criado justamente para ficar documentado o tamanho máximo aceito até a data corrente.</b>
37
- #
38
- # @return [Fixnum] 4
39
- #
40
- def self.tamanho_maximo_agencia
41
- 4
42
- end
31
+ ################# VALIDAÇÕES DINÂMICAS #################
32
+ def valid_numero_documento_maximum
33
+ 15
34
+ end
43
35
 
44
- # Tamanho máximo do código do cedente emitido no Boleto.
45
- # <b>Método criado justamente para ficar documentado o tamanho máximo aceito até a data corrente.</b>
46
- #
47
- # @return [Fixnum] 6
48
- #
49
- def self.tamanho_maximo_codigo_cedente
50
- 6
51
- end
36
+ # Tamanho máximo para o codigo_cedente/Convênio
37
+ def valid_convenio_maximum
38
+ 6
39
+ end
52
40
 
53
- # Tamanho máximo do numero do documento no Boleto.
54
- # <b>Método criado justamente para ficar documentado o tamanho máximo aceito até a data corrente.</b>
55
- #
56
- # @return [Fixnum] 15
57
- #
58
- def self.tamanho_maximo_numero_documento
59
- 15
60
- end
41
+ # codigo_cedente/Convênio deve ser obrigatório
42
+ def valid_convenio_required
43
+ true
44
+ end
61
45
 
62
- # <b>Carteiras suportadas.</b>
63
- #
64
- # <b>Método criado para validar se a carteira informada é suportada.</b>
65
- #
66
- # @return [Array]
67
- #
68
- def self.carteiras_suportadas
69
- %w(14 24)
70
- end
46
+ # Carteira deve ter 2 digitos
47
+ def valid_carteira_length
48
+ 2
49
+ end
50
+ def valid_carteira_inclusion
51
+ %w{14 24}
52
+ end
53
+ ##########################################################
71
54
 
72
55
  # Conforme descrito na documentação, o valor que deve constar em local do pagamento é
73
56
  # "PREFERENCIALMENTE NAS CASAS LOTÉRICAS ATÉ O VALOR LIMITE"
@@ -78,70 +61,8 @@ module BrBoleto
78
61
  })
79
62
  end
80
63
 
81
- # Validações para os campos abaixo:
82
- #
83
- # * Agencia
84
- # * Codigo Cedente
85
- # * Número do documento
86
- #
87
- # Se você quiser sobrescrever os metodos, <b>ficará a sua responsabilidade.</b>
88
- # Basta você sobrescrever os métodos de validação:
89
- #
90
- # class Caixa < BrBoleto::Core::Caixa
91
- # def self.tamanho_maximo_agencia
92
- # 6
93
- # end
94
- #
95
- # def self.tamanho_maximo_codigo_cedente
96
- # 9
97
- # end
98
- #
99
- # def self.tamanho_maximo_numero_documento
100
- # 10
101
- # end
102
- # end
103
- #
104
- # Obs.: Mudar as regras de validação podem influenciar na emissão do boleto em si.
105
- # Talvez você precise analisar o efeito no #codigo_de_barras e na #linha_digitável (ambos podem ser
106
- # sobreescritos também).
107
- #
108
- validates :agencia, :codigo_cedente, presence: true
109
-
110
- validates :agencia, length: { maximum: tamanho_maximo_agencia }, if: :deve_validar_agencia?
111
- validates :codigo_cedente, length: { maximum: tamanho_maximo_codigo_cedente }, if: :deve_validar_codigo_cedente?
112
- validates :numero_documento, length: { maximum: tamanho_maximo_numero_documento }, if: :deve_validar_numero_documento?
113
-
114
- validates :carteira, inclusion: { in: ->(object) { object.class.carteiras_suportadas } }, if: :deve_validar_carteira?
115
-
116
- # @return [String] Código do Banco descrito na documentação.
117
- #
118
- def codigo_banco
119
- '104'
120
- end
121
-
122
- # @return [String] Dígito do código do banco descrito na documentação.
123
- #
124
- def digito_codigo_banco
125
- '0'
126
- end
127
-
128
- # Campo Agência / Código do Cedente
129
- #
130
- # @return [String]
131
- #
132
- def agencia_codigo_cedente
133
- "#{agencia} / #{codigo_cedente}-#{digito_verificador_codigo_cedente}"
134
- end
135
-
136
- def digito_verificador_codigo_cedente
137
- BrBoleto::Calculos::Modulo11FatorDe2a9RestoZero.new(codigo_cedente)
138
- end
139
- def digito_verificador_codigo_beneficiario
140
- digito_verificador_codigo_cedente
141
- end
142
-
143
64
  def digito_verificador_nosso_numero
144
- BrBoleto::Calculos::Modulo11FatorDe2a9RestoZero.new("#{carteira}#{numero_documento}")
65
+ BrBoleto::Calculos::Modulo11FatorDe2a9RestoZero.new("#{conta.carteira}#{numero_documento}")
145
66
  end
146
67
 
147
68
  # Mostra o campo nosso número calculando o dígito verificador do nosso número.
@@ -149,7 +70,7 @@ module BrBoleto
149
70
  # @return [String]
150
71
  #
151
72
  def nosso_numero
152
- "#{carteira}#{numero_documento}-#{digito_verificador_nosso_numero}"
73
+ "#{conta.carteira}#{numero_documento}-#{digito_verificador_nosso_numero}"
153
74
  end
154
75
 
155
76
 
@@ -170,17 +91,7 @@ module BrBoleto
170
91
  # @return [String]
171
92
  #
172
93
  def tipo_cobranca
173
- carteira[0] if carteira.present?
174
- end
175
-
176
- # Modalidade de cobrança
177
- # As vezes é chamado de modalidade de cobrança e as vezes é chamado de tipo de cobrança
178
- # Por isso foi criado o metodo modalidade_cobrança que é a mesma coisa que o tipo_cobranca
179
- #
180
- # @return [String]
181
- #
182
- def modalidade_cobranca
183
- tipo_cobranca
94
+ conta.carteira[0] if conta.carteira.present?
184
95
  end
185
96
 
186
97
  # O Identificado de Emissão é o 2° e ultimo caracter da carteira
@@ -189,35 +100,9 @@ module BrBoleto
189
100
  # @return [String]
190
101
  #
191
102
  def identificador_de_emissao
192
- carteira.last if carteira.present?
193
- end
194
-
195
- # Formata a carteira dependendo se ela é registrada ou não.
196
- #
197
- # Para cobrança COM registro usar: <b>RG</b>
198
- # Para Cobrança SEM registro usar: <b>SR</b>
199
- #
200
- # @return [String]
201
- #
202
- def carteira_formatada
203
- if carteira.in?(carteiras_com_registro)
204
- 'RG'
205
- else
206
- 'SR'
207
- end
103
+ conta.carteira.last if conta.carteira.present?
208
104
  end
209
105
 
210
- # Retorna as carteiras com registro da Caixa Econômica Federal.
211
- # <b>Você pode sobrescrever esse método na subclasse caso exista mais
212
- # carteiras com registro na Caixa Econômica Federal.</b>
213
- #
214
- # @return [Array]
215
- #
216
- def carteiras_com_registro
217
- %w(14)
218
- end
219
-
220
-
221
106
  # === Código de barras do banco
222
107
  #
223
108
  # ________________________________________________________________________________________
@@ -243,8 +128,8 @@ module BrBoleto
243
128
 
244
129
  def composicao_codigo_barras
245
130
  return @composicao_codigo_barras if @composicao_codigo_barras
246
- @composicao_codigo_barras = "#{codigo_beneficiario}"
247
- @composicao_codigo_barras << "#{digito_verificador_codigo_beneficiario}"
131
+ @composicao_codigo_barras = "#{conta.codigo_cedente}"
132
+ @composicao_codigo_barras << "#{conta.codigo_cedente_dv}"
248
133
  @composicao_codigo_barras << "#{nosso_numero_de_3_a_5}"
249
134
  @composicao_codigo_barras << "#{tipo_cobranca}"
250
135
  @composicao_codigo_barras << "#{nosso_numero_de_6_a_8}"
@@ -9,115 +9,32 @@ module BrBoleto
9
9
  # 'documentacoes_dos_boletos/sicoob' dentro dessa biblioteca.
10
10
  #
11
11
  class Sicoob < Base
12
- # === Carteira/Modalidade:
13
- #
14
- # '1/01' - Simples com registro
15
- # '1/02' - Simples sem registro
16
- # '3/03' - Garantida Caucionada
17
- #
18
- attr_accessor :modalidade_cobranca
19
-
20
- def modalidade_cobranca
21
- if @modalidade_cobranca.present?
22
- @modalidade_cobranca.to_s.rjust(2, '0')
23
- else
24
- '01'
25
- end
26
- end
27
-
28
- #Modalidades de cobranças válidas conforme a documentação
29
- def self.modalidade_cobranca_validas
30
- %{'01' '02' '03'}
31
- end
32
-
33
- def deve_validar_modalidade_cobranca?
34
- true
12
+ def conta_class
13
+ BrBoleto::Conta::Sicoob
35
14
  end
36
15
 
37
- # Quantidade de parcelas que o boleto possui
38
- # Liberando a possibilidade de edição
39
- attr_accessor :parcelas
40
- def parcelas
41
- if @parcelas.present?
42
- @parcelas.to_s.rjust(3, '0')
43
- else
44
- '001'
16
+ ################# VALIDAÇÕES DINÂMICAS #################
17
+ def valid_numero_documento_maximum
18
+ 7
19
+ end
20
+ def valid_modalidade_inclusion
21
+ %w{01 02 03}
45
22
  end
46
- end
47
-
48
-
49
- # Tamanho máximo de uma agência no Banco Sicoob.
50
- # <b>Método criado justamente para ficar documentado o tamanho máximo aceito até a data corrente.</b>
51
- #
52
- # @return [Fixnum] 4
53
- #
54
- def self.tamanho_maximo_agencia
55
- 4
56
- end
57
-
58
- # Tamanho máximo do codigo cedente no Banco Sicoob.
59
- # <b>Método criado justamente para ficar documentado o tamanho máximo aceito até a data corrente.</b>
60
- #
61
- # @return [Fixnum] 7
62
- #
63
- def self.tamanho_maximo_codigo_cedente
64
- 7
65
- end
66
-
67
- # Tamanho máximo do numero do documento no Boleto.
68
- # <b>Método criado justamente para ficar documentado o tamanho máximo aceito até a data corrente.</b>
69
- #
70
- # @return [Fixnum] 6
71
- #
72
- def self.tamanho_maximo_numero_documento
73
- 7
74
- end
75
-
76
- # <b>Carteiras suportadas.</b>
77
- #
78
- # <b>Método criado para validar se a carteira informada é suportada.</b>
79
- #
80
- # @return [Array]
81
- #
82
- def self.carteiras_suportadas
83
- %w[1 3]
84
- end
85
-
86
- # Validações para os campos abaixo:
87
- #
88
- # * Agencia
89
- # * Codigo Cedente
90
- # * Número do documento
91
- #
92
- # Se você quiser sobrescrever os metodos, <b>ficará a sua responsabilidade.</b>
93
- # Basta você sobrescrever os métodos de validação:
94
- #
95
- # class Sicoob < BrBoleto::Core::Sicoob
96
- # def self.tamanho_maximo_agencia
97
- # 6
98
- # end
99
- #
100
- # def self.tamanho_maximo_codigo_cedente
101
- # 9
102
- # end
103
- #
104
- # def self.tamanho_maximo_numero_documento
105
- # 10
106
- # end
107
- # end
108
- #
109
- # Obs.: Mudar as regras de validação podem influenciar na emissão do boleto em si.
110
- # Talvez você precise analisar o efeito no #codigo_de_barras e na #linha_digitável (ambos podem ser
111
- # sobreescritos também).
112
- #
113
- validates :agencia, :codigo_cedente, presence: true
114
23
 
115
- validates :agencia, length: { maximum: tamanho_maximo_agencia }, if: :deve_validar_agencia?
116
- validates :codigo_cedente, length: { maximum: tamanho_maximo_codigo_cedente }, if: :deve_validar_codigo_cedente?
117
- validates :numero_documento, length: { maximum: tamanho_maximo_numero_documento }, if: :deve_validar_numero_documento?
24
+ def valid_carteira_inclusion
25
+ %w[1 3]
26
+ end
27
+
28
+ # Tamanho máximo para o codigo_cedente/Convênio
29
+ def valid_convenio_maximum
30
+ 6
31
+ end
118
32
 
119
- validates :carteira, inclusion: { in: ->(object) { object.class.carteiras_suportadas } }, if: :deve_validar_carteira?
120
- validates :modalidade_cobranca, inclusion: { in: ->(object) { object.class.modalidade_cobranca_validas } }, if: :deve_validar_modalidade_cobranca?
33
+ # codigo_cedente/Convênio deve ser obrigatório
34
+ def valid_convenio_required
35
+ true
36
+ end
37
+ ##########################################################
121
38
 
122
39
  def default_values
123
40
  super.merge({
@@ -125,26 +42,6 @@ module BrBoleto
125
42
  })
126
43
  end
127
44
 
128
- # @return [String] Código do Banco descrito na documentação.
129
- #
130
- def codigo_banco
131
- '756'
132
- end
133
-
134
- # @return [String] Dígito do código do banco descrito na documentação.
135
- #
136
- def digito_codigo_banco
137
- '0'
138
- end
139
-
140
- # Campo Agência / Código do Cedente
141
- #
142
- # @return [String]
143
- #
144
- def agencia_codigo_cedente
145
- "#{agencia} / #{codigo_cedente}"
146
- end
147
-
148
45
  # O nosso número descrino na documentação é formado pelo numero do documento mais o digito
149
46
  # verificador no nosso_numero, que é um cálculo descrito na documentação.
150
47
  #
@@ -154,24 +51,6 @@ module BrBoleto
154
51
  "#{numero_documento}-#{digito_verificador_nosso_numero}"
155
52
  end
156
53
 
157
- # Tipo de cobrança
158
- # Ex: :com_registro, :sem_registro, :garantia_caucionada
159
- #
160
- # Obs: O VALOR DESSE METODO NÃO INFLUÊNCIA NA GERAÇÃO DO BOLETO
161
- # É APENAS PARA QUESTÃO DE INFORMAÇÃO CASO PRECISE PARA OUTRAS COISAS.
162
- #
163
- def tipo_cobranca_formatada
164
- case "#{modalidade_cobranca}".rjust(2, "0")
165
- when '01'
166
- :com_registro
167
- when '02'
168
- :sem_registro
169
- when '03'
170
- :caucionada
171
- end
172
- end
173
-
174
-
175
54
  # === Código de barras do banco
176
55
  #
177
56
  # ___________________________________________________________
@@ -184,15 +63,16 @@ module BrBoleto
184
63
  # | 34 - 41 | 08 | Nosso Número do título |
185
64
  # | 42 - 44 | 03 | Número da Parcela do Título (001) |
186
65
  # |___________________________________________________________|
66
+ # Tamanho total: 25
187
67
  #
188
68
  # @return [String]
189
69
  #
190
70
  def codigo_de_barras_do_banco
191
- "#{carteira}#{agencia}#{modalidade_cobranca}#{codigo_cedente}#{nosso_numero.gsub('-','')}#{parcelas}"
71
+ "#{conta.carteira}#{conta.agencia}#{conta.modalidade}#{conta.codigo_cedente}#{conta.codigo_cedente_dv}#{nosso_numero.gsub('-','')}#{parcelas}"
192
72
  end
193
73
 
194
74
  def digito_verificador_nosso_numero
195
- BrBoleto::Calculos::Modulo11Fator3197.new("#{agencia}#{codigo_cedente.rjust(10, '0')}#{numero_documento}")
75
+ BrBoleto::Calculos::Modulo11Fator3197.new("#{conta.agencia}#{conta.codigo_cedente.rjust(9, '0')}#{conta.codigo_cedente_dv}#{numero_documento}")
196
76
  end
197
77
  end
198
78
  end