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,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.data_vencimento = Date.parse('2004-07-04')
|
|
29
|
+
# boleto.codigo_cedente = "0000001"
|
|
30
|
+
# boleto.valor_documento = 5.0
|
|
31
|
+
# end
|
|
32
|
+
#
|
|
33
|
+
class Banrisul < Boleto
|
|
34
|
+
# Tamanho máximo de uma agência no Banrisul (sem número de controle).
|
|
35
|
+
# <b>Método criado justamente para ficar documentado o tamanho máximo aceito até a data corrente.</b>
|
|
36
|
+
#
|
|
37
|
+
# @return [Fixnum] 3
|
|
38
|
+
#
|
|
39
|
+
def self.maximo_agencia
|
|
40
|
+
3
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
# Tamanho máximo do código cedente.
|
|
44
|
+
# <b>Método criado justamente para ficar documentado o tamanho máximo aceito até a data corrente.</b>
|
|
45
|
+
#
|
|
46
|
+
# @return [Fixnum] 4
|
|
47
|
+
#
|
|
48
|
+
def self.maximo_codigo_cedente
|
|
49
|
+
7
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
# Tamanho máximo do número do documento.
|
|
53
|
+
# <b>Método criado justamente para ficar documentado o tamanho máximo aceito até a data corrente.</b>
|
|
54
|
+
#
|
|
55
|
+
# @return [Fixnum] 8
|
|
56
|
+
#
|
|
57
|
+
def self.maximo_numero_documento
|
|
58
|
+
8
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
# <b>Carteiras suportadas.</b>
|
|
62
|
+
#
|
|
63
|
+
# <b>Método criado para validar se a carteira informada é suportada.</b>
|
|
64
|
+
#
|
|
65
|
+
# @return [Array]
|
|
66
|
+
#
|
|
67
|
+
def self.carteiras_suportadas
|
|
68
|
+
%w[00 08]
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
validates :agencia, :digito_agencia, :codigo_cedente, :digito_codigo_cedente, presence: true
|
|
72
|
+
|
|
73
|
+
validates :agencia, length: { maximum: maximo_agencia }, if: :deve_validar_agencia?
|
|
74
|
+
validates :codigo_cedente, length: { maximum: maximo_codigo_cedente }, if: :deve_validar_codigo_cedente?
|
|
75
|
+
validates :numero_documento, length: { maximum: maximo_numero_documento }, if: :deve_validar_numero_documento?
|
|
76
|
+
|
|
77
|
+
validates :carteira, inclusion: { in: ->(object) { object.class.carteiras_suportadas } }, if: :deve_validar_carteira?
|
|
78
|
+
|
|
79
|
+
# @return [String] 3 caracteres
|
|
80
|
+
#
|
|
81
|
+
def agencia
|
|
82
|
+
@agencia.to_s.rjust(3, '0') if @agencia.present?
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
# @return [String] 8 caracteres
|
|
86
|
+
#
|
|
87
|
+
def numero_documento
|
|
88
|
+
@numero_documento.to_s.rjust(8, '0') if @numero_documento.present?
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
# @return [String] 7 caracteres
|
|
92
|
+
#
|
|
93
|
+
def codigo_cedente
|
|
94
|
+
@codigo_cedente.to_s.rjust(7, '0') if @codigo_cedente.present?
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
# @return [String] 2 caracteres
|
|
98
|
+
#
|
|
99
|
+
def carteira
|
|
100
|
+
@carteira.to_s.rjust(2, '0') if @carteira.present?
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
# @return [String] Código do Banco descrito na documentação.
|
|
104
|
+
#
|
|
105
|
+
def codigo_banco
|
|
106
|
+
'041'
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
# Dígito do código do banco. Precisa mostrar esse dígito no boleto.
|
|
110
|
+
#
|
|
111
|
+
# @return [String] Dígito do código do banco descrito na documentação.
|
|
112
|
+
#
|
|
113
|
+
def digito_codigo_banco
|
|
114
|
+
'8'
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
# Dígito do código da agência. Precisa mostrar esse dígito no boleto.
|
|
118
|
+
#
|
|
119
|
+
# @return [String] Dígito da agência calculado apartir do ModuloNumeroDeControle.
|
|
120
|
+
#
|
|
121
|
+
def digito_agencia
|
|
122
|
+
ModuloNumeroDeControle.new(agencia)
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
# Dígito do código do cedente. Precisa mostrar esse dígito no boleto.
|
|
126
|
+
#
|
|
127
|
+
# @return [String] Dígito do código do cedente calculado apartir do ModuloNumeroDeControle.
|
|
128
|
+
#
|
|
129
|
+
def digito_codigo_cedente
|
|
130
|
+
ModuloNumeroDeControle.new(codigo_cedente)
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
# Retorna a Agencia, digito da agencia, código do cedente e o dígito do código do cedente.
|
|
134
|
+
#
|
|
135
|
+
# @return [String]
|
|
136
|
+
#
|
|
137
|
+
def agencia_codigo_cedente
|
|
138
|
+
"#{agencia}.#{digito_agencia} #{codigo_cedente}.#{digito_codigo_cedente}"
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
# Retorna o número do documento com seu número de controle.
|
|
142
|
+
#
|
|
143
|
+
# Para mais detalhes do cálculo, veja a classe ModuloNumeroDeControle.
|
|
144
|
+
#
|
|
145
|
+
# @return [String]
|
|
146
|
+
#
|
|
147
|
+
def nosso_numero
|
|
148
|
+
"#{numero_documento}.#{ModuloNumeroDeControle.new(numero_documento)}"
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
# === Código de barras do banco
|
|
152
|
+
#
|
|
153
|
+
# ________________________________________________________________________________________________
|
|
154
|
+
# | Posição | Tamanho | Descrição |
|
|
155
|
+
# |---------|---------|---------------------------------------------------------------------------|
|
|
156
|
+
# | 20 | 01 | Tipo da cobrança do produto (mais detalhes veja #tipo_da_cobranca) |
|
|
157
|
+
# | 21 | 01 | Constante '1' |
|
|
158
|
+
# | 22-24 | 03 | Agência (sem número de controle) |
|
|
159
|
+
# | 25-31 | 07 | Código do Cedente (sem número de controle) |
|
|
160
|
+
# | 32-39 | 08 | Nosso número (número do documento sem número de controle) |
|
|
161
|
+
# | 40-42 | 03 | Constante '041' |
|
|
162
|
+
# | 43-44 | 02 | Duplo Dígito referente às posições 20 a 42 (módulo do numero de controle) |
|
|
163
|
+
# ------------------------------------------------------------------------------------------------|
|
|
164
|
+
#
|
|
165
|
+
def codigo_de_barras_do_banco
|
|
166
|
+
codigo = "#{tipo_da_cobranca}1#{agencia}#{codigo_cedente}#{numero_documento}041"
|
|
167
|
+
"#{codigo}#{ModuloNumeroDeControle.new(codigo)}"
|
|
168
|
+
end
|
|
169
|
+
|
|
170
|
+
# Tipo da cobranca do boleto
|
|
171
|
+
#
|
|
172
|
+
# "1" Cobrança Normal, Fichário emitido pelo BANRISUL.
|
|
173
|
+
# "2" Cobrança Direta, Fichário emitido pelo CLIENTE.
|
|
174
|
+
#
|
|
175
|
+
# @return [String]
|
|
176
|
+
#
|
|
177
|
+
def tipo_da_cobranca
|
|
178
|
+
"2"
|
|
179
|
+
end
|
|
180
|
+
end
|
|
181
|
+
end
|
|
182
|
+
end
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
#
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
2
3
|
module BoletoBancario
|
|
3
4
|
module Core
|
|
4
5
|
# @abstract Métodos { #codigo_banco, #digito_codigo_banco, #agencia_codigo_cedente, #nosso_numero, #codigo_de_barras_do_banco}
|
|
@@ -12,10 +13,7 @@ module BoletoBancario
|
|
|
12
13
|
# * Internacionalização;
|
|
13
14
|
# * Nomes das classes para serem manipuladas;
|
|
14
15
|
#
|
|
15
|
-
include ActiveModel::
|
|
16
|
-
include ActiveModel::Conversion
|
|
17
|
-
extend ActiveModel::Naming
|
|
18
|
-
extend ActiveModel::Translation
|
|
16
|
+
include ActiveModel::Model
|
|
19
17
|
|
|
20
18
|
# Nome/Razão social que aparece no campo 'Cedente' no boleto.
|
|
21
19
|
#
|
|
@@ -84,20 +82,10 @@ module BoletoBancario
|
|
|
84
82
|
#
|
|
85
83
|
attr_accessor :agencia
|
|
86
84
|
|
|
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
85
|
# Número da Conta corrente. Campo auto explicativo.
|
|
93
86
|
#
|
|
94
87
|
attr_accessor :conta_corrente
|
|
95
88
|
|
|
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
89
|
# Código da moeda. Campo auto explicativo.
|
|
102
90
|
# Padrão '9' (Real).
|
|
103
91
|
#
|
|
@@ -168,24 +156,46 @@ module BoletoBancario
|
|
|
168
156
|
#
|
|
169
157
|
attr_accessor :local_pagamento
|
|
170
158
|
|
|
171
|
-
#
|
|
159
|
+
# Aceitar após o vencimento.
|
|
160
|
+
# Nessa gem utilizamos o campo aceite como Boolean.
|
|
161
|
+
# Obviamente, true para 'S' e false/nil para 'N'.
|
|
172
162
|
#
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
#
|
|
176
|
-
#
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
163
|
+
attr_accessor :aceite
|
|
164
|
+
|
|
165
|
+
# Campos de instruções.
|
|
166
|
+
# São permitidas até seis linhas de instruções a serem mostradas no boleto
|
|
167
|
+
|
|
168
|
+
attr_accessor :instrucoes1,
|
|
169
|
+
:instrucoes2,
|
|
170
|
+
:instrucoes3,
|
|
171
|
+
:instrucoes4,
|
|
172
|
+
:instrucoes5,
|
|
173
|
+
:instrucoes6
|
|
174
|
+
|
|
175
|
+
# Caminho do logo do banco.
|
|
176
|
+
#
|
|
177
|
+
attr_accessor :logo
|
|
178
|
+
|
|
179
|
+
# Tamanho maximo do valor do documento do boleto.
|
|
180
|
+
# Acredito que não existirá valor de documento nesse valor,
|
|
181
|
+
# <b>porém a biblioteca precisa manter a consistência</b>.
|
|
182
|
+
#
|
|
183
|
+
# No código de barras o valor do documento precisa
|
|
184
|
+
# ter um tamanho de 8 caracteres para os reais (acrescentando zeros à esquerda),
|
|
185
|
+
# e 2 caracteres nos centavos (acrescentando zeros à esquerda).
|
|
186
|
+
#
|
|
187
|
+
# @return [Float] 99999999.99
|
|
188
|
+
#
|
|
189
|
+
def self.valor_documento_tamanho_maximo
|
|
190
|
+
99999999.99
|
|
191
|
+
end
|
|
183
192
|
|
|
184
193
|
# Validações de todos os boletos
|
|
185
194
|
#
|
|
186
195
|
validates :carteira, :valor_documento, :numero_documento, :data_vencimento, presence: true
|
|
187
196
|
validates :cedente, :endereco_cedente, presence: true
|
|
188
197
|
validates :sacado, :documento_sacado, presence: true
|
|
198
|
+
validates :valor_documento, numericality: { less_than_or_equal_to: ->(object) { object.class.valor_documento_tamanho_maximo } }
|
|
189
199
|
validate :data_vencimento_deve_ser_uma_data
|
|
190
200
|
|
|
191
201
|
# Passing the attributes as Hash or block
|
|
@@ -197,7 +207,6 @@ module BoletoBancario
|
|
|
197
207
|
# @option options [String] :documento_cedente
|
|
198
208
|
# @option options [String] :endereco_cedente
|
|
199
209
|
# @option options [String] :conta_corrente
|
|
200
|
-
# @option options [String] :digito_conta_corrente
|
|
201
210
|
# @option options [String] :agencia
|
|
202
211
|
# @option options [Date] :data_vencimento
|
|
203
212
|
# @option options [String] :numero_documento
|
|
@@ -253,6 +262,7 @@ module BoletoBancario
|
|
|
253
262
|
# bradesco.especie = 'outra_especie_que_nao_seja_em_reais'
|
|
254
263
|
# bradesco.especie_documento = 'outra_especie_do_documento'
|
|
255
264
|
# bradesco.data_documento = Date.tomorrow
|
|
265
|
+
# bradesco.aceite = false
|
|
256
266
|
# end
|
|
257
267
|
#
|
|
258
268
|
# @return [Hash] Código da Moeda sendo '9' (real). Espécie sendo 'R$' (real).
|
|
@@ -263,7 +273,8 @@ module BoletoBancario
|
|
|
263
273
|
:especie => 'R$',
|
|
264
274
|
:especie_documento => 'DM',
|
|
265
275
|
:local_pagamento => 'PAGÁVEL EM QUALQUER BANCO ATÉ O VENCIMENTO',
|
|
266
|
-
:data_documento => Date.today
|
|
276
|
+
:data_documento => Date.today,
|
|
277
|
+
:aceite => true
|
|
267
278
|
}
|
|
268
279
|
end
|
|
269
280
|
|
|
@@ -336,7 +347,17 @@ module BoletoBancario
|
|
|
336
347
|
# @return [String] Precisa retornar 10 dígitos para o código de barras (incluindo os centavos).
|
|
337
348
|
#
|
|
338
349
|
def valor_formatado_para_codigo_de_barras
|
|
339
|
-
valor_documento.
|
|
350
|
+
valor_documento_formatado = (Integer(valor_documento.to_f * 100) / Float(100))
|
|
351
|
+
real, centavos = valor_documento_formatado.to_s.split(/\./)
|
|
352
|
+
"#{real.rjust(8, '0')}#{centavos.ljust(2, '0')}"
|
|
353
|
+
end
|
|
354
|
+
|
|
355
|
+
# Força a carteira a retornar o valor como string
|
|
356
|
+
#
|
|
357
|
+
# @return [String]
|
|
358
|
+
#
|
|
359
|
+
def carteira
|
|
360
|
+
@carteira.to_s if @carteira.present?
|
|
340
361
|
end
|
|
341
362
|
|
|
342
363
|
# Embora o padrão seja mostrar o número da carteira no boleto,
|
|
@@ -349,6 +370,19 @@ module BoletoBancario
|
|
|
349
370
|
carteira
|
|
350
371
|
end
|
|
351
372
|
|
|
373
|
+
# Se o aceite for 'true', retorna 'S'.
|
|
374
|
+
# Retorna 'N', caso contrário.
|
|
375
|
+
#
|
|
376
|
+
# @return [String]
|
|
377
|
+
#
|
|
378
|
+
def aceite_formatado
|
|
379
|
+
if @aceite.present?
|
|
380
|
+
'S'
|
|
381
|
+
else
|
|
382
|
+
'N'
|
|
383
|
+
end
|
|
384
|
+
end
|
|
385
|
+
|
|
352
386
|
# Fator de vencimento que é calculado a partir de uma data base.
|
|
353
387
|
# Veja <b>FatorVencimento</b> para mais detalhes.
|
|
354
388
|
#
|
|
@@ -469,7 +503,35 @@ module BoletoBancario
|
|
|
469
503
|
false
|
|
470
504
|
end
|
|
471
505
|
|
|
472
|
-
#
|
|
506
|
+
# Renderiza o boleto em formato PDF.
|
|
507
|
+
#
|
|
508
|
+
# @return [String] Conteúdo binário do PDF
|
|
509
|
+
# @raise [ArgumentError] Se o boleto não for válido
|
|
510
|
+
#
|
|
511
|
+
def to_pdf
|
|
512
|
+
Renderers::PdfRenderer.new(self).render
|
|
513
|
+
end
|
|
514
|
+
|
|
515
|
+
# Renderiza o boleto em formato HTML.
|
|
516
|
+
#
|
|
517
|
+
# @return [String] Conteúdo HTML do boleto
|
|
518
|
+
# @raise [ArgumentError] Se o boleto não for válido
|
|
519
|
+
#
|
|
520
|
+
def to_html
|
|
521
|
+
Renderers::HtmlRenderer.new(self).render
|
|
522
|
+
end
|
|
523
|
+
|
|
524
|
+
# Renderiza o código de barras em formato PNG.
|
|
525
|
+
#
|
|
526
|
+
# @param [Hash] options Opções para o renderizador PNG
|
|
527
|
+
# @return [String] Conteúdo binário do PNG
|
|
528
|
+
# @raise [ArgumentError] Se o boleto não for válido
|
|
529
|
+
#
|
|
530
|
+
def to_png(options = {})
|
|
531
|
+
Renderers::PngRenderer.new(self, options).render
|
|
532
|
+
end
|
|
533
|
+
|
|
534
|
+
# Método usado para verificar se deve realizar a validação de tamanho do campo 'agência'.
|
|
473
535
|
# <b>Sobrescreva esse método na subclasse, caso você mesmo queira fazer as validações</b>.
|
|
474
536
|
#
|
|
475
537
|
# @return [True]
|
|
@@ -478,7 +540,7 @@ module BoletoBancario
|
|
|
478
540
|
true
|
|
479
541
|
end
|
|
480
542
|
|
|
481
|
-
#
|
|
543
|
+
# Método usado para verificar se deve realizar a validação de tamanho do campo 'conta_corrente'.
|
|
482
544
|
# <b>Sobrescreva esse método na subclasse, caso você mesmo queira fazer as validações</b>.
|
|
483
545
|
#
|
|
484
546
|
# @return [True]
|
|
@@ -487,7 +549,7 @@ module BoletoBancario
|
|
|
487
549
|
true
|
|
488
550
|
end
|
|
489
551
|
|
|
490
|
-
#
|
|
552
|
+
# Método usado para verificar se deve realizar a validação de tamanho do campo 'codigo_cedente'.
|
|
491
553
|
# <b>Sobrescreva esse método na subclasse, caso você mesmo queira fazer as validações</b>.
|
|
492
554
|
#
|
|
493
555
|
# @return [True]
|
|
@@ -496,7 +558,7 @@ module BoletoBancario
|
|
|
496
558
|
true
|
|
497
559
|
end
|
|
498
560
|
|
|
499
|
-
#
|
|
561
|
+
# Método usado para verificar se deve realizar a validação de tamanho do campo 'numero_documento'.
|
|
500
562
|
# <b>Sobrescreva esse método na subclasse, caso você mesmo queira fazer as validações</b>.
|
|
501
563
|
#
|
|
502
564
|
# @return [True]
|
|
@@ -505,7 +567,7 @@ module BoletoBancario
|
|
|
505
567
|
true
|
|
506
568
|
end
|
|
507
569
|
|
|
508
|
-
#
|
|
570
|
+
# Método usado para verificar se deve realizar a validação do campo 'carteira'.
|
|
509
571
|
# <b>Sobrescreva esse método na subclasse, caso você mesmo queira fazer as validações</b>.
|
|
510
572
|
#
|
|
511
573
|
# @return [True]
|
|
@@ -522,4 +584,4 @@ module BoletoBancario
|
|
|
522
584
|
end
|
|
523
585
|
end
|
|
524
586
|
end
|
|
525
|
-
end
|
|
587
|
+
end
|
|
@@ -42,7 +42,7 @@ module BoletoBancario
|
|
|
42
42
|
# Bradesco.new do |boleto|
|
|
43
43
|
# boleto.conta_corrente = '89755'
|
|
44
44
|
# boleto.agencia = '0097'
|
|
45
|
-
# boleto.carteira = '
|
|
45
|
+
# boleto.carteira = '03'
|
|
46
46
|
# boleto.numero_documento = '12345678'
|
|
47
47
|
# boleto.codigo_cedente = '909014'
|
|
48
48
|
# end
|
|
@@ -112,29 +112,26 @@ module BoletoBancario
|
|
|
112
112
|
11
|
|
113
113
|
end
|
|
114
114
|
|
|
115
|
-
#
|
|
116
|
-
# O tamanho máximo é justamente 2 porque no código de barras só é permitido 2 posições para este campo.
|
|
115
|
+
# <b>Carteiras suportadas.</b>
|
|
117
116
|
#
|
|
118
|
-
# <b>Método criado
|
|
117
|
+
# <b>Método criado para validar se a carteira informada é suportada.</b>
|
|
119
118
|
#
|
|
120
|
-
# @return [
|
|
119
|
+
# @return [Array]
|
|
121
120
|
#
|
|
122
|
-
def self.
|
|
123
|
-
|
|
121
|
+
def self.carteiras_suportadas
|
|
122
|
+
%w[03 06 09 19 21 22]
|
|
124
123
|
end
|
|
125
124
|
|
|
126
125
|
validates :agencia, :digito_agencia, :conta_corrente, :digito_conta_corrente, presence: true
|
|
127
126
|
|
|
128
|
-
# Validações
|
|
127
|
+
# Validações para os campos abaixo:
|
|
129
128
|
#
|
|
130
129
|
# * Agencia
|
|
131
|
-
# * Digito verificador da agencia
|
|
132
130
|
# * Conta corrente
|
|
133
|
-
# * Digito verificador da conta corrente
|
|
134
131
|
# * Número do documento
|
|
135
132
|
# * Carteira
|
|
136
133
|
#
|
|
137
|
-
# Se você quiser sobrescrever os
|
|
134
|
+
# Se você quiser sobrescrever os metodos, ficará a sua responsabilidade.
|
|
138
135
|
# Basta você sobrescrever os métodos de validação:
|
|
139
136
|
#
|
|
140
137
|
# class Bradesco < BoletoBancario::Core::Bradesco
|
|
@@ -150,8 +147,8 @@ module BoletoBancario
|
|
|
150
147
|
# 9
|
|
151
148
|
# end
|
|
152
149
|
#
|
|
153
|
-
# def self.
|
|
154
|
-
#
|
|
150
|
+
# def self.carteiras_suportadas
|
|
151
|
+
# %w[03 06 09 19 21 22]
|
|
155
152
|
# end
|
|
156
153
|
# end
|
|
157
154
|
#
|
|
@@ -159,12 +156,11 @@ module BoletoBancario
|
|
|
159
156
|
# Você precisará analisar o efeito no #codigo_de_barras, #nosso_numero e na
|
|
160
157
|
# #linha_digitável (ambos podem ser sobreescritos também).
|
|
161
158
|
#
|
|
162
|
-
validates :digito_agencia, length: { maximum: 1 }
|
|
163
|
-
validates :digito_conta_corrente, length: { maximum: 1 }
|
|
164
159
|
validates :agencia, length: { maximum: tamanho_maximo_agencia }, if: :deve_validar_agencia?
|
|
165
160
|
validates :conta_corrente, length: { maximum: tamanho_maximo_conta_corrente }, if: :deve_validar_conta_corrente?
|
|
166
161
|
validates :numero_documento, length: { maximum: tamanho_maximo_numero_documento }, if: :deve_validar_numero_documento?
|
|
167
|
-
|
|
162
|
+
|
|
163
|
+
validates :carteira, inclusion: { in: ->(object) { object.class.carteiras_suportadas } }, if: :deve_validar_carteira?
|
|
168
164
|
|
|
169
165
|
# @return [String] 7 caracteres
|
|
170
166
|
#
|
|
@@ -220,6 +216,22 @@ module BoletoBancario
|
|
|
220
216
|
'2'
|
|
221
217
|
end
|
|
222
218
|
|
|
219
|
+
# Dígito do código da agência. Precisa mostrar esse dígito no boleto.
|
|
220
|
+
#
|
|
221
|
+
# @return [String] Dígito da agência calculado usando o Modulo11FatorDe9a2.
|
|
222
|
+
#
|
|
223
|
+
def digito_agencia
|
|
224
|
+
Modulo11FatorDe9a2.new(agencia)
|
|
225
|
+
end
|
|
226
|
+
|
|
227
|
+
# Dígito da conta corrente. Precisa mostrar esse dígito no boleto.
|
|
228
|
+
#
|
|
229
|
+
# @return [String] Dígito da conta corrente calculado apartir do Modulo11FatorDe9a2.
|
|
230
|
+
#
|
|
231
|
+
def digito_conta_corrente
|
|
232
|
+
Modulo11FatorDe9a2.new(conta_corrente)
|
|
233
|
+
end
|
|
234
|
+
|
|
223
235
|
# Campo preenchido com:
|
|
224
236
|
#
|
|
225
237
|
# - Agência com 4 caracteres - digito da agência / Conta de Cobrança com 7 caracteres - Digito da Conta
|
|
@@ -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 C6 Bank.
|
|
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/c6_bank' 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 C6 Bank trabalha com carteira de cobrança registrada.
|
|
19
|
+
#
|
|
20
|
+
# ___________________________________________________________________________
|
|
21
|
+
# | Carteira | Descrição | Testada/Homologada |
|
|
22
|
+
# | 1 | Cobrança Registrada | Esperando Contribuição |
|
|
23
|
+
# ----------------------------------------------------------------------------
|
|
24
|
+
#
|
|
25
|
+
class C6Bank < Boleto
|
|
26
|
+
# Tamanho máximo de uma conta corrente no C6 Bank.
|
|
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 C6 Bank.
|
|
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 C6 Bank.
|
|
59
|
+
#
|
|
60
|
+
# @return [Array]
|
|
61
|
+
#
|
|
62
|
+
def self.carteiras_suportadas
|
|
63
|
+
%w[1]
|
|
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 C6 Bank.
|
|
97
|
+
#
|
|
98
|
+
# @return [String] '336'
|
|
99
|
+
#
|
|
100
|
+
def codigo_banco
|
|
101
|
+
'336'
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
# Dígito do código do banco.
|
|
105
|
+
#
|
|
106
|
+
# @return [String] '5'
|
|
107
|
+
#
|
|
108
|
+
def digito_codigo_banco
|
|
109
|
+
'5'
|
|
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 C6 Bank.
|
|
146
|
+
#
|
|
147
|
+
# @return [String]
|
|
148
|
+
#
|
|
149
|
+
def codigo_de_barras_do_banco
|
|
150
|
+
codigo = "#{agencia}#{carteira.to_s.rjust(1, '0')}#{numero_documento}#{conta_corrente.to_s[0, 9]}"
|
|
151
|
+
"#{codigo.ljust(25, '0')}"
|
|
152
|
+
end
|
|
153
|
+
end
|
|
154
|
+
end
|
|
155
|
+
end
|