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.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/Gemfile.lock +1 -1
- data/README.markdown +278 -98
- data/br_boleto.gemspec +5 -3
- data/lib/br_boleto/active_model_base.rb +1 -1
- data/lib/br_boleto/association/have_conta.rb +109 -0
- data/lib/br_boleto/association/have_pagador.rb +38 -0
- data/lib/br_boleto/association/have_pagamentos.rb +44 -0
- data/lib/br_boleto/boleto/base.rb +50 -379
- data/lib/br_boleto/boleto/caixa.rb +28 -143
- data/lib/br_boleto/boleto/sicoob.rb +24 -144
- data/lib/br_boleto/conta/base.rb +288 -0
- data/lib/br_boleto/conta/caixa.rb +109 -0
- data/lib/br_boleto/conta/sicoob.rb +64 -0
- data/lib/br_boleto/helper/default_codes.rb +33 -0
- data/lib/br_boleto/helper/format_value.rb +1 -0
- data/lib/br_boleto/helper/number.rb +30 -0
- data/lib/br_boleto/pagador.rb +82 -0
- data/lib/br_boleto/remessa/base.rb +28 -50
- data/lib/br_boleto/remessa/cnab240/base.rb +22 -131
- data/lib/br_boleto/remessa/cnab240/caixa.rb +16 -62
- data/lib/br_boleto/remessa/cnab240/helper/header_arquivo.rb +7 -7
- data/lib/br_boleto/remessa/cnab240/helper/header_lote.rb +6 -6
- data/lib/br_boleto/remessa/cnab240/helper/segmento_p.rb +22 -22
- data/lib/br_boleto/remessa/cnab240/helper/segmento_q.rb +16 -16
- data/lib/br_boleto/remessa/cnab240/helper/segmento_r.rb +3 -3
- data/lib/br_boleto/remessa/cnab240/helper/segmento_s.rb +3 -3
- data/lib/br_boleto/remessa/cnab240/helper/trailer_arquivo.rb +3 -3
- data/lib/br_boleto/remessa/cnab240/helper/trailer_lote.rb +3 -3
- data/lib/br_boleto/remessa/cnab240/sicoob.rb +36 -73
- data/lib/br_boleto/remessa/cnab400/base.rb +95 -0
- data/lib/br_boleto/remessa/cnab400/helper/detalhe.rb +136 -0
- data/lib/br_boleto/remessa/cnab400/helper/header.rb +114 -0
- data/lib/br_boleto/remessa/cnab400/helper/trailer.rb +50 -0
- data/lib/br_boleto/remessa/cnab400/sicoob.rb +249 -0
- data/lib/br_boleto/remessa/lote.rb +1 -23
- data/lib/br_boleto/remessa/pagamento.rb +188 -51
- data/lib/br_boleto/retorno/base.rb +9 -0
- data/lib/br_boleto/retorno/cnab240/base.rb +2 -10
- data/lib/br_boleto/retorno/cnab400/base.rb +48 -0
- data/lib/br_boleto/retorno/cnab400/sicoob.rb +42 -0
- data/lib/br_boleto/retorno/pagamento.rb +12 -6
- data/lib/br_boleto/string_methods.rb +8 -2
- data/lib/br_boleto/validations.rb +19 -0
- data/lib/br_boleto/version.rb +3 -3
- data/lib/br_boleto.rb +38 -8
- data/lib/config/locales/br-boleto-en.yml +89 -0
- data/lib/config/locales/br-boleto-pt-BR.yml +89 -0
- data/test/br_boleto/association/have_conta_test.rb +319 -0
- data/test/br_boleto/association/have_pagador_test.rb +110 -0
- data/test/br_boleto/association/have_pagamentos_test.rb +113 -0
- data/test/br_boleto/boleto/base_test.rb +127 -201
- data/test/br_boleto/boleto/caixa_test.rb +58 -72
- data/test/br_boleto/boleto/sicoob_test.rb +88 -147
- data/test/br_boleto/conta/base_test.rb +490 -0
- data/test/br_boleto/conta/caixa_test.rb +154 -0
- data/test/br_boleto/conta/sicoob_test.rb +144 -0
- data/test/br_boleto/helper/number_test.rb +29 -0
- data/test/br_boleto/pagador_test.rb +158 -0
- data/test/br_boleto/remessa/base_test.rb +37 -62
- data/test/br_boleto/remessa/cnab240/base_test.rb +75 -95
- data/test/br_boleto/remessa/cnab240/caixa_test.rb +61 -96
- data/test/br_boleto/remessa/cnab240/helper/header_arquivo_test.rb +11 -11
- data/test/br_boleto/remessa/cnab240/helper/header_lote_test.rb +8 -8
- data/test/br_boleto/remessa/cnab240/helper/segmento_p_test.rb +17 -15
- data/test/br_boleto/remessa/cnab240/helper/segmento_q_test.rb +13 -13
- data/test/br_boleto/remessa/cnab240/helper/segmento_r_test.rb +2 -2
- data/test/br_boleto/remessa/cnab240/helper/segmento_s_test.rb +3 -3
- data/test/br_boleto/remessa/cnab240/helper/trailer_arquivo_test.rb +1 -1
- data/test/br_boleto/remessa/cnab240/helper/trailer_lote_test.rb +1 -1
- data/test/br_boleto/remessa/cnab240/sicoob_test.rb +136 -131
- data/test/br_boleto/remessa/cnab400/base_test.rb +263 -0
- data/test/br_boleto/remessa/cnab400/sicoob_test.rb +179 -0
- data/test/br_boleto/remessa/lote_test.rb +2 -41
- data/test/br_boleto/remessa/pagamento_test.rb +186 -188
- data/test/br_boleto/retorno/base_test.rb +0 -1
- data/test/br_boleto/retorno/cnab240/base_test.rb +12 -11
- data/test/br_boleto/retorno/cnab240/caixa_test.rb +11 -11
- data/test/br_boleto/retorno/cnab240/sicoob_test.rb +11 -11
- data/test/br_boleto/retorno/cnab400/sicoob_test.rb +227 -0
- data/test/br_boleto/retorno/pagamento_test.rb +6 -6
- data/test/factories/boleto/base.rb +9 -7
- data/test/factories/boleto/boleto_caixa.rb +2 -9
- data/test/factories/boleto/boleto_sicoob.rb +10 -8
- data/test/factories/conta/base.rb +10 -0
- data/test/factories/conta/caixa.rb +15 -0
- data/test/factories/conta/sicoob.rb +16 -0
- data/test/factories/pagador.rb +15 -0
- data/test/factories/remessa/base.rb +0 -6
- data/test/factories/remessa/cnab240/base.rb +0 -10
- data/test/factories/remessa/cnab240/caixa.rb +1 -6
- data/test/factories/remessa/cnab240/sicoob.rb +1 -10
- data/test/factories/remessa/cnab400/base.rb +8 -0
- data/test/factories/remessa/cnab400/sicoob.rb +8 -0
- data/test/factories/remessa/pagamento.rb +8 -7
- data/test/fixtures/remessa/cnab240/sicoob.rem +8 -0
- data/test/{files → fixtures}/retorno/cnab240/caixa.ret +0 -0
- data/test/{files → fixtures}/retorno/cnab240/padrao240.ret +0 -0
- data/test/fixtures/retorno/cnab400/sicoob.ret +7 -0
- data/test/inheritance/boleto_test.rb +4 -1
- data/test/inheritance/sicoob_test.rb +23 -7
- data/test/test_helper.rb +70 -0
- 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 {
|
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
|
-
|
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
|
-
|
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
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
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
|
-
#
|
199
|
-
#
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
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
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
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
|
-
:
|
292
|
-
:
|
293
|
-
:
|
294
|
-
:
|
295
|
-
:
|
296
|
-
:
|
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
|