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.
Files changed (63) hide show
  1. checksums.yaml +7 -0
  2. data/Changelog.markdown +58 -2
  3. data/README.markdown +679 -156
  4. data/lib/boleto_bancario/calculos/documento.rb +191 -0
  5. data/lib/boleto_bancario/calculos/fator_vencimento.rb +78 -31
  6. data/lib/boleto_bancario/calculos/modulo11_fator_de9a2.rb +65 -0
  7. data/lib/boleto_bancario/calculos/modulo11_fator_de9a2_resto_x.rb +5 -51
  8. data/lib/boleto_bancario/calculos/modulo_numero_de_controle.rb +117 -0
  9. data/lib/boleto_bancario/core/banco_brasil.rb +30 -5
  10. data/lib/boleto_bancario/core/banrisul.rb +182 -0
  11. data/lib/boleto_bancario/core/boleto.rb +97 -35
  12. data/lib/boleto_bancario/core/bradesco.rb +28 -16
  13. data/lib/boleto_bancario/core/c6_bank.rb +155 -0
  14. data/lib/boleto_bancario/core/caixa.rb +233 -0
  15. data/lib/boleto_bancario/core/inter.rb +155 -0
  16. data/lib/boleto_bancario/core/itau.rb +20 -10
  17. data/lib/boleto_bancario/core/nubank.rb +156 -0
  18. data/lib/boleto_bancario/core/santander.rb +19 -22
  19. data/lib/boleto_bancario/core/sicoob.rb +172 -0
  20. data/lib/boleto_bancario/core/sicredi.rb +290 -0
  21. data/lib/boleto_bancario/locales/pt-BR.yml +55 -0
  22. data/lib/boleto_bancario/renderers/base.rb +154 -0
  23. data/lib/boleto_bancario/renderers/html_renderer.rb +92 -0
  24. data/lib/boleto_bancario/renderers/pdf_renderer.rb +130 -0
  25. data/lib/boleto_bancario/renderers/png_renderer.rb +66 -0
  26. data/lib/boleto_bancario/templates/_barcode.html.erb +3 -0
  27. data/lib/boleto_bancario/templates/_cedente.html.erb +14 -0
  28. data/lib/boleto_bancario/templates/_header.html.erb +4 -0
  29. data/lib/boleto_bancario/templates/_instructions.html.erb +10 -0
  30. data/lib/boleto_bancario/templates/_payment.html.erb +36 -0
  31. data/lib/boleto_bancario/templates/_sacado.html.erb +10 -0
  32. data/lib/boleto_bancario/templates/boleto.html.erb +22 -0
  33. data/lib/boleto_bancario/templates/boleto_styles.css +18 -0
  34. data/lib/boleto_bancario/version.rb +3 -2
  35. data/lib/boleto_bancario.rb +48 -19
  36. data/lib/generators/boleto_bancario/views_generator.rb +47 -0
  37. metadata +140 -106
  38. data/.gitignore +0 -18
  39. data/.rspec +0 -1
  40. data/.rvmrc +0 -1
  41. data/Gemfile +0 -3
  42. data/Planning.markdown +0 -131
  43. data/Rakefile +0 -9
  44. data/TODO.markdown +0 -5
  45. data/boleto_bancario.gemspec +0 -25
  46. data/documentacoes_dos_boletos/Bradesco/Manual_BRADESCO.PDF +0 -0
  47. data/spec/boleto_bancario/calculos/digitos_spec.rb +0 -19
  48. data/spec/boleto_bancario/calculos/fator_vencimento_spec.rb +0 -59
  49. data/spec/boleto_bancario/calculos/fatores_de_multiplicacao_spec.rb +0 -69
  50. data/spec/boleto_bancario/calculos/linha_digitavel_spec.rb +0 -57
  51. data/spec/boleto_bancario/calculos/modulo10_spec.rb +0 -49
  52. data/spec/boleto_bancario/calculos/modulo11_fator_de2a7_spec.rb +0 -43
  53. data/spec/boleto_bancario/calculos/modulo11_fator_de2a9_resto_zero_spec.rb +0 -39
  54. data/spec/boleto_bancario/calculos/modulo11_fator_de2a9_spec.rb +0 -61
  55. data/spec/boleto_bancario/calculos/modulo11_fator_de9a2_resto_x_spec.rb +0 -37
  56. data/spec/boleto_bancario/calculos/modulo11_spec.rb +0 -19
  57. data/spec/boleto_bancario/core/banco_brasil_spec.rb +0 -383
  58. data/spec/boleto_bancario/core/boleto_spec.rb +0 -102
  59. data/spec/boleto_bancario/core/bradesco_spec.rb +0 -170
  60. data/spec/boleto_bancario/core/itau_spec.rb +0 -336
  61. data/spec/boleto_bancario/core/santander_spec.rb +0 -135
  62. data/spec/shared_examples/boleto_bancario_shared_example.rb +0 -164
  63. 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
- # Tamanho máximo da carteira.
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 justamente para ficar documentado o tamanho máximo aceito até a data corrente.</b>
185
+ # <b>Método criado para validar se a carteira informada é suportada.</b>
187
186
  #
188
- # @return [Fixnum] 3
187
+ # @return [Array]
189
188
  #
190
- def self.tamanho_maximo_carteira
191
- 3
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 de tamanho para os campos abaixo:
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 tamanhos permitidos, ficará a sua responsabilidade.
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
- validates :carteira, length: { maximum: tamanho_maximo_carteira }, if: :deve_validar_carteira?
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