br_boleto 1.2.2 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
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