boleto_bancario 0.0.1.beta → 1.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 +7 -0
- data/Changelog.markdown +58 -2
- data/README.markdown +679 -156
- data/lib/boleto_bancario/calculos/documento.rb +191 -0
- data/lib/boleto_bancario/calculos/fator_vencimento.rb +78 -31
- data/lib/boleto_bancario/calculos/modulo11_fator_de9a2.rb +65 -0
- data/lib/boleto_bancario/calculos/modulo11_fator_de9a2_resto_x.rb +5 -51
- data/lib/boleto_bancario/calculos/modulo_numero_de_controle.rb +117 -0
- data/lib/boleto_bancario/core/banco_brasil.rb +30 -5
- data/lib/boleto_bancario/core/banrisul.rb +182 -0
- data/lib/boleto_bancario/core/boleto.rb +97 -35
- data/lib/boleto_bancario/core/bradesco.rb +28 -16
- data/lib/boleto_bancario/core/c6_bank.rb +155 -0
- data/lib/boleto_bancario/core/caixa.rb +233 -0
- data/lib/boleto_bancario/core/inter.rb +155 -0
- data/lib/boleto_bancario/core/itau.rb +20 -10
- data/lib/boleto_bancario/core/nubank.rb +156 -0
- data/lib/boleto_bancario/core/santander.rb +19 -22
- data/lib/boleto_bancario/core/sicoob.rb +172 -0
- data/lib/boleto_bancario/core/sicredi.rb +290 -0
- data/lib/boleto_bancario/locales/pt-BR.yml +55 -0
- data/lib/boleto_bancario/renderers/base.rb +154 -0
- data/lib/boleto_bancario/renderers/html_renderer.rb +92 -0
- data/lib/boleto_bancario/renderers/pdf_renderer.rb +130 -0
- data/lib/boleto_bancario/renderers/png_renderer.rb +66 -0
- data/lib/boleto_bancario/templates/_barcode.html.erb +3 -0
- data/lib/boleto_bancario/templates/_cedente.html.erb +14 -0
- data/lib/boleto_bancario/templates/_header.html.erb +4 -0
- data/lib/boleto_bancario/templates/_instructions.html.erb +10 -0
- data/lib/boleto_bancario/templates/_payment.html.erb +36 -0
- data/lib/boleto_bancario/templates/_sacado.html.erb +10 -0
- data/lib/boleto_bancario/templates/boleto.html.erb +22 -0
- data/lib/boleto_bancario/templates/boleto_styles.css +18 -0
- data/lib/boleto_bancario/version.rb +3 -2
- data/lib/boleto_bancario.rb +48 -19
- data/lib/generators/boleto_bancario/views_generator.rb +47 -0
- metadata +140 -106
- data/.gitignore +0 -18
- data/.rspec +0 -1
- data/.rvmrc +0 -1
- data/Gemfile +0 -3
- data/Planning.markdown +0 -131
- data/Rakefile +0 -9
- data/TODO.markdown +0 -5
- data/boleto_bancario.gemspec +0 -25
- data/documentacoes_dos_boletos/Bradesco/Manual_BRADESCO.PDF +0 -0
- data/spec/boleto_bancario/calculos/digitos_spec.rb +0 -19
- data/spec/boleto_bancario/calculos/fator_vencimento_spec.rb +0 -59
- data/spec/boleto_bancario/calculos/fatores_de_multiplicacao_spec.rb +0 -69
- data/spec/boleto_bancario/calculos/linha_digitavel_spec.rb +0 -57
- data/spec/boleto_bancario/calculos/modulo10_spec.rb +0 -49
- data/spec/boleto_bancario/calculos/modulo11_fator_de2a7_spec.rb +0 -43
- data/spec/boleto_bancario/calculos/modulo11_fator_de2a9_resto_zero_spec.rb +0 -39
- data/spec/boleto_bancario/calculos/modulo11_fator_de2a9_spec.rb +0 -61
- data/spec/boleto_bancario/calculos/modulo11_fator_de9a2_resto_x_spec.rb +0 -37
- data/spec/boleto_bancario/calculos/modulo11_spec.rb +0 -19
- data/spec/boleto_bancario/core/banco_brasil_spec.rb +0 -383
- data/spec/boleto_bancario/core/boleto_spec.rb +0 -102
- data/spec/boleto_bancario/core/bradesco_spec.rb +0 -170
- data/spec/boleto_bancario/core/itau_spec.rb +0 -336
- data/spec/boleto_bancario/core/santander_spec.rb +0 -135
- data/spec/shared_examples/boleto_bancario_shared_example.rb +0 -164
- data/spec/spec_helper.rb +0 -14
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
module BoletoBancario
|
|
3
|
+
module Core
|
|
4
|
+
# Implementação de emissão de boleto bancário pela Caixa Econômica Federal.
|
|
5
|
+
#
|
|
6
|
+
# === Documentação Implementada
|
|
7
|
+
#
|
|
8
|
+
# A documentação na qual essa implementação foi baseada está localizada na pasta
|
|
9
|
+
# 'documentacoes_dos_boletos/caixa' dentro dessa biblioteca.
|
|
10
|
+
# === Carteiras suportadas
|
|
11
|
+
#
|
|
12
|
+
# Segue abaixo as carteiras suportadas da Caixa Econômica Federal <b>seguindo a documentação</b>:
|
|
13
|
+
#
|
|
14
|
+
# _________________________________________________________________________
|
|
15
|
+
# | Carteira | Descrição | Testada/Homologada no banco |
|
|
16
|
+
# | 14 | Cobrança Simples com registro | Esperando Contribuição |
|
|
17
|
+
# | 24 | Cobrança Simples sem registro | Esperando Contribuição |
|
|
18
|
+
# |_________________________________________________________________________|
|
|
19
|
+
#
|
|
20
|
+
class Caixa < Boleto
|
|
21
|
+
# Tamanho máximo de uma agência na Caixa Econômica Federal.
|
|
22
|
+
# <b>Método criado justamente para ficar documentado o tamanho máximo aceito até a data corrente.</b>
|
|
23
|
+
#
|
|
24
|
+
# @return [Fixnum] 4
|
|
25
|
+
#
|
|
26
|
+
def self.tamanho_maximo_agencia
|
|
27
|
+
4
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
# Tamanho máximo do código do cedente emitido no Boleto.
|
|
31
|
+
# <b>Método criado justamente para ficar documentado o tamanho máximo aceito até a data corrente.</b>
|
|
32
|
+
#
|
|
33
|
+
# @return [Fixnum] 6
|
|
34
|
+
#
|
|
35
|
+
def self.tamanho_maximo_codigo_cedente
|
|
36
|
+
6
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
# <b>Carteiras suportadas.</b>
|
|
40
|
+
# <b>Método criado para validar se a carteira informada é suportada.</b>
|
|
41
|
+
#
|
|
42
|
+
# @return [Array]
|
|
43
|
+
#
|
|
44
|
+
def self.carteiras_suportadas
|
|
45
|
+
%w[14 24]
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
# Tamanho máximo do número do documento emitido no Boleto.
|
|
49
|
+
# <b>Método criado justamente para ficar documentado o tamanho máximo aceito até a data corrente.</b>
|
|
50
|
+
#
|
|
51
|
+
# @return [Fixnum] 15
|
|
52
|
+
#
|
|
53
|
+
def self.tamanho_maximo_numero_documento
|
|
54
|
+
15
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
# Tamanho maximo do valor do documento do boleto.
|
|
58
|
+
# O valor maximo descrito na decumentação é de 9999999.99
|
|
59
|
+
#
|
|
60
|
+
# @return [Float] 9999999.99
|
|
61
|
+
#
|
|
62
|
+
def self.valor_documento_tamanho_maximo
|
|
63
|
+
9999999.99
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
# Validações para os campos abaixo:
|
|
67
|
+
#
|
|
68
|
+
# * Agencia
|
|
69
|
+
# * Conta Corrente
|
|
70
|
+
# * Carteira
|
|
71
|
+
# * Número do documento
|
|
72
|
+
#
|
|
73
|
+
# Se você quiser sobrescrever os metodos, <b>ficará a sua responsabilidade.</b>
|
|
74
|
+
# Basta você sobrescrever os métodos de validação:
|
|
75
|
+
#
|
|
76
|
+
# class Santander < BoletoBancario::Core::Santander
|
|
77
|
+
# def self.tamanho_maximo_agencia
|
|
78
|
+
# 5
|
|
79
|
+
# end
|
|
80
|
+
#
|
|
81
|
+
# def self.tamanho_maximo_codigo_cedente
|
|
82
|
+
# 7
|
|
83
|
+
# end
|
|
84
|
+
#
|
|
85
|
+
# def self.tamanho_maximo_numero_documento
|
|
86
|
+
# 10
|
|
87
|
+
# end
|
|
88
|
+
#
|
|
89
|
+
# def self.carteiras_suportadas
|
|
90
|
+
# %w[10 53]
|
|
91
|
+
# end
|
|
92
|
+
# end
|
|
93
|
+
#
|
|
94
|
+
# Obs.: Mudar as regras de validação podem influenciar na emissão do boleto em si.
|
|
95
|
+
# Talvez você precise analisar o efeito no #codigo_de_barras e na #linha_digitável (ambos podem ser
|
|
96
|
+
# sobreescritos também).
|
|
97
|
+
#
|
|
98
|
+
validates :agencia, :codigo_cedente, presence: true
|
|
99
|
+
|
|
100
|
+
validates :agencia, length: { maximum: tamanho_maximo_agencia }, if: :deve_validar_agencia?
|
|
101
|
+
validates :codigo_cedente, length: { maximum: tamanho_maximo_codigo_cedente }, if: :deve_validar_codigo_cedente?
|
|
102
|
+
validates :numero_documento, length: { maximum: tamanho_maximo_numero_documento }, if: :deve_validar_numero_documento?
|
|
103
|
+
|
|
104
|
+
validates :carteira, inclusion: { in: ->(object) { object.class.carteiras_suportadas } }, if: :deve_validar_carteira?
|
|
105
|
+
|
|
106
|
+
# @return [String] 4 caracteres
|
|
107
|
+
#
|
|
108
|
+
def agencia
|
|
109
|
+
@agencia.to_s.rjust(4, '0') if @agencia.present?
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
# @return [String] 6 caracteres
|
|
113
|
+
#
|
|
114
|
+
def codigo_cedente
|
|
115
|
+
@codigo_cedente.to_s.rjust(6, '0') if @codigo_cedente.present?
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
# @return [String] 15 caracteres
|
|
119
|
+
#
|
|
120
|
+
def numero_documento
|
|
121
|
+
@numero_documento.to_s.rjust(15, '0') if @numero_documento.present?
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
# Formata a carteira dependendo se ela é registrada ou não.
|
|
125
|
+
#
|
|
126
|
+
# Para cobrança COM registro usar: <b>RG</b>
|
|
127
|
+
# Para Cobrança SEM registro usar: <b>SR</b>
|
|
128
|
+
#
|
|
129
|
+
# @return [String]
|
|
130
|
+
#
|
|
131
|
+
def carteira_formatada
|
|
132
|
+
if @carteira.to_s.in?(carteiras_com_registro)
|
|
133
|
+
"RG"
|
|
134
|
+
else
|
|
135
|
+
'SR'
|
|
136
|
+
end
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
# Retorna as carteiras com registro da Caixa Econômica Federal.
|
|
140
|
+
# <b>Você pode sobrescrever esse método na subclasse caso exista mais
|
|
141
|
+
# carteiras com registro na Caixa Econômica Federal.</b>
|
|
142
|
+
#
|
|
143
|
+
# @return [Array]
|
|
144
|
+
#
|
|
145
|
+
def carteiras_com_registro
|
|
146
|
+
%w(14)
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
def tipo_cobranca
|
|
150
|
+
carteira.first if carteira.present?
|
|
151
|
+
end
|
|
152
|
+
|
|
153
|
+
def identificador_de_emissao
|
|
154
|
+
carteira.last if carteira.present?
|
|
155
|
+
end
|
|
156
|
+
|
|
157
|
+
# @return [String] Código do Banco descrito na documentação.
|
|
158
|
+
#
|
|
159
|
+
def codigo_banco
|
|
160
|
+
'104'
|
|
161
|
+
end
|
|
162
|
+
|
|
163
|
+
# @return [String] Dígito do código do banco descrito na documentação.
|
|
164
|
+
#
|
|
165
|
+
def digito_codigo_banco
|
|
166
|
+
'0'
|
|
167
|
+
end
|
|
168
|
+
|
|
169
|
+
# Campo Agência / Código do Cedente (Número fornecido pelo Banco)
|
|
170
|
+
#
|
|
171
|
+
# @return [String]
|
|
172
|
+
#
|
|
173
|
+
def agencia_codigo_cedente
|
|
174
|
+
"#{agencia} / #{codigo_cedente}-#{codigo_cedente_dv}"
|
|
175
|
+
end
|
|
176
|
+
|
|
177
|
+
def codigo_cedente_dv
|
|
178
|
+
Modulo11FatorDe2a9RestoZero.new(codigo_cedente)
|
|
179
|
+
end
|
|
180
|
+
|
|
181
|
+
# Mostra o campo nosso número calculando o dígito verificador do nosso número.
|
|
182
|
+
#
|
|
183
|
+
# @return [String]
|
|
184
|
+
#
|
|
185
|
+
def nosso_numero
|
|
186
|
+
"#{carteira}#{numero_documento}-#{nosso_numero_dv}"
|
|
187
|
+
end
|
|
188
|
+
|
|
189
|
+
def nosso_numero_dv
|
|
190
|
+
Modulo11FatorDe2a9RestoZero.new("#{carteira}#{numero_documento}")
|
|
191
|
+
end
|
|
192
|
+
|
|
193
|
+
def nosso_numero_de3a5
|
|
194
|
+
nosso_numero[2..4] if nosso_numero.present?
|
|
195
|
+
end
|
|
196
|
+
|
|
197
|
+
def nosso_numero_de6a8
|
|
198
|
+
nosso_numero[5..7] if nosso_numero.present?
|
|
199
|
+
end
|
|
200
|
+
|
|
201
|
+
def nosso_numero_de9a17
|
|
202
|
+
nosso_numero[8..16] if nosso_numero.present?
|
|
203
|
+
end
|
|
204
|
+
|
|
205
|
+
|
|
206
|
+
# === Código de barras do banco
|
|
207
|
+
#
|
|
208
|
+
# ________________________________________________________________________________________
|
|
209
|
+
# | Posição | Tamanho | Descrição |
|
|
210
|
+
# |----------|---------|------------------------------------------------------------------|
|
|
211
|
+
# | 20 - 25 | 06 | Código do Beneficiário |
|
|
212
|
+
# | 26 - 26 | 01 | DV do Código do Beneficiário |
|
|
213
|
+
# | 27 – 29 | 03 | Nosso Número - 3ª a 5ª posição do Nosso Número |
|
|
214
|
+
# | 30 – 30 | 01 | Constante 1, tipo de cobrança (1-Registrada / 2-Sem Registro) |
|
|
215
|
+
# | 31 – 33 | 03 | Nosso Número - 6ª a 8ª posição do Nosso Número |
|
|
216
|
+
# | 34 – 34 | 01 | Constante 2, identificador de emissão do boleto (4-Beneficiário) |
|
|
217
|
+
# | 35 – 43 | 09 | Nosso Número - 9ª a 17ª posição do Nosso Número |
|
|
218
|
+
# | 44 – 44 | 01 | DV do Campo Livre |
|
|
219
|
+
# -----------------------------------------------------------------------------------------
|
|
220
|
+
#
|
|
221
|
+
# @return [String]
|
|
222
|
+
#
|
|
223
|
+
def codigo_de_barras_do_banco
|
|
224
|
+
codigo = "#{codigo_cedente}#{codigo_cedente_dv}#{nosso_numero_de3a5}#{tipo_cobranca}#{nosso_numero_de6a8}"
|
|
225
|
+
codigo << "#{identificador_de_emissao}#{nosso_numero_de9a17}"
|
|
226
|
+
|
|
227
|
+
codigo_dv = Modulo11FatorDe2a9RestoZero.new(codigo)
|
|
228
|
+
|
|
229
|
+
"#{codigo}#{codigo_dv}"
|
|
230
|
+
end
|
|
231
|
+
end
|
|
232
|
+
end
|
|
233
|
+
end
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module BoletoBancario
|
|
4
|
+
module Core
|
|
5
|
+
# Implementação de emissão de boleto bancário pelo Banco Inter.
|
|
6
|
+
#
|
|
7
|
+
# === Documentação Implementada
|
|
8
|
+
#
|
|
9
|
+
# A documentação na qual essa implementação foi baseada está localizada na pasta
|
|
10
|
+
# 'documentacoes_dos_boletos/inter' dentro dessa biblioteca.
|
|
11
|
+
#
|
|
12
|
+
# === Contrato das classes de emissão de boletos
|
|
13
|
+
#
|
|
14
|
+
# Para ver o "<b>contrato</b>" da Emissão de Boletos veja a classe BoletoBancario::Core::Boleto.
|
|
15
|
+
#
|
|
16
|
+
# === Carteiras suportadas
|
|
17
|
+
#
|
|
18
|
+
# O Banco Inter trabalha com carteira de cobrança registrada.
|
|
19
|
+
#
|
|
20
|
+
# ___________________________________________________________________________
|
|
21
|
+
# | Carteira | Descrição | Testada/Homologada |
|
|
22
|
+
# | 112 | Cobrança Registrada | Esperando Contribuição |
|
|
23
|
+
# ----------------------------------------------------------------------------
|
|
24
|
+
#
|
|
25
|
+
class Inter < Boleto
|
|
26
|
+
# Tamanho máximo de uma conta corrente no Banco Inter.
|
|
27
|
+
#
|
|
28
|
+
# @return [Integer] 10
|
|
29
|
+
#
|
|
30
|
+
def self.tamanho_maximo_conta_corrente
|
|
31
|
+
10
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
# Tamanho máximo de uma agência no Banco Inter.
|
|
35
|
+
#
|
|
36
|
+
# @return [Integer] 4
|
|
37
|
+
#
|
|
38
|
+
def self.tamanho_maximo_agencia
|
|
39
|
+
4
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
# Tamanho máximo do número do documento.
|
|
43
|
+
#
|
|
44
|
+
# @return [Integer] 11
|
|
45
|
+
#
|
|
46
|
+
def self.tamanho_maximo_numero_documento
|
|
47
|
+
11
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
# Tamanho máximo do código do cedente.
|
|
51
|
+
#
|
|
52
|
+
# @return [Integer] 10
|
|
53
|
+
#
|
|
54
|
+
def self.tamanho_maximo_codigo_cedente
|
|
55
|
+
10
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
# Carteiras suportadas pelo Banco Inter.
|
|
59
|
+
#
|
|
60
|
+
# @return [Array]
|
|
61
|
+
#
|
|
62
|
+
def self.carteiras_suportadas
|
|
63
|
+
%w[112]
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
validates :agencia, :conta_corrente, presence: true
|
|
67
|
+
validates :numero_documento, length: { maximum: tamanho_maximo_numero_documento }, if: :deve_validar_numero_documento?
|
|
68
|
+
validates :conta_corrente, length: { maximum: tamanho_maximo_conta_corrente }, if: :deve_validar_conta_corrente?
|
|
69
|
+
validates :agencia, length: { maximum: tamanho_maximo_agencia }, if: :deve_validar_agencia?
|
|
70
|
+
validates :carteira, inclusion: { in: ->(object) { object.class.carteiras_suportadas } }, if: :deve_validar_carteira?
|
|
71
|
+
|
|
72
|
+
# @return [String] Número do documento com 11 dígitos.
|
|
73
|
+
#
|
|
74
|
+
def numero_documento
|
|
75
|
+
@numero_documento.to_s.rjust(11, '0') if @numero_documento.present?
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
# @return [String] Agência com 4 dígitos.
|
|
79
|
+
#
|
|
80
|
+
def agencia
|
|
81
|
+
@agencia.to_s.rjust(4, '0') if @agencia.present?
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
# @return [String] Conta corrente com 10 dígitos.
|
|
85
|
+
#
|
|
86
|
+
def conta_corrente
|
|
87
|
+
@conta_corrente.to_s.rjust(10, '0') if @conta_corrente.present?
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
# @return [String] Código do cedente com 10 dígitos.
|
|
91
|
+
#
|
|
92
|
+
def codigo_cedente
|
|
93
|
+
@codigo_cedente.to_s.rjust(10, '0') if @codigo_cedente.present?
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
# Código do Banco Inter.
|
|
97
|
+
#
|
|
98
|
+
# @return [String] '077'
|
|
99
|
+
#
|
|
100
|
+
def codigo_banco
|
|
101
|
+
'077'
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
# Dígito do código do banco.
|
|
105
|
+
#
|
|
106
|
+
# @return [String] '9'
|
|
107
|
+
#
|
|
108
|
+
def digito_codigo_banco
|
|
109
|
+
'9'
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
# Dígito verificador da conta corrente.
|
|
113
|
+
#
|
|
114
|
+
# @return [String]
|
|
115
|
+
#
|
|
116
|
+
def digito_conta_corrente
|
|
117
|
+
Modulo10.new(conta_corrente.to_s)
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
# Agência e código do cedente formatados.
|
|
121
|
+
#
|
|
122
|
+
# @return [String]
|
|
123
|
+
#
|
|
124
|
+
def agencia_codigo_cedente
|
|
125
|
+
"#{agencia} / #{conta_corrente}-#{digito_conta_corrente}"
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
# Nosso Número formatado.
|
|
129
|
+
#
|
|
130
|
+
# @return [String]
|
|
131
|
+
#
|
|
132
|
+
def nosso_numero
|
|
133
|
+
"#{numero_documento}-#{digito_nosso_numero}"
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
# Dígito verificador do nosso número.
|
|
137
|
+
#
|
|
138
|
+
# @return [String]
|
|
139
|
+
#
|
|
140
|
+
def digito_nosso_numero
|
|
141
|
+
Modulo11FatorDe2a9.new(numero_documento.to_s)
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
# Segunda parte do código de barras (campo livre).
|
|
145
|
+
# 25 posições específicas do Banco Inter.
|
|
146
|
+
#
|
|
147
|
+
# @return [String]
|
|
148
|
+
#
|
|
149
|
+
def codigo_de_barras_do_banco
|
|
150
|
+
codigo = "#{agencia}#{carteira}#{numero_documento}#{conta_corrente.to_s[0, 7]}"
|
|
151
|
+
"#{codigo.ljust(25, '0')}"
|
|
152
|
+
end
|
|
153
|
+
end
|
|
154
|
+
end
|
|
155
|
+
end
|
|
@@ -180,15 +180,14 @@ module BoletoBancario
|
|
|
180
180
|
7
|
|
181
181
|
end
|
|
182
182
|
|
|
183
|
-
#
|
|
184
|
-
# O tamanho máximo é justamente 3 porque no código de barras só é permitido 3 posições para este campo.
|
|
183
|
+
# <b>Carteiras suportadas.</b>
|
|
185
184
|
#
|
|
186
|
-
# <b>Método criado
|
|
185
|
+
# <b>Método criado para validar se a carteira informada é suportada.</b>
|
|
187
186
|
#
|
|
188
|
-
# @return [
|
|
187
|
+
# @return [Array]
|
|
189
188
|
#
|
|
190
|
-
def self.
|
|
191
|
-
|
|
189
|
+
def self.carteiras_suportadas
|
|
190
|
+
%w[107 109 174 175 196 198 126 131 146 122 142 143 150 168]
|
|
192
191
|
end
|
|
193
192
|
|
|
194
193
|
# Campos obrigatórios
|
|
@@ -198,16 +197,15 @@ module BoletoBancario
|
|
|
198
197
|
# * Dígito da conta corrente
|
|
199
198
|
#
|
|
200
199
|
validates :agencia, :conta_corrente, :digito_conta_corrente, presence: true
|
|
201
|
-
validates :digito_conta_corrente, length: { maximum: 1 }
|
|
202
200
|
|
|
203
|
-
# Validações
|
|
201
|
+
# Validações para os campos abaixo:
|
|
204
202
|
#
|
|
205
203
|
# * Número do documento
|
|
206
204
|
# * Conta Corrente
|
|
207
205
|
# * Agencia
|
|
208
206
|
# * Carteira
|
|
209
207
|
#
|
|
210
|
-
# Se você quiser sobrescrever os
|
|
208
|
+
# Se você quiser sobrescrever os metodos, ficará a sua responsabilidade.
|
|
211
209
|
# Basta você sobrescrever os métodos de validação:
|
|
212
210
|
#
|
|
213
211
|
# class BoletoItau < BoletoBancario::Core::Itau
|
|
@@ -222,6 +220,9 @@ module BoletoBancario
|
|
|
222
220
|
# def self.tamanho_maximo_numero_documento
|
|
223
221
|
# 9
|
|
224
222
|
# end
|
|
223
|
+
# def self.carteiras_suportadas
|
|
224
|
+
# %w[107 109 174 175 196 198 126 131 146 122 142 143 150 168]
|
|
225
|
+
# end
|
|
225
226
|
# end
|
|
226
227
|
#
|
|
227
228
|
# Obs.: Mudar as regras de validação podem influenciar na emissão do boleto em si.
|
|
@@ -231,7 +232,8 @@ module BoletoBancario
|
|
|
231
232
|
validates :numero_documento, length: { maximum: tamanho_maximo_numero_documento }, if: :deve_validar_numero_documento?
|
|
232
233
|
validates :conta_corrente, length: { maximum: tamanho_maximo_conta_corrente }, if: :deve_validar_conta_corrente?
|
|
233
234
|
validates :agencia, length: { maximum: tamanho_maximo_agencia }, if: :deve_validar_agencia?
|
|
234
|
-
|
|
235
|
+
|
|
236
|
+
validates :carteira, inclusion: { in: ->(object) { object.class.carteiras_suportadas } }, if: :deve_validar_carteira?
|
|
235
237
|
|
|
236
238
|
# Campos obrigatórios e validações de tamanho para os campos:
|
|
237
239
|
#
|
|
@@ -298,6 +300,14 @@ module BoletoBancario
|
|
|
298
300
|
'7'
|
|
299
301
|
end
|
|
300
302
|
|
|
303
|
+
# Dígito da conta corrente. Precisa mostrar esse dígito no boleto.
|
|
304
|
+
#
|
|
305
|
+
# @return [String] Dígito da conta corrente calculado apartir do Modulo10.
|
|
306
|
+
#
|
|
307
|
+
def digito_conta_corrente
|
|
308
|
+
Modulo10.new("#{agencia}#{conta_corrente}")
|
|
309
|
+
end
|
|
310
|
+
|
|
301
311
|
# Agência, conta corrente and dígito da conta corrente formatado.
|
|
302
312
|
#
|
|
303
313
|
# @return [String] Campo descrito na documentação (Pag. 50).
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module BoletoBancario
|
|
4
|
+
module Core
|
|
5
|
+
# Implementação de emissão de boleto bancário pelo Nubank.
|
|
6
|
+
#
|
|
7
|
+
# === Documentação Implementada
|
|
8
|
+
#
|
|
9
|
+
# A documentação na qual essa implementação foi baseada está localizada na pasta
|
|
10
|
+
# 'documentacoes_dos_boletos/nubank' dentro dessa biblioteca.
|
|
11
|
+
#
|
|
12
|
+
# === Contrato das classes de emissão de boletos
|
|
13
|
+
#
|
|
14
|
+
# Para ver o "<b>contrato</b>" da Emissão de Boletos veja a classe BoletoBancario::Core::Boleto.
|
|
15
|
+
#
|
|
16
|
+
# === Carteiras suportadas
|
|
17
|
+
#
|
|
18
|
+
# O Nubank trabalha com carteira única de cobrança registrada.
|
|
19
|
+
#
|
|
20
|
+
# ___________________________________________________________________________
|
|
21
|
+
# | Carteira | Descrição | Testada/Homologada |
|
|
22
|
+
# | 1 | Cobrança Registrada | Esperando Contribuição |
|
|
23
|
+
# ----------------------------------------------------------------------------
|
|
24
|
+
#
|
|
25
|
+
class Nubank < Boleto
|
|
26
|
+
# Tamanho máximo de uma conta corrente no Nubank.
|
|
27
|
+
#
|
|
28
|
+
# @return [Integer] 10
|
|
29
|
+
#
|
|
30
|
+
def self.tamanho_maximo_conta_corrente
|
|
31
|
+
10
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
# Tamanho máximo de uma agência no Nubank.
|
|
35
|
+
# Nubank utiliza agência fixa 0001.
|
|
36
|
+
#
|
|
37
|
+
# @return [Integer] 4
|
|
38
|
+
#
|
|
39
|
+
def self.tamanho_maximo_agencia
|
|
40
|
+
4
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
# Tamanho máximo do número do documento.
|
|
44
|
+
#
|
|
45
|
+
# @return [Integer] 11
|
|
46
|
+
#
|
|
47
|
+
def self.tamanho_maximo_numero_documento
|
|
48
|
+
11
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
# Tamanho máximo do código do cedente.
|
|
52
|
+
#
|
|
53
|
+
# @return [Integer] 10
|
|
54
|
+
#
|
|
55
|
+
def self.tamanho_maximo_codigo_cedente
|
|
56
|
+
10
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
# Carteiras suportadas pelo Nubank.
|
|
60
|
+
#
|
|
61
|
+
# @return [Array]
|
|
62
|
+
#
|
|
63
|
+
def self.carteiras_suportadas
|
|
64
|
+
%w[1]
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
validates :agencia, :conta_corrente, presence: true
|
|
68
|
+
validates :numero_documento, length: { maximum: tamanho_maximo_numero_documento }, if: :deve_validar_numero_documento?
|
|
69
|
+
validates :conta_corrente, length: { maximum: tamanho_maximo_conta_corrente }, if: :deve_validar_conta_corrente?
|
|
70
|
+
validates :agencia, length: { maximum: tamanho_maximo_agencia }, if: :deve_validar_agencia?
|
|
71
|
+
validates :carteira, inclusion: { in: ->(object) { object.class.carteiras_suportadas } }, if: :deve_validar_carteira?
|
|
72
|
+
|
|
73
|
+
# @return [String] Número do documento com 11 dígitos.
|
|
74
|
+
#
|
|
75
|
+
def numero_documento
|
|
76
|
+
@numero_documento.to_s.rjust(11, '0') if @numero_documento.present?
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
# @return [String] Agência com 4 dígitos.
|
|
80
|
+
#
|
|
81
|
+
def agencia
|
|
82
|
+
@agencia.to_s.rjust(4, '0') if @agencia.present?
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
# @return [String] Conta corrente com 10 dígitos.
|
|
86
|
+
#
|
|
87
|
+
def conta_corrente
|
|
88
|
+
@conta_corrente.to_s.rjust(10, '0') if @conta_corrente.present?
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
# @return [String] Código do cedente com 10 dígitos.
|
|
92
|
+
#
|
|
93
|
+
def codigo_cedente
|
|
94
|
+
@codigo_cedente.to_s.rjust(10, '0') if @codigo_cedente.present?
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
# Código do Banco Nubank.
|
|
98
|
+
#
|
|
99
|
+
# @return [String] '260'
|
|
100
|
+
#
|
|
101
|
+
def codigo_banco
|
|
102
|
+
'260'
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
# Dígito do código do banco.
|
|
106
|
+
#
|
|
107
|
+
# @return [String] '0'
|
|
108
|
+
#
|
|
109
|
+
def digito_codigo_banco
|
|
110
|
+
'0'
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
# Dígito verificador da conta corrente.
|
|
114
|
+
#
|
|
115
|
+
# @return [String]
|
|
116
|
+
#
|
|
117
|
+
def digito_conta_corrente
|
|
118
|
+
Modulo10.new(conta_corrente.to_s)
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
# Agência e código do cedente formatados.
|
|
122
|
+
#
|
|
123
|
+
# @return [String]
|
|
124
|
+
#
|
|
125
|
+
def agencia_codigo_cedente
|
|
126
|
+
"#{agencia} / #{conta_corrente}-#{digito_conta_corrente}"
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
# Nosso Número formatado.
|
|
130
|
+
#
|
|
131
|
+
# @return [String]
|
|
132
|
+
#
|
|
133
|
+
def nosso_numero
|
|
134
|
+
"#{carteira}/#{numero_documento}-#{digito_nosso_numero}"
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
# Dígito verificador do nosso número.
|
|
138
|
+
#
|
|
139
|
+
# @return [String]
|
|
140
|
+
#
|
|
141
|
+
def digito_nosso_numero
|
|
142
|
+
Modulo10.new("#{carteira}#{numero_documento}")
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
# Segunda parte do código de barras (campo livre).
|
|
146
|
+
# 25 posições específicas do Nubank.
|
|
147
|
+
#
|
|
148
|
+
# @return [String]
|
|
149
|
+
#
|
|
150
|
+
def codigo_de_barras_do_banco
|
|
151
|
+
codigo = "#{carteira.to_s.rjust(1, '0')}#{numero_documento}#{agencia}#{conta_corrente.to_s[0, 9]}"
|
|
152
|
+
"#{codigo.ljust(25, '0')}"
|
|
153
|
+
end
|
|
154
|
+
end
|
|
155
|
+
end
|
|
156
|
+
end
|