brcobranca_sicredi_400 1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/CHANGELOG.md +3 -0
- data/LICENSE +20 -0
- data/README.md +91 -0
- data/Rakefile +8 -0
- data/lib/brcobranca/arquivos/logos/ailos.eps +412 -0
- data/lib/brcobranca/arquivos/logos/ailos_carne.eps +412 -0
- data/lib/brcobranca/arquivos/logos/bancobrasil.eps +5402 -0
- data/lib/brcobranca/arquivos/logos/bancobrasil_carne.eps +5410 -0
- data/lib/brcobranca/arquivos/logos/bancobrasilia.eps +0 -0
- data/lib/brcobranca/arquivos/logos/bancobrasilia_carne.eps +0 -0
- data/lib/brcobranca/arquivos/logos/banconordeste.eps +0 -0
- data/lib/brcobranca/arquivos/logos/banconordeste_carne.eps +0 -0
- data/lib/brcobranca/arquivos/logos/banestes.eps +5198 -0
- data/lib/brcobranca/arquivos/logos/banestes_carne.eps +5206 -0
- data/lib/brcobranca/arquivos/logos/banrisul.eps +121 -0
- data/lib/brcobranca/arquivos/logos/banrisul_carne.eps +121 -0
- data/lib/brcobranca/arquivos/logos/bradesco.eps +5210 -0
- data/lib/brcobranca/arquivos/logos/bradesco_carne.eps +5214 -0
- data/lib/brcobranca/arquivos/logos/caixa.eps +5111 -0
- data/lib/brcobranca/arquivos/logos/caixa_carne.eps +5115 -0
- data/lib/brcobranca/arquivos/logos/cecred.eps +0 -0
- data/lib/brcobranca/arquivos/logos/cecred_carne.eps +0 -0
- data/lib/brcobranca/arquivos/logos/citibank.eps +745 -0
- data/lib/brcobranca/arquivos/logos/citibank_carne.eps +745 -0
- data/lib/brcobranca/arquivos/logos/credisis.eps +0 -0
- data/lib/brcobranca/arquivos/logos/credisis_carne.eps +0 -0
- data/lib/brcobranca/arquivos/logos/hsbc.eps +5124 -0
- data/lib/brcobranca/arquivos/logos/hsbc_carne.eps +5128 -0
- data/lib/brcobranca/arquivos/logos/itau.eps +5318 -0
- data/lib/brcobranca/arquivos/logos/itau_carne.eps +5322 -0
- data/lib/brcobranca/arquivos/logos/safra.eps +0 -0
- data/lib/brcobranca/arquivos/logos/safra_carne.eps +0 -0
- data/lib/brcobranca/arquivos/logos/santander.eps +5305 -0
- data/lib/brcobranca/arquivos/logos/santander_carne.eps +5313 -0
- data/lib/brcobranca/arquivos/logos/sicoob.eps +5375 -0
- data/lib/brcobranca/arquivos/logos/sicoob_carne.eps +5379 -0
- data/lib/brcobranca/arquivos/logos/sicredi.eps +5379 -0
- data/lib/brcobranca/arquivos/logos/sicredi_carne.eps +5383 -0
- data/lib/brcobranca/arquivos/logos/unicred.eps +0 -0
- data/lib/brcobranca/arquivos/logos/unicred_carne.eps +0 -0
- data/lib/brcobranca/arquivos/templates/modelo_carne.eps +1112 -0
- data/lib/brcobranca/arquivos/templates/modelo_generico.eps +0 -0
- data/lib/brcobranca/arquivos/templates/modelo_generico2.eps +9967 -0
- data/lib/brcobranca/boleto/ailos.rb +89 -0
- data/lib/brcobranca/boleto/banco_brasil.rb +165 -0
- data/lib/brcobranca/boleto/banco_brasilia.rb +102 -0
- data/lib/brcobranca/boleto/banco_nordeste.rb +80 -0
- data/lib/brcobranca/boleto/banestes.rb +86 -0
- data/lib/brcobranca/boleto/banrisul.rb +95 -0
- data/lib/brcobranca/boleto/base.rb +256 -0
- data/lib/brcobranca/boleto/bradesco.rb +100 -0
- data/lib/brcobranca/boleto/caixa.rb +123 -0
- data/lib/brcobranca/boleto/citibank.rb +97 -0
- data/lib/brcobranca/boleto/credisis.rb +118 -0
- data/lib/brcobranca/boleto/hsbc.rb +96 -0
- data/lib/brcobranca/boleto/itau.rb +138 -0
- data/lib/brcobranca/boleto/safra.rb +152 -0
- data/lib/brcobranca/boleto/santander.rb +86 -0
- data/lib/brcobranca/boleto/sicoob.rb +120 -0
- data/lib/brcobranca/boleto/sicredi.rb +145 -0
- data/lib/brcobranca/boleto/template/base.rb +28 -0
- data/lib/brcobranca/boleto/template/rghost.rb +308 -0
- data/lib/brcobranca/boleto/template/rghost2.rb +264 -0
- data/lib/brcobranca/boleto/template/rghost_bolepix.rb +286 -0
- data/lib/brcobranca/boleto/template/rghost_carne.rb +319 -0
- data/lib/brcobranca/boleto/unicred.rb +99 -0
- data/lib/brcobranca/calculo.rb +120 -0
- data/lib/brcobranca/calculo_data.rb +63 -0
- data/lib/brcobranca/currency.rb +69 -0
- data/lib/brcobranca/formatacao.rb +104 -0
- data/lib/brcobranca/formatacao_string.rb +37 -0
- data/lib/brcobranca/limpeza.rb +20 -0
- data/lib/brcobranca/remessa/base.rb +72 -0
- data/lib/brcobranca/remessa/cnab240/ailos.rb +156 -0
- data/lib/brcobranca/remessa/cnab240/banco_brasil.rb +249 -0
- data/lib/brcobranca/remessa/cnab240/base.rb +529 -0
- data/lib/brcobranca/remessa/cnab240/base_correspondente.rb +307 -0
- data/lib/brcobranca/remessa/cnab240/caixa.rb +171 -0
- data/lib/brcobranca/remessa/cnab240/santander.rb +225 -0
- data/lib/brcobranca/remessa/cnab240/sicoob.rb +229 -0
- data/lib/brcobranca/remessa/cnab240/sicoob_banco_brasil.rb +101 -0
- data/lib/brcobranca/remessa/cnab240/sicredi.rb +183 -0
- data/lib/brcobranca/remessa/cnab240/unicred.rb +10 -0
- data/lib/brcobranca/remessa/cnab400/banco_brasil.rb +169 -0
- data/lib/brcobranca/remessa/cnab400/banco_brasilia.rb +167 -0
- data/lib/brcobranca/remessa/cnab400/banco_nordeste.rb +161 -0
- data/lib/brcobranca/remessa/cnab400/banrisul.rb +158 -0
- data/lib/brcobranca/remessa/cnab400/base.rb +132 -0
- data/lib/brcobranca/remessa/cnab400/bradesco.rb +155 -0
- data/lib/brcobranca/remessa/cnab400/citibank.rb +139 -0
- data/lib/brcobranca/remessa/cnab400/credisis.rb +130 -0
- data/lib/brcobranca/remessa/cnab400/itau.rb +162 -0
- data/lib/brcobranca/remessa/cnab400/santander.rb +233 -0
- data/lib/brcobranca/remessa/cnab400/sicoob.rb +305 -0
- data/lib/brcobranca/remessa/cnab400/sicredi.rb +117 -0
- data/lib/brcobranca/remessa/cnab400/unicred.rb +259 -0
- data/lib/brcobranca/remessa/pagamento.rb +320 -0
- data/lib/brcobranca/retorno/base.rb +11 -0
- data/lib/brcobranca/retorno/cnab240/ailos.rb +104 -0
- data/lib/brcobranca/retorno/cnab240/base.rb +41 -0
- data/lib/brcobranca/retorno/cnab240/caixa.rb +47 -0
- data/lib/brcobranca/retorno/cnab240/santander.rb +99 -0
- data/lib/brcobranca/retorno/cnab240/sicoob.rb +101 -0
- data/lib/brcobranca/retorno/cnab240/sicredi.rb +82 -0
- data/lib/brcobranca/retorno/cnab400/banco_brasil.rb +130 -0
- data/lib/brcobranca/retorno/cnab400/banco_brasilia.rb +90 -0
- data/lib/brcobranca/retorno/cnab400/banco_nordeste.rb +113 -0
- data/lib/brcobranca/retorno/cnab400/banrisul.rb +42 -0
- data/lib/brcobranca/retorno/cnab400/base.rb +53 -0
- data/lib/brcobranca/retorno/cnab400/bradesco.rb +124 -0
- data/lib/brcobranca/retorno/cnab400/credisis.rb +116 -0
- data/lib/brcobranca/retorno/cnab400/itau.rb +144 -0
- data/lib/brcobranca/retorno/cnab400/santander.rb +58 -0
- data/lib/brcobranca/retorno/cnab400/sicredi.rb +78 -0
- data/lib/brcobranca/retorno/cnab400/unicred.rb +123 -0
- data/lib/brcobranca/retorno/retorno_cbr643.rb +48 -0
- data/lib/brcobranca/retorno/retorno_cnab240.rb +99 -0
- data/lib/brcobranca/retorno/retorno_cnab400.rb +71 -0
- data/lib/brcobranca/util/date.rb +21 -0
- data/lib/brcobranca/util/empresa.rb +29 -0
- data/lib/brcobranca/util/errors.rb +76 -0
- data/lib/brcobranca/validations.rb +208 -0
- data/lib/brcobranca/version.rb +5 -0
- data/lib/brcobranca.rb +200 -0
- metadata +225 -0
@@ -0,0 +1,104 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
#
|
4
|
+
# @author Kivanio Barbosa
|
5
|
+
module Brcobranca
|
6
|
+
# Métodos auxiliares de formatação
|
7
|
+
module Formatacao
|
8
|
+
# Formata como CPF
|
9
|
+
#
|
10
|
+
# @return [String]
|
11
|
+
# @example
|
12
|
+
# "12345678901".to_br_cpf #=> 123.456.789-01
|
13
|
+
def to_br_cpf
|
14
|
+
somente_numeros.gsub(/^(.{3})(.{3})(.{3})(.{2})$/, '\1.\2.\3-\4')
|
15
|
+
end
|
16
|
+
|
17
|
+
# Formata como CEP
|
18
|
+
#
|
19
|
+
# @return [String]
|
20
|
+
# @example
|
21
|
+
# "85253100".to_br_cep #=> "85253-100"
|
22
|
+
# 85253100.to_br_cep #=> "85253-100"
|
23
|
+
def to_br_cep
|
24
|
+
somente_numeros.gsub(/^(.{5})(.{3})$/, '\1-\2')
|
25
|
+
end
|
26
|
+
|
27
|
+
# Formata como CNPJ
|
28
|
+
#
|
29
|
+
# @return [String]
|
30
|
+
# @example
|
31
|
+
# "12345678000901".to_br_cnpj #=> 12.345.678/0009-01
|
32
|
+
def to_br_cnpj
|
33
|
+
somente_numeros.gsub(/^(.{2})(.{3})(.{3})(.{4})(.{2})$/, '\1.\2.\3/\4-\5')
|
34
|
+
end
|
35
|
+
|
36
|
+
# Gera formatação automática do documento baseado no tamanho do campo.
|
37
|
+
#
|
38
|
+
# @return [String] Retorna a mesma caso não encontre o formato adequado.
|
39
|
+
# @example
|
40
|
+
# "12345678000901".formata_documento #=> 12.345.678/0009-01
|
41
|
+
# "85253100".formata_documento #=> "85253-100"
|
42
|
+
# "12345678901".formata_documento #=> 123.456.789-01
|
43
|
+
# "12345".formata_documento #=> 12345
|
44
|
+
def formata_documento
|
45
|
+
case somente_numeros.size
|
46
|
+
when 8 then to_br_cep
|
47
|
+
when 11 then to_br_cpf
|
48
|
+
when 14 then to_br_cnpj
|
49
|
+
else
|
50
|
+
self
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
# Remove caracteres que não sejam numéricos.
|
55
|
+
#
|
56
|
+
# @return [String]
|
57
|
+
# @example
|
58
|
+
# 1a23e45+".somente_numeros #=> 12345
|
59
|
+
def somente_numeros
|
60
|
+
to_s.gsub(/\D/, '')
|
61
|
+
end
|
62
|
+
|
63
|
+
# Monta a linha digitável padrão para todos os bancos segundo a BACEN.
|
64
|
+
#
|
65
|
+
# A linha digitável será composta por cinco campos:<br/>
|
66
|
+
# <b>1º campo</b>: <br/>
|
67
|
+
# Composto pelo código de Banco, código da moeda, as cinco primeiras posições do campo livre
|
68
|
+
# e o dígito verificador deste campo.<br/>
|
69
|
+
# <b>2º campo</b>: <br/>
|
70
|
+
# Composto pelas posições 6ª a 15ª do campo livre e o dígito verificador deste campo.<br/>
|
71
|
+
# <b>3º campo</b>: <br/>
|
72
|
+
# Composto pelas posições 16ª a 25ª do campo livre e o dígito verificador deste campo.<br/>
|
73
|
+
# <b>4º campo</b>: <br/>
|
74
|
+
# Composto pelo dígito verificador do código de barras, ou seja, a 5ª posição do código de barras.<br/>
|
75
|
+
# <b>5º campo</b>: <br/>
|
76
|
+
# Composto pelo fator de vencimento com 4(quatro) caracteres e o valor do documento com
|
77
|
+
# 10(dez) caracteres, sem separadores e sem edição.<br/>
|
78
|
+
#
|
79
|
+
# @return [String]
|
80
|
+
# @raise [ArgumentError] Caso não seja um número de 44 dígitos.
|
81
|
+
# @example
|
82
|
+
# "00192376900000135000000001238798777770016818".linha_digitavel #=> "00190.00009 01238.798779 77700.168188 2 37690000013500"
|
83
|
+
def linha_digitavel
|
84
|
+
unless self =~ /^(\d{4})(\d{1})(\d{14})(\d{5})(\d{10})(\d{10})$/
|
85
|
+
raise ArgumentError, "#{self} Precisa conter 44 caracteres numéricos."
|
86
|
+
end
|
87
|
+
|
88
|
+
linha = Regexp.last_match[1]
|
89
|
+
linha << Regexp.last_match[4]
|
90
|
+
linha << linha.modulo10.to_s
|
91
|
+
linha << Regexp.last_match[5]
|
92
|
+
linha << Regexp.last_match[5].modulo10.to_s
|
93
|
+
linha << Regexp.last_match[6]
|
94
|
+
linha << Regexp.last_match[6].modulo10.to_s
|
95
|
+
linha << Regexp.last_match[2]
|
96
|
+
linha << Regexp.last_match[3]
|
97
|
+
linha.gsub(/^(.{5})(.{5})(.{5})(.{6})(.{5})(.{6})(.{1})(.{14})$/, '\1.\2 \3.\4 \5.\6 \7 \8')
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
[String, Numeric].each do |klass|
|
103
|
+
klass.class_eval { include Brcobranca::Formatacao }
|
104
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Brcobranca
|
4
|
+
# Métodos auxiliares de formatação de strings
|
5
|
+
module FormatacaoString
|
6
|
+
# Formata o tamanho da string
|
7
|
+
# para o tamanho passado
|
8
|
+
# se a string for menor, adiciona espacos a direita
|
9
|
+
# se a string for maior, trunca para o num. de caracteres
|
10
|
+
#
|
11
|
+
def format_size(size)
|
12
|
+
clean_str = remove_accents.strip.gsub(/\s+/, ' ').gsub(/[^A-Za-z0-9[[:space:]]]/, '')
|
13
|
+
if clean_str.size > size
|
14
|
+
clean_str.truncate(size)
|
15
|
+
else
|
16
|
+
clean_str.ljust(size, ' ')
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def truncate(truncate_at)
|
21
|
+
return dup unless length > truncate_at
|
22
|
+
|
23
|
+
(self[0, truncate_at]).to_s
|
24
|
+
end
|
25
|
+
|
26
|
+
def remove_accents
|
27
|
+
tr(
|
28
|
+
'ÀÁÂÃÄÅàáâãäåĀāĂ㥹ÇçĆćĈĉĊċČčÐðĎďĐđÈÉÊËèéêëĒēĔĕĖėĘęĚěĜĝĞğĠġĢģĤĥĦħÌÍÎÏìíîïĨĩĪīĬĭĮįİıĴĵĶķĸĹĺĻļĽľĿŀŁłÑñŃńŅņŇňʼnŊŋÒÓÔÕÖØòóôõöøŌōŎŏŐőŔŕŖŗŘřŚśŜŝŞşŠšſŢţŤťŦŧÙÚÛÜùúûüŨũŪūŬŭŮůŰűŲųŴŵÝýÿŶŷŸŹźŻżŽž',
|
29
|
+
'AAAAAAaaaaaaAaAaAaCcCcCcCcCcDdDdDdEEEEeeeeEeEeEeEeEeGgGgGgGgHhHhIIIIiiiiIiIiIiIiIiJjKkkLlLlLlLlLlNnNnNnNnnNnOOOOOOooooooOoOoOoRrRrRrSsSsSsSssTtTtTtUUUUuuuuUuUuUuUuUuUuWwYyyYyYZzZzZz'
|
30
|
+
)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
[String].each do |klass|
|
36
|
+
klass.class_eval { include Brcobranca::FormatacaoString }
|
37
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Brcobranca
|
4
|
+
module Limpeza
|
5
|
+
# Transforma Float em String preservando o zero a direita.
|
6
|
+
#
|
7
|
+
# @return [String]
|
8
|
+
# @example
|
9
|
+
# 1.9 #=> 190
|
10
|
+
# 1.93 #=> 193
|
11
|
+
def limpa_valor_moeda
|
12
|
+
inicio, fim = to_s.split('.')
|
13
|
+
(inicio + fim.ljust(2, '0'))
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
[Float, String].each do |klass|
|
19
|
+
klass.class_eval { include Brcobranca::Limpeza }
|
20
|
+
end
|
@@ -0,0 +1,72 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Brcobranca
|
4
|
+
module Remessa
|
5
|
+
class Base
|
6
|
+
# pagamentos da remessa (cada pagamento representa um registro detalhe no arquivo)
|
7
|
+
attr_accessor :pagamentos
|
8
|
+
# empresa mae (razao social)
|
9
|
+
attr_accessor :empresa_mae
|
10
|
+
# agencia (sem digito verificador)
|
11
|
+
attr_accessor :agencia
|
12
|
+
# numero da conta corrente
|
13
|
+
attr_accessor :conta_corrente
|
14
|
+
# digito verificador da conta corrente
|
15
|
+
attr_accessor :digito_conta
|
16
|
+
# carteira do cedente
|
17
|
+
attr_accessor :carteira
|
18
|
+
# sequencial remessa (num. sequencial que nao pode ser repetido nem zerado)
|
19
|
+
attr_accessor :sequencial_remessa
|
20
|
+
# aceite (A = ACEITO/N = NAO ACEITO)
|
21
|
+
attr_accessor :aceite
|
22
|
+
# documento do cedente (CPF/CNPJ)
|
23
|
+
attr_accessor :documento_cedente
|
24
|
+
|
25
|
+
# Validações
|
26
|
+
include Brcobranca::Validations
|
27
|
+
|
28
|
+
validates_presence_of :pagamentos, :empresa_mae, message: 'não pode estar em branco.'
|
29
|
+
|
30
|
+
validates_each :pagamentos do |record, attr, value|
|
31
|
+
if value.is_a? Array
|
32
|
+
record.errors.add(attr, 'não pode estar vazio.') if value.empty?
|
33
|
+
value.each do |pagamento|
|
34
|
+
if pagamento.is_a? Brcobranca::Remessa::Pagamento
|
35
|
+
pagamento.errors.full_messages.each { |msg| record.errors.add(attr, msg) } if pagamento.invalid?
|
36
|
+
else
|
37
|
+
record.errors.add(attr, 'cada item deve ser um objeto Pagamento.')
|
38
|
+
end
|
39
|
+
end
|
40
|
+
else
|
41
|
+
record.errors.add(attr, 'deve ser uma coleção (Array).')
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
# Nova instancia da classe
|
46
|
+
#
|
47
|
+
# @param campos [Hash]
|
48
|
+
#
|
49
|
+
def initialize(campos = {})
|
50
|
+
campos = { aceite: 'N' }.merge!(campos)
|
51
|
+
campos.each do |campo, valor|
|
52
|
+
send :"#{campo}=", valor
|
53
|
+
end
|
54
|
+
|
55
|
+
yield self if block_given?
|
56
|
+
end
|
57
|
+
|
58
|
+
def quantidade_titulos_cobranca
|
59
|
+
pagamentos.length.to_s.rjust(6, '0')
|
60
|
+
end
|
61
|
+
|
62
|
+
def totaliza_valor_titulos
|
63
|
+
pagamentos.inject(0.0) { |sum, pagamento| sum + pagamento.valor.to_f }
|
64
|
+
end
|
65
|
+
|
66
|
+
def valor_titulos_carteira(tamanho = 17)
|
67
|
+
total = format '%.2f', totaliza_valor_titulos
|
68
|
+
total.somente_numeros.rjust(tamanho, '0')
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
@@ -0,0 +1,156 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Brcobranca
|
4
|
+
module Remessa
|
5
|
+
module Cnab240
|
6
|
+
class Ailos < Brcobranca::Remessa::Cnab240::Base
|
7
|
+
# digito da agencia
|
8
|
+
attr_accessor :digito_agencia
|
9
|
+
|
10
|
+
validates_presence_of :digito_agencia, :convenio, :conta_corrente, message: 'não pode estar em branco.'
|
11
|
+
validates_length_of :convenio, maximum: 6, message: 'deve ter 6 dígitos.'
|
12
|
+
validates_length_of :conta_corrente, maximum: 7, message: 'deve ter 7 dígitos.'
|
13
|
+
validates_length_of :digito_agencia, is: 1, message: 'deve ter 1 dígito.'
|
14
|
+
|
15
|
+
def initialize(campos = {})
|
16
|
+
campos = { emissao_boleto: '2',
|
17
|
+
forma_cadastramento: '0',
|
18
|
+
distribuicao_boleto: '2',
|
19
|
+
especie_titulo: '02' }.merge!(campos)
|
20
|
+
super(campos)
|
21
|
+
end
|
22
|
+
|
23
|
+
def convenio=(valor)
|
24
|
+
@convenio = valor.to_s.rjust(6, '0') if valor
|
25
|
+
end
|
26
|
+
|
27
|
+
def conta_corrente=(valor)
|
28
|
+
@conta_corrente = valor.to_s.rjust(7, '0') if valor
|
29
|
+
end
|
30
|
+
|
31
|
+
def cod_banco
|
32
|
+
'085'
|
33
|
+
end
|
34
|
+
|
35
|
+
def nome_banco
|
36
|
+
'AILOS'.ljust(30, ' ')
|
37
|
+
end
|
38
|
+
|
39
|
+
def versao_layout_arquivo
|
40
|
+
'087'
|
41
|
+
end
|
42
|
+
|
43
|
+
def versao_layout_lote
|
44
|
+
'045'
|
45
|
+
end
|
46
|
+
|
47
|
+
def codigo_convenio
|
48
|
+
convenio.ljust(20, ' ')
|
49
|
+
end
|
50
|
+
|
51
|
+
def uso_exclusivo_banco
|
52
|
+
''.rjust(20, ' ')
|
53
|
+
end
|
54
|
+
|
55
|
+
def uso_exclusivo_empresa
|
56
|
+
''.ljust(20, ' ')
|
57
|
+
end
|
58
|
+
|
59
|
+
def convenio_lote
|
60
|
+
codigo_convenio
|
61
|
+
end
|
62
|
+
|
63
|
+
def info_conta
|
64
|
+
# CAMPO # TAMANHO
|
65
|
+
# agencia 5
|
66
|
+
# digito agencia 1
|
67
|
+
# conta corrente 12
|
68
|
+
# dv da conta 1
|
69
|
+
# dv agencia/conta 1
|
70
|
+
"#{agencia_conta_corrente}#{agencia_conta_corrente_dv}"
|
71
|
+
end
|
72
|
+
|
73
|
+
def agencia_conta_corrente
|
74
|
+
"#{agencia.to_s.rjust(5, '0')}#{digito_agencia}#{conta_corrente.rjust(12, '0')}#{conta_corrente_dv}"
|
75
|
+
end
|
76
|
+
|
77
|
+
def conta_corrente_dv
|
78
|
+
conta_corrente.modulo11(mapeamento: { 10 => 0 })
|
79
|
+
end
|
80
|
+
|
81
|
+
def agencia_conta_corrente_dv
|
82
|
+
' '
|
83
|
+
end
|
84
|
+
|
85
|
+
def complemento_header
|
86
|
+
''.rjust(29, ' ').to_s
|
87
|
+
end
|
88
|
+
|
89
|
+
def complemento_trailer
|
90
|
+
"#{''.rjust(69, '0')}#{''.rjust(148, ' ')}"
|
91
|
+
end
|
92
|
+
|
93
|
+
def tipo_documento
|
94
|
+
'1'
|
95
|
+
end
|
96
|
+
|
97
|
+
def complemento_p(pagamento)
|
98
|
+
# CAMPO TAMANHO
|
99
|
+
# conta_corrente 12
|
100
|
+
# dv conta corrente 1
|
101
|
+
# dv agencia/conta 1
|
102
|
+
# ident. titulo 20
|
103
|
+
"#{conta_corrente.rjust(12,
|
104
|
+
'0')}#{conta_corrente_dv}#{agencia_conta_corrente_dv}#{ajusta_nosso_numero(pagamento)}"
|
105
|
+
end
|
106
|
+
|
107
|
+
def ajusta_nosso_numero(pagamento)
|
108
|
+
"#{conta_corrente}#{conta_corrente_dv}#{pagamento.nosso_numero.to_s.rjust(9, '0')}".ljust(20, ' ')
|
109
|
+
end
|
110
|
+
|
111
|
+
def identificacao_titulo_empresa(pagamento)
|
112
|
+
pagamento.documento_ou_numero.to_s.ljust(25, ' ')
|
113
|
+
end
|
114
|
+
|
115
|
+
def complemento_trailer
|
116
|
+
# CAMPO TAMANHO
|
117
|
+
# Qt. Títulos em Cobrança Simples 6
|
118
|
+
# Vl. Títulos em Carteira Simples 15 + 2 decimais
|
119
|
+
# Qt. Títulos em Cobrança Vinculada 6
|
120
|
+
# Vl. Títulos em Carteira Vinculada 15 + 2 decimais
|
121
|
+
# Qt. Títulos em Cobrança Caucionada 6
|
122
|
+
# Vl. Títulos em Carteira Caucionada 15 + 2 decimais
|
123
|
+
# Qt. Títulos em Cobrança Descontada 6
|
124
|
+
# Vl. Títulos em Carteira Descontada 15 + 2 decimais
|
125
|
+
total_cobranca_simples = "#{quantidade_titulos_cobranca}#{valor_titulos_carteira}"
|
126
|
+
total_cobranca_vinculada = ''.rjust(23, '0')
|
127
|
+
total_cobranca_caucionada = ''.rjust(23, '0')
|
128
|
+
total_cobranca_descontada = ''.rjust(23, '0')
|
129
|
+
|
130
|
+
"#{total_cobranca_simples}#{total_cobranca_vinculada}#{total_cobranca_caucionada}" \
|
131
|
+
"#{total_cobranca_descontada}".ljust(217, ' ')
|
132
|
+
end
|
133
|
+
|
134
|
+
def total_segmentos(pagamentos)
|
135
|
+
pagamentos.inject(0) do |total, pagamento|
|
136
|
+
total + (pagamento.codigo_multa == '0' ? 2 : 3)
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
140
|
+
def monta_segmento_r(pagamento, nro_lote, contador)
|
141
|
+
return nil if pagamento.codigo_multa == '0'
|
142
|
+
|
143
|
+
super(pagamento, nro_lote, contador)
|
144
|
+
end
|
145
|
+
|
146
|
+
def codigo_baixa(_pagamento)
|
147
|
+
'2'
|
148
|
+
end
|
149
|
+
|
150
|
+
def dias_baixa(_pagamento)
|
151
|
+
''.rjust(3, ' ')
|
152
|
+
end
|
153
|
+
end
|
154
|
+
end
|
155
|
+
end
|
156
|
+
end
|
@@ -0,0 +1,249 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Brcobranca
|
4
|
+
module Remessa
|
5
|
+
module Cnab240
|
6
|
+
class BancoBrasil < Brcobranca::Remessa::Cnab240::Base
|
7
|
+
# variacao da carteira
|
8
|
+
attr_accessor :variacao
|
9
|
+
|
10
|
+
# identificacao da emissao do boleto (attr na classe base)
|
11
|
+
# campo nao tratado pelo sistema do Banco do Brasil
|
12
|
+
# identificacao da distribuicao do boleto (attr na classe base)
|
13
|
+
# campo nao tratado pelo sistema do Banco do Brasil
|
14
|
+
|
15
|
+
validates_presence_of :carteira, :variacao, message: 'não pode estar em branco.'
|
16
|
+
validates_presence_of :convenio, message: 'não pode estar em branco.'
|
17
|
+
validates_length_of :conta_corrente, maximum: 12, message: 'deve ter 12 dígitos.'
|
18
|
+
validates_length_of :agencia, maximum: 5, message: 'deve ter 5 dígitos.'
|
19
|
+
validates_length_of :carteira, is: 2, message: 'deve ter 2 dígitos.'
|
20
|
+
validates_length_of :variacao, is: 3, message: 'deve ter 3 dígitos.'
|
21
|
+
validates_length_of :convenio, in: 4..7, message: 'deve ter de 4 a 7 dígitos.'
|
22
|
+
|
23
|
+
def initialize(campos = {})
|
24
|
+
campos = { emissao_boleto: '0',
|
25
|
+
distribuicao_boleto: '0',
|
26
|
+
especie_titulo: '02',
|
27
|
+
codigo_baixa: '00',
|
28
|
+
codigo_carteira: '7' }.merge!(campos)
|
29
|
+
super(campos)
|
30
|
+
end
|
31
|
+
|
32
|
+
def cod_banco
|
33
|
+
'001'
|
34
|
+
end
|
35
|
+
|
36
|
+
def nome_banco
|
37
|
+
'BANCO DO BRASIL S.A.'.ljust(30, ' ')
|
38
|
+
end
|
39
|
+
|
40
|
+
def versao_layout_arquivo
|
41
|
+
'083'
|
42
|
+
end
|
43
|
+
|
44
|
+
def versao_layout_lote
|
45
|
+
'042'
|
46
|
+
end
|
47
|
+
|
48
|
+
def digito_agencia
|
49
|
+
# utilizando a agencia com 4 digitos
|
50
|
+
# para calcular o digito
|
51
|
+
agencia.modulo11(mapeamento: { 10 => 'X' }).to_s
|
52
|
+
end
|
53
|
+
|
54
|
+
def digito_conta
|
55
|
+
# utilizando a conta corrente com 5 digitos
|
56
|
+
# para calcular o digito
|
57
|
+
conta_corrente.modulo11(mapeamento: { 10 => 'X' }).to_s
|
58
|
+
end
|
59
|
+
|
60
|
+
def codigo_convenio
|
61
|
+
# CAMPO TAMANHO
|
62
|
+
# num. convenio 9
|
63
|
+
# cobranca cedente 4
|
64
|
+
# carteira 2
|
65
|
+
# variacao carteira 3
|
66
|
+
# campo reservado 2
|
67
|
+
"#{convenio.rjust(9, '0')}0014#{carteira}#{variacao} "
|
68
|
+
end
|
69
|
+
|
70
|
+
alias convenio_lote codigo_convenio
|
71
|
+
|
72
|
+
def info_conta
|
73
|
+
# CAMPO TAMANHO
|
74
|
+
# agencia 5
|
75
|
+
# digito agencia 1
|
76
|
+
# conta corrente 12
|
77
|
+
# digito conta 1
|
78
|
+
# digito agencia/conta 1
|
79
|
+
"#{agencia.rjust(5, '0')}#{digito_agencia}#{conta_corrente.rjust(12, '0')}#{digito_conta} "
|
80
|
+
end
|
81
|
+
|
82
|
+
def complemento_header
|
83
|
+
''.rjust(29, ' ')
|
84
|
+
end
|
85
|
+
|
86
|
+
def complemento_trailer
|
87
|
+
''.rjust(217, '0')
|
88
|
+
end
|
89
|
+
|
90
|
+
def complemento_p(pagamento)
|
91
|
+
# CAMPO TAMANHO
|
92
|
+
# conta corrente 12
|
93
|
+
# digito conta 1
|
94
|
+
# digito agencia/conta 1
|
95
|
+
# ident. titulo no banco 20
|
96
|
+
"#{conta_corrente.rjust(12, '0')}#{digito_conta} #{identificador_titulo(pagamento.nosso_numero)}"
|
97
|
+
end
|
98
|
+
|
99
|
+
# Retorna o nosso numero mais o digito verificador
|
100
|
+
#
|
101
|
+
# @return [String]
|
102
|
+
#
|
103
|
+
def formata_nosso_numero(nosso_numero)
|
104
|
+
quantidade = case convenio.to_s.size
|
105
|
+
# convenio de 4 posicoes com nosso numero de 7
|
106
|
+
when 4
|
107
|
+
7
|
108
|
+
# convenio de 6 posicoes com nosso numero de 5
|
109
|
+
when 6
|
110
|
+
5
|
111
|
+
# convenio de 7 posicoes com nosso numero de 10
|
112
|
+
when 7
|
113
|
+
10
|
114
|
+
else
|
115
|
+
raise Brcobranca::NaoImplementado, 'Tipo de convênio não implementado.'
|
116
|
+
end
|
117
|
+
nosso_numero = nosso_numero.to_s.rjust(quantidade, '0')
|
118
|
+
|
119
|
+
# calcula o digito do nosso numero (menos para quando nosso numero tiver 10 posicoes)
|
120
|
+
digito = "#{convenio}#{nosso_numero}".modulo11(mapeamento: { 10 => 'X' }) unless quantidade == 10
|
121
|
+
"#{nosso_numero}#{digito}"
|
122
|
+
end
|
123
|
+
|
124
|
+
def identificador_titulo(nosso_numero)
|
125
|
+
"#{convenio}#{formata_nosso_numero(nosso_numero)}".ljust(20, ' ')
|
126
|
+
end
|
127
|
+
|
128
|
+
# Monta o registro segmento P do arquivo
|
129
|
+
#
|
130
|
+
# @param pagamento [Brcobranca::Remessa::Pagamento]
|
131
|
+
# objeto contendo os detalhes do boleto (valor, vencimento, sacado, etc)
|
132
|
+
# @param nro_lote [Integer]
|
133
|
+
# numero do lote que o segmento esta inserido
|
134
|
+
# @param sequencial [Integer]
|
135
|
+
# numero sequencial do registro no lote
|
136
|
+
#
|
137
|
+
# @return [String]
|
138
|
+
#
|
139
|
+
def monta_segmento_p(pagamento, nro_lote, sequencial)
|
140
|
+
# campos com * na frente nao foram implementados
|
141
|
+
segmento_p = ''
|
142
|
+
# # DESCRICAO TAMANHO
|
143
|
+
segmento_p += cod_banco # codigo banco 3
|
144
|
+
segmento_p << nro_lote.to_s.rjust(4, '0') # lote de servico 4
|
145
|
+
segmento_p << '3' # tipo de registro 1
|
146
|
+
segmento_p << sequencial.to_s.rjust(5, '0') # num. sequencial do registro no lote 5
|
147
|
+
segmento_p << 'P' # cod. segmento 1
|
148
|
+
segmento_p << ' ' # uso exclusivo 1
|
149
|
+
# Códigos de Movimento para Remessa tratados pelo Banco do Brasil:
|
150
|
+
# 01 – Entrada de títulos,
|
151
|
+
# 02 – Pedido de baixa,
|
152
|
+
# 04 – Concessão de Abatimento,
|
153
|
+
# 05 – Cancelamento de Abatimento,
|
154
|
+
# 06 – Alteração de Vencimento,
|
155
|
+
# 07 – Concessão de Desconto,
|
156
|
+
# 08 – Cancelamento de Desconto,
|
157
|
+
# 09 – Protestar,
|
158
|
+
# 10 – Cancela/Sustação da Instrução de protesto,
|
159
|
+
# 30 – Recusa da Alegação do Sacado,
|
160
|
+
# 31 – Alteração de Outros Dados,
|
161
|
+
# 40 – Alteração de Modalidade.
|
162
|
+
segmento_p << pagamento.identificacao_ocorrencia # cod. movimento remessa 2
|
163
|
+
segmento_p << agencia.to_s.rjust(5, '0') # agencia 5
|
164
|
+
segmento_p << digito_agencia.to_s # dv agencia 1
|
165
|
+
segmento_p << complemento_p(pagamento) # informacoes da conta 34
|
166
|
+
# Informar:
|
167
|
+
# 1 – para carteira 11/12 na modalidade Simples;
|
168
|
+
# 2 ou 3 – para carteira 11/17 modalidade Vinculada/Caucionada e carteira 31;
|
169
|
+
# 4 – para carteira 11/17 modalidade Descontada e carteira 51;
|
170
|
+
# e 7 – para carteira 17 modalidade Simples.
|
171
|
+
segmento_p << codigo_carteira # codigo da carteira 1
|
172
|
+
segmento_p << forma_cadastramento # forma de cadastro do titulo 1
|
173
|
+
segmento_p << tipo_documento # tipo de documento 1
|
174
|
+
segmento_p << emissao_boleto # identificaco emissao 1
|
175
|
+
segmento_p << distribuicao_boleto # indentificacao entrega 1
|
176
|
+
segmento_p << numero(pagamento) # uso exclusivo 15
|
177
|
+
segmento_p << pagamento.data_vencimento.strftime('%d%m%Y') # data de venc. 8
|
178
|
+
segmento_p << pagamento.formata_valor(15) # valor documento 15
|
179
|
+
segmento_p << ''.rjust(5, '0') # agencia cobradora 5
|
180
|
+
segmento_p << ' ' # dv agencia cobradora 1
|
181
|
+
# Para carteira 11 e 17 modalidade Simples, pode ser usado:
|
182
|
+
# 01 – Cheque, 02 – Duplicata Mercantil,
|
183
|
+
# 04 – Duplicata de Serviço,
|
184
|
+
# 06 – Duplicata Rural,
|
185
|
+
# 07 – Letra de Câmbio,
|
186
|
+
# 12 – Nota Promissória,
|
187
|
+
# 17 - Recibo,
|
188
|
+
# 19 – Nota de Debito,
|
189
|
+
# 26 – Warrant,
|
190
|
+
# 27 – Dívida Ativa de Estado,
|
191
|
+
# 28 – Divida Ativa de Município e
|
192
|
+
# 29 – Dívida Ativa União.
|
193
|
+
# Para carteira 12 (moeda variável) pode ser usado:
|
194
|
+
# 02 – Duplicata Mercantil,
|
195
|
+
# 04 – Duplicata de Serviço,
|
196
|
+
# 07 – Letra de Câmbio,
|
197
|
+
# 12 – Nota Promissória,
|
198
|
+
# 17 – Recibo e
|
199
|
+
# 19 – Nota de Débito.
|
200
|
+
# Para carteira 15 (prêmio de seguro) pode ser usado:
|
201
|
+
# 16 – Nota de Seguro e
|
202
|
+
# 20 – Apólice de Seguro.
|
203
|
+
# Para carteira 11/17 modalidade Vinculada e carteira 31, pode ser usado:
|
204
|
+
# 02 – Duplicata Mercantil e
|
205
|
+
# 04 – Duplicata de Serviço.
|
206
|
+
# Para carteira 11/17 modalidade Descontada e carteira 51, pode ser usado:
|
207
|
+
# 02 – Duplicata Mercantil,
|
208
|
+
# 04 – Duplicata de Serviço, e
|
209
|
+
# 07 – Letra de Câmbio.
|
210
|
+
# Obs.: O Banco do Brasil encaminha para protesto os seguintes títulos:
|
211
|
+
# Duplicata Mercantil, Rural e de Serviço, Letra de Câmbio, e
|
212
|
+
# Certidão de Dívida Ativa da União, dos Estados e do Município.
|
213
|
+
segmento_p << especie_titulo # especie do titulo 2
|
214
|
+
segmento_p << aceite # aceite 1
|
215
|
+
segmento_p << pagamento.data_emissao.strftime('%d%m%Y') # data de emissao titulo 8
|
216
|
+
segmento_p << pagamento.tipo_mora # cod. do juros 1
|
217
|
+
segmento_p << data_mora(pagamento) # data juros 8
|
218
|
+
segmento_p << pagamento.formata_valor_mora(15) # valor juros 15
|
219
|
+
segmento_p << pagamento.cod_desconto # cod. do desconto 1
|
220
|
+
segmento_p << pagamento.formata_data_desconto('%d%m%Y') # data desconto 8
|
221
|
+
segmento_p << pagamento.formata_valor_desconto(15) # valor desconto 15
|
222
|
+
segmento_p << pagamento.formata_valor_iof(15) # valor IOF 15
|
223
|
+
segmento_p << pagamento.formata_valor_abatimento(15) # valor abatimento 15
|
224
|
+
segmento_p << identificacao_titulo_empresa(pagamento) # identificacao documento empresa 25
|
225
|
+
|
226
|
+
# O Banco do Brasil trata somente os códigos
|
227
|
+
# '1' – Protestar dias corridos,
|
228
|
+
# '2' – Protestar dias úteis, e
|
229
|
+
# '3' – Não protestar.
|
230
|
+
# No caso de carteira 31 ou carteira 11/17 modalidade Vinculada,
|
231
|
+
# se não informado nenhum código,
|
232
|
+
# o sistema assume automaticamente Protesto em 3 dias úteis.
|
233
|
+
segmento_p << pagamento.codigo_protesto # cod. para protesto 1
|
234
|
+
# Preencher de acordo com o código informado na posição 221.
|
235
|
+
# Para código '1' – é possível, de 6 a 29 dias, 35o, 40o, dia corrido.
|
236
|
+
# Para código '2' – é possível, 3o, 4o ou 5o dia útil.
|
237
|
+
# Para código '3' preencher com Zeros.
|
238
|
+
segmento_p << pagamento.dias_protesto.to_s.rjust(2, '0') # dias para protesto 2
|
239
|
+
segmento_p << '0' # cod. para baixa 1 *'1' = Protestar Dias Corridos, '2' = Protestar Dias Úteis, '3' = Não Protestar
|
240
|
+
segmento_p << '000' # dias para baixa 2 *
|
241
|
+
segmento_p << '09' # cod. da moeda 2
|
242
|
+
segmento_p << ''.rjust(10, '0') # uso exclusivo 10
|
243
|
+
segmento_p << ' ' # uso exclusivo 1
|
244
|
+
segmento_p
|
245
|
+
end
|
246
|
+
end
|
247
|
+
end
|
248
|
+
end
|
249
|
+
end
|