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.
- 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
|