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,182 @@
1
+ module BoletoBancario
2
+ module Core
3
+ # Implementação de emissão de boleto bancário do Banrisul.
4
+ #
5
+ # === Documentação Implementada
6
+ #
7
+ # A documentação na qual essa implementação foi baseada está localizada na pasta
8
+ # 'documentacoes_dos_boletos/banrisul' dentro dessa biblioteca.
9
+ #
10
+ # === Contrato das classes de emissão de boletos
11
+ #
12
+ # Para ver o "<b>contrato</b>" da Emissão de Boletos (geração de código de barras, linha digitável, etc) veja
13
+ # a classe BoletoBancario::Core::Boleto.
14
+ #
15
+ # === Carteiras Suportadas
16
+ #
17
+ # 00 - CCB sem registro
18
+ # 08 - CCB com registro
19
+ #
20
+ # === Usage
21
+ #
22
+ # class BoletoBanrisul < BoletoBancario::Banrisul
23
+ # end
24
+ #
25
+ # boleto = BoletoBanrisul.new do |boleto|
26
+ # boleto.numero_documento = 22832563
27
+ # boleto.agencia = 100
28
+ # boleto.digito_agencia = 81
29
+ # boleto.data_vencimento = Date.parse('2004-07-04')
30
+ # boleto.codigo_cedente = "0000001"
31
+ # boleto.digito_codigo_cedente = "83"
32
+ # boleto.valor_documento = 5.0
33
+ # end
34
+ #
35
+ class Banrisul < Boleto
36
+ # Número de controle
37
+ attr_accessor :digito_codigo_cedente
38
+
39
+ # Tamanho máximo de uma agência no Banrisul (sem número de controle).
40
+ # <b>Método criado justamente para ficar documentado o tamanho máximo aceito até a data corrente.</b>
41
+ #
42
+ # @return [Fixnum] 3
43
+ #
44
+ def self.maximo_agencia
45
+ 3
46
+ end
47
+
48
+ # Tamanho máximo do número de controle da agência.
49
+ # <b>Método criado justamente para ficar documentado o tamanho máximo aceito até a data corrente.</b>
50
+ #
51
+ # @return [Fixnum] 4
52
+ #
53
+ def self.maximo_digito_agencia
54
+ 2
55
+ end
56
+
57
+ # Tamanho máximo do código cedente.
58
+ # <b>Método criado justamente para ficar documentado o tamanho máximo aceito até a data corrente.</b>
59
+ #
60
+ # @return [Fixnum] 4
61
+ #
62
+ def self.maximo_codigo_cedente
63
+ 7
64
+ end
65
+
66
+ # Tamanho máximo de um dígito do código do cedente.
67
+ # <b>Método criado justamente para ficar documentado o tamanho máximo aceito até a data corrente.</b>
68
+ #
69
+ # @return [Fixnum] 2
70
+ #
71
+ def self.maximo_digito_codigo_cedente
72
+ 2
73
+ end
74
+
75
+ # Tamanho máximo do número do documento.
76
+ # <b>Método criado justamente para ficar documentado o tamanho máximo aceito até a data corrente.</b>
77
+ #
78
+ # @return [Fixnum] 8
79
+ #
80
+ def self.maximo_numero_documento
81
+ 8
82
+ end
83
+
84
+ validates :agencia, :digito_agencia, :codigo_cedente, :digito_codigo_cedente, presence: true
85
+
86
+ validates :agencia, length: { maximum: maximo_agencia }, if: :deve_validar_agencia?
87
+ validates :digito_agencia, length: { is: maximo_digito_agencia }, if: :deve_validar_digito_agencia?
88
+ validates :codigo_cedente, length: { maximum: maximo_codigo_cedente }, if: :deve_validar_codigo_cedente?
89
+ validates :digito_codigo_cedente, length: { is: maximo_digito_codigo_cedente }, if: :deve_validar_digito_codigo_cedente?
90
+ validates :numero_documento, length: { maximum: maximo_numero_documento }, if: :deve_validar_numero_documento?
91
+
92
+ # @return [String] 3 caracteres
93
+ #
94
+ def agencia
95
+ @agencia.to_s.rjust(3, '0') if @agencia.present?
96
+ end
97
+
98
+ # @return [String] 8 caracteres
99
+ #
100
+ def numero_documento
101
+ @numero_documento.to_s.rjust(8, '0') if @numero_documento.present?
102
+ end
103
+
104
+ # @return [String] 7 caracteres
105
+ #
106
+ def codigo_cedente
107
+ @codigo_cedente.to_s.rjust(7, '0') if @codigo_cedente.present?
108
+ end
109
+
110
+ # @return [String] Código do Banco descrito na documentação.
111
+ #
112
+ def codigo_banco
113
+ '041'
114
+ end
115
+
116
+ # Dígito do código do banco. Precisa mostrar esse dígito no boleto.
117
+ #
118
+ # @return [String] Dígito do código do banco descrito na documentação.
119
+ #
120
+ def digito_codigo_banco
121
+ '8'
122
+ end
123
+
124
+ # Retorna a Agencia, digito da agencia, código do cedente e o dígito do código do cedente.
125
+ #
126
+ # @return [String]
127
+ #
128
+ def agencia_codigo_cedente
129
+ "#{agencia}.#{digito_agencia} #{codigo_cedente}.#{digito_codigo_cedente}"
130
+ end
131
+
132
+ # Retorna o número do documento com seu número de controle.
133
+ #
134
+ # Para mais detalhes do cálculo, veja a classe ModuloNumeroDeControle.
135
+ #
136
+ # @return [String]
137
+ #
138
+ def nosso_numero
139
+ "#{numero_documento}.#{ModuloNumeroDeControle.new(numero_documento)}"
140
+ end
141
+
142
+ # === Código de barras do banco
143
+ #
144
+ # ________________________________________________________________________________________________
145
+ # | Posição | Tamanho | Descrição |
146
+ # |---------|---------|---------------------------------------------------------------------------|
147
+ # | 20 | 01 | Tipo da cobrança do produto (mais detalhes veja #tipo_da_cobranca) |
148
+ # | 21 | 01 | Constante '1' |
149
+ # | 22-24 | 03 | Agência (sem número de controle) |
150
+ # | 25-31 | 07 | Código do Cedente (sem número de controle) |
151
+ # | 32-39 | 08 | Nosso número (número do documento sem número de controle) |
152
+ # | 40-42 | 03 | Constante '041' |
153
+ # | 43-44 | 02 | Duplo Dígito referente às posições 20 a 42 (módulo do numero de controle) |
154
+ # ------------------------------------------------------------------------------------------------|
155
+ #
156
+ def codigo_de_barras_do_banco
157
+ codigo = "#{tipo_da_cobranca}1#{agencia}#{codigo_cedente}#{numero_documento}041"
158
+ "#{codigo}#{ModuloNumeroDeControle.new(codigo)}"
159
+ end
160
+
161
+ # Tipo da cobranca do boleto
162
+ #
163
+ # "1" Cobrança Normal, Fichário emitido pelo BANRISUL.
164
+ # "2" Cobrança Direta, Fichário emitido pelo CLIENTE.
165
+ #
166
+ # @return [String]
167
+ #
168
+ def tipo_da_cobranca
169
+ "2"
170
+ end
171
+
172
+ # Método usado para verificar se deve realizar a validação de tamanho do campo 'digito_codigo_cedente'.
173
+ # <b>Sobrescreva esse método na subclasse, caso você mesmo queira fazer as validações</b>.
174
+ #
175
+ # @return [True]
176
+ #
177
+ def deve_validar_digito_codigo_cedente?
178
+ true
179
+ end
180
+ end
181
+ end
182
+ end
@@ -0,0 +1,559 @@
1
+ # encoding: utf-8
2
+ module BoletoBancario
3
+ module Core
4
+ # @abstract Métodos { #codigo_banco, #digito_codigo_banco, #agencia_codigo_cedente, #nosso_numero, #codigo_de_barras_do_banco}
5
+ # Métodos para serem escritos nas subclasses (exitem outros opcionais, conforme visto nessa documentação).
6
+ #
7
+ class Boleto
8
+ include BoletoBancario::Calculos
9
+
10
+ # Seguindo a interface do Active Model para:
11
+ # * Validações;
12
+ # * Internacionalização;
13
+ # * Nomes das classes para serem manipuladas;
14
+ #
15
+ include ActiveModel::Validations
16
+ include ActiveModel::Conversion
17
+ extend ActiveModel::Naming
18
+ extend ActiveModel::Translation
19
+
20
+ # Nome/Razão social que aparece no campo 'Cedente' no boleto.
21
+ #
22
+ attr_accessor :cedente
23
+
24
+ # <b>Código do Cedente é o código do cliente, fornecido pelo banco.</b>
25
+ #
26
+ # Alguns bancos, dependendo do banco e da carteira, precisam desse campo preenchido.
27
+ # Em compensação, outros bancos (a minoria) não fazem utilização desse campo.
28
+ #
29
+ attr_accessor :codigo_cedente
30
+
31
+ # Documento do Cedente (CPF ou CNPJ).
32
+ # <b>OBS.: Esse campo não possui validação do campo. Caso você precise imeplemente na subclasse.</b>
33
+ #
34
+ # Esse campo serve apenas para mostrar no boleto no campo "CPF/CNPJ".
35
+ #
36
+ attr_accessor :documento_cedente
37
+
38
+ # Deve ser informado o endereço completo do Cedente.
39
+ # Se o título possuir a figura de Sacador Avalista o endereço informado
40
+ # deverá ser do Sacador Avalista, conforme Lei Federal 12.039 de 01/10/2009.
41
+ #
42
+ # <b>Campo Obrigatório</b>
43
+ #
44
+ attr_accessor :endereco_cedente
45
+
46
+ # Data do vencimento do boleto. Campo auto explicativo.
47
+ #
48
+ # <b>Campo Obrigatório</b>
49
+ #
50
+ attr_accessor :data_vencimento
51
+
52
+ # Número do documento que será mostrado no boleto.
53
+ # Campo de resposabilidade do Cedente e cada banco possui um tamanho esperado.
54
+ #
55
+ attr_accessor :numero_documento
56
+
57
+ # Valor total do documento. Campo auto explicativo.
58
+ #
59
+ # <b>Campo Obrigatório</b>.
60
+ #
61
+ attr_accessor :valor_documento
62
+
63
+ # Uma carteira de cobrança define o modo como o boleto é tratado pelo banco.
64
+ # Existem duas grandes divisões: carteiras não registradas e carteiras registradas.
65
+ #
66
+ # === Carteiras Não Registradas
67
+ #
68
+ # Significa que não há registro no banco sobre os boletos gerados, ou seja, você não precisa
69
+ # notificar o banco a cada boleto gerado.
70
+ # Neste caso a cobrança de taxa bancária é feita por boleto pago.
71
+ #
72
+ # === Carteiras Registradas
73
+ #
74
+ # Você precisa notificar o banco sobre todos os boletos gerados, em geral enviando um
75
+ # arquivo chamado "arquivo de remessa".
76
+ # Neste caso, normalmente existe uma taxa bancária por boleto gerado, independentemente de ele ser pago.
77
+ # Nestas carteiras também se encaixam serviços bancários adicionais, como protesto em caso de não pagamento.
78
+ #
79
+ # <b>Campo Obrigatório</b>
80
+ #
81
+ attr_accessor :carteira
82
+
83
+ # Número da agência. Campo auto explicativo.
84
+ #
85
+ attr_accessor :agencia
86
+
87
+ # Dígito da agência. Campo auto explicativo.
88
+ # Alguns bancos tem o agência, enquanto outros não possuem.
89
+ #
90
+ attr_accessor :digito_agencia
91
+
92
+ # Número da Conta corrente. Campo auto explicativo.
93
+ #
94
+ attr_accessor :conta_corrente
95
+
96
+ # Dígito da conta corrente. Campo auto explicativo.
97
+ # Alguns bancos tem o dígito da conta corrente outros não.
98
+ #
99
+ attr_accessor :digito_conta_corrente
100
+
101
+ # Código da moeda. Campo auto explicativo.
102
+ # Padrão '9' (Real).
103
+ #
104
+ attr_accessor :codigo_moeda
105
+
106
+ # Essencial para identificação da moeda em que a operação foi efetuada.
107
+ #
108
+ # Padrão 'R$' (Real).
109
+ #
110
+ attr_accessor :especie
111
+
112
+ # Normalmente se vê neste campo a informação "DM" que quer dizer duplicata mercantil,
113
+ # mas existem inúmeros tipos de espécie, <b>neste caso é aconselhável discutir com o banco
114
+ # qual a espécie de documento será utilizada</b>, a identificação incorreta da espécie do documento
115
+ # não vai impedir que o boleto seja pago e nem que o credito seja efetuado na conta do cliente,
116
+ # mas <b>pode ocasionar na impossibilidade de se protestar o boleto caso venha a ser necessário.</b>
117
+ #
118
+ # Segue a sigla e descrição do campo especie do documento:
119
+ #
120
+ # ---------------------------------
121
+ # | Sigla | Descrição |
122
+ # ----------------------------------
123
+ # | NP | Nota Promissória |
124
+ # | NS | Nota de Seguro |
125
+ # | CS | Cobrança Seriada |
126
+ # | REC | Recibo |
127
+ # | LC | Letras de Câmbio |
128
+ # | ND | Notas de débito |
129
+ # | DS | Duplicata de Serviços |
130
+ # | DM | Duplicata Mercantil |
131
+ # ---------------------------------|
132
+ #
133
+ # Padrão 'DM' (Duplicata Mercantil)
134
+ #
135
+ attr_accessor :especie_documento
136
+
137
+ # Data em que o documento foi gerado. Campo auto explicativo.
138
+ #
139
+ attr_accessor :data_documento
140
+
141
+ # Nome do sacado.
142
+ #
143
+ # O sacado é a pessoa para o qual o boleto está sendo emitido, podemos resumir dizendo
144
+ # que o sacado é o cliente do Cedente, ou aquele para o qual uma determina mercadoria
145
+ # foi vendida e o pagamento desta será efetuado por meio de boleto de cobrança.
146
+ #
147
+ # <b>Campo Obrigatório</b>.
148
+ #
149
+ attr_accessor :sacado
150
+
151
+ # Documento do sacado.
152
+ #
153
+ # <b>OBS.: Esse campo não possui validação do campo. Caso você precise imeplemente na subclasse.</b>
154
+ #
155
+ # Esse campo serve apenas para mostrar no boleto no campo "CPF/CNPJ".
156
+ #
157
+ attr_accessor :documento_sacado
158
+
159
+ # Endereço do sacado.
160
+ #
161
+ # <b>OBS.: Esse campo não possui validação do campo. Caso você precise imeplemente na subclasse.</b>
162
+ #
163
+ # Esse campo serve apenas para mostrar no boleto no campo "Sacado".
164
+ #
165
+ attr_accessor :endereco_sacado
166
+
167
+ # Descrição do local do pagamento.
168
+ #
169
+ attr_accessor :local_pagamento
170
+
171
+ # Aceitar após o vencimento.
172
+ # Nessa gem utilizamos o campo aceite como Boolean.
173
+ # Obviamente, true para 'S' e false/nil para 'N'.
174
+ #
175
+ attr_accessor :aceite
176
+
177
+ # Tamanho maximo do valor do documento do boleto.
178
+ # Acredito que não existirá valor de documento nesse valor,
179
+ # <b>porém a biblioteca precisa manter a consistência</b>.
180
+ #
181
+ # No código de barras o valor do documento precisa
182
+ # ter um tamanho de 8 caracteres para os reais (acrescentando zeros à esquerda),
183
+ # e 2 caracteres nos centavos (acrescentando zeros à esquerda).
184
+ #
185
+ # @return [Float] 99999999.99
186
+ #
187
+ def self.valor_documento_tamanho_maximo
188
+ 99999999.99
189
+ end
190
+
191
+ # Validações de todos os boletos
192
+ #
193
+ validates :carteira, :valor_documento, :numero_documento, :data_vencimento, presence: true
194
+ validates :cedente, :endereco_cedente, presence: true
195
+ validates :sacado, :documento_sacado, presence: true
196
+ validates :valor_documento, numericality: { less_than_or_equal_to: valor_documento_tamanho_maximo }
197
+ validate :data_vencimento_deve_ser_uma_data
198
+
199
+ # Passing the attributes as Hash or block
200
+ #
201
+ # @overload initialize(options = {}, &block)
202
+ # @param [Hash] options Passing a hash accessing the attributes of the self.
203
+ # @option options [String] :cedente
204
+ # @option options [String] :codigo_cedente
205
+ # @option options [String] :documento_cedente
206
+ # @option options [String] :endereco_cedente
207
+ # @option options [String] :conta_corrente
208
+ # @option options [String] :digito_conta_corrente
209
+ # @option options [String] :agencia
210
+ # @option options [Date] :data_vencimento
211
+ # @option options [String] :numero_documento
212
+ # @option options [Float] :valor_documento
213
+ # @option options [String] :codigo_moeda
214
+ # @option options [String] :especie
215
+ # @option options [String] :especie_documento
216
+ # @option options [String] :sacado
217
+ # @option options [String] :documento_sacado
218
+ #
219
+ # @param [Proc] block Optional params. Passing a block accessing the attributes of the self.
220
+ #
221
+ # For the options, waiting for the ActiveModel 4 and the ActiveModel::Model. :)
222
+ #
223
+ # === Exemplos
224
+ #
225
+ # O recomendado é usar os boletos herdando de seu respectivo banco. Por exemplo:
226
+ #
227
+ # class Itau < BoletoBancario::Itau
228
+ # end
229
+ #
230
+ # Agora você pode emitir um boleto usando a classe criada acima:
231
+ #
232
+ # Itau.new(conta_corrente: '89755', agencia: '0097', :carteira => '195')
233
+ #
234
+ # Você pode usar blocos se quiser:
235
+ #
236
+ # Itau.new do |boleto|
237
+ # boleto.conta_corrente = '89755'
238
+ # boleto.agencia = '0097'
239
+ # boleto.carteira = '198'
240
+ # boleto.numero_documento = '12345678'
241
+ # boleto.codigo_cedente = '909014'
242
+ # end
243
+ #
244
+ def initialize(options={}, &block)
245
+ default_options.merge(options).each do |attribute, value|
246
+ send("#{attribute}=", value) if respond_to?("#{attribute}=")
247
+ end
248
+
249
+ yield(self) if block_given?
250
+ end
251
+
252
+ # Opções default.
253
+ #
254
+ # Caso queira sobrescrever as opções, você pode simplesmente instanciar o objeto passando a opção desejada:
255
+ #
256
+ # class Bradesco < BoletoBancario::Bradesco
257
+ # end
258
+ #
259
+ # Bradesco.new do |bradesco|
260
+ # bradesco.codigo_moeda = 'outro_codigo_da_moeda'
261
+ # bradesco.especie = 'outra_especie_que_nao_seja_em_reais'
262
+ # bradesco.especie_documento = 'outra_especie_do_documento'
263
+ # bradesco.data_documento = Date.tomorrow
264
+ # bradesco.aceite = false
265
+ # end
266
+ #
267
+ # @return [Hash] Código da Moeda sendo '9' (real). Espécie sendo 'R$' (real).
268
+ #
269
+ def default_options
270
+ {
271
+ :codigo_moeda => '9',
272
+ :especie => 'R$',
273
+ :especie_documento => 'DM',
274
+ :local_pagamento => 'PAGÁVEL EM QUALQUER BANCO ATÉ O VENCIMENTO',
275
+ :data_documento => Date.today,
276
+ :aceite => true
277
+ }
278
+ end
279
+
280
+ # Código do Banco.
281
+ # <b>Esse campo é específico para cada banco</b>.
282
+ #
283
+ # @return [String] Corresponde ao código do banco.
284
+ #
285
+ # @raise [NotImplementedError] Precisa implementar nas subclasses.
286
+ #
287
+ def codigo_banco
288
+ raise NotImplementedError.new("Not implemented #codigo_banco in #{self}.")
289
+ end
290
+
291
+ # Dígito do código do banco.
292
+ # <b>Esse campo é específico para cada banco</b>.
293
+ #
294
+ # @return [String] Corresponde ao dígito do código do banco.
295
+ # @raise [NotImplementedError] Precisa implementar nas subclasses.
296
+ #
297
+ def digito_codigo_banco
298
+ raise NotImplementedError.new("Not implemented #digito_codigo_banco in #{self}.")
299
+ end
300
+
301
+ # Formata o código do banco com o dígito do código do banco.
302
+ # Método usado para o campo de código do banco localizado no cabeçalho do boleto.
303
+ #
304
+ # @return [String]
305
+ #
306
+ def codigo_banco_formatado
307
+ "#{codigo_banco}-#{digito_codigo_banco}"
308
+ end
309
+
310
+ # Agência, código do cedente ou nosso número.
311
+ # <b>Esse campo é específico para cada banco</b>.
312
+ #
313
+ # @return [String] - Corresponde aos campos "Agencia / Codigo do Cedente".
314
+ # @raise [NotImplementedError] Precisa implementar nas subclasses.
315
+ #
316
+ def agencia_codigo_cedente
317
+ raise NotImplementedError.new("Not implemented #agencia_codigo_cedente in #{self}.")
318
+ end
319
+
320
+ # O Nosso Número é o número que identifica unicamente um boleto para uma conta.
321
+ # O tamanho máximo do Nosso Número depende do banco e carteira.
322
+ #
323
+ # <b>Para carteiras registradas, você deve solicitar ao seu banco um intervalo de números para utilização.</b>
324
+ # Quando estiver perto do fim do intervalo, deve solicitar um novo intervalo.
325
+ #
326
+ # <b>Para carteiras não registradas o Nosso Número é livre</b>.
327
+ # Ao receber o retorno do banco, é através do Nosso Número que será possível identificar os boletos pagos.
328
+ #
329
+ # <b>Esse campo é específico para cada banco</b>.
330
+ #
331
+ # @return [String] Corresponde ao formato específico de cada banco.
332
+ # @raise [NotImplementedError] Precisa implementar nas subclasses.
333
+ #
334
+ def nosso_numero
335
+ raise NotImplementedError.new("Not implemented #nosso_numero in #{self}.")
336
+ end
337
+
338
+ # Formata o valor do documentado para ser mostrado no código de barras
339
+ # e na linha digitável com 08 dígitos na casa dos Reais e 02 dígitos nas casas dos centavos.
340
+ #
341
+ # @example
342
+ #
343
+ # Bradesco.new(:valor_documento => 123.45).valor_formatado_para_codigo_de_barras
344
+ # # => "0000012345"
345
+ #
346
+ # @return [String] Precisa retornar 10 dígitos para o código de barras (incluindo os centavos).
347
+ #
348
+ def valor_formatado_para_codigo_de_barras
349
+ valor_documento_formatado = (Integer(valor_documento.to_f * 100) / Float(100))
350
+ real, centavos = valor_documento_formatado.to_s.split(/\./)
351
+ "#{real.rjust(8, '0')}#{centavos.rjust(2, '0')}"
352
+ end
353
+
354
+ # Embora o padrão seja mostrar o número da carteira no boleto,
355
+ # <b>alguns bancos</b> requerem que seja mostrado um valor diferente na carteira.
356
+ # <b>Para essas exceções, sobrescreva esse método na subclasse.</b>
357
+ #
358
+ # @return [String] retorna o número da carteira
359
+ #
360
+ def carteira_formatada
361
+ carteira
362
+ end
363
+
364
+ # Se o aceite for 'true', retorna 'S'.
365
+ # Retorna 'N', caso contrário.
366
+ #
367
+ # @return [String]
368
+ #
369
+ def aceite_formatado
370
+ if @aceite.present?
371
+ 'S'
372
+ else
373
+ 'N'
374
+ end
375
+ end
376
+
377
+ # Fator de vencimento que é calculado a partir de uma data base.
378
+ # Veja <b>FatorVencimento</b> para mais detalhes.
379
+ #
380
+ # @return [String] 4 caracteres.
381
+ #
382
+ def fator_de_vencimento
383
+ FatorVencimento.new(data_vencimento)
384
+ end
385
+
386
+ # === Código de Barras
387
+ #
388
+ # O código de barras contêm exatamente 44 posições nessa sequência:
389
+ #
390
+ # ____________________________________________________________
391
+ # | Posição | Tamanho | Descrição |
392
+ # |----------|---------|--------------------------------------|
393
+ # | 01-03 | 03 | Código do banco |
394
+ # | 04 | 01 | Código da moeda |
395
+ # | 05 | 01 | Dígito do código de barras (DAC) |
396
+ # | 06-09 | 04 | Fator de vencimento |
397
+ # | 10-19 | 10 | Valor do documento |
398
+ # | 20-44 | 25 | Critério de cada Banco (Campo livre) |
399
+ # -------------------------------------------------------------
400
+ #
401
+ # @return [String] Código de barras com 44 posições.
402
+ #
403
+ def codigo_de_barras
404
+ "#{codigo_de_barras_padrao}#{codigo_de_barras_do_banco}".insert(4, digito_codigo_de_barras)
405
+ end
406
+
407
+ # Primeira parte do código de barras.
408
+ # <b>Essa parte do código de barras é padrão para todos os bancos.</b>.
409
+ #
410
+ # @return [String] Primeiras 18 posições do código de barras (<b>Não retorna o DAC do código de barras</b>).
411
+ #
412
+ def codigo_de_barras_padrao
413
+ "#{codigo_banco}#{codigo_moeda}#{fator_de_vencimento}#{valor_formatado_para_codigo_de_barras}"
414
+ end
415
+
416
+ # Segunda parte do código de barras.
417
+ # <b>Esse campo é específico para cada banco</b>.
418
+ #
419
+ # @return [String] 25 últimas posições do código de barras.
420
+ # @raise [NotImplementedError] Precisa implementar nas subclasses.
421
+ #
422
+ def codigo_de_barras_do_banco
423
+ raise NotImplementedError.new("Not implemented #codigo_de_barras_do_banco in #{self}.")
424
+ end
425
+
426
+ # Dígito verificador do código de barras (DAC).
427
+ #
428
+ # Por definição da FEBRABAN e do Banco Central do Brasil,
429
+ # na <b>5º posição do Código de Barras</b>, deve ser indicado obrigatoriamente
430
+ # o “dígito verificador” (DAC), calculado através do módulo 11.
431
+ #
432
+ # <b>OBS.:</b> Para mais detalhes deste cálculo,
433
+ # veja a descrição em <b>BoletoBancario::Calculos::Modulo11FatorDe2a9</b>.
434
+ #
435
+ # @return [String] Dígito calculado do código de barras.
436
+ #
437
+ def digito_codigo_de_barras
438
+ Modulo11FatorDe2a9.new("#{codigo_de_barras_padrao}#{codigo_de_barras_do_banco}")
439
+ end
440
+
441
+ # Representação numérica do código de barras, mais conhecida como linha digitável! :p
442
+ #
443
+ # A representação numérica do código de barras é composta, por cinco campos.
444
+ # Sendo os três primeiros campos, amarrados por DAC's (dígitos verificadores),
445
+ # todos calculados pelo módulo 10.
446
+ #
447
+ # <b>OBS.:</b> Para mais detalhes deste cálculo, veja a descrição em Modulo10.
448
+ #
449
+ # === Linha Digitável
450
+ #
451
+ # A linha digitável contêm exatamente 47 posições nessa sequência:
452
+ #
453
+ # _______________________________________________________________________________________________________
454
+ # |Campo | Posição | Tamanho | Descrição |
455
+ # |------|----------|---------|--------------------------------------------------------------------------|
456
+ # | 1º | 01-03 | 03 | Código do banco (posições 1 a 3 do código de barras) |
457
+ # | | 04 | 01 | Código da moeda (posição 4 do código de barras) |
458
+ # | | 05-09 | 5 | Cinco posições do campo livre (posições 20 a 24 do código de barras) |
459
+ # | | 10 | 1 | Dígito verificador do primeiro campo (Módulo10) |
460
+ # |------------------------------------------------------------------------------------------------------|
461
+ # | 2º | 11-20 | 10 | 6º a 15º posições do campo livre (posições 25 a 34 do código de barras) |
462
+ # | | 21 | 01 | Dígito verificador do segundo campo (Módulo10) |
463
+ # |------------------------------------------------------------------------------------------------------|
464
+ # | 3º | 22-31 | 10 | 16º a 25º posições do campo livre (posições 35 a 44 do código de barras) |
465
+ # | | 32 | 01 | Dígito verificador do terceiro campo (Módulo10) |
466
+ # |------------------------------------------------------------------------------------------------------|
467
+ # | 4º | 33 | 01 | Dígito verificador do código de barras (posição 5 do código de barras) |
468
+ # |------------------------------------------------------------------------------------------------------|
469
+ # | 5ª | 34-37 | 04 | Fator de vencimento (posições 6 a 9 do código de barras) |
470
+ # | | 38-47 | 10 | Valor nominal do documento (posições 10 a 19 do código de barras) |
471
+ # -------------------------------------------------------------------------------------------------------|
472
+ #
473
+ # @return [String] Contêm a representação numérica do código de barras formatado com pontos e espaços.
474
+ #
475
+ def linha_digitavel
476
+ LinhaDigitavel.new(codigo_de_barras)
477
+ end
478
+
479
+ # Returns a string that <b>identifying the render path associated with the object</b>.
480
+ #
481
+ # <b>ActionPack uses this to find a suitable partial to represent the object.</b>
482
+ #
483
+ # @return [String]
484
+ #
485
+ def to_partial_path
486
+ "boleto_bancario/#{self.class.name.demodulize.underscore}"
487
+ end
488
+
489
+ # Seguindo a interface do Active Model.
490
+ #
491
+ # @return [False]
492
+ #
493
+ def persisted?
494
+ false
495
+ end
496
+
497
+ # Método usado para verificar se deve realizar a validação de tamanho do campo 'agência'.
498
+ # <b>Sobrescreva esse método na subclasse, caso você mesmo queira fazer as validações</b>.
499
+ #
500
+ # @return [True]
501
+ #
502
+ def deve_validar_agencia?
503
+ true
504
+ end
505
+
506
+ # Método usado para verificar se deve realizar a validação de tamanho do campo 'digito_agência'.
507
+ # <b>Sobrescreva esse método na subclasse, caso você mesmo queira fazer as validações</b>.
508
+ #
509
+ # @return [True]
510
+ #
511
+ def deve_validar_digito_agencia?
512
+ true
513
+ end
514
+
515
+ # Método usado para verificar se deve realizar a validação de tamanho do campo 'conta_corrente'.
516
+ # <b>Sobrescreva esse método na subclasse, caso você mesmo queira fazer as validações</b>.
517
+ #
518
+ # @return [True]
519
+ #
520
+ def deve_validar_conta_corrente?
521
+ true
522
+ end
523
+
524
+ # Método usado para verificar se deve realizar a validação de tamanho do campo 'codigo_cedente'.
525
+ # <b>Sobrescreva esse método na subclasse, caso você mesmo queira fazer as validações</b>.
526
+ #
527
+ # @return [True]
528
+ #
529
+ def deve_validar_codigo_cedente?
530
+ true
531
+ end
532
+
533
+ # Método usado para verificar se deve realizar a validação de tamanho do campo 'numero_documento'.
534
+ # <b>Sobrescreva esse método na subclasse, caso você mesmo queira fazer as validações</b>.
535
+ #
536
+ # @return [True]
537
+ #
538
+ def deve_validar_numero_documento?
539
+ true
540
+ end
541
+
542
+ # Método usado para verificar se deve realizar a validação de tamanho do campo 'carteira'.
543
+ # <b>Sobrescreva esse método na subclasse, caso você mesmo queira fazer as validações</b>.
544
+ #
545
+ # @return [True]
546
+ #
547
+ def deve_validar_carteira?
548
+ true
549
+ end
550
+
551
+ # Verifica e valida se a data do vencimento deve ser uma data válida.
552
+ # <b>Precisa ser uma data para o cálculo do fator do vencimento.</b>
553
+ #
554
+ def data_vencimento_deve_ser_uma_data
555
+ errors.add(:data_vencimento, :invalid) unless data_vencimento.kind_of?(Date)
556
+ end
557
+ end
558
+ end
559
+ end