br_boleto 1.2.2 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/Gemfile.lock +1 -1
- data/README.markdown +278 -98
- data/br_boleto.gemspec +5 -3
- data/lib/br_boleto/active_model_base.rb +1 -1
- data/lib/br_boleto/association/have_conta.rb +109 -0
- data/lib/br_boleto/association/have_pagador.rb +38 -0
- data/lib/br_boleto/association/have_pagamentos.rb +44 -0
- data/lib/br_boleto/boleto/base.rb +50 -379
- data/lib/br_boleto/boleto/caixa.rb +28 -143
- data/lib/br_boleto/boleto/sicoob.rb +24 -144
- data/lib/br_boleto/conta/base.rb +288 -0
- data/lib/br_boleto/conta/caixa.rb +109 -0
- data/lib/br_boleto/conta/sicoob.rb +64 -0
- data/lib/br_boleto/helper/default_codes.rb +33 -0
- data/lib/br_boleto/helper/format_value.rb +1 -0
- data/lib/br_boleto/helper/number.rb +30 -0
- data/lib/br_boleto/pagador.rb +82 -0
- data/lib/br_boleto/remessa/base.rb +28 -50
- data/lib/br_boleto/remessa/cnab240/base.rb +22 -131
- data/lib/br_boleto/remessa/cnab240/caixa.rb +16 -62
- data/lib/br_boleto/remessa/cnab240/helper/header_arquivo.rb +7 -7
- data/lib/br_boleto/remessa/cnab240/helper/header_lote.rb +6 -6
- data/lib/br_boleto/remessa/cnab240/helper/segmento_p.rb +22 -22
- data/lib/br_boleto/remessa/cnab240/helper/segmento_q.rb +16 -16
- data/lib/br_boleto/remessa/cnab240/helper/segmento_r.rb +3 -3
- data/lib/br_boleto/remessa/cnab240/helper/segmento_s.rb +3 -3
- data/lib/br_boleto/remessa/cnab240/helper/trailer_arquivo.rb +3 -3
- data/lib/br_boleto/remessa/cnab240/helper/trailer_lote.rb +3 -3
- data/lib/br_boleto/remessa/cnab240/sicoob.rb +36 -73
- data/lib/br_boleto/remessa/cnab400/base.rb +95 -0
- data/lib/br_boleto/remessa/cnab400/helper/detalhe.rb +136 -0
- data/lib/br_boleto/remessa/cnab400/helper/header.rb +114 -0
- data/lib/br_boleto/remessa/cnab400/helper/trailer.rb +50 -0
- data/lib/br_boleto/remessa/cnab400/sicoob.rb +249 -0
- data/lib/br_boleto/remessa/lote.rb +1 -23
- data/lib/br_boleto/remessa/pagamento.rb +188 -51
- data/lib/br_boleto/retorno/base.rb +9 -0
- data/lib/br_boleto/retorno/cnab240/base.rb +2 -10
- data/lib/br_boleto/retorno/cnab400/base.rb +48 -0
- data/lib/br_boleto/retorno/cnab400/sicoob.rb +42 -0
- data/lib/br_boleto/retorno/pagamento.rb +12 -6
- data/lib/br_boleto/string_methods.rb +8 -2
- data/lib/br_boleto/validations.rb +19 -0
- data/lib/br_boleto/version.rb +3 -3
- data/lib/br_boleto.rb +38 -8
- data/lib/config/locales/br-boleto-en.yml +89 -0
- data/lib/config/locales/br-boleto-pt-BR.yml +89 -0
- data/test/br_boleto/association/have_conta_test.rb +319 -0
- data/test/br_boleto/association/have_pagador_test.rb +110 -0
- data/test/br_boleto/association/have_pagamentos_test.rb +113 -0
- data/test/br_boleto/boleto/base_test.rb +127 -201
- data/test/br_boleto/boleto/caixa_test.rb +58 -72
- data/test/br_boleto/boleto/sicoob_test.rb +88 -147
- data/test/br_boleto/conta/base_test.rb +490 -0
- data/test/br_boleto/conta/caixa_test.rb +154 -0
- data/test/br_boleto/conta/sicoob_test.rb +144 -0
- data/test/br_boleto/helper/number_test.rb +29 -0
- data/test/br_boleto/pagador_test.rb +158 -0
- data/test/br_boleto/remessa/base_test.rb +37 -62
- data/test/br_boleto/remessa/cnab240/base_test.rb +75 -95
- data/test/br_boleto/remessa/cnab240/caixa_test.rb +61 -96
- data/test/br_boleto/remessa/cnab240/helper/header_arquivo_test.rb +11 -11
- data/test/br_boleto/remessa/cnab240/helper/header_lote_test.rb +8 -8
- data/test/br_boleto/remessa/cnab240/helper/segmento_p_test.rb +17 -15
- data/test/br_boleto/remessa/cnab240/helper/segmento_q_test.rb +13 -13
- data/test/br_boleto/remessa/cnab240/helper/segmento_r_test.rb +2 -2
- data/test/br_boleto/remessa/cnab240/helper/segmento_s_test.rb +3 -3
- data/test/br_boleto/remessa/cnab240/helper/trailer_arquivo_test.rb +1 -1
- data/test/br_boleto/remessa/cnab240/helper/trailer_lote_test.rb +1 -1
- data/test/br_boleto/remessa/cnab240/sicoob_test.rb +136 -131
- data/test/br_boleto/remessa/cnab400/base_test.rb +263 -0
- data/test/br_boleto/remessa/cnab400/sicoob_test.rb +179 -0
- data/test/br_boleto/remessa/lote_test.rb +2 -41
- data/test/br_boleto/remessa/pagamento_test.rb +186 -188
- data/test/br_boleto/retorno/base_test.rb +0 -1
- data/test/br_boleto/retorno/cnab240/base_test.rb +12 -11
- data/test/br_boleto/retorno/cnab240/caixa_test.rb +11 -11
- data/test/br_boleto/retorno/cnab240/sicoob_test.rb +11 -11
- data/test/br_boleto/retorno/cnab400/sicoob_test.rb +227 -0
- data/test/br_boleto/retorno/pagamento_test.rb +6 -6
- data/test/factories/boleto/base.rb +9 -7
- data/test/factories/boleto/boleto_caixa.rb +2 -9
- data/test/factories/boleto/boleto_sicoob.rb +10 -8
- data/test/factories/conta/base.rb +10 -0
- data/test/factories/conta/caixa.rb +15 -0
- data/test/factories/conta/sicoob.rb +16 -0
- data/test/factories/pagador.rb +15 -0
- data/test/factories/remessa/base.rb +0 -6
- data/test/factories/remessa/cnab240/base.rb +0 -10
- data/test/factories/remessa/cnab240/caixa.rb +1 -6
- data/test/factories/remessa/cnab240/sicoob.rb +1 -10
- data/test/factories/remessa/cnab400/base.rb +8 -0
- data/test/factories/remessa/cnab400/sicoob.rb +8 -0
- data/test/factories/remessa/pagamento.rb +8 -7
- data/test/fixtures/remessa/cnab240/sicoob.rem +8 -0
- data/test/{files → fixtures}/retorno/cnab240/caixa.ret +0 -0
- data/test/{files → fixtures}/retorno/cnab240/padrao240.ret +0 -0
- data/test/fixtures/retorno/cnab400/sicoob.ret +7 -0
- data/test/inheritance/boleto_test.rb +4 -1
- data/test/inheritance/sicoob_test.rb +23 -7
- data/test/test_helper.rb +70 -0
- metadata +63 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 294ff39fa89db1c6ba4b5d5b19b8fab67b1aec44
|
4
|
+
data.tar.gz: b95de65b899273762c04d225aa85cdbbaa3f91fc
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a330174ff34f16d4456533e874020123e40dff5c7c0ecce1f5efdb6154fbece15e39d20bd60733f272e76f860420663a463fff8d62e553e5462b2f07ddeb4de0
|
7
|
+
data.tar.gz: a5f2c505bd24a19295c904d5ef87fc6201f5a95b980fc083a6fd080316b37c2acc5e290c1bf7881b3830c969dc713b8edd8fa529f82c039167094d24663019cb
|
data/.gitignore
CHANGED
data/Gemfile.lock
CHANGED
data/README.markdown
CHANGED
@@ -10,21 +10,15 @@ Emissão de Boletos Bancários em Ruby.
|
|
10
10
|
|
11
11
|
1. Boleto bancário (apenas os cálculos para o boleto, sem a interface) para os bancos:
|
12
12
|
- Sicoob
|
13
|
-
- Caixa
|
13
|
+
- Caixa (em andamento)
|
14
14
|
2. Arquivo de remessa para os Bancos:
|
15
|
-
- Sicoob (CNAB 240)
|
15
|
+
- Sicoob (CNAB 240 e CNAB400)
|
16
16
|
- Caixa (CNAB 240)
|
17
17
|
3. Arquivo de retorno para os Bancos:
|
18
|
-
- Sicoob (CNAB 240)
|
18
|
+
- Sicoob (CNAB 240 e CNAB400)
|
19
19
|
- Caixa (CNAB 240)
|
20
20
|
|
21
|
-
## Alternativas
|
22
|
-
|
23
|
-
Essa biblioteca é baseada em outras **ótimas** bibliotecas.
|
24
|
-
**Recomendo analisar muito bem cada solução**:
|
25
21
|
|
26
|
-
* Brcobranca [https://github.com/kivanio/brcobranca](https://github.com/kivanio/brcobranca)
|
27
|
-
* Gem de Boleto Bancário [https://github.com/tomas-stefano/boleto_bancario](https://github.com/tomas-stefano/boleto_bancario)
|
28
22
|
|
29
23
|
## Instalação
|
30
24
|
**Manualmente**
|
@@ -76,55 +70,228 @@ Para todos os bancos e carteiras implementadas, **seguimos as documentações**
|
|
76
70
|
<table>
|
77
71
|
<tr>
|
78
72
|
<th>Nome do Banco</th>
|
73
|
+
<th>CNAB</th>
|
79
74
|
<th>Testada/Homologada no banco</th>
|
80
75
|
<th>Autor </th>
|
81
76
|
</tr>
|
82
77
|
<tr>
|
83
78
|
<td>Sicoob</td>
|
79
|
+
<td>240</td>
|
84
80
|
<td>Homologado dia 07/08/2015</td>
|
85
81
|
<td>Bruno M. Mergen</td>
|
86
82
|
</tr>
|
83
|
+
<tr>
|
84
|
+
<td>Sicoob</td>
|
85
|
+
<td>400</td>
|
86
|
+
<td>Pendente</td>
|
87
|
+
<td>Bruno M. Mergen</td>
|
88
|
+
</tr>
|
87
89
|
<tr>
|
88
90
|
<td>Caixa</td>
|
91
|
+
<td>240</td>
|
89
92
|
<td>Pendente</td>
|
90
93
|
<td></td>
|
91
94
|
</tr>
|
92
95
|
</table>
|
93
96
|
|
94
|
-
|
97
|
+
# Como usar
|
95
98
|
|
96
|
-
|
99
|
+
## Começando
|
100
|
+
Em todas as classes desenvolvidas é possível instanciar objetos em forma de `Hash` ou `Block`. Exemplo:
|
101
|
+
```ruby
|
102
|
+
obj1 = BrBoleto::Pagador.new(nome: 'João')
|
103
|
+
obj2 = BrBoleto::Pagador.new do |pagador|
|
104
|
+
pagador.nome = 'João'
|
105
|
+
end
|
106
|
+
```
|
107
|
+
|
108
|
+
As associações também podem ser instanciadas em forma de `Hash`ou `Block`. Exemplo:
|
109
|
+
```ruby
|
110
|
+
boleto1 = BrBoleto::Boleto::Sicoob.new do |boleto|
|
111
|
+
boleto.conta do |ct|
|
112
|
+
ct.agencia = 1234
|
113
|
+
ct.carteira = 1
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
boleto1.conta.agencia
|
118
|
+
# => "1234"
|
97
119
|
|
98
|
-
|
120
|
+
# OU
|
121
|
+
|
122
|
+
boleto2 = BrBoleto::Boleto::Sicoob.new({
|
123
|
+
conta: {
|
124
|
+
agencia: 7465,
|
125
|
+
carteira: 2
|
126
|
+
}
|
127
|
+
}
|
128
|
+
|
129
|
+
boleto2.conta.agencia
|
130
|
+
# => "7465"
|
131
|
+
|
132
|
+
# OU
|
133
|
+
|
134
|
+
conta = BrBoleto::Conta::Sicoob.new(agencia: 4522)
|
135
|
+
boleto2 = BrBoleto::Boleto::Sicoob.new(conta: conta)
|
136
|
+
boleto2.conta.agencia
|
137
|
+
# => "4522"
|
138
|
+
```
|
139
|
+
|
140
|
+
|
141
|
+
### Classes auxiliares
|
142
|
+
Devido a falta de padronização de regras e nomenclaturas entre os banco, essa gem é composta por classes auxiliares para conseguir manter o minimo de padronização com sua utilização e nomenclaturas.
|
143
|
+
|
144
|
+
#### Conta
|
145
|
+
Para gerar **boletos** e **remessas** é necessário de uma conta bancária, certo? Pensando nisso foi criado uma classe onde contém todas as regras e informações referente a conta bancária. Existe uma classe para cada banco desenvolvido. **Vejamos um exemplo com o banco Sicoob:**
|
146
|
+
```ruby
|
147
|
+
conta = BrBoleto::Conta::Sicoob.new({
|
148
|
+
codigo_beneficiario: '253167',
|
149
|
+
codigo_beneficiario_dv: '4', # Se não passar o dv irá gerar automaticamente
|
150
|
+
conta_corrente: '887469',
|
151
|
+
conta_corrente_dv: '7', # Se não passar o dv irá gerar automaticamente
|
152
|
+
agencia: '3069',
|
153
|
+
carteira: '1',
|
154
|
+
modalidade: '02' ,
|
155
|
+
razao_social: 'Razao Social emitente',
|
156
|
+
cpf_cnpj: '98137264000196',
|
157
|
+
endereco: 'Rua nome da rua, 9999',
|
158
|
+
})
|
159
|
+
|
160
|
+
```
|
161
|
+
|
162
|
+
#### Pagador
|
163
|
+
O pagador é o "cliente" que vai pagar o boleto/cobrança. É utilizado no boleto e no Pagamento da remessa.
|
164
|
+
```ruby
|
165
|
+
pagador = BrBoleto::Pagador.new do
|
166
|
+
nome = 'João da Silva'
|
167
|
+
cpf_cnpj = '33.669.170/0001-12' # Gerado pelo gerador de cnpj
|
168
|
+
endereco = 'RUA DO PAGADOR'
|
169
|
+
bairro = 'Bairro do pagador'
|
170
|
+
cep = '89885-000'
|
171
|
+
cidade = 'Chapecó'
|
172
|
+
uf = 'SC'
|
173
|
+
nome_avalista = 'Maria avalista'
|
174
|
+
documento_avalista = '840.106.990-43' # Gerado pelo gerador de CPF
|
175
|
+
end
|
176
|
+
```
|
177
|
+
|
178
|
+
#### Pagamento
|
179
|
+
É utilizado apenas para gerar remessas. Cada pagamento representa 1 boleto (por exemplo). Exemplo:
|
180
|
+
|
181
|
+
```ruby
|
182
|
+
pagamento = BrBoleto::Remessa::Pagamento.new({
|
183
|
+
nosso_numero: "123456",
|
184
|
+
numero_documento: "977897",
|
185
|
+
data_vencimento: Date.tomorrow,
|
186
|
+
valor_documento: 100.12,
|
187
|
+
pagador: {
|
188
|
+
nome: 'João da Silva',
|
189
|
+
cpf_cnpj: '33.669.170/0001-12', # Gerado pelo gerador de pdf online
|
190
|
+
# ....
|
191
|
+
},
|
192
|
+
data_emissao: Date.today, # Valor default
|
193
|
+
valor_mora: 0.0, # Valor default
|
194
|
+
valor_desconto: 0.0, # Valor default
|
195
|
+
valor_iof: 0.0, # Valor default
|
196
|
+
valor_abatimento: 0.0, # Valor default
|
197
|
+
cod_desconto: '0', # Valor default
|
198
|
+
desconto_2_codigo: '0', # Valor default
|
199
|
+
desconto_2_valor: 0.0, # Valor default
|
200
|
+
desconto_3_codigo: '0', # Valor default
|
201
|
+
desconto_3_valor: 0.0, # Valor default
|
202
|
+
codigo_multa: '3', # Valor default
|
203
|
+
codigo_juros: '3', # Valor default
|
204
|
+
valor_multa: 0.0, # Valor default
|
205
|
+
valor_juros: 0.0, # Valor default
|
206
|
+
parcela: '1', # Valor default
|
207
|
+
tipo_impressao: '1', # Valor default
|
208
|
+
tipo_emissao: '2', # Valor default
|
209
|
+
identificacao_ocorrencia: '01', # Valor default
|
210
|
+
especie_titulo: '01', # Valor default
|
211
|
+
codigo_moeda: '9', # Valor default
|
212
|
+
forma_cadastramento: '0', # Valor default
|
213
|
+
emissao_boleto: '2', # Valor default
|
214
|
+
distribuicao_boleto: '2', # Valor default
|
215
|
+
})
|
216
|
+
```
|
217
|
+
|
218
|
+
## Sobrescrevendo classes e validações
|
219
|
+
|
220
|
+
Você pode usar as próprias classes da gem, porém, **recomendo criar uma subclasse** para os bancos que você gostaria de desenvolver. Com isso também é possível sobrescrever validações e métodos da gem. (*Isso pode ser útil caso precise tratar alguma particularidade*)
|
221
|
+
|
222
|
+
##### **Exemplo:**
|
99
223
|
|
100
224
|
```ruby
|
101
225
|
class BoletoSicoob < BrBoleto::Boleto::Sicoob
|
226
|
+
def default_values
|
227
|
+
{
|
228
|
+
local_pagamento: 'PREFERENCIALMENTE NA EMPRESA XXXXX',
|
229
|
+
aceite: true
|
230
|
+
}
|
231
|
+
end
|
102
232
|
end
|
103
233
|
|
234
|
+
boleto = BoletoSicoob.new()
|
235
|
+
boleto.aceite # true
|
236
|
+
boleto.local_pagamento # PREFERENCIALMENTE NA EMPRESA XXXXX
|
237
|
+
```
|
238
|
+
|
239
|
+
Você pode também sobrescrever a `class` da conta, mas para isso será necessário sobrescrever um método na `class` do boleto para que funcione adequadamente:
|
240
|
+
```ruby
|
241
|
+
class MinhaContaSicoob < BrBoleto::Conta::Sicoob
|
242
|
+
# Suas regras aqui
|
243
|
+
end
|
244
|
+
class MeuBoletoSicoob < BrBoleto::Boleto::Sicoob
|
245
|
+
def conta_class
|
246
|
+
MinhaContaSicoob # Sem isso sua conta personalizada não vai funcioanr
|
247
|
+
end
|
248
|
+
end
|
249
|
+
|
250
|
+
boleto = MeuBoletoSicoob.new
|
251
|
+
boleto.conta.class
|
252
|
+
# => MinhaContaSicoob
|
253
|
+
```
|
254
|
+
|
255
|
+
Você pode sobrescrever os comportamentos na subclasse.
|
256
|
+
Por exemplo, imagine que você quer sobrescrever a forma como é tratada a segunda parte do código de barras.
|
257
|
+
**Seguindo a interface da classe BrBoleto::Boleto::Base** fica bem simples:
|
258
|
+
|
259
|
+
```ruby
|
260
|
+
class BoletoSicoob < BrBoleto::Boleto::Sicoob
|
261
|
+
def codigo_de_barras_do_banco
|
262
|
+
# Sua implementação ...
|
263
|
+
end
|
264
|
+
end
|
104
265
|
```
|
105
266
|
|
106
267
|
### Criando os boletos / Validações
|
107
268
|
|
108
|
-
Agora você pode emitir um boleto, **usando a classe criada no exemplo
|
269
|
+
Agora você pode emitir um boleto, **usando a classe criada no exemplo anterior**:
|
109
270
|
|
110
271
|
```ruby
|
111
|
-
BoletoSicoob.new(agencia: '3195', codigo_cedente: '6532',
|
272
|
+
BoletoSicoob.new(conta: {agencia: '3195', codigo_cedente: '6532', carteira: '1'}, numero_documento: '1101', valor_documento: 105.78)
|
112
273
|
```
|
113
274
|
|
114
275
|
Você pode usar blocos se quiser:
|
115
276
|
|
116
277
|
```ruby
|
117
278
|
boleto_sicoob = BoletoSicoob.new do |boleto|
|
118
|
-
boleto.
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
279
|
+
boleto.conta = {
|
280
|
+
agencia: '0097',
|
281
|
+
carteira: '1',
|
282
|
+
modalidade: '01',
|
283
|
+
razao_social: 'Razao Social da Empresa',
|
284
|
+
codigo_cedente: '90901',
|
285
|
+
endereco: 'Rua nome da rua, 9999',
|
286
|
+
cpf_cnpj: '98137264000196', # Gerado pelo gerador de cnpj
|
287
|
+
}
|
288
|
+
boleto.pagador do |pag|
|
289
|
+
pag.nome = 'Nome do Sacado'
|
290
|
+
pag.cpf_cnpj = '35433793990'
|
291
|
+
end
|
123
292
|
boleto.numero_documento = '12345678'
|
124
|
-
boleto.sacado = 'Nome do Sacado'
|
125
|
-
boleto.documento_sacado = '35433793990'
|
126
293
|
boleto.data_vencimento = Date.tomorrow
|
127
|
-
boleto.valor_documento =
|
294
|
+
boleto.valor_documento = 31_678.99
|
128
295
|
end
|
129
296
|
```
|
130
297
|
|
@@ -152,9 +319,9 @@ boleto_sicoob.linha_digitavel
|
|
152
319
|
|
153
320
|
boleto_sicoob.nosso_numero
|
154
321
|
|
155
|
-
boleto_sicoob.agencia_codigo_cedente
|
322
|
+
boleto_sicoob.conta.agencia_codigo_cedente
|
156
323
|
|
157
|
-
boleto_sicoob.carteira_formatada # Formata a carteira, para mostrar no boleto.
|
324
|
+
boleto_sicoob.conta.carteira_formatada # Formata a carteira, para mostrar no boleto.
|
158
325
|
|
159
326
|
boleto_sicoob.numero_documento
|
160
327
|
|
@@ -165,23 +332,9 @@ boleto_sicoob.especie
|
|
165
332
|
boleto_sicoob.especie_documento
|
166
333
|
```
|
167
334
|
|
168
|
-
## Sobrescrevendo comportamentos
|
169
|
-
|
170
|
-
Você pode sobrescrever os comportamentos na subclasse.
|
171
|
-
|
172
|
-
Por exemplo, imagine que você quer sobrescrever a forma como é tratada a segunda parte do código de barras.
|
173
|
-
**Seguindo a interface da classe BrBoleto::Boleto** fica bem simples:
|
174
|
-
|
175
|
-
```ruby
|
176
|
-
class BoletoSicoob < BrBoleto::Boleto::Sicoob
|
177
|
-
def codigo_de_barras_do_banco
|
178
|
-
# Sua implementação ...
|
179
|
-
end
|
180
|
-
end
|
181
|
-
```
|
182
335
|
#**Arquivo de remessa**
|
183
336
|
|
184
|
-
|
337
|
+
## **CNAB 240**
|
185
338
|
Um arquivo de remessa é composto de UM ou VÁRIOS lotes (class BrBoleto::Remessa::Lote).
|
186
339
|
Estes lotes são compostos de UM ou VÁRIOS pagamentos (class BrBoleto::Remessa::Pagamento).
|
187
340
|
|
@@ -191,18 +344,26 @@ Com isso, deve-se instanciar um lote passando os dois pagamentos instanciados. E
|
|
191
344
|
Exemplo:
|
192
345
|
```ruby
|
193
346
|
boleto_1 = BrBoleto::Boleto::Sicoob.new({
|
194
|
-
|
195
|
-
|
347
|
+
conta: {
|
348
|
+
agencia: 3069,
|
349
|
+
codigo_cedente: 6532,
|
350
|
+
carteira: 1,
|
351
|
+
conta_corrente: '5679',
|
352
|
+
razao_social: 'Cedente 1',
|
353
|
+
cpf_cnpj: '12345678901',
|
354
|
+
},
|
355
|
+
pagador: {
|
356
|
+
nome: 'Sacado',
|
357
|
+
cpf_cnpj: '725.275.005-10',
|
358
|
+
endereco: 'Rua teste, 23045',
|
359
|
+
bairro: 'Centro',
|
360
|
+
cep: '89804-457',
|
361
|
+
cidade: 'Chapecó',
|
362
|
+
uf: 'SC'
|
363
|
+
},
|
196
364
|
numero_documento: 10001,
|
197
|
-
carteira: 1,
|
198
365
|
valor_documento: 100.78,
|
199
|
-
data_vencimento: Date.tomorrow,
|
200
|
-
conta_corrente: '5679',
|
201
|
-
cedente: 'Cedente 1',
|
202
|
-
documento_cedente:'12345678901',
|
203
|
-
sacado: 'Sacado',
|
204
|
-
documento_sacado: '725.275.005-10',
|
205
|
-
endereco_sacado: 'Rua teste, 23045',
|
366
|
+
data_vencimento: Date.tomorrow,
|
206
367
|
instrucoes1: 'Lembrar de algo 1',
|
207
368
|
instrucoes2: 'Lembrar de algo 2',
|
208
369
|
instrucoes3: 'Lembrar de algo 3',
|
@@ -212,18 +373,26 @@ boleto_1 = BrBoleto::Boleto::Sicoob.new({
|
|
212
373
|
})
|
213
374
|
|
214
375
|
boleto_2 = BrBoleto::Boleto::Sicoob.new({
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
376
|
+
conta: {
|
377
|
+
agencia: 3069,
|
378
|
+
codigo_cedente: 6532,
|
379
|
+
carteira: 1,
|
380
|
+
conta_corrente: '5679',
|
381
|
+
razao_social: 'Cedente 1',
|
382
|
+
cpf_cnpj: '12345678901',
|
383
|
+
},
|
384
|
+
pagador: {
|
385
|
+
nome: 'Sacado 2',
|
386
|
+
cpf_cnpj: '725.275.005-10',
|
387
|
+
endereco: 'Rua teste, 648',
|
388
|
+
bairro: 'Centro',
|
389
|
+
cep: '89804-301',
|
390
|
+
cidade: 'Xaxim',
|
391
|
+
uf: 'SC'
|
392
|
+
},
|
219
393
|
valor_documento: 200.78,
|
220
394
|
data_vencimento: Date.tomorrow,
|
221
|
-
|
222
|
-
cedente: 'Cedente 2',
|
223
|
-
documento_cedente:'12345678901',
|
224
|
-
sacado: 'Sacado',
|
225
|
-
documento_sacado: '725.275.005-10',
|
226
|
-
endereco_sacado: 'Rua teste, 23045',
|
395
|
+
numero_documento: 10002,
|
227
396
|
instrucoes1: 'Lembrar de algo 1',
|
228
397
|
instrucoes2: 'Lembrar de algo 2',
|
229
398
|
instrucoes3: 'Lembrar de algo 3',
|
@@ -237,44 +406,30 @@ pagamento_1 = BrBoleto::Remessa::Pagamento.new({
|
|
237
406
|
nosso_numero: boleto_1.nosso_numero,
|
238
407
|
data_vencimento: boleto_1.data_vencimento,
|
239
408
|
valor_documento: boleto_1.valor_documento,
|
240
|
-
|
241
|
-
nome_sacado: boleto_1.sacado,
|
242
|
-
endereco_sacado: "R. TESTE DO SACADO",
|
243
|
-
cep_sacado: "89888000",
|
244
|
-
cidade_sacado: "PIRÁPORA",
|
245
|
-
uf_sacado: "SC",
|
246
|
-
bairro_sacado: "Bairro"
|
409
|
+
pagador: boleto_1.pagador
|
247
410
|
})
|
248
411
|
|
249
412
|
pagamento_2 = BrBoleto::Remessa::Pagamento.new({
|
250
413
|
nosso_numero: boleto_2.nosso_numero,
|
251
414
|
data_vencimento: boleto_2.data_vencimento,
|
252
415
|
valor_documento: boleto_2.valor_documento,
|
253
|
-
|
254
|
-
nome_sacado: boleto_2.sacado,
|
255
|
-
endereco_sacado: "R. TESTE DO SACADO",
|
256
|
-
cep_sacado: "89888000",
|
257
|
-
cidade_sacado: "PIRÁPORA",
|
258
|
-
uf_sacado: "SC",
|
259
|
-
bairro_sacado: "Bairro"
|
416
|
+
pagador: boleto_2.pagador
|
260
417
|
})
|
261
418
|
|
262
419
|
|
263
420
|
lote = BrBoleto::Remessa::Lote.new(pagamentos: [pagamento_1, pagamento_2])
|
264
421
|
|
265
422
|
remessa = BrBoleto::Remessa::Cnab240::Sicoob.new({
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
distribuicao_boleto: '2',
|
277
|
-
especie_titulo: '02'
|
423
|
+
conta: {
|
424
|
+
agencia: 3069,
|
425
|
+
codigo_cedente: 6532,
|
426
|
+
carteira: 1,
|
427
|
+
conta_corrente: '5679',
|
428
|
+
razao_social: 'Cedente 1',
|
429
|
+
cpf_cnpj: '12345678901',
|
430
|
+
},
|
431
|
+
lotes: lote,
|
432
|
+
sequencial_remessa: 1
|
278
433
|
})
|
279
434
|
|
280
435
|
|
@@ -325,20 +480,45 @@ lotes << BrBoleto::Remessa::Lote.new(pagamentos: pagamento_2)
|
|
325
480
|
|
326
481
|
remessa = BrBoleto::Remessa::Cnab240::Sicoob.new({
|
327
482
|
lotes: lotes,
|
328
|
-
|
329
|
-
|
330
|
-
|
331
|
-
|
332
|
-
|
333
|
-
|
334
|
-
|
335
|
-
|
336
|
-
|
337
|
-
distribuicao_boleto: '2',
|
338
|
-
especie_titulo: '02'
|
483
|
+
conta: {
|
484
|
+
agencia: 3069,
|
485
|
+
codigo_cedente: 6532,
|
486
|
+
carteira: 1,
|
487
|
+
conta_corrente: '5679',
|
488
|
+
razao_social: 'Cedente 1',
|
489
|
+
cpf_cnpj: '12345678901',
|
490
|
+
},
|
491
|
+
sequencial_remessa: 2
|
339
492
|
})
|
340
493
|
```
|
494
|
+
##**CNAB 400**
|
495
|
+
O CNAB400 é composto por 1 ou vários pagamentos. A diferença de utilização entre o CNAB 240 e o 400 é que no 400 não existe lotes, apenas pagamentos. Exemplo:
|
496
|
+
|
497
|
+
```ruby
|
498
|
+
|
499
|
+
remessa = BrBoleto::Remessa::Cnab400::Sicoob.new do |rem|
|
500
|
+
rem.conta = {
|
501
|
+
agencia: 3069,
|
502
|
+
codigo_cedente: 6532,
|
503
|
+
carteira: 1,
|
504
|
+
conta_corrente: '5679',
|
505
|
+
razao_social: 'Cedente 1',
|
506
|
+
cpf_cnpj: '12345678901',
|
507
|
+
}
|
508
|
+
pagamentos = [pagamento1, pagamento2]
|
509
|
+
sequencial_remessa = 5
|
510
|
+
end
|
511
|
+
```
|
512
|
+
|
513
|
+
## Alternativas
|
514
|
+
|
515
|
+
Essa biblioteca é baseada em outras **ótimas** bibliotecas.
|
516
|
+
**Recomendo analisar muito bem cada solução**:
|
517
|
+
|
518
|
+
* Brcobranca [https://github.com/kivanio/brcobranca](https://github.com/kivanio/brcobranca)
|
519
|
+
* Gem de Boleto Bancário [https://github.com/tomas-stefano/boleto_bancario](https://github.com/tomas-stefano/boleto_bancario)
|
341
520
|
|
521
|
+
|
342
522
|
## Contribuições
|
343
523
|
|
344
524
|
Seja um contribuidor. Você pode contribuir de N formas. Seguem elas:
|
@@ -352,5 +532,5 @@ Seja um contribuidor. Você pode contribuir de N formas. Seguem elas:
|
|
352
532
|
|
353
533
|
## Licença
|
354
534
|
|
355
|
-
-
|
356
|
-
- Copyleft
|
535
|
+
- MIT
|
536
|
+
- Copyleft 2016 Bruno M. Mergen
|
data/br_boleto.gemspec
CHANGED
@@ -12,9 +12,11 @@ Gem::Specification.new do |gem|
|
|
12
12
|
|
13
13
|
gem.homepage = "https://github.com/Brunomm/br_boleto"
|
14
14
|
|
15
|
-
gem.files = `git ls-files`.split(
|
16
|
-
|
17
|
-
|
15
|
+
gem.files = `git ls-files`.split("\n").reject{|fil|
|
16
|
+
fil.include?('documentacoes_boletos/')
|
17
|
+
}
|
18
|
+
gem.test_files = `git ls-files -- test`.split("\n")
|
19
|
+
# gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
18
20
|
gem.require_paths = ["lib"]
|
19
21
|
|
20
22
|
gem.required_ruby_version = '~> 2.1'
|
@@ -0,0 +1,109 @@
|
|
1
|
+
module BrBoleto
|
2
|
+
module HaveConta
|
3
|
+
extend ActiveSupport::Concern
|
4
|
+
|
5
|
+
included do
|
6
|
+
validate :conta_validations
|
7
|
+
end
|
8
|
+
|
9
|
+
def conta
|
10
|
+
yield conta if block_given?
|
11
|
+
get_conta
|
12
|
+
end
|
13
|
+
|
14
|
+
def conta=(value)
|
15
|
+
if value.is_a?(conta_class) || value.nil?
|
16
|
+
@conta = value
|
17
|
+
elsif value.is_a?(Hash)
|
18
|
+
conta.assign_attributes(value)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def conta_class
|
23
|
+
raise NotImplementedError.new("Not implemented #conta_class in #{self}.")
|
24
|
+
end
|
25
|
+
|
26
|
+
private
|
27
|
+
|
28
|
+
def get_conta
|
29
|
+
@conta.is_a?(conta_class) ? @conta : @conta = conta_class.new()
|
30
|
+
set_regras_tamanho_e_validations!
|
31
|
+
@conta
|
32
|
+
end
|
33
|
+
|
34
|
+
####################### VALIDAÇÔES DA CONTA #######################
|
35
|
+
# Devem ser sobrescrita a cada classe que utilizar, pois pode variar
|
36
|
+
def valid_conta_corrente_length; end
|
37
|
+
def valid_conta_corrente_minimum; end
|
38
|
+
def valid_conta_corrente_maximum; end
|
39
|
+
def valid_conta_corrente_required; end
|
40
|
+
def valid_modalidade_length; end
|
41
|
+
def valid_modalidade_minimum; end
|
42
|
+
def valid_modalidade_maximum; end
|
43
|
+
def valid_modalidade_required; end
|
44
|
+
def valid_codigo_cedente_length; end
|
45
|
+
def valid_codigo_cedente_minimum; end
|
46
|
+
def valid_codigo_cedente_maximum; end
|
47
|
+
def valid_codigo_cedente_required; end
|
48
|
+
def valid_codigo_cedente_inclusion; end
|
49
|
+
def valid_endereco_required; end
|
50
|
+
def valid_carteira_length; end
|
51
|
+
def valid_carteira_minimum; end
|
52
|
+
def valid_carteira_maximum; end
|
53
|
+
def valid_carteira_required; end
|
54
|
+
def valid_convenio_length; end
|
55
|
+
def valid_convenio_minimum; end
|
56
|
+
def valid_convenio_maximum; end
|
57
|
+
def valid_convenio_required; end
|
58
|
+
def valid_modalidade_inclusion; end
|
59
|
+
def valid_carteira_inclusion; end
|
60
|
+
def valid_convenio_inclusion; end
|
61
|
+
def valid_versao_aplicativo_required; end # Banco da Caixa
|
62
|
+
|
63
|
+
def set_regras_tamanho_e_validations!
|
64
|
+
@conta ||= conta_class.new()
|
65
|
+
@conta.valid_conta_corrente_length = valid_conta_corrente_length if "#{valid_conta_corrente_length}".present?
|
66
|
+
@conta.valid_conta_corrente_minimum = valid_conta_corrente_minimum if "#{valid_conta_corrente_minimum}".present?
|
67
|
+
@conta.valid_conta_corrente_maximum = valid_conta_corrente_maximum if "#{valid_conta_corrente_maximum}".present?
|
68
|
+
@conta.valid_conta_corrente_required = valid_conta_corrente_required if "#{valid_conta_corrente_required}".present?
|
69
|
+
|
70
|
+
@conta.valid_modalidade_length = valid_modalidade_length if "#{valid_modalidade_length}".present?
|
71
|
+
@conta.valid_modalidade_minimum = valid_modalidade_minimum if "#{valid_modalidade_minimum}".present?
|
72
|
+
@conta.valid_modalidade_maximum = valid_modalidade_maximum if "#{valid_modalidade_maximum}".present?
|
73
|
+
@conta.valid_modalidade_required = valid_modalidade_required if "#{valid_modalidade_required}".present?
|
74
|
+
@conta.valid_modalidade_inclusion = valid_modalidade_inclusion if "#{valid_modalidade_inclusion}".present?
|
75
|
+
|
76
|
+
@conta.valid_endereco_required = valid_endereco_required if "#{valid_endereco_required}".present?
|
77
|
+
|
78
|
+
@conta.valid_carteira_length = valid_carteira_length if "#{valid_carteira_length}".present?
|
79
|
+
@conta.valid_carteira_minimum = valid_carteira_minimum if "#{valid_carteira_minimum}".present?
|
80
|
+
@conta.valid_carteira_maximum = valid_carteira_maximum if "#{valid_carteira_maximum}".present?
|
81
|
+
@conta.valid_carteira_required = valid_carteira_required if "#{valid_carteira_required}".present?
|
82
|
+
@conta.valid_carteira_inclusion = valid_carteira_inclusion if "#{valid_carteira_inclusion}".present?
|
83
|
+
|
84
|
+
# Se tiver alguma validação setada em convênio é o que deve prevalecer
|
85
|
+
@conta.valid_codigo_cedente_length = valid_codigo_cedente_length if "#{valid_codigo_cedente_length}".present?
|
86
|
+
@conta.valid_codigo_cedente_minimum = valid_codigo_cedente_minimum if "#{valid_codigo_cedente_minimum}".present?
|
87
|
+
@conta.valid_codigo_cedente_maximum = valid_codigo_cedente_maximum if "#{valid_codigo_cedente_maximum}".present?
|
88
|
+
@conta.valid_codigo_cedente_required = valid_codigo_cedente_required if "#{valid_codigo_cedente_required}".present?
|
89
|
+
@conta.valid_codigo_cedente_inclusion = valid_codigo_cedente_inclusion if "#{valid_codigo_cedente_inclusion}".present?
|
90
|
+
|
91
|
+
@conta.valid_convenio_length = valid_convenio_length if "#{valid_convenio_length}".present?
|
92
|
+
@conta.valid_convenio_minimum = valid_convenio_minimum if "#{valid_convenio_minimum}".present?
|
93
|
+
@conta.valid_convenio_maximum = valid_convenio_maximum if "#{valid_convenio_maximum}".present?
|
94
|
+
@conta.valid_convenio_required = valid_convenio_required if "#{valid_convenio_required}".present?
|
95
|
+
@conta.valid_convenio_inclusion = valid_convenio_inclusion if "#{valid_convenio_inclusion}".present?
|
96
|
+
|
97
|
+
@conta.valid_versao_aplicativo_required = valid_versao_aplicativo_required if "#{valid_versao_aplicativo_required}".present?
|
98
|
+
end
|
99
|
+
|
100
|
+
def conta_validations
|
101
|
+
set_regras_tamanho_e_validations!
|
102
|
+
if conta.invalid?
|
103
|
+
conta.errors.full_messages.each do |msg|
|
104
|
+
errors.add(:base, msg)
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|