boleto_bancario 0.0.2 → 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 (73) hide show
  1. checksums.yaml +5 -5
  2. data/Changelog.markdown +54 -2
  3. data/README.markdown +660 -189
  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/core/boleto.rb +30 -1
  7. data/lib/boleto_bancario/core/c6_bank.rb +155 -0
  8. data/lib/boleto_bancario/core/inter.rb +155 -0
  9. data/lib/boleto_bancario/core/nubank.rb +156 -0
  10. data/lib/boleto_bancario/locales/pt-BR.yml +55 -0
  11. data/lib/boleto_bancario/renderers/base.rb +154 -0
  12. data/lib/boleto_bancario/renderers/html_renderer.rb +92 -0
  13. data/lib/boleto_bancario/renderers/pdf_renderer.rb +130 -0
  14. data/lib/boleto_bancario/renderers/png_renderer.rb +66 -0
  15. data/lib/boleto_bancario/templates/_barcode.html.erb +3 -0
  16. data/lib/boleto_bancario/templates/_cedente.html.erb +14 -0
  17. data/lib/boleto_bancario/templates/_header.html.erb +4 -0
  18. data/lib/boleto_bancario/templates/_instructions.html.erb +10 -0
  19. data/lib/boleto_bancario/templates/_payment.html.erb +36 -0
  20. data/lib/boleto_bancario/templates/_sacado.html.erb +10 -0
  21. data/lib/boleto_bancario/templates/boleto.html.erb +22 -0
  22. data/lib/boleto_bancario/templates/boleto_styles.css +18 -0
  23. data/lib/boleto_bancario/version.rb +3 -1
  24. data/lib/boleto_bancario.rb +23 -6
  25. data/lib/generators/boleto_bancario/views_generator.rb +47 -0
  26. metadata +91 -129
  27. data/.gitignore +0 -19
  28. data/.rspec +0 -1
  29. data/.travis.yml +0 -10
  30. data/Gemfile +0 -3
  31. data/Planning.markdown +0 -63
  32. data/Rakefile +0 -15
  33. data/TODO.markdown +0 -19
  34. data/boleto_bancario.gemspec +0 -29
  35. data/documentacoes_dos_boletos/Bradesco/Manual_BRADESCO.PDF +0 -0
  36. data/lib/boleto_bancario/core/hsbc.rb +0 -170
  37. data/lib/boleto_bancario/core/real.rb +0 -177
  38. data/spec/boleto_bancario/calculos/digitos_spec.rb +0 -19
  39. data/spec/boleto_bancario/calculos/fator_vencimento_spec.rb +0 -59
  40. data/spec/boleto_bancario/calculos/fatores_de_multiplicacao_spec.rb +0 -69
  41. data/spec/boleto_bancario/calculos/linha_digitavel_spec.rb +0 -57
  42. data/spec/boleto_bancario/calculos/modulo10_spec.rb +0 -53
  43. data/spec/boleto_bancario/calculos/modulo11_fator_de2a7_spec.rb +0 -43
  44. data/spec/boleto_bancario/calculos/modulo11_fator_de2a9_resto_zero_spec.rb +0 -39
  45. data/spec/boleto_bancario/calculos/modulo11_fator_de2a9_spec.rb +0 -67
  46. data/spec/boleto_bancario/calculos/modulo11_fator_de9a2_resto_x_spec.rb +0 -37
  47. data/spec/boleto_bancario/calculos/modulo11_fator_de9a2_spec.rb +0 -31
  48. data/spec/boleto_bancario/calculos/modulo11_spec.rb +0 -19
  49. data/spec/boleto_bancario/calculos/modulo_numero_de_controle_spec.rb +0 -37
  50. data/spec/boleto_bancario/core/banco_brasil_spec.rb +0 -377
  51. data/spec/boleto_bancario/core/banrisul_spec.rb +0 -129
  52. data/spec/boleto_bancario/core/boleto_spec.rb +0 -218
  53. data/spec/boleto_bancario/core/bradesco_spec.rb +0 -163
  54. data/spec/boleto_bancario/core/caixa_spec.rb +0 -111
  55. data/spec/boleto_bancario/core/hsbc_spec.rb +0 -72
  56. data/spec/boleto_bancario/core/itau_spec.rb +0 -333
  57. data/spec/boleto_bancario/core/real_spec.rb +0 -104
  58. data/spec/boleto_bancario/core/santander_spec.rb +0 -137
  59. data/spec/boleto_bancario/core/sicoob_spec.rb +0 -111
  60. data/spec/boleto_bancario/core/sicredi_spec.rb +0 -149
  61. data/spec/inheritance/banco_brasil_spec.rb +0 -22
  62. data/spec/inheritance/banrisul_spec.rb +0 -22
  63. data/spec/inheritance/boleto_spec.rb +0 -15
  64. data/spec/inheritance/bradesco_spec.rb +0 -22
  65. data/spec/inheritance/caixa_spec.rb +0 -22
  66. data/spec/inheritance/hsbc_spec.rb +0 -22
  67. data/spec/inheritance/itau_spec.rb +0 -22
  68. data/spec/inheritance/real_spec.rb +0 -22
  69. data/spec/inheritance/santander_spec.rb +0 -22
  70. data/spec/inheritance/sicoob_spec.rb +0 -22
  71. data/spec/inheritance/sicredi_spec.rb +0 -22
  72. data/spec/shared_examples/boleto_bancario_shared_example.rb +0 -151
  73. data/spec/spec_helper.rb +0 -14
data/README.markdown CHANGED
@@ -1,260 +1,731 @@
1
- # Boleto Bancario
1
+ # Boleto Bancário
2
2
 
3
- Emissão de Boletos Bancários em Ruby.
3
+ [![CI](https://github.com/tomas-stefano/boleto_bancario/actions/workflows/ci.yml/badge.svg)](https://github.com/tomas-stefano/boleto_bancario/actions/workflows/ci.yml)
4
+ [![Gem Version](https://badge.fury.io/rb/boleto_bancario.svg)](https://badge.fury.io/rb/boleto_bancario)
4
5
 
5
- Foi colocado um esforço enorme para tornar a gem **simples e principalmente, flexível**.
6
+ Gem para emissão de boletos bancários em Ruby.
6
7
 
7
- ## Versão Beta
8
+ ## Requisitos
8
9
 
9
- Essa gem ainda está em versão beta. Algumas coisas podem mudar até que a versão oficial seja lançada.
10
+ - Ruby 3.1 ou superior
11
+ - Rails 7.1 ou superior (opcional)
10
12
 
11
- ## Alternativas
13
+ ## Instalação
12
14
 
13
- Essa biblioteca é baseada em outras **ótimas** bibliotecas.
14
- **Recomendo analisar muito bem cada solução**:
15
+ Adicione ao seu Gemfile:
15
16
 
16
- * Stella Caelum [http://stella.caelum.com.br/](http://stella.caelum.com.br/)
17
- * Novo Gateway de Pagamentos da Locaweb [http://www.locaweb.com.br/produtos/gateway-pagamento.html](http://www.locaweb.com.br/produtos/gateway-pagamento.html)
18
- * Brcobranca [https://github.com/kivanio/brcobranca](https://github.com/kivanio/brcobranca)
19
- * Boleto Php [http://boletophp.com.br/](http://boletophp.com.br/)
20
- * Gem de Boleto Bancário (essa gem) [https://github.com/tomas-stefano/boleto_bancario](https://github.com/tomas-stefano/boleto_bancario)
17
+ ```ruby
18
+ gem 'boleto_bancario'
19
+ ```
21
20
 
22
- ## Instalação
21
+ Ou instale diretamente:
23
22
 
24
- gem install boleto_bancario
23
+ ```bash
24
+ gem install boleto_bancario
25
+ ```
25
26
 
26
- ## Documentação
27
+ ## Bancos Suportados
27
28
 
28
- Seguimos todas as documentações descritas abaixo:
29
+ | Banco | Código | Carteiras |
30
+ |-------|--------|-----------|
31
+ | Banco do Brasil | 001 | 12, 16, 17, 18 |
32
+ | Banrisul | 041 | 00, 08 |
33
+ | Bradesco | 237 | 03, 06, 09, 19, 21, 22 |
34
+ | Caixa Econômica | 104 | 14, 24 |
35
+ | Itaú | 341 | 107, 109, 122, 126, 131, 142, 143, 146, 150, 168, 174, 175, 196, 198 |
36
+ | Santander | 033 | 101, 102, 121 |
37
+ | Sicoob | 756 | 1, 9 |
38
+ | Sicredi | 748 | 03, C |
39
+ | **Nubank** | 260 | 1 |
40
+ | **Inter** | 077 | 112 |
41
+ | **C6 Bank** | 336 | 1 |
29
42
 
30
- * [Banco do Brasil](documentacoes_dos_boletos/banco_brasil)
31
- * [Banrisul](documentacoes_dos_boletos/banrisul)
32
- * [Bradesco](documentacoes_dos_boletos/Bradesco)
33
- * [Caixa](documentacoes_dos_boletos/Caixa)
34
- * [HSBC](documentacoes_dos_boletos/HASBC)
35
- * [Itaú](documentacoes_dos_boletos/Itau)
36
- * [Real](documentacoes_dos_boletos/Real)
37
- * [Santander](documentacoes_dos_boletos/santander)
38
- * [Sicoob](documentacoes_dos_boletos/Sicoob)
39
- * [Sicredi](documentacoes_dos_boletos/Sicredi)
43
+ ## Uso Básico
40
44
 
41
- Se você tiver uma documentação do boleto, **mais atualizada**, gostaria de pedir que você me enviasse. :)
45
+ ### Criando um Boleto
42
46
 
43
- ## Bancos Suportados
47
+ ```ruby
48
+ boleto = BoletoBancario::Itau.new do |b|
49
+ b.agencia = '0097'
50
+ b.conta_corrente = '89755'
51
+ b.carteira = '198'
52
+ b.cedente = 'Razão Social da Empresa'
53
+ b.codigo_cedente = '90901'
54
+ b.endereco_cedente = 'Rua Exemplo, 123 - São Paulo/SP'
55
+ b.numero_documento = '12345678'
56
+ b.sacado = 'Nome do Cliente'
57
+ b.documento_sacado = '123.456.789-00'
58
+ b.data_vencimento = Date.today + 5
59
+ b.valor_documento = 199.90
60
+ end
61
+ ```
44
62
 
45
- Para todos os bancos e carteiras implementadas, **seguimos as documentações** que estão dentro do repositório:
46
-
47
- <table>
48
- <tr>
49
- <th>Nome do Banco</th>
50
- <th>Carteiras Suportadas</th>
51
- <th>Testada/Homologada no banco</th>
52
- </tr>
53
- <tr>
54
- <td>Banco do Brasil</td>
55
- <td>
56
- 12 com código do cedente de 6 dígitos,
57
- 16 e 18 com código do cedente de 4 dígitos,
58
- 16 e 18 com código do cedente e nosso número de 17 dígitos,
59
- 16 e 18 com código do cedente de 6 dígitos,
60
- 16, 17 e 18 código do cedente de 7 e 8 dígitos.
61
- </td>
62
- <td>Esperando Contribuição</td>
63
- </tr>
64
- <tr>
65
- <td>Banrisul</td>
66
- <td>00, 08.</td>
67
- <td>Esperando Contribuição</td>
68
- </tr>
69
- <tr>
70
- <td>Bradesco</td>
71
- <td>03, 06, 09, 19, 21, 22.</td>
72
- <td>Esperando Contribuição</td>
73
- </tr>
74
- <tr>
75
- <td>Caixa</td>
76
- <td>14, 24.</td>
77
- <td>Esperando Contribuição</td>
78
- </tr>
79
- <tr>
80
- <td>HSBC</td>
81
- <td>CNR.</td>
82
- <td>Esperando Contribuição</td>
83
- </tr>
84
- <tr>
85
- <td>Itaú</td>
86
- <td>107, 109, 122, 142, 143, 126, 174, 175, 196, 198, 131, 146, 150, 168.</td>
87
- <td>Esperando Contribuição</td>
88
- </tr>
89
- <tr>
90
- <td>Real</td>
91
- <td>00, 20, 31, 42, 47, 85.</td>
92
- <td>Esperando Contribuição</td>
93
- </tr>
94
- <tr>
95
- <td>Santander</td>
96
- <td>101, 102, 121.</td>
97
- <td>Esperando Contribuição</td>
98
- </tr>
99
- <tr>
100
- <td>Sicoob</td>
101
- <td>1, 9.</td>
102
- <td>Esperando Contribuição</td>
103
- </tr>
104
- <tr>
105
- <td>Sicredi</td>
106
- <td>03, C.</td>
107
- <td>Esperando Contribuição</td>
108
- </tr>
109
- </table>
110
-
111
- **OBS.: Caso a homologação seja aceita junto ao banco, contribua e mude a seção acima. Caso recuse alguma carteira acima, por favor me avise, para tirar dessa lista.**
112
-
113
- ## Homologação no Banco
114
-
115
- Uma ótima forma de contribuir para a gem, é validar junto ao banco os boletos implementados acima.
116
-
117
- ## Usage
118
-
119
- Você pode usar as próprias classes da gem, porém, **recomendo criar uma subclasse** para os bancos que você gostaria de desenvolver.
120
-
121
- ### Exemplo
63
+ ### Validando o Boleto
64
+
65
+ Cada banco possui suas próprias validações. Sempre verifique se o boleto é válido antes de renderizar:
122
66
 
123
67
  ```ruby
124
- class BoletoItau < BoletoBancario::Itau
68
+ if boleto.valid?
69
+ # Boleto válido, pode renderizar
70
+ else
71
+ boleto.errors.full_messages.each do |erro|
72
+ puts erro
73
+ end
125
74
  end
75
+ ```
76
+
77
+ ### Acessando os Dados do Boleto
78
+
79
+ ```ruby
80
+ boleto.codigo_banco_formatado # => "341-7"
81
+ boleto.codigo_de_barras # => "34191..."
82
+ boleto.linha_digitavel # => "34191.75009 00000.000002..."
83
+ boleto.nosso_numero # => "198/12345678-3"
84
+ boleto.agencia_codigo_cedente # => "0097 / 90901-0"
85
+ ```
86
+
87
+ ## Formatos de Saída
88
+
89
+ ### PDF
90
+
91
+ Gera o boleto em formato PDF usando Prawn:
92
+
93
+ ```ruby
94
+ boleto.to_pdf
95
+ # => String com o conteúdo binário do PDF
96
+
97
+ # Salvando em arquivo
98
+ File.binwrite('boleto.pdf', boleto.to_pdf)
99
+ ```
100
+
101
+ ### HTML
102
+
103
+ Gera o boleto em formato HTML:
104
+
105
+ ```ruby
106
+ boleto.to_html
107
+ # => String com o HTML completo do boleto
108
+ ```
109
+
110
+ ### PNG (Código de Barras)
111
+
112
+ Gera apenas a imagem do código de barras:
113
+
114
+ ```ruby
115
+ boleto.to_png
116
+ # => String com o conteúdo binário do PNG
117
+
118
+ # Com opções customizadas
119
+ boleto.to_png(height: 80, margin: 20)
120
+
121
+ # Salvando em arquivo
122
+ File.binwrite('codigo_barras.png', boleto.to_png)
123
+ ```
124
+
125
+ ### Customizando Templates HTML
126
+
127
+ O HTML é gerado usando templates ERB que podem ser customizados.
128
+
129
+ #### Usando um Caminho Customizado
130
+
131
+ ```ruby
132
+ class MeuHtmlRenderer < BoletoBancario::Renderers::HtmlRenderer
133
+ self.template_path = '/caminho/para/meus/templates'
134
+ end
135
+
136
+ boleto = BoletoBancario::Itau.new(...)
137
+ renderer = MeuHtmlRenderer.new(boleto)
138
+ html = renderer.render
139
+ ```
140
+
141
+ #### Estrutura dos Templates
142
+
143
+ Os templates padrão estão em `lib/boleto_bancario/templates/`:
144
+
145
+ | Arquivo | Descrição |
146
+ |---------|-----------|
147
+ | `boleto.html.erb` | Template principal |
148
+ | `boleto_styles.css` | Estilos CSS |
149
+ | `_header.html.erb` | Cabeçalho com nome e código do banco |
150
+ | `_cedente.html.erb` | Dados do cedente |
151
+ | `_sacado.html.erb` | Dados do sacado |
152
+ | `_payment.html.erb` | Informações de pagamento |
153
+ | `_instructions.html.erb` | Instruções do boleto |
154
+ | `_barcode.html.erb` | Código de barras |
155
+
156
+ #### Rails: Copiando Templates
157
+
158
+ ```bash
159
+ rails generate boleto_bancario:views
160
+ ```
161
+
162
+ Isso copia os templates para `app/views/boletos/`, onde você pode customizá-los.
163
+
164
+ #### Rails: Renderizando com Partials
165
+
166
+ O boleto suporta `to_partial_path` para integração com Rails:
167
+
168
+ ```erb
169
+ <%# app/views/boletos/_itau.html.erb %>
170
+ <div class="meu-boleto-customizado">
171
+ <h1><%= boleto.cedente %></h1>
172
+ <p>Valor: R$ <%= number_to_currency(boleto.valor_documento) %></p>
173
+ <!-- ... -->
174
+ </div>
175
+
176
+ <%# Em qualquer view %>
177
+ <%= render @boleto %>
178
+ ```
179
+
180
+ ## Exemplos por Banco
181
+
182
+ ### Banco do Brasil
183
+
184
+ ```ruby
185
+ # Carteira 18 com código do cedente de 6 dígitos
186
+ boleto = BoletoBancario::BancoBrasil.new do |b|
187
+ b.agencia = '1234'
188
+ b.digito_agencia = '1'
189
+ b.conta_corrente = '12345678'
190
+ b.digito_conta_corrente = '9'
191
+ b.carteira = '18'
192
+ b.cedente = 'Padaria do João LTDA'
193
+ b.documento_cedente = '12.345.678/0001-90'
194
+ b.codigo_cedente = '123456'
195
+ b.endereco_cedente = 'Rua das Flores, 100 - Centro - Brasília/DF'
196
+ b.numero_documento = '12345'
197
+ b.sacado = 'Maria Silva'
198
+ b.documento_sacado = '123.456.789-00'
199
+ b.endereco_sacado = 'Av. Brasil, 500 - Apt 101 - São Paulo/SP'
200
+ b.data_vencimento = Date.today + 10
201
+ b.valor_documento = 1250.00
202
+ b.instrucoes = 'Não receber após o vencimento. Juros de 1% ao mês.'
203
+ end
204
+
205
+ # Verificando os dados gerados
206
+ boleto.codigo_banco_formatado # => "001-9"
207
+ boleto.nosso_numero # => "12345678-12345-17"
208
+ boleto.agencia_codigo_cedente # => "1234-1 / 123456"
209
+ ```
210
+
211
+ ### Banrisul
126
212
 
127
- class BoletoSantander < BoletoBancario::Santander
213
+ ```ruby
214
+ # Carteira 00 - Cobrança Simples
215
+ boleto = BoletoBancario::Banrisul.new do |b|
216
+ b.agencia = '1102'
217
+ b.digito_agencia = '72'
218
+ b.conta_corrente = '9000150'
219
+ b.digito_conta_corrente = '46'
220
+ b.carteira = '00'
221
+ b.cedente = 'Loja de Informática RS LTDA'
222
+ b.documento_cedente = '98.765.432/0001-10'
223
+ b.endereco_cedente = 'Av. Ipiranga, 1000 - Porto Alegre/RS'
224
+ b.numero_documento = '22832563'
225
+ b.sacado = 'José Santos'
226
+ b.documento_sacado = '987.654.321-00'
227
+ b.endereco_sacado = 'Rua Voluntários da Pátria, 200 - Porto Alegre/RS'
228
+ b.data_vencimento = Date.today + 15
229
+ b.valor_documento = 550.00
128
230
  end
129
231
 
130
- class BoletoBradesco < BoletoBancario::Bradesco
232
+ boleto.codigo_banco_formatado # => "041-8"
233
+ boleto.nosso_numero # => "22832563.42"
234
+ ```
235
+
236
+ ### Bradesco
237
+
238
+ ```ruby
239
+ # Carteira 09 - Cobrança com Registro
240
+ boleto = BoletoBancario::Bradesco.new do |b|
241
+ b.agencia = '1234'
242
+ b.digito_agencia = '5'
243
+ b.conta_corrente = '1234567'
244
+ b.digito_conta_corrente = '0'
245
+ b.carteira = '09'
246
+ b.cedente = 'Distribuidora ABC LTDA'
247
+ b.documento_cedente = '11.222.333/0001-44'
248
+ b.endereco_cedente = 'Rua Augusta, 2000 - São Paulo/SP'
249
+ b.numero_documento = '12345678901'
250
+ b.sacado = 'Carlos Ferreira'
251
+ b.documento_sacado = '111.222.333-44'
252
+ b.endereco_sacado = 'Rua Oscar Freire, 300 - São Paulo/SP'
253
+ b.data_vencimento = Date.today + 7
254
+ b.valor_documento = 1890.50
255
+ b.instrucoes = 'Após vencimento cobrar multa de 2%'
131
256
  end
132
257
 
133
- class BoletoBancoBrasil < BoletoBancario::BancoBrasil
258
+ boleto.codigo_banco_formatado # => "237-2"
259
+ boleto.nosso_numero # => "09/12345678901-P"
260
+ boleto.agencia_codigo_cedente # => "1234-5 / 1234567-0"
261
+
262
+ # Carteira 06 - Cobrança Sem Registro
263
+ boleto_sem_registro = BoletoBancario::Bradesco.new do |b|
264
+ b.agencia = '1234'
265
+ b.conta_corrente = '1234567'
266
+ b.carteira = '06'
267
+ b.cedente = 'Distribuidora ABC LTDA'
268
+ b.numero_documento = '98765432101'
269
+ b.sacado = 'Ana Paula'
270
+ b.documento_sacado = '222.333.444-55'
271
+ b.data_vencimento = Date.today + 5
272
+ b.valor_documento = 350.00
134
273
  end
135
274
  ```
136
275
 
137
- Segue os attributos dos boletos:
138
-
139
- * Agência
140
- * Dígito da agência
141
- * Conta Corrente
142
- * Dígito da Conta Corrente
143
- * Carteira
144
- * Cedente
145
- * Código do Cedente
146
- * Documento do Cedente
147
- * Endereço do Cedente
148
- * Sacado
149
- * Documento do Sacado
150
- * Código da Moeda
151
- * Data do documento
152
- * Data do vencimento
153
- * Número do documento
154
- * Valor do documento (valor do boleto)
155
- * Espécie
156
- * Espécie do documento
157
-
158
- ### Criando os boletos / Validações
159
-
160
- Agora você pode emitir um boleto, **usando a classe criada no exemplo acima**:
276
+ ### Caixa Econômica Federal
161
277
 
162
278
  ```ruby
163
- BoletoItau.new(conta_corrente: '89755', agencia: '0097', :carteira => '195')
279
+ # Carteira 14 - Cobrança Simples com Registro
280
+ boleto = BoletoBancario::Caixa.new do |b|
281
+ b.agencia = '1234'
282
+ b.conta_corrente = '123456'
283
+ b.carteira = '14'
284
+ b.cedente = 'Construtora XYZ LTDA'
285
+ b.documento_cedente = '33.444.555/0001-66'
286
+ b.codigo_cedente = '123456'
287
+ b.endereco_cedente = 'Setor Comercial Sul, Quadra 1 - Brasília/DF'
288
+ b.numero_documento = '000000000000001'
289
+ b.sacado = 'Roberto Almeida'
290
+ b.documento_sacado = '333.444.555-66'
291
+ b.endereco_sacado = 'SGAN 607, Bloco A - Brasília/DF'
292
+ b.data_vencimento = Date.today + 30
293
+ b.valor_documento = 15000.00
294
+ b.instrucoes = 'Referente à parcela 1/12 do contrato 12345'
295
+ end
296
+
297
+ boleto.codigo_banco_formatado # => "104-0"
298
+ boleto.nosso_numero # => "14000000000000001-0"
299
+
300
+ # Carteira 24 - Cobrança Sem Registro
301
+ boleto_sr = BoletoBancario::Caixa.new do |b|
302
+ b.agencia = '1234'
303
+ b.conta_corrente = '123456'
304
+ b.carteira = '24'
305
+ b.cedente = 'Construtora XYZ LTDA'
306
+ b.codigo_cedente = '123456'
307
+ b.numero_documento = '000000000000002'
308
+ b.sacado = 'Fernanda Costa'
309
+ b.documento_sacado = '444.555.666-77'
310
+ b.data_vencimento = Date.today + 15
311
+ b.valor_documento = 8500.00
312
+ end
164
313
  ```
165
314
 
166
- Você pode usar blocos se quiser:
315
+ ### Itaú
167
316
 
168
317
  ```ruby
169
- boleto_itau = BoletoItau.new do |boleto|
170
- boleto.conta_corrente = '89755'
171
- boleto.agencia = '0097'
172
- boleto.carteira = '198'
173
- boleto.cedente = 'Razao Social da Empresa'
174
- boleto.codigo_cedente = '90901'
175
- boleto.endereco_cedente = 'Rua nome da rua, 9999'
176
- boleto.numero_documento = '12345678'
177
- boleto.sacado = 'Nome do Sacado'
178
- boleto.documento_sacado = '35433793990'
179
- boleto.data_vencimento = Date.tomorrow
180
- boleto.valor_documento = 31678.99
181
- boleto.seu_numero = 1234
318
+ # Carteira 198 - Cobrança com Registro
319
+ boleto = BoletoBancario::Itau.new do |b|
320
+ b.agencia = '0097'
321
+ b.conta_corrente = '12345'
322
+ b.digito_conta_corrente = '7'
323
+ b.carteira = '198'
324
+ b.cedente = 'Tech Solutions LTDA'
325
+ b.documento_cedente = '55.666.777/0001-88'
326
+ b.codigo_cedente = '12345'
327
+ b.endereco_cedente = 'Av. Paulista, 1500 - 10º andar - São Paulo/SP'
328
+ b.numero_documento = '12345678'
329
+ b.sacado = 'Pedro Henrique'
330
+ b.documento_sacado = '555.666.777-88'
331
+ b.endereco_sacado = 'Rua Consolação, 100 - São Paulo/SP'
332
+ b.data_vencimento = Date.today + 5
333
+ b.valor_documento = 2500.00
334
+ b.seu_numero = '1234'
335
+ b.instrucoes = 'Cobrar juros de 0,033% ao dia após vencimento'
336
+ end
337
+
338
+ boleto.codigo_banco_formatado # => "341-7"
339
+ boleto.nosso_numero # => "198/12345678-2"
340
+ boleto.agencia_codigo_cedente # => "0097 / 12345-7"
341
+
342
+ # Carteira 109 - Direta Eletrônica sem Registro
343
+ boleto_109 = BoletoBancario::Itau.new do |b|
344
+ b.agencia = '0097'
345
+ b.conta_corrente = '12345'
346
+ b.carteira = '109'
347
+ b.cedente = 'Tech Solutions LTDA'
348
+ b.codigo_cedente = '12345'
349
+ b.numero_documento = '87654321'
350
+ b.sacado = 'Juliana Lima'
351
+ b.documento_sacado = '666.777.888-99'
352
+ b.data_vencimento = Date.today + 3
353
+ b.valor_documento = 199.90
354
+ end
355
+
356
+ # Carteira 175 - Cobrança com Registro com IOF
357
+ boleto_175 = BoletoBancario::Itau.new do |b|
358
+ b.agencia = '0097'
359
+ b.conta_corrente = '12345'
360
+ b.carteira = '175'
361
+ b.cedente = 'Seguradora ABC'
362
+ b.codigo_cedente = '12345'
363
+ b.numero_documento = '11111111'
364
+ b.sacado = 'Marcos Souza'
365
+ b.documento_sacado = '777.888.999-00'
366
+ b.data_vencimento = Date.today + 30
367
+ b.valor_documento = 5000.00
182
368
  end
183
369
  ```
184
370
 
185
- **Cada banco possui suas próprias validações de campo e de tamanho**.
186
- Primeiramente, **antes de renderizar qualquer boleto você precisar verificar se esse o boleto é válido**.
371
+ ### Santander
187
372
 
188
373
  ```ruby
189
- if boleto_itau.valid?
190
- # Renderiza o boleto itau
191
- else
192
- # Trata os erros
374
+ # Carteira 102 - Cobrança Simples com Registro
375
+ boleto = BoletoBancario::Santander.new do |b|
376
+ b.agencia = '1234'
377
+ b.conta_corrente = '1234567'
378
+ b.carteira = '102'
379
+ b.cedente = 'Importadora Global LTDA'
380
+ b.documento_cedente = '77.888.999/0001-00'
381
+ b.codigo_cedente = '1234567'
382
+ b.endereco_cedente = 'Av. das Nações Unidas, 12000 - São Paulo/SP'
383
+ b.numero_documento = '1234567890123'
384
+ b.sacado = 'Lucas Oliveira'
385
+ b.documento_sacado = '888.999.000-11'
386
+ b.endereco_sacado = 'Rua Funchal, 500 - São Paulo/SP'
387
+ b.data_vencimento = Date.today + 10
388
+ b.valor_documento = 3750.00
389
+ end
390
+
391
+ boleto.codigo_banco_formatado # => "033-7"
392
+ boleto.nosso_numero # => "1234567890123-4"
393
+ boleto.agencia_codigo_cedente # => "1234 / 1234567"
394
+
395
+ # Carteira 101 - Cobrança Simples Rápida
396
+ boleto_101 = BoletoBancario::Santander.new do |b|
397
+ b.agencia = '1234'
398
+ b.conta_corrente = '1234567'
399
+ b.carteira = '101'
400
+ b.cedente = 'Importadora Global LTDA'
401
+ b.codigo_cedente = '1234567'
402
+ b.numero_documento = '9876543210987'
403
+ b.sacado = 'Beatriz Mendes'
404
+ b.documento_sacado = '999.000.111-22'
405
+ b.data_vencimento = Date.today + 7
406
+ b.valor_documento = 890.00
193
407
  end
194
408
  ```
195
409
 
196
- ### Campos do Boleto
410
+ ### Sicoob
411
+
412
+ ```ruby
413
+ # Carteira 1 - Simples com Registro
414
+ boleto = BoletoBancario::Sicoob.new do |b|
415
+ b.agencia = '3069'
416
+ b.conta_corrente = '828452'
417
+ b.carteira = '1'
418
+ b.cedente = 'Cooperativa Agrícola do Vale'
419
+ b.documento_cedente = '11.222.333/0001-44'
420
+ b.codigo_cedente = '828452'
421
+ b.convenio = '123456'
422
+ b.endereco_cedente = 'Rodovia BR-101, km 50 - Interior/MG'
423
+ b.numero_documento = '1234567'
424
+ b.sacado = 'Fazenda Santa Maria'
425
+ b.documento_sacado = '22.333.444/0001-55'
426
+ b.endereco_sacado = 'Fazenda Santa Maria, s/n - Zona Rural - Interior/MG'
427
+ b.data_vencimento = Date.today + 30
428
+ b.valor_documento = 25000.00
429
+ b.instrucoes = 'Referente à compra de insumos agrícolas'
430
+ end
431
+
432
+ boleto.codigo_banco_formatado # => "756-0"
433
+ boleto.nosso_numero # => "1234567-4"
434
+ boleto.agencia_codigo_cedente # => "3069 / 828452"
435
+
436
+ # Carteira 9 - Sem Registro
437
+ boleto_9 = BoletoBancario::Sicoob.new do |b|
438
+ b.agencia = '3069'
439
+ b.conta_corrente = '828452'
440
+ b.carteira = '9'
441
+ b.cedente = 'Cooperativa Agrícola do Vale'
442
+ b.codigo_cedente = '828452'
443
+ b.convenio = '123456'
444
+ b.numero_documento = '7654321'
445
+ b.sacado = 'Sítio Boa Vista'
446
+ b.documento_sacado = '33.444.555/0001-66'
447
+ b.data_vencimento = Date.today + 15
448
+ b.valor_documento = 8500.00
449
+ end
450
+ ```
197
451
 
198
- Segue abaixo os métodos para serem chamados, no momento de renderizar os boletos. Os campos são de mesmo nome:
452
+ ### Sicredi
199
453
 
200
454
  ```ruby
201
- boleto_itau.codigo_banco_formatado # Retorna o código do banco, junto com seu dígito
455
+ # Carteira 03 - Cobrança com Registro
456
+ boleto = BoletoBancario::Sicredi.new do |b|
457
+ b.agencia = '0710'
458
+ b.conta_corrente = '54321'
459
+ b.carteira = '03'
460
+ b.posto = '08'
461
+ b.byte_id = '2'
462
+ b.cedente = 'Supermercado Bom Preço LTDA'
463
+ b.documento_cedente = '44.555.666/0001-77'
464
+ b.endereco_cedente = 'Av. Central, 500 - Centro - Interior/RS'
465
+ b.numero_documento = '12345'
466
+ b.sacado = 'João da Silva'
467
+ b.documento_sacado = '444.555.666-77'
468
+ b.endereco_sacado = 'Rua das Palmeiras, 100 - Interior/RS'
469
+ b.data_vencimento = Date.today + 7
470
+ b.valor_documento = 450.00
471
+ end
202
472
 
203
- boleto_itau.codigo_de_barras
473
+ boleto.codigo_banco_formatado # => "748-X"
474
+ boleto.agencia_codigo_cedente # => "0710.08.54321"
475
+
476
+ # Carteira C - Correspondente
477
+ boleto_c = BoletoBancario::Sicredi.new do |b|
478
+ b.agencia = '0710'
479
+ b.conta_corrente = '54321'
480
+ b.carteira = 'C'
481
+ b.posto = '08'
482
+ b.byte_id = '3'
483
+ b.cedente = 'Supermercado Bom Preço LTDA'
484
+ b.numero_documento = '54321'
485
+ b.sacado = 'Maria Aparecida'
486
+ b.documento_sacado = '555.666.777-88'
487
+ b.data_vencimento = Date.today + 10
488
+ b.valor_documento = 1200.00
489
+ end
490
+ ```
204
491
 
205
- boleto_itau.linha_digitavel
492
+ ### Nubank
206
493
 
207
- boleto_itau.nosso_numero
494
+ ```ruby
495
+ boleto = BoletoBancario::Nubank.new do |b|
496
+ b.agencia = '0001'
497
+ b.conta_corrente = '1234567890'
498
+ b.carteira = '1'
499
+ b.cedente = 'Startup Digital LTDA'
500
+ b.documento_cedente = '55.666.777/0001-88'
501
+ b.endereco_cedente = 'Rua Capote Valente, 39 - Pinheiros - São Paulo/SP'
502
+ b.numero_documento = '00012345678'
503
+ b.sacado = 'Amanda Torres'
504
+ b.documento_sacado = '666.777.888-99'
505
+ b.endereco_sacado = 'Av. Rebouças, 1000 - Apt 42 - São Paulo/SP'
506
+ b.data_vencimento = Date.today + 7
507
+ b.valor_documento = 299.90
508
+ b.instrucoes = 'Pagamento referente à assinatura mensal'
509
+ end
208
510
 
209
- boleto_itau.agencia_codigo_cedente
511
+ boleto.codigo_banco_formatado # => "260-0"
512
+ boleto.nosso_numero # => "00012345678-9"
513
+ boleto.agencia_codigo_cedente # => "0001 / 1234567890-3"
514
+ ```
210
515
 
211
- boleto_itau.carteira_formatada # Formata a carteira, para mostrar no boleto.
516
+ ### Inter
212
517
 
213
- boleto_itau.numero_documento
518
+ ```ruby
519
+ boleto = BoletoBancario::Inter.new do |b|
520
+ b.agencia = '0001'
521
+ b.conta_corrente = '9876543210'
522
+ b.carteira = '112'
523
+ b.cedente = 'E-commerce Express LTDA'
524
+ b.documento_cedente = '66.777.888/0001-99'
525
+ b.endereco_cedente = 'Av. Raja Gabaglia, 1000 - Belo Horizonte/MG'
526
+ b.numero_documento = '00098765432'
527
+ b.sacado = 'Ricardo Gomes'
528
+ b.documento_sacado = '777.888.999-00'
529
+ b.endereco_sacado = 'Rua da Bahia, 500 - Belo Horizonte/MG'
530
+ b.data_vencimento = Date.today + 5
531
+ b.valor_documento = 1599.00
532
+ b.instrucoes = 'Pedido #98765 - Entrega expressa inclusa'
533
+ end
214
534
 
215
- boleto_itau.valor_documento
535
+ boleto.codigo_banco_formatado # => "077-9"
536
+ boleto.nosso_numero # => "00098765432-9"
537
+ boleto.agencia_codigo_cedente # => "0001 / 9876543210-3"
538
+ ```
216
539
 
217
- boleto_itau.especie
540
+ ### C6 Bank
218
541
 
219
- boleto_itau.especie_documento
542
+ ```ruby
543
+ boleto = BoletoBancario::C6Bank.new do |b|
544
+ b.agencia = '0001'
545
+ b.conta_corrente = '5678901234'
546
+ b.carteira = '1'
547
+ b.cedente = 'Fintech Solutions LTDA'
548
+ b.documento_cedente = '77.888.999/0001-00'
549
+ b.endereco_cedente = 'Av. Faria Lima, 3000 - 15º andar - São Paulo/SP'
550
+ b.numero_documento = '00056789012'
551
+ b.sacado = 'Camila Rodrigues'
552
+ b.documento_sacado = '888.999.000-11'
553
+ b.endereco_sacado = 'Rua Pamplona, 200 - São Paulo/SP'
554
+ b.data_vencimento = Date.today + 10
555
+ b.valor_documento = 4500.00
556
+ b.instrucoes = 'Parcela 3/6 - Contrato de serviços'
557
+ end
558
+
559
+ boleto.codigo_banco_formatado # => "336-5"
560
+ boleto.nosso_numero # => "00056789012-4"
561
+ boleto.agencia_codigo_cedente # => "0001 / 5678901234-3"
220
562
  ```
221
563
 
222
- ## Sobrescrevendo comportamentos
564
+ ## Herança e Customização
565
+
566
+ Recomendamos criar subclasses para cada banco utilizado na sua aplicação:
567
+
568
+ ```ruby
569
+ class MeuBoletoItau < BoletoBancario::Itau
570
+ # Valores padrão para sua empresa
571
+ def default_values
572
+ super.merge(
573
+ cedente: 'Minha Empresa LTDA',
574
+ endereco_cedente: 'Rua Principal, 100 - São Paulo/SP',
575
+ agencia: '1234',
576
+ conta_corrente: '56789',
577
+ carteira: '109'
578
+ )
579
+ end
580
+ end
223
581
 
224
- Você pode sobrescrever os comportamentos na subclasse.
582
+ # Uso simplificado
583
+ boleto = MeuBoletoItau.new(
584
+ numero_documento: '123',
585
+ sacado: 'Cliente',
586
+ documento_sacado: '123.456.789-00',
587
+ data_vencimento: Date.today + 5,
588
+ valor_documento: 100.00
589
+ )
590
+ ```
225
591
 
226
- Por exemplo, imagine que você quer sobrescrever a forma como é tratada a segunda parte do código de barras.
227
- **Seguindo a interface da classe BoletoBancario::Boleto** fica bem simples:
592
+ ### Sobrescrevendo Comportamentos
228
593
 
229
594
  ```ruby
230
- class BoletoItau < BoletoBancario::Itau
595
+ class MeuBoletoBradesco < BoletoBancario::Bradesco
596
+ # Customiza o código de barras do banco
231
597
  def codigo_de_barras_do_banco
232
- # Sua implementação ...
598
+ # Sua implementação customizada
599
+ end
600
+
601
+ # Customiza a formatação do nosso número
602
+ def nosso_numero
603
+ # Sua implementação customizada
233
604
  end
234
605
  end
235
606
  ```
236
607
 
237
- ## Formatos (HTML, PDF e PNG)
608
+ ## Validação de CPF/CNPJ
609
+
610
+ A gem inclui utilitários para validação de documentos:
238
611
 
239
- ### Objetivos para as próximas versões: criar os formatos dos boletos de:
612
+ ```ruby
613
+ # Validação
614
+ BoletoBancario::Calculos::Documento.valid?('123.456.789-09') # => true/false
615
+ BoletoBancario::Calculos::Documento.valid?('12.345.678/0001-95') # => true/false
240
616
 
241
- * HTML
242
- * PDF
243
- * PNG
617
+ # Formatação
618
+ BoletoBancario::Calculos::Documento.format('12345678909') # => "123.456.789-09"
619
+ BoletoBancario::Calculos::Documento.format('12345678000195') # => "12.345.678/0001-95"
620
+ ```
244
621
 
245
- ## O que a gem não faz
622
+ ## Atributos Disponíveis
623
+
624
+ | Atributo | Descrição |
625
+ |----------|-----------|
626
+ | `agencia` | Número da agência |
627
+ | `digito_agencia` | Dígito verificador da agência |
628
+ | `conta_corrente` | Número da conta corrente |
629
+ | `digito_conta_corrente` | Dígito verificador da conta |
630
+ | `carteira` | Código da carteira |
631
+ | `cedente` | Nome/Razão social do beneficiário |
632
+ | `codigo_cedente` | Código do cedente no banco |
633
+ | `documento_cedente` | CPF/CNPJ do beneficiário |
634
+ | `endereco_cedente` | Endereço do beneficiário |
635
+ | `sacado` | Nome do pagador |
636
+ | `documento_sacado` | CPF/CNPJ do pagador |
637
+ | `endereco_sacado` | Endereço do pagador |
638
+ | `numero_documento` | Número do documento/boleto |
639
+ | `data_documento` | Data de emissão |
640
+ | `data_vencimento` | Data de vencimento |
641
+ | `valor_documento` | Valor do boleto |
642
+ | `especie` | Espécie da moeda (padrão: R$) |
643
+ | `especie_documento` | Espécie do documento (padrão: DM) |
644
+ | `instrucoes` | Instruções para o caixa |
645
+
646
+ ## Métodos Disponíveis
647
+
648
+ | Método | Descrição |
649
+ |--------|-----------|
650
+ | `codigo_banco` | Código do banco (3 dígitos) |
651
+ | `digito_codigo_banco` | Dígito do código do banco |
652
+ | `codigo_banco_formatado` | Código formatado (ex: "341-7") |
653
+ | `codigo_de_barras` | Código de barras (44 dígitos) |
654
+ | `linha_digitavel` | Linha digitável formatada |
655
+ | `nosso_numero` | Nosso número formatado |
656
+ | `agencia_codigo_cedente` | Agência/Código do cedente |
657
+ | `carteira_formatada` | Carteira formatada para exibição |
658
+ | `to_pdf` | Gera PDF do boleto |
659
+ | `to_html` | Gera HTML do boleto |
660
+ | `to_png` | Gera PNG do código de barras |
661
+
662
+ ## FEBRABAN 2025
663
+
664
+ A partir de 22/02/2025, o cálculo do fator de vencimento foi atualizado conforme norma FEBRABAN:
665
+
666
+ - **Antes de 22/02/2025**: Data base 07/10/1997
667
+ - **A partir de 22/02/2025**: Data base 29/05/2022, fator reinicia em 1000
668
+
669
+ A gem trata essa transição automaticamente.
670
+
671
+ ## Internacionalização (i18n)
672
+
673
+ A gem inclui traduções em português brasileiro. Para usar em outros idiomas:
246
674
 
247
- A gem não trata os arquivos de remessa e os arquivos de retorno do banco.
675
+ ```ruby
676
+ # config/locales/boleto_bancario.en.yml
677
+ en:
678
+ boleto_bancario:
679
+ cedente: "Beneficiary"
680
+ sacado: "Payer"
681
+ # ...
682
+ ```
683
+
684
+ ## O Que a Gem Não Faz
685
+
686
+ Esta gem é focada exclusivamente na **emissão de boletos**. Ela **não** trata:
687
+
688
+ - Arquivos de remessa (CNAB 240/400)
689
+ - Arquivos de retorno
690
+ - Integração com APIs bancárias
691
+ - Registro de boletos online
692
+
693
+ Para essas funcionalidades, considere usar gems complementares.
694
+
695
+ ## Documentação dos Bancos
696
+
697
+ As documentações oficiais utilizadas estão disponíveis em:
698
+
699
+ - [documentacoes_dos_boletos/](documentacoes_dos_boletos/)
700
+
701
+ ## Contribuindo
702
+
703
+ Contribuições são bem-vindas! Você pode ajudar de várias formas:
704
+
705
+ 1. **Homologando boletos** junto aos bancos
706
+ 2. **Reportando bugs** e abrindo issues
707
+ 3. **Enviando pull requests** com melhorias
708
+ 4. **Atualizando documentações** dos bancos
709
+ 5. **Adicionando suporte** a novos bancos
710
+
711
+ ### Desenvolvimento
712
+
713
+ ```bash
714
+ # Clone o repositório
715
+ git clone https://github.com/tomas-stefano/boleto_bancario.git
716
+ cd boleto_bancario
717
+
718
+ # Instale as dependências
719
+ bundle install
720
+
721
+ # Execute os testes
722
+ bundle exec rspec
723
+ ```
248
724
 
249
- Na minha opinião não deveria ser responsabilidade dessa gem.
250
- Essa gem **apenas emite o boleto**, com todas as informações necessárias do boleto.
725
+ ## Changelog
251
726
 
252
- ## Contribuições
727
+ Veja o arquivo [Changelog.markdown](Changelog.markdown) para o histórico de alterações.
253
728
 
254
- Seja um contribuidor. Você pode contribuir de N formas. Seguem elas:
729
+ ## Licença
255
730
 
256
- * Homologando boletos junto ao banco.
257
- * Fornecendo documentações mais atualizadas dos Bancos.
258
- * Escrevendo novos formatos (PDF, PNG), e me avisando para divulgar no Readme.
259
- * Refatorando código!!
260
- * Fornecendo Feedback construtivo! (Sempre bem vindo!)
731
+ MIT License. Veja [LICENSE](LICENSE) para mais detalhes.