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
@@ -0,0 +1,38 @@
1
+ module BrBoleto
2
+ module HavePagador
3
+ extend ActiveSupport::Concern
4
+
5
+ included do
6
+ validate :pagador_validations
7
+ end
8
+
9
+ def pagador
10
+ yield pagador if block_given?
11
+ @pagador.is_a?(pagador_class) ? @pagador : @pagador = pagador_class.new()
12
+ end
13
+
14
+ def pagador=(value)
15
+ if value.is_a?(pagador_class) || value.nil?
16
+ @pagador = value
17
+ elsif value.is_a?(Hash)
18
+ pagador.assign_attributes(value)
19
+ end
20
+ end
21
+
22
+ private
23
+ def pagador_class
24
+ BrBoleto::Pagador
25
+ end
26
+
27
+ def valid_endereco_required; end
28
+
29
+ def pagador_validations
30
+ pagador.valid_endereco_required = valid_endereco_required if "#{valid_endereco_required}".present?
31
+ if pagador.invalid?
32
+ pagador.errors.full_messages.each do |msg|
33
+ errors.add(:base, msg)
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,44 @@
1
+ module BrBoleto
2
+ module HavePagamentos
3
+ extend ActiveSupport::Concern
4
+
5
+ included do
6
+ attr_accessor :pagamento_valid_tipo_impressao_required
7
+ attr_accessor :pagamento_valid_cod_desconto_length
8
+ attr_accessor :pagamento_valid_emissao_boleto_length
9
+ attr_accessor :pagamento_valid_distribuicao_boleto_length
10
+
11
+ validates :pagamentos, presence: true
12
+ validates_each :pagamentos do |record, attr, value|
13
+ value.each_with_index do |pagamento, i|
14
+ pagamento.valid_tipo_impressao_required = record.pagamento_valid_tipo_impressao_required if "#{record.pagamento_valid_tipo_impressao_required}".present?
15
+ pagamento.valid_cod_desconto_length = record.pagamento_valid_cod_desconto_length if "#{record.pagamento_valid_cod_desconto_length}".present?
16
+ pagamento.valid_emissao_boleto_length = record.pagamento_valid_emissao_boleto_length if "#{record.pagamento_valid_emissao_boleto_length}".present?
17
+ pagamento.valid_distribuicao_boleto_length = record.pagamento_valid_distribuicao_boleto_length if "#{record.pagamento_valid_distribuicao_boleto_length}".present?
18
+
19
+ if pagamento.invalid?
20
+ pagamento.errors.full_messages.each { |msg| record.errors.add(:pagamentos, "#{pagamento.nosso_numero || i+1}: #{msg}") }
21
+ end
22
+
23
+ end
24
+ end
25
+ class << self
26
+ def class_for_pagamentos
27
+ BrBoleto::Remessa::Pagamento
28
+ end
29
+ end
30
+
31
+ def pagamentos=(value)
32
+ @pagamentos = value
33
+ end
34
+
35
+ def pagamentos
36
+ @pagamentos = [@pagamentos].flatten.compact.select{|p| p.is_a?(self.class.class_for_pagamentos)}
37
+ end
38
+
39
+ end
40
+
41
+
42
+
43
+ end
44
+ end
@@ -1,52 +1,13 @@
1
1
  # encoding: utf-8
2
2
  module BrBoleto
3
3
  module Boleto
4
- # @abstract Métodos { #codigo_banco, #digito_codigo_banco, #agencia_codigo_cedente, #nosso_numero, #codigo_de_barras_do_banco}
4
+ # @abstract Métodos { #nosso_numero, #codigo_de_barras_do_banco}
5
5
  # Métodos para serem escritos nas subclasses (exitem outros opcionais, conforme visto nessa documentação).
6
6
  #
7
7
  class Base < BrBoleto::ActiveModelBase
8
- include BrBoleto::Calculos
9
-
10
- # Nome/Razão social que aparece no campo 'Cedente' no boleto.
11
- #
12
- attr_accessor :cedente
13
-
14
- # <b>Código do Cedente é o código do cliente, fornecido pelo banco.</b>
15
- #
16
- # Alguns bancos, dependendo do banco e da carteira, precisam desse campo preenchido.
17
- # Em compensação, outros bancos (a minoria) não fazem utilização desse campo.
18
- #
19
- attr_accessor :codigo_cedente # com DV
20
-
21
- # Código do beneficiário e codigo cedente é a mesma coisa
22
- # Por isso foi criado um alias para que cada um utilize a nomenclatura que preferir.
23
- #
24
- alias_attribute :codigo_beneficiario, :codigo_cedente
25
-
26
- # Formatação para o código do cedente conforme o tamanho definido por cada banco
27
- # Perceba que é obrigatório ter o metodo self.tamanho_maximo_codigo_cedente implementado
28
- # na classe de cada banco
29
- #
30
- # @return [String]
31
- #
32
- def codigo_cedente
33
- @codigo_cedente.to_s.rjust(self.class.tamanho_maximo_codigo_cedente, '0') if @codigo_cedente.present?
34
- end
35
-
36
- # Documento do Cedente (CPF ou CNPJ).
37
- # <b>OBS.: Esse campo não possui validação do campo. Caso você precise imeplemente na subclasse.</b>
38
- #
39
- # Esse campo serve apenas para mostrar no boleto no campo "CPF/CNPJ".
40
- #
41
- attr_accessor :documento_cedente
42
-
43
- # Deve ser informado o endereço completo do Cedente.
44
- # Se o título possuir a figura de Sacador Avalista o endereço informado
45
- # deverá ser do Sacador Avalista, conforme Lei Federal 12.039 de 01/10/2009.
46
- #
47
- # <b>Campo Obrigatório</b>
48
- #
49
- attr_accessor :endereco_cedente
8
+ include BrBoleto::Calculos
9
+ include BrBoleto::HaveConta
10
+ include BrBoleto::HavePagador
50
11
 
51
12
  # Data do vencimento do boleto. Campo auto explicativo.
52
13
  #
@@ -58,11 +19,12 @@ module BrBoleto
58
19
  # Campo de resposabilidade do Cedente e cada banco possui um tamanho esperado.
59
20
  #
60
21
  attr_accessor :numero_documento
61
- #
62
- # @return [String]
63
- #
64
22
  def numero_documento
65
- @numero_documento.to_s.rjust(self.class.tamanho_maximo_numero_documento, '0') if @numero_documento.present?
23
+ if valid_numero_documento_maximum && @numero_documento.present?
24
+ @numero_documento.to_s.rjust(valid_numero_documento_maximum, '0')
25
+ else
26
+ @numero_documento
27
+ end
66
28
  end
67
29
 
68
30
  # Valor total do documento. Campo auto explicativo.
@@ -70,36 +32,7 @@ module BrBoleto
70
32
  # <b>Campo Obrigatório</b>.
71
33
  #
72
34
  attr_accessor :valor_documento
73
-
74
- # Uma carteira de cobrança define o modo como o boleto é tratado pelo banco.
75
- # Existem duas grandes divisões: carteiras não registradas e carteiras registradas.
76
- #
77
- # === Carteiras Não Registradas
78
- #
79
- # Significa que não há registro no banco sobre os boletos gerados, ou seja, você não precisa
80
- # notificar o banco a cada boleto gerado.
81
- # Neste caso a cobrança de taxa bancária é feita por boleto pago.
82
- #
83
- # === Carteiras Registradas
84
- #
85
- # Você precisa notificar o banco sobre todos os boletos gerados, em geral enviando um
86
- # arquivo chamado "arquivo de remessa".
87
- # Neste caso, normalmente existe uma taxa bancária por boleto gerado, independentemente de ele ser pago.
88
- # Nestas carteiras também se encaixam serviços bancários adicionais, como protesto em caso de não pagamento.
89
- #
90
- # <b>Campo Obrigatório</b>
91
- #
92
- attr_accessor :carteira
93
-
94
- # Número da agência. Campo auto explicativo.
95
- #
96
- attr_accessor :agencia
97
- #
98
- # @return [String] 4 caracteres
99
- #
100
- def agencia
101
- @agencia.to_s.rjust(self.class.tamanho_maximo_agencia, '0') if @agencia.present?
102
- end
35
+
103
36
 
104
37
  # Número da Conta corrente. Campo auto explicativo.
105
38
  #
@@ -145,32 +78,6 @@ module BrBoleto
145
78
  #
146
79
  attr_accessor :data_documento
147
80
 
148
- # Nome do sacado.
149
- #
150
- # O sacado é a pessoa para o qual o boleto está sendo emitido, podemos resumir dizendo
151
- # que o sacado é o cliente do Cedente, ou aquele para o qual uma determina mercadoria
152
- # foi vendida e o pagamento desta será efetuado por meio de boleto de cobrança.
153
- #
154
- # <b>Campo Obrigatório</b>.
155
- #
156
- attr_accessor :sacado
157
-
158
- # Documento do sacado.
159
- #
160
- # <b>OBS.: Esse campo não possui validação do campo. Caso você precise imeplemente na subclasse.</b>
161
- #
162
- # Esse campo serve apenas para mostrar no boleto no campo "CPF/CNPJ".
163
- #
164
- attr_accessor :documento_sacado
165
-
166
- # Endereço do sacado.
167
- #
168
- # <b>OBS.: Esse campo não possui validação do campo. Caso você precise imeplemente na subclasse.</b>
169
- #
170
- # Esse campo serve apenas para mostrar no boleto no campo "Sacado".
171
- #
172
- attr_accessor :endereco_sacado
173
-
174
81
  # Descrição do local do pagamento.
175
82
  #
176
83
  attr_accessor :local_pagamento
@@ -185,90 +92,48 @@ module BrBoleto
185
92
  # São permitidas até seis linhas de instruções a serem mostradas no boleto
186
93
 
187
94
  attr_accessor :instrucoes1,
188
- :instrucoes2,
189
- :instrucoes3,
190
- :instrucoes4,
191
- :instrucoes5,
192
- :instrucoes6
95
+ :instrucoes2,
96
+ :instrucoes3,
97
+ :instrucoes4,
98
+ :instrucoes5,
99
+ :instrucoes6
193
100
 
194
101
  # Caminho do logo do banco.
195
102
  #
196
103
  attr_accessor :logo
197
104
 
198
- # Tamanho maximo do valor do documento do boleto.
199
- # Acredito que não existirá valor de documento nesse valor,
200
- # <b>porém a biblioteca precisa manter a consistência</b>.
201
- #
202
- # No código de barras o valor do documento precisa
203
- # ter um tamanho de 8 caracteres para os reais (acrescentando zeros à esquerda),
204
- # e 2 caracteres nos centavos (acrescentando zeros à esquerda).
205
- #
206
- # @return [Float] 99999999.99
207
- #
208
- def self.valor_documento_tamanho_maximo
209
- 99999999.99
105
+ # Quantidade de parcelas que o boleto possui
106
+ # Liberando a possibilidade de edição
107
+ attr_accessor :parcelas
108
+ def parcelas
109
+ if @parcelas.present?
110
+ @parcelas.to_s.rjust(3, '0')
111
+ else
112
+ '001'
113
+ end
210
114
  end
211
115
 
212
- # Validações de todos os boletos
213
- #
214
- validates :carteira, :valor_documento, :numero_documento, :data_vencimento, presence: true
215
- validates :cedente, :endereco_cedente, presence: true
216
- validates :sacado, :documento_sacado, presence: true
217
- validates :valor_documento, numericality: { less_than_or_equal_to: ->(object) { object.class.valor_documento_tamanho_maximo } }
116
+ ################# VALIDAÇÕES DINÂMICAS #################
117
+
118
+ def valid_numero_documento_maximum; 6 end
119
+ validates :numero_documento, custom_length: {maximum: :valid_numero_documento_maximum}, if: :valid_numero_documento_maximum
120
+
121
+ # Tamanho maximo do valor do documento do boleto.
122
+ # Acredito que não existirá valor de documento nesse valor,
123
+ # <b>porém a biblioteca precisa manter a consistência</b>.
124
+ #
125
+ # No código de barras o valor do documento precisa
126
+ # ter um tamanho de 8 caracteres para os reais (acrescentando zeros à esquerda),
127
+ # e 2 caracteres nos centavos (acrescentando zeros à esquerda).
128
+ #
129
+ # @return [Float] 99999999.99
130
+ #
131
+ def valid_valor_documento_tamanho_maximo; 99999999.99 end
132
+ validates :valor_documento, numericality: { less_than_or_equal_to: ->(obj) { obj.valid_valor_documento_tamanho_maximo } }, if: :valid_valor_documento_tamanho_maximo
133
+ ##########################################################
134
+ validates :valor_documento, :numero_documento, :data_vencimento, presence: true
218
135
  validate :data_vencimento_deve_ser_uma_data
219
136
 
220
- # Passing the attributes as Hash or block
221
- #
222
- # @overload initialize(options = {}, &block)
223
- # @param [Hash] options Passing a hash accessing the attributes of the self.
224
- # @option options [String] :cedente
225
- # @option options [String] :codigo_cedente
226
- # @option options [String] :documento_cedente
227
- # @option options [String] :endereco_cedente
228
- # @option options [String] :conta_corrente
229
- # @option options [String] :agencia
230
- # @option options [Date] :data_vencimento
231
- # @option options [String] :numero_documento
232
- # @option options [Float] :valor_documento
233
- # @option options [String] :codigo_moeda
234
- # @option options [String] :especie
235
- # @option options [String] :especie_documento
236
- # @option options [String] :sacado
237
- # @option options [String] :documento_sacado
238
- #
239
- # @param [Proc] block Optional params. Passing a block accessing the attributes of the self.
240
- #
241
- # For the options, waiting for the ActiveModel 4 and the ActiveModel::Model. :)
242
- #
243
- # === Exemplos
244
- #
245
- # O recomendado é usar os boletos herdando de seu respectivo banco. Por exemplo:
246
- #
247
- # class Sicoob < BrBoleto::Sicoob
248
- # end
249
- #
250
- # Agora você pode emitir um boleto usando a classe criada acima:
251
- #
252
- # Sicoob.new(conta_corrente: '89755', agencia: '0097', :carteira => '195')
253
- #
254
- # Você pode usar blocos se quiser:
255
- #
256
- # Sicoob.new do |boleto|
257
- # boleto.conta_corrente = '89755'
258
- # boleto.agencia = '0097'
259
- # boleto.carteira = '198'
260
- # boleto.numero_documento = '12345678'
261
- # boleto.codigo_cedente = '909014'
262
- # end
263
- #
264
- def initialize(options={}, &block)
265
- default_values.merge(options).each do |attribute, value|
266
- send("#{attribute}=", value) if respond_to?("#{attribute}=")
267
- end
268
-
269
- yield(self) if block_given?
270
- end
271
-
272
137
  # Opções default.
273
138
  #
274
139
  # Caso queira sobrescrever as opções, você pode simplesmente instanciar o objeto passando a opção desejada:
@@ -288,80 +153,15 @@ module BrBoleto
288
153
  #
289
154
  def default_values
290
155
  {
291
- :codigo_moeda => '9',
292
- :especie => 'R$',
293
- :especie_documento => 'DM',
294
- :local_pagamento => 'PAGÁVEL EM QUALQUER BANCO ATÉ O VENCIMENTO',
295
- :data_documento => Date.current,
296
- :aceite => true
156
+ codigo_moeda: '9',
157
+ especie: 'R$',
158
+ especie_documento: 'DM',
159
+ local_pagamento: 'PAGÁVEL EM QUALQUER BANCO ATÉ O VENCIMENTO',
160
+ data_documento: Date.current,
161
+ aceite: false
297
162
  }
298
163
  end
299
164
 
300
- # Tipo de cobrança
301
- # Ex: :com_registro, :sem_registro, :caucionada
302
- # A implementação para esse valor deve ser implementada para cada banco,
303
- # pois cada banco tem uma maneira diferente para saber o tipo de cobrança.
304
- #
305
- # Obs: O VALOR DESSE METODO NÃO INFLUÊNCIA NA GERAÇÃO DO BOLETO
306
- # É APENAS PARA QUESTÃO DE INFORMAÇÃO CASO PRECISE PARA OUTRAS COISAS, POR EXEMPLO:
307
- # É UTILIZADO NOS PAGAMENTOS DAS REMESSAS, MAIS ESPECIFICAMENTE NO COMPLEMENTO TRAILER
308
- # DO LOTE PARA O BANCO SICOOB NO CNAB 240.
309
- def tipo_cobranca_formatada
310
- end
311
-
312
- # Código do Banco.
313
- # <b>Esse campo é específico para cada banco</b>.
314
- #
315
- # @return [String] Corresponde ao código do banco.
316
- #
317
- # @raise [NotImplementedError] Precisa implementar nas subclasses.
318
- #
319
- def codigo_banco
320
- raise NotImplementedError.new("Not implemented #codigo_banco in #{self}.")
321
- end
322
-
323
- # Dígito do código do banco.
324
- # <b>Esse campo é específico para cada banco</b>.
325
- #
326
- # @return [String] Corresponde ao dígito do código do banco.
327
- # @raise [NotImplementedError] Precisa implementar nas subclasses.
328
- #
329
- def digito_codigo_banco
330
- raise NotImplementedError.new("Not implemented #digito_codigo_banco in #{self}.")
331
- end
332
-
333
- # Esses métodos servem apenas para questão de testes
334
- # Não são utilizados nas subclasses.
335
- # Devem obrigatóriamente ser sobrescritos nas subclasses
336
- def self.tamanho_maximo_agencia
337
- 4
338
- end
339
- def self.tamanho_maximo_codigo_cedente
340
- 6
341
- end
342
- def self.tamanho_maximo_numero_documento
343
- 6
344
- end
345
-
346
- # Formata o código do banco com o dígito do código do banco.
347
- # Método usado para o campo de código do banco localizado no cabeçalho do boleto.
348
- #
349
- # @return [String]
350
- #
351
- def codigo_banco_formatado
352
- "#{codigo_banco}-#{digito_codigo_banco}"
353
- end
354
-
355
- # Agência, código do cedente ou nosso número.
356
- # <b>Esse campo é específico para cada banco</b>.
357
- #
358
- # @return [String] - Corresponde aos campos "Agencia / Codigo do Cedente".
359
- # @raise [NotImplementedError] Precisa implementar nas subclasses.
360
- #
361
- def agencia_codigo_cedente
362
- raise NotImplementedError.new("Not implemented #agencia_codigo_cedente in #{self}.")
363
- end
364
-
365
165
  # O Nosso Número é o número que identifica unicamente um boleto para uma conta.
366
166
  # O tamanho máximo do Nosso Número depende do banco e carteira.
367
167
  #
@@ -396,24 +196,6 @@ module BrBoleto
396
196
  "#{real.rjust(8, '0')}#{centavos.ljust(2, '0')}"
397
197
  end
398
198
 
399
- # Força a carteira a retornar o valor como string
400
- #
401
- # @return [String]
402
- #
403
- def carteira
404
- @carteira.to_s if @carteira.present?
405
- end
406
-
407
- # Embora o padrão seja mostrar o número da carteira no boleto,
408
- # <b>alguns bancos</b> requerem que seja mostrado um valor diferente na carteira.
409
- # <b>Para essas exceções, sobrescreva esse método na subclasse.</b>
410
- #
411
- # @return [String] retorna o número da carteira
412
- #
413
- def carteira_formatada
414
- carteira
415
- end
416
-
417
199
  # Se o aceite for 'true', retorna 'S'.
418
200
  # Retorna 'N', caso contrário.
419
201
  #
@@ -463,7 +245,7 @@ module BrBoleto
463
245
  # @return [String] Primeiras 18 posições do código de barras (<b>Não retorna o DAC do código de barras</b>).
464
246
  #
465
247
  def codigo_de_barras_padrao
466
- "#{codigo_banco}#{codigo_moeda}#{fator_de_vencimento}#{valor_formatado_para_codigo_de_barras}"
248
+ "#{conta.codigo_banco}#{codigo_moeda}#{fator_de_vencimento}#{valor_formatado_para_codigo_de_barras}"
467
249
  end
468
250
 
469
251
  # Segunda parte do código de barras.
@@ -547,123 +329,12 @@ module BrBoleto
547
329
  false
548
330
  end
549
331
 
550
- # Método usado para verificar se deve realizar a validação de tamanho do campo 'agência'.
551
- # <b>Sobrescreva esse método na subclasse, caso você mesmo queira fazer as validações</b>.
552
- #
553
- # @return [True]
554
- #
555
- def deve_validar_agencia?
556
- true
557
- end
558
-
559
- # Método usado para verificar se deve realizar a validação de tamanho do campo 'conta_corrente'.
560
- # <b>Sobrescreva esse método na subclasse, caso você mesmo queira fazer as validações</b>.
561
- #
562
- # @return [True]
563
- #
564
- def deve_validar_conta_corrente?
565
- true
566
- end
567
-
568
- # Método usado para verificar se deve realizar a validação de tamanho do campo 'codigo_cedente'.
569
- # <b>Sobrescreva esse método na subclasse, caso você mesmo queira fazer as validações</b>.
570
- #
571
- # @return [True]
572
- #
573
- def deve_validar_codigo_cedente?
574
- true
575
- end
576
-
577
- # Método usado para verificar se deve realizar a validação de tamanho do campo 'numero_documento'.
578
- # <b>Sobrescreva esse método na subclasse, caso você mesmo queira fazer as validações</b>.
579
- #
580
- # @return [True]
581
- #
582
- def deve_validar_numero_documento?
583
- true
584
- end
585
-
586
- # Método usado para verificar se deve realizar a validação do campo 'carteira'.
587
- # <b>Sobrescreva esse método na subclasse, caso você mesmo queira fazer as validações</b>.
588
- #
589
- # @return [True]
590
- #
591
- def deve_validar_carteira?
592
- true
593
- end
594
-
595
332
  # Verifica e valida se a data do vencimento deve ser uma data válida.
596
333
  # <b>Precisa ser uma data para o cálculo do fator do vencimento.</b>
597
334
  #
598
335
  def data_vencimento_deve_ser_uma_data
599
336
  errors.add(:data_vencimento, :invalid) unless data_vencimento.kind_of?(Date)
600
337
  end
601
-
602
-
603
- ################ FORMATAÇÃO PARA CPF OU CNPJ ################
604
- # tanto o documento do sacado quandto do cedente possui 3 tipos de formatação
605
- # EX:
606
- # documento_sacado = '12345678901'
607
- # atributo + '_formatado':
608
- # documento_sacado_formatado = '123.456.789-01'
609
- # atributo + '_formatado_com_label':
610
- # documento_sacado_formatado_com_label = 'CPF 123.456.789-01'
611
- #
612
- # OBS: O documento_cedente e documento_sacado SEMPRE irão retornar o valor sem a formatação
613
- # mesmo que seja setado
614
- ##############################################################
615
-
616
- # Retorna o documento do sacado com tamanho 0, 11 ou 14 caracteres
617
- # Sempre retorna o valor sem a formatação
618
- #
619
- # @return String
620
- #
621
- def documento_sacado
622
- return "" unless @documento_sacado.present?
623
- BrBoleto::Helper::CpfCnpj.new(@documento_sacado).sem_formatacao
624
- end
625
-
626
- # Retorna o documento do sacado formatado
627
- #
628
- # @return String
629
- #
630
- def documento_sacado_formatado
631
- BrBoleto::Helper::CpfCnpj.new(documento_sacado).com_formatacao
632
- end
633
-
634
- # Retorna o documento do sacado formatado com label de CNPJ ou CPF
635
- #
636
- # @return String
637
- #
638
- def documento_sacado_formatado_com_label
639
- BrBoleto::Helper::CpfCnpj.new(documento_sacado).formatado_com_label
640
- end
641
-
642
- # Retorna o documento do cedente com tamanho 0, 11 ou 14 caracteres
643
- # Sempre retorna o valor sem a formatação
644
- #
645
- # @return String
646
- #
647
- def documento_cedente
648
- return "" unless @documento_cedente.present?
649
- BrBoleto::Helper::CpfCnpj.new(@documento_cedente).sem_formatacao
650
- end
651
-
652
- # Retorna o documento do cedente formatado
653
- #
654
- # @return String
655
- #
656
- def documento_cedente_formatado
657
- BrBoleto::Helper::CpfCnpj.new(documento_cedente).com_formatacao
658
- end
659
-
660
- # Retorna o documento do cedente formatado com label de CNPJ ou CPF
661
- #
662
- # @return String
663
- #
664
- def documento_cedente_formatado_com_label
665
- BrBoleto::Helper::CpfCnpj.new(documento_cedente).formatado_com_label
666
- end
667
338
  end
668
339
  end
669
340
  end