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
data/README.markdown CHANGED
@@ -1,208 +1,731 @@
1
- # BoletoBancario
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 que estão dentro do repositório:
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
- * [Bradesco](https://github.com/tomas-stefano/boleto_bancario/tree/master/documentacoes_dos_boletos/bradesco)
31
- * [Banco do Brasil](https://github.com/tomas-stefano/boleto_bancario/tree/master/documentacoes_dos_boletos/banco_brasil)
32
- * [Itaú](https://github.com/tomas-stefano/boleto_bancario/tree/master/documentacoes_dos_boletos/itau)
33
- * [Santander](https://github.com/tomas-stefano/boleto_bancario/tree/master/documentacoes_dos_boletos/santander)
43
+ ## Uso Básico
34
44
 
35
- Se você tiver uma documentação do boleto, **mais atualizada**, venha contribuir para a gem. :)
45
+ ### Criando um Boleto
36
46
 
37
- ## 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
+ ```
38
62
 
39
- Para todos os bancos e carteiras implementadas, **seguimos as documentações** que estão dentro do repositório:
40
-
41
- <table>
42
- <tr>
43
- <th>Nome do Banco</th>
44
- <th>Carteiras Suportadas</th>
45
- <th>Testada/Homologada no banco</th>
46
- </tr>
47
- <tr>
48
- <td>Banco do Brasil</td>
49
- <td>
50
- 12 com código do cedente de 6 dígitos,
51
- 16 e 18 com código do cedente de 4 dígitos,
52
- 16 e 18 com código do cedente e nosso número de 17 dígitos,
53
- 16 e 18 com código do cedente de 6 dígitos,
54
- 16, 17 e 18 código do cedente de 7 e 8 dígitos.
55
- </td>
56
- <td>Esperando Contribuição</td>
57
- </tr>
58
- <tr>
59
- <td>Itaú</td>
60
- <td>107, 109, 122, 142, 143, 126, 174, 175, 196, 198, 131, 146, 150, 168.</td>
61
- <td>Esperando Contribuição</td>
62
- </tr>
63
- <tr>
64
- <td>Bradesco</td>
65
- <td>03, 06, 09, 19, 21, 22.</td>
66
- <td>Esperando Contribuição</td>
67
- </tr>
68
- <tr>
69
- <td>Santander</td>
70
- <td>101, 102, 121.</td>
71
- <td>Esperando Contribuição</td>
72
- </tr>
73
- </table>
74
-
75
- **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.**
76
-
77
- ## Homologação no Banco
78
-
79
- Uma ótima forma de contribuir para a gem, é validar junto ao banco os boletos implementados acima.
80
-
81
- ## Usage
82
-
83
- Você pode usar as próprias classes da gem, porém, **recomendo criar uma subclasse** para os bancos que você gostaria de desenvolver.
84
-
85
- ### Exemplo
86
-
87
- ```ruby
88
- class BoletoItau < BoletoBancario::Itau
89
- end
63
+ ### Validando o Boleto
90
64
 
91
- class BoletoSantander < BoletoBancario::Santander
92
- end
65
+ Cada banco possui suas próprias validações. Sempre verifique se o boleto é válido antes de renderizar:
93
66
 
94
- class BoletoBradesco < BoletoBancario::Bradesco
67
+ ```ruby
68
+ if boleto.valid?
69
+ # Boleto válido, pode renderizar
70
+ else
71
+ boleto.errors.full_messages.each do |erro|
72
+ puts erro
95
73
  end
74
+ end
75
+ ```
96
76
 
97
- class BoletoBancoBrasil < BoletoBancario::BancoBrasil
98
- end
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"
99
85
  ```
100
86
 
101
- Segue os attributos dos boletos:
87
+ ## Formatos de Saída
102
88
 
103
- * Agência
104
- * Dígito da agência
105
- * Conta Corrente
106
- * Dígito da Conta Corrente
107
- * Carteira
108
- * Cedente
109
- * Código do Cedente
110
- * Documento do Cedente
111
- * Endereço do Cedente
112
- * Sacado
113
- * Documento do Sacado
114
- * Código da Moeda
115
- * Data do documento
116
- * Data do vencimento
117
- * Número do documento
118
- * Valor do documento (valor do boleto)
119
- * Espécie
120
- * Espécie do documento
89
+ ### PDF
121
90
 
122
- ### Criando os boletos / Validações
91
+ Gera o boleto em formato PDF usando Prawn:
123
92
 
124
- Agora você pode emitir um boleto, **usando a classe criada no exemplo acima**:
93
+ ```ruby
94
+ boleto.to_pdf
95
+ # => String com o conteúdo binário do PDF
125
96
 
126
- BoletoItau.new(conta_corrente: '89755', agencia: '0097', :carteira => '195')
97
+ # Salvando em arquivo
98
+ File.binwrite('boleto.pdf', boleto.to_pdf)
99
+ ```
127
100
 
128
- Você pode usar blocos se quiser:
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
+ ```
129
109
 
130
- BoletoItau.new do |boleto|
131
- boleto_itau.conta_corrente = '89755'
132
- boleto_itau.digito_conta_corrente = '1'
133
- boleto_itau.agencia = '0097'
134
- boleto_itau.carteira = '198'
135
- boleto_itau.cedente = 'Razao Social da Empresa'
136
- boleto_itau.codigo_cedente = '90901'
137
- boleto_itau.endereco_cedente = 'Rua nome da rua, 9999'
138
- boleto_itau.numero_documento = '12345678'
139
- boleto_itau.sacado = 'Nome do Sacado'
140
- boleto_itau.documento_sacado = '35433793990'
141
- boleto_itau.data_vencimento = Date.tomorrow
142
- boleto_itau.valor_documento = 31678.99
143
- boleto_itau.seu_numero = 1234
144
- end
110
+ ### PNG (Código de Barras)
145
111
 
146
- **Cada banco possui suas próprias validações de campo e de tamanho**.
147
- Primeiramente, **antes de renderizar qualquer boleto você precisar verificar se esse o boleto é válido**.
112
+ Gera apenas a imagem do código de barras:
148
113
 
149
- if boleto_itau.valid?
150
- # Renderiza o boleto itau
151
- else
152
- # Trata os erros
153
- end
114
+ ```ruby
115
+ boleto.to_png
116
+ # => String com o conteúdo binário do PNG
154
117
 
155
- ### Campos do Boleto
118
+ # Com opções customizadas
119
+ boleto.to_png(height: 80, margin: 20)
156
120
 
157
- Segue abaixo os métodos para serem chamados, no momento de renderizar os boletos. Os campos são de mesmo nome:
121
+ # Salvando em arquivo
122
+ File.binwrite('codigo_barras.png', boleto.to_png)
123
+ ```
158
124
 
159
- boleto_itau.codigo_banco_formatado # Retorna o código do banco, junto com seu dígito
125
+ ### Customizando Templates HTML
160
126
 
161
- boleto_itau.codigo_de_barras
127
+ O HTML é gerado usando templates ERB que podem ser customizados.
162
128
 
163
- boleto_itau.linha_digitavel
129
+ #### Usando um Caminho Customizado
164
130
 
165
- boleto_itau.nosso_numero
131
+ ```ruby
132
+ class MeuHtmlRenderer < BoletoBancario::Renderers::HtmlRenderer
133
+ self.template_path = '/caminho/para/meus/templates'
134
+ end
166
135
 
167
- boleto_itau.agencia_codigo_cedente
136
+ boleto = BoletoBancario::Itau.new(...)
137
+ renderer = MeuHtmlRenderer.new(boleto)
138
+ html = renderer.render
139
+ ```
168
140
 
169
- boleto_itau.carteira_formatada # Formata a carteira, para mostrar no boleto.
141
+ #### Estrutura dos Templates
170
142
 
171
- boleto_itau.numero_documento
143
+ Os templates padrão estão em `lib/boleto_bancario/templates/`:
172
144
 
173
- boleto_itau.valor_documento
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 |
174
155
 
175
- boleto_itau.especie
156
+ #### Rails: Copiando Templates
176
157
 
177
- boleto_itau.especie_documento
158
+ ```bash
159
+ rails generate boleto_bancario:views
160
+ ```
178
161
 
179
- ## Sobrescrevendo comportamentos
162
+ Isso copia os templates para `app/views/boletos/`, onde você pode customizá-los.
180
163
 
181
- Você pode sobrescrever os comportamentos na subclasse.
164
+ #### Rails: Renderizando com Partials
182
165
 
183
- Por exemplo, imagine que você quer sobrescrever a forma como é tratada a segunda parte do código de barras.
184
- **Seguindo a interface da classe BoletoBancario::Boleto** fica bem simples:
166
+ O boleto suporta `to_partial_path` para integração com Rails:
185
167
 
186
- class BoletoItau < BoletoBancario::Itau
187
- def codigo_de_barras_do_banco
188
- # Sua implementação ...
189
- end
190
- end
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>
191
175
 
192
- ## O que a gem não faz
176
+ <%# Em qualquer view %>
177
+ <%= render @boleto %>
178
+ ```
193
179
 
194
- A gem não trata os arquivos de remessa e os arquivos de retorno do banco.
180
+ ## Exemplos por Banco
195
181
 
196
- Na minha opinião não deveria ser responsabilidade dessa gem.
197
- Essa gem **apenas emite o boleto**, com todas as informações necessárias para o pagamento.
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
212
+
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
230
+ end
231
+
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%'
256
+ end
257
+
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
273
+ end
274
+ ```
275
+
276
+ ### Caixa Econômica Federal
277
+
278
+ ```ruby
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
313
+ ```
314
+
315
+ ### Itaú
316
+
317
+ ```ruby
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
368
+ end
369
+ ```
370
+
371
+ ### Santander
372
+
373
+ ```ruby
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
407
+ end
408
+ ```
409
+
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
+ ```
451
+
452
+ ### Sicredi
453
+
454
+ ```ruby
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
472
+
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
+ ```
491
+
492
+ ### Nubank
493
+
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
510
+
511
+ boleto.codigo_banco_formatado # => "260-0"
512
+ boleto.nosso_numero # => "00012345678-9"
513
+ boleto.agencia_codigo_cedente # => "0001 / 1234567890-3"
514
+ ```
515
+
516
+ ### Inter
517
+
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
534
+
535
+ boleto.codigo_banco_formatado # => "077-9"
536
+ boleto.nosso_numero # => "00098765432-9"
537
+ boleto.agencia_codigo_cedente # => "0001 / 9876543210-3"
538
+ ```
539
+
540
+ ### C6 Bank
541
+
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"
562
+ ```
563
+
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
581
+
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
+ ```
591
+
592
+ ### Sobrescrevendo Comportamentos
593
+
594
+ ```ruby
595
+ class MeuBoletoBradesco < BoletoBancario::Bradesco
596
+ # Customiza o código de barras do banco
597
+ def codigo_de_barras_do_banco
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
604
+ end
605
+ end
606
+ ```
607
+
608
+ ## Validação de CPF/CNPJ
609
+
610
+ A gem inclui utilitários para validação de documentos:
611
+
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
616
+
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
+ ```
621
+
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:
674
+
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
+ ```
198
724
 
199
- ## Contribuições
725
+ ## Changelog
200
726
 
201
- Seja um contribuidor. Você pode contribuir de N formas. Seguem elas:
727
+ Veja o arquivo [Changelog.markdown](Changelog.markdown) para o histórico de alterações.
202
728
 
203
- * Homologando boletos junto ao banco.
204
- * Fornecendo documentações mais atualizadas dos Bancos.
205
- * Escrevendo novos formatos (PDF, PNG), e me avisando para divulgar no Readme.
206
- * Refatorando código!!
207
- * Fornecendo Feedback construtivo! (Sempre bem vindo!)
729
+ ## Licença
208
730
 
731
+ MIT License. Veja [LICENSE](LICENSE) para mais detalhes.