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,161 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Brcobranca
|
4
|
+
module Remessa
|
5
|
+
module Cnab400
|
6
|
+
class BancoNordeste < Brcobranca::Remessa::Cnab400::Base
|
7
|
+
# 1 - Emitido pelo banco
|
8
|
+
# 2 - Emitido pelo cliente
|
9
|
+
attr_accessor :emissao_boleto
|
10
|
+
|
11
|
+
validates_presence_of :agencia, :conta_corrente, message: 'não pode estar em branco.'
|
12
|
+
validates_presence_of :documento_cedente, :digito_conta, message: 'não pode estar em branco.'
|
13
|
+
validates_length_of :agencia, maximum: 4, message: 'deve ter 4 dígitos.'
|
14
|
+
validates_length_of :conta_corrente, maximum: 7, message: 'deve ter 7 dígitos.'
|
15
|
+
validates_length_of :documento_cedente, minimum: 11, maximum: 14, message: 'deve ter entre 11 e 14 dígitos.'
|
16
|
+
validates_length_of :carteira, maximum: 2, message: 'deve ter 2 dígitos.'
|
17
|
+
validates_length_of :digito_conta, maximum: 1, message: 'deve ter 1 dígito.'
|
18
|
+
validates_inclusion_of :carteira, in: %w[21 41 51], message: 'não é válida.'
|
19
|
+
|
20
|
+
# Nova instancia do Banco do Nordeste
|
21
|
+
def initialize(campos = {})
|
22
|
+
campos = {
|
23
|
+
aceite: 'N',
|
24
|
+
emissao_boleto: '2'
|
25
|
+
}.merge!(campos)
|
26
|
+
|
27
|
+
super(campos)
|
28
|
+
end
|
29
|
+
|
30
|
+
def agencia=(valor)
|
31
|
+
@agencia = valor.to_s.rjust(4, '0') if valor
|
32
|
+
end
|
33
|
+
|
34
|
+
def conta_corrente=(valor)
|
35
|
+
@conta_corrente = valor.to_s.rjust(7, '0') if valor
|
36
|
+
end
|
37
|
+
|
38
|
+
def carteira=(valor)
|
39
|
+
@carteira = valor.to_s.rjust(2, '0') if valor
|
40
|
+
end
|
41
|
+
|
42
|
+
def cod_banco
|
43
|
+
'004'
|
44
|
+
end
|
45
|
+
|
46
|
+
def nome_banco
|
47
|
+
'B.DO NORDESTE'.ljust(15, ' ')
|
48
|
+
end
|
49
|
+
|
50
|
+
# Informacoes da conta corrente do cedente
|
51
|
+
#
|
52
|
+
# @return [String]
|
53
|
+
#
|
54
|
+
def info_conta
|
55
|
+
# CAMPO TAMANHO
|
56
|
+
# agencia 4
|
57
|
+
# zeros 2
|
58
|
+
# conta corrente 7
|
59
|
+
# digito da conta 1
|
60
|
+
# complemento 6
|
61
|
+
"#{agencia}00#{conta_corrente}#{digito_conta}#{''.rjust(6, ' ')}"
|
62
|
+
end
|
63
|
+
|
64
|
+
# Complemento do header
|
65
|
+
# (no caso do Banco do Nordeste, sao apenas espacos em branco)
|
66
|
+
#
|
67
|
+
# @return [String]
|
68
|
+
#
|
69
|
+
def complemento
|
70
|
+
''.rjust(294, ' ')
|
71
|
+
end
|
72
|
+
|
73
|
+
# Codigo da carteira de acordo com a documentacao do Banco do Nordeste
|
74
|
+
#
|
75
|
+
# @return [String]
|
76
|
+
#
|
77
|
+
def codigo_carteira
|
78
|
+
return 'I' if carteira.to_s == '51'
|
79
|
+
|
80
|
+
carteiras = {
|
81
|
+
'1' => { '21' => '1', '41' => '2' }, # 1 - Emitido pelo banco
|
82
|
+
'2' => { '21' => '4', '41' => '5' } # 2 - Emitido pelo cliente
|
83
|
+
}
|
84
|
+
|
85
|
+
carteiras[emissao_boleto.to_s][carteira.to_s]
|
86
|
+
end
|
87
|
+
|
88
|
+
# Dígito verificador do nosso número.
|
89
|
+
#
|
90
|
+
# @param nosso_numero
|
91
|
+
#
|
92
|
+
# @return [String] 1 caracteres numéricos.
|
93
|
+
def digito_nosso_numero(nosso_numero)
|
94
|
+
nosso_numero.to_s.rjust(7, '0').modulo11(
|
95
|
+
multiplicador: (2..8).to_a,
|
96
|
+
mapeamento: { 1 => 0, 10 => 0, 11 => 0 }
|
97
|
+
) { |total| 11 - (total % 11) }
|
98
|
+
end
|
99
|
+
|
100
|
+
# Detalhe do arquivo
|
101
|
+
#
|
102
|
+
# @param pagamento [PagamentoCnab400]
|
103
|
+
# objeto contendo as informacoes referentes ao boleto (valor, vencimento, cliente)
|
104
|
+
# @param sequencial
|
105
|
+
# num. sequencial do registro no arquivo
|
106
|
+
#
|
107
|
+
# @return [String]
|
108
|
+
#
|
109
|
+
def monta_detalhe(pagamento, sequencial)
|
110
|
+
raise Brcobranca::RemessaInvalida, pagamento if pagamento.invalid?
|
111
|
+
|
112
|
+
detalhe = '1' # identificacao transacao 9[01]
|
113
|
+
detalhe += ''.rjust(16, ' ') # filler [16]
|
114
|
+
detalhe << agencia # agencia 9[04]
|
115
|
+
detalhe << ''.rjust(2, '0') # complemento de registro (zeros) 9[02]
|
116
|
+
detalhe << conta_corrente # conta corrente 9[07]
|
117
|
+
detalhe << digito_conta # dac 9[01]
|
118
|
+
detalhe << pagamento.formata_percentual_multa.to_s[0..1] # taxa - multa [02]
|
119
|
+
detalhe << ''.rjust(4, ' ') # filler [04]
|
120
|
+
detalhe << pagamento.documento_ou_numero.to_s.ljust(25) # identificacao do tit. na empresa X[25]
|
121
|
+
detalhe << pagamento.nosso_numero.to_s.rjust(7, '0') # nosso numero 9[07]
|
122
|
+
detalhe << digito_nosso_numero(pagamento.nosso_numero).to_s # dv nosso numero 9[01]
|
123
|
+
detalhe << ''.rjust(10, '0') # numero do contrato [10]
|
124
|
+
detalhe << ''.rjust(6, '0') # data do segundo pagamento [06]
|
125
|
+
detalhe << ''.rjust(13, '0') # valor do segundo pagamento [13]
|
126
|
+
detalhe << ''.rjust(8, ' ') # filler [08]
|
127
|
+
detalhe << codigo_carteira # codigo da carteira X[01]
|
128
|
+
detalhe << pagamento.identificacao_ocorrencia # identificacao ocorrencia 9[02]
|
129
|
+
detalhe << pagamento.numero.to_s.rjust(10, '0') # numero do documento X[10]
|
130
|
+
detalhe << pagamento.data_vencimento.strftime('%d%m%y') # data do vencimento 9[06]
|
131
|
+
detalhe << pagamento.formata_valor # valor do documento 9[13]
|
132
|
+
detalhe << cod_banco # codigo banco 9[03]
|
133
|
+
detalhe << ''.rjust(4, '0') # agencia cobradora - deixar zero 9[05]
|
134
|
+
detalhe << ' ' # filler [01]
|
135
|
+
detalhe << '01' # especie do titulo X[02]
|
136
|
+
detalhe << aceite # aceite (A/N) X[01]
|
137
|
+
detalhe << pagamento.data_emissao.strftime('%d%m%y') # data de emissao 9[06]
|
138
|
+
detalhe << ''.rjust(4, '0') # instrucao - deixar zero [04]
|
139
|
+
detalhe << pagamento.formata_valor_mora # valor mora ao dia 9[13]
|
140
|
+
detalhe << pagamento.formata_data_desconto # data limite para desconto 9[06]
|
141
|
+
detalhe << pagamento.formata_valor_desconto # valor do desconto 9[13]
|
142
|
+
detalhe << pagamento.formata_valor_iof # valor do iof 9[13]
|
143
|
+
detalhe << pagamento.formata_valor_abatimento # valor do abatimento 9[13]
|
144
|
+
detalhe << pagamento.identificacao_sacado # identificacao do pagador 9[02]
|
145
|
+
detalhe << pagamento.documento_sacado.to_s.rjust(14, '0') # documento do pagador 9[14]
|
146
|
+
detalhe << pagamento.nome_sacado.format_size(40) # nome do pagador X[40]
|
147
|
+
detalhe << pagamento.endereco_sacado.format_size(40) # endereco do pagador X[40]
|
148
|
+
detalhe << pagamento.bairro_sacado.format_size(12) # bairro do pagador X[12]
|
149
|
+
detalhe << pagamento.cep_sacado # cep do pagador 9[08]
|
150
|
+
detalhe << pagamento.cidade_sacado.format_size(15) # cidade do pagador X[15]
|
151
|
+
detalhe << pagamento.uf_sacado # uf do pagador X[02]
|
152
|
+
detalhe << pagamento.nome_avalista.format_size(40) # nome do sacador/avalista X[30]
|
153
|
+
detalhe << '99' # prazo para protesto [02]
|
154
|
+
detalhe << '0' # código da moeda X[01]
|
155
|
+
detalhe << sequencial.to_s.rjust(6, '0') # numero do registro no arquivo 9[06]
|
156
|
+
detalhe
|
157
|
+
end
|
158
|
+
end
|
159
|
+
end
|
160
|
+
end
|
161
|
+
end
|
@@ -0,0 +1,158 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Brcobranca
|
4
|
+
module Remessa
|
5
|
+
module Cnab400
|
6
|
+
class Banrisul < Brcobranca::Remessa::Cnab400::Base
|
7
|
+
attr_accessor :convenio
|
8
|
+
|
9
|
+
validates_presence_of :agencia, :convenio, :sequencial_remessa, message: 'não pode estar em branco.'
|
10
|
+
validates_length_of :agencia, maximum: 4, message: 'deve ter 4 dígitos.'
|
11
|
+
validates_length_of :sequencial_remessa, maximum: 7, message: 'deve ter 7 dígitos.'
|
12
|
+
validates_length_of :convenio, maximum: 13, message: 'deve ter 13 dígitos.'
|
13
|
+
validates_length_of :carteira, maximum: 1, message: 'deve ter 1 dígito.'
|
14
|
+
|
15
|
+
def agencia=(valor)
|
16
|
+
@agencia = valor.to_s.rjust(4, '0') if valor
|
17
|
+
end
|
18
|
+
|
19
|
+
def convenio=(valor)
|
20
|
+
@convenio = valor.to_s.rjust(13, '0') if valor
|
21
|
+
end
|
22
|
+
|
23
|
+
def sequencial_remessa=(valor)
|
24
|
+
@sequencial_remessa = valor.to_s.rjust(7, '0') if valor
|
25
|
+
end
|
26
|
+
|
27
|
+
def info_conta
|
28
|
+
codigo_cedente.ljust(20, ' ')
|
29
|
+
end
|
30
|
+
|
31
|
+
def cod_banco
|
32
|
+
'041'
|
33
|
+
end
|
34
|
+
|
35
|
+
def nome_banco
|
36
|
+
'BANRISUL'.ljust(15, ' ')
|
37
|
+
end
|
38
|
+
|
39
|
+
def complemento
|
40
|
+
''.rjust(294, ' ')
|
41
|
+
end
|
42
|
+
|
43
|
+
def codigo_cedente
|
44
|
+
convenio
|
45
|
+
end
|
46
|
+
|
47
|
+
def digito_nosso_numero(nosso_numero)
|
48
|
+
nosso_numero.duplo_digito
|
49
|
+
end
|
50
|
+
|
51
|
+
# Header do arquivo remessa
|
52
|
+
#
|
53
|
+
# @return [String]
|
54
|
+
#
|
55
|
+
def monta_header
|
56
|
+
# CAMPO TAMANHO VALOR
|
57
|
+
# tipo do registro [1] 0
|
58
|
+
# operacao [1] 1
|
59
|
+
# literal remessa [7] REMESSA
|
60
|
+
# brancos [16]
|
61
|
+
# info. conta [20]
|
62
|
+
# empresa mae [30]
|
63
|
+
# cod. banco [3]
|
64
|
+
# nome banco [15]
|
65
|
+
# data geracao [6] formato DDMMAA
|
66
|
+
# complemento registro [294]
|
67
|
+
# num. sequencial [6] 000001
|
68
|
+
"01REMESSA #{info_conta}#{empresa_mae.format_size(30)}#{cod_banco}#{nome_banco}#{data_geracao}#{complemento}000001"
|
69
|
+
end
|
70
|
+
|
71
|
+
def monta_detalhe(pagamento, sequencial)
|
72
|
+
raise Brcobranca::RemessaInvalida, pagamento if pagamento.invalid?
|
73
|
+
|
74
|
+
detalhe = '1' # identificação do registro 9[01] 001 a 001
|
75
|
+
detalhe += ''.rjust(16, ' ') # brancos 9[16] 002 a 017
|
76
|
+
detalhe << codigo_cedente.rjust(13, ' ') # código do cedente X[13] 018 a 030
|
77
|
+
detalhe << ''.rjust(7, ' ') # brancos X[07] 031 a 037
|
78
|
+
detalhe << pagamento.documento_ou_numero.to_s.ljust(25, ' ') # num. controle X[25] 038 a 062
|
79
|
+
detalhe << pagamento.nosso_numero.to_s.rjust(8, '0') # identificação do título (nosso número) 9[08] 063 a 070
|
80
|
+
detalhe << digito_nosso_numero(pagamento.nosso_numero) # dígitos de conferência do nosso número (dv) 9[02] 071 a 072
|
81
|
+
detalhe << ''.rjust(32, ' ') # mensagem no bloqueto X[32] 073 a 104
|
82
|
+
detalhe << ''.rjust(3, ' ') # brancos X[03] 105 a 107
|
83
|
+
detalhe << carteira # carteira 9[01] 108 a 108
|
84
|
+
detalhe << pagamento.identificacao_ocorrencia # identificacao ocorrencia 9[02] 109 a 110
|
85
|
+
detalhe << pagamento.documento_ou_numero.to_s.ljust(10, ' ') # numero do documento alfanum. X[10] 111 a 120
|
86
|
+
detalhe << pagamento.data_vencimento.strftime('%d%m%y') # data de vencimento 9[06] 121 a 126
|
87
|
+
detalhe << pagamento.formata_valor # valor do titulo 9[13] 127 a 139
|
88
|
+
detalhe << cod_banco # banco encarregado 9[03] 140 a 142
|
89
|
+
detalhe << ''.rjust(5, ' ') # agencia depositaria (brancos) 9[05] 143 a 147
|
90
|
+
detalhe << '08' # especie do titulo 9[02] 148 a 149
|
91
|
+
detalhe << 'N' # identificacao (sempre N) X[01] 150 a 150
|
92
|
+
detalhe << pagamento.data_emissao.strftime('%d%m%y') # data de emissao 9[06] 151 a 156
|
93
|
+
detalhe << codigo_primeira_instrucao(pagamento) # 1a instrucao 9[02] 157 a 158
|
94
|
+
detalhe << pagamento.cod_segunda_instrucao # 2a instrucao 9[02] 159 a 160
|
95
|
+
detalhe << tipo_mora(pagamento) # tipo de mora (diária ou mensal) 9[13] 161 a 161
|
96
|
+
detalhe << formata_valor_mora(12, pagamento) # mora 9[13] 162 a 173
|
97
|
+
detalhe << pagamento.formata_data_desconto # data desconto 9[06] 174 a 179
|
98
|
+
detalhe << pagamento.formata_valor_desconto # valor desconto 9[13] 180 a 192
|
99
|
+
detalhe << pagamento.formata_valor_iof # valor iof 9[13] 193 a 205
|
100
|
+
detalhe << pagamento.formata_valor_abatimento # valor abatimento 9[13] 206 a 218
|
101
|
+
detalhe << pagamento.identificacao_sacado # identificacao do pagador 9[02] 219 a 220
|
102
|
+
detalhe << pagamento.documento_sacado.to_s.rjust(14, '0') # cpf/cnpj do pagador 9[14] 221 a 234
|
103
|
+
detalhe << pagamento.nome_sacado.format_size(35) # nome do pagador 9[35] 235 a 269
|
104
|
+
detalhe << ''.rjust(5, ' ') # brancos 9[05] 270 a 274
|
105
|
+
detalhe << pagamento.endereco_sacado.format_size(40) # endereco do pagador X[40] 275 a 314
|
106
|
+
detalhe << ''.rjust(7, ' ') # brancos X[07] 315 a 321
|
107
|
+
detalhe << formata_percentual_multa(pagamento) # percentual multa X[02] 322 a 324
|
108
|
+
detalhe << '00' # num.dias para a multa após o vencimento 9[02] 325 a 326
|
109
|
+
detalhe << pagamento.cep_sacado # cep do pagador 9[08] 327 a 334
|
110
|
+
detalhe << pagamento.cidade_sacado.format_size(15) # cidade do pagador 9[15] 335 a 349
|
111
|
+
detalhe << pagamento.uf_sacado # uf do pagador 9[02] 350 a 351
|
112
|
+
detalhe << '0000' # taxa ao dia para pag. antecipado 9[04] 352 a 355
|
113
|
+
detalhe << ' ' # branco 9[01] 356 a 356
|
114
|
+
detalhe << ''.rjust(13, '0') # valor para cálc. do desconto 9[13] 357 a 369
|
115
|
+
detalhe << pagamento.dias_protesto.to_s.rjust(2, '0') # dias para protesto 9[02] 370 a 371
|
116
|
+
detalhe << ''.rjust(23, ' ') # brancos X[23] 370 a 394
|
117
|
+
detalhe << sequencial.to_s.rjust(6, '0') # numero do registro do arquivo 9[06] 395 a 400
|
118
|
+
detalhe
|
119
|
+
end
|
120
|
+
|
121
|
+
def monta_trailer(sequencial)
|
122
|
+
trailer = '9'
|
123
|
+
trailer += ''.rjust(26, ' ') # brancos X[26] 002 a 027
|
124
|
+
trailer << valor_titulos_carteira(13) # total geral/valores dos títulos 9[13] 028 a 040
|
125
|
+
trailer << ''.rjust(354, ' ') # brancos X[354] 041 a 394
|
126
|
+
trailer << sequencial.to_s.rjust(6, '0') # sequencial 9[06] 395 a 400
|
127
|
+
trailer
|
128
|
+
end
|
129
|
+
|
130
|
+
private
|
131
|
+
|
132
|
+
def codigo_primeira_instrucao(pagamento)
|
133
|
+
return '18' if pagamento.percentual_multa.to_f > 0.00
|
134
|
+
|
135
|
+
pagamento.cod_primeira_instrucao
|
136
|
+
end
|
137
|
+
|
138
|
+
def tipo_mora(pagamento)
|
139
|
+
return ' ' if pagamento.tipo_mora == '3'
|
140
|
+
|
141
|
+
pagamento.tipo_mora
|
142
|
+
end
|
143
|
+
|
144
|
+
def formata_percentual_multa(pagamento)
|
145
|
+
raise ValorInvalido, 'Deve ser um Float' unless pagamento.percentual_multa.to_s.include?('.')
|
146
|
+
|
147
|
+
format('%.1f', pagamento.percentual_multa).delete('.').rjust(3, '0')
|
148
|
+
end
|
149
|
+
|
150
|
+
def formata_valor_mora(tamanho, pagamento)
|
151
|
+
return ''.rjust(tamanho, ' ') if pagamento.tipo_mora == '3'
|
152
|
+
|
153
|
+
pagamento.formata_valor_mora(tamanho)
|
154
|
+
end
|
155
|
+
end
|
156
|
+
end
|
157
|
+
end
|
158
|
+
end
|
@@ -0,0 +1,132 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Brcobranca
|
4
|
+
module Remessa
|
5
|
+
module Cnab400
|
6
|
+
class Base < Brcobranca::Remessa::Base
|
7
|
+
validates_presence_of :carteira, message: 'não pode estar em branco.'
|
8
|
+
|
9
|
+
# Data da geracao do arquivo seguindo o padrao DDMMAA
|
10
|
+
#
|
11
|
+
# @return [String]
|
12
|
+
#
|
13
|
+
def data_geracao
|
14
|
+
Date.current.strftime('%d%m%y')
|
15
|
+
end
|
16
|
+
|
17
|
+
# Header do arquivo remessa
|
18
|
+
#
|
19
|
+
# @return [String]
|
20
|
+
#
|
21
|
+
def monta_header
|
22
|
+
# CAMPO TAMANHO VALOR
|
23
|
+
# tipo do registro [1] 0
|
24
|
+
# operacao [1] 1
|
25
|
+
# literal remessa [7] REMESSA
|
26
|
+
# Código do serviço [2] 01
|
27
|
+
# cod. servico [15] COBRANCA
|
28
|
+
# info. conta [20]
|
29
|
+
# empresa mae [30]
|
30
|
+
# cod. banco [3]
|
31
|
+
# nome banco [15]
|
32
|
+
# data geracao [6] formato DDMMAA
|
33
|
+
# complemento registro [294]
|
34
|
+
# num. sequencial [6] 000001
|
35
|
+
"01REMESSA01COBRANCA #{info_conta}#{empresa_mae.format_size(30)}#{cod_banco}#{nome_banco}#{data_geracao}#{complemento}000001"
|
36
|
+
end
|
37
|
+
|
38
|
+
# Trailer do arquivo remessa
|
39
|
+
#
|
40
|
+
# @param sequencial
|
41
|
+
# num. sequencial do registro no arquivo
|
42
|
+
#
|
43
|
+
# @return [String]
|
44
|
+
#
|
45
|
+
def monta_trailer(sequencial)
|
46
|
+
# CAMPO TAMANHO VALOR
|
47
|
+
# identificacao registro [1] 9
|
48
|
+
# complemento [393]
|
49
|
+
# num. sequencial [6]
|
50
|
+
"9#{''.rjust(393, ' ')}#{sequencial.to_s.rjust(6, '0')}"
|
51
|
+
end
|
52
|
+
|
53
|
+
# Registro detalhe do arquivo remessa
|
54
|
+
#
|
55
|
+
# Este metodo deve ser sobrescrevido na classe do banco
|
56
|
+
#
|
57
|
+
def monta_detalhe(_pagamento, _sequencial)
|
58
|
+
raise Brcobranca::NaoImplementado,
|
59
|
+
'Sobreescreva este método na classe referente ao banco que você esta criando'
|
60
|
+
end
|
61
|
+
|
62
|
+
# Gera o arquivo com os registros
|
63
|
+
#
|
64
|
+
# @return [String]
|
65
|
+
def gera_arquivo
|
66
|
+
raise Brcobranca::RemessaInvalida, self unless valid?
|
67
|
+
|
68
|
+
# contador de registros no arquivo
|
69
|
+
contador = 1
|
70
|
+
ret = [monta_header]
|
71
|
+
pagamentos.each do |pagamento|
|
72
|
+
contador += 1
|
73
|
+
ret << monta_detalhe(pagamento, contador)
|
74
|
+
if pagamento.codigo_multa.to_i.positive? && respond_to?(:monta_detalhe_multa)
|
75
|
+
contador += 1
|
76
|
+
ret << monta_detalhe_multa(pagamento, contador)
|
77
|
+
end
|
78
|
+
|
79
|
+
# Adiciona registro de desconto adicional
|
80
|
+
if pagamento.valor_segundo_desconto.to_f.positive? && respond_to?(:monta_descontos_adicionais)
|
81
|
+
contador += 1
|
82
|
+
ret << monta_descontos_adicionais(pagamento, contador)
|
83
|
+
end
|
84
|
+
end
|
85
|
+
ret << monta_trailer(contador + 1)
|
86
|
+
|
87
|
+
remittance = ret.join("\n").remove_accents.upcase
|
88
|
+
remittance << "\n"
|
89
|
+
|
90
|
+
remittance.encode(remittance.encoding, universal_newline: true).encode(remittance.encoding,
|
91
|
+
crlf_newline: true)
|
92
|
+
end
|
93
|
+
|
94
|
+
# Informacoes referentes a conta do cedente
|
95
|
+
#
|
96
|
+
# Este metodo deve ser sobrescrevido na classe do banco
|
97
|
+
#
|
98
|
+
def info_conta
|
99
|
+
raise Brcobranca::NaoImplementado,
|
100
|
+
'Sobreescreva este método na classe referente ao banco que você esta criando'
|
101
|
+
end
|
102
|
+
|
103
|
+
# Numero do banco na camara de compensacao
|
104
|
+
#
|
105
|
+
# Este metodo deve ser sobrescrevido na classe do banco
|
106
|
+
#
|
107
|
+
def cod_banco
|
108
|
+
raise Brcobranca::NaoImplementado,
|
109
|
+
'Sobreescreva este método na classe referente ao banco que você esta criando'
|
110
|
+
end
|
111
|
+
|
112
|
+
# Nome por extenso do banco cobrador
|
113
|
+
#
|
114
|
+
# Este metodo deve ser sobrescrevido na classe do banco
|
115
|
+
#
|
116
|
+
def nome_banco
|
117
|
+
raise Brcobranca::NaoImplementado,
|
118
|
+
'Sobreescreva este método na classe referente ao banco que você esta criando'
|
119
|
+
end
|
120
|
+
|
121
|
+
# Complemento do registro header
|
122
|
+
#
|
123
|
+
# Este metodo deve ser sobrescrevido na classe do banco
|
124
|
+
#
|
125
|
+
def complemento
|
126
|
+
raise Brcobranca::NaoImplementado,
|
127
|
+
'Sobreescreva este método na classe referente ao banco que você esta criando'
|
128
|
+
end
|
129
|
+
end
|
130
|
+
end
|
131
|
+
end
|
132
|
+
end
|
@@ -0,0 +1,155 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Brcobranca
|
4
|
+
module Remessa
|
5
|
+
module Cnab400
|
6
|
+
class Bradesco < Brcobranca::Remessa::Cnab400::Base
|
7
|
+
# codigo da empresa (informado pelo Bradesco no cadastramento)
|
8
|
+
attr_accessor :codigo_empresa
|
9
|
+
|
10
|
+
validates_presence_of :agencia, :conta_corrente, message: 'não pode estar em branco.'
|
11
|
+
validates_presence_of :codigo_empresa, :sequencial_remessa,
|
12
|
+
:digito_conta, message: 'não pode estar em branco.'
|
13
|
+
validates_length_of :codigo_empresa, maximum: 20, message: 'deve ser menor ou igual a 20 dígitos.'
|
14
|
+
validates_length_of :agencia, maximum: 5, message: 'deve ter 5 dígitos.'
|
15
|
+
validates_length_of :conta_corrente, maximum: 7, message: 'deve ter 7 dígitos.'
|
16
|
+
validates_length_of :sequencial_remessa, maximum: 7, message: 'deve ter 7 dígitos.'
|
17
|
+
validates_length_of :carteira, maximum: 2, message: 'deve ter no máximo 2 dígitos.'
|
18
|
+
validates_length_of :digito_conta, maximum: 1, message: 'deve ter 1 dígito.'
|
19
|
+
|
20
|
+
def agencia=(valor)
|
21
|
+
@agencia = valor.to_s.rjust(5, '0') if valor
|
22
|
+
end
|
23
|
+
|
24
|
+
def conta_corrente=(valor)
|
25
|
+
@conta_corrente = valor.to_s.rjust(7, '0') if valor
|
26
|
+
end
|
27
|
+
|
28
|
+
def codigo_empresa=(valor)
|
29
|
+
@codigo_empresa = valor.to_s.rjust(20, '0') if valor
|
30
|
+
end
|
31
|
+
|
32
|
+
def sequencial_remessa=(valor)
|
33
|
+
@sequencial_remessa = valor.to_s.rjust(7, '0') if valor
|
34
|
+
end
|
35
|
+
|
36
|
+
def info_conta
|
37
|
+
codigo_empresa
|
38
|
+
end
|
39
|
+
|
40
|
+
def cod_banco
|
41
|
+
'237'
|
42
|
+
end
|
43
|
+
|
44
|
+
def nome_banco
|
45
|
+
'BRADESCO'.ljust(15, ' ')
|
46
|
+
end
|
47
|
+
|
48
|
+
def complemento
|
49
|
+
"#{''.rjust(8, ' ')}MX#{sequencial_remessa}#{''.rjust(277, ' ')}"
|
50
|
+
end
|
51
|
+
|
52
|
+
def identificacao_empresa
|
53
|
+
# identificacao da empresa no banco
|
54
|
+
identificacao = '0' # vazio [1]
|
55
|
+
identificacao += carteira.to_s.rjust(3, '0') # carteira [3]
|
56
|
+
identificacao << agencia # codigo da agencia (sem dv) [5]
|
57
|
+
identificacao << conta_corrente # codigo da conta [7]
|
58
|
+
identificacao << digito_conta # digito da conta [1]
|
59
|
+
end
|
60
|
+
|
61
|
+
def digito_nosso_numero(nosso_numero)
|
62
|
+
"#{carteira}#{nosso_numero.to_s.rjust(11, '0')}".modulo11(
|
63
|
+
multiplicador: [2, 3, 4, 5, 6, 7],
|
64
|
+
mapeamento: { 10 => 'P', 11 => 0 }
|
65
|
+
) { |total| 11 - (total % 11) }
|
66
|
+
end
|
67
|
+
|
68
|
+
# Formata o endereco do sacado
|
69
|
+
# de acordo com os caracteres disponiveis (40)
|
70
|
+
# concatenando o endereco, cidade e uf
|
71
|
+
#
|
72
|
+
def formata_endereco_sacado(pgto)
|
73
|
+
endereco = "#{pgto.endereco_sacado}, #{pgto.cidade_sacado}/#{pgto.uf_sacado}"
|
74
|
+
return endereco.ljust(40, ' ') if endereco.size <= 40
|
75
|
+
|
76
|
+
"#{pgto.endereco_sacado[0..19]} #{pgto.cidade_sacado[0..14]}/#{pgto.uf_sacado}".format_size(40)
|
77
|
+
end
|
78
|
+
|
79
|
+
def monta_detalhe(pagamento, sequencial)
|
80
|
+
raise Brcobranca::RemessaInvalida, pagamento if pagamento.invalid?
|
81
|
+
|
82
|
+
detalhe = '1' # identificacao do registro 9[01] 001 a 001
|
83
|
+
detalhe += ''.rjust(5, '0') # agencia de debito (op) 9[05] 002 a 006
|
84
|
+
detalhe << ''.rjust(1, '0') # digito da agencia de debito (op) X[01] 007 a 007
|
85
|
+
detalhe << ''.rjust(5, '0') # razao da conta corrente de debito (op) 9[05] 008 a 012
|
86
|
+
detalhe << ''.rjust(7, '0') # conta corrente (op) 9[07] 013 a 019
|
87
|
+
detalhe << ''.rjust(1, '0') # digito da conta corrente (op) X[01] 020 a 020
|
88
|
+
detalhe << identificacao_empresa # identficacao da empresa X[17] 021 a 037
|
89
|
+
detalhe << pagamento.documento_ou_numero.to_s.ljust(25, ' ') # num. controle X[25] 038 a 062
|
90
|
+
detalhe << ''.rjust(3, '0') # codigo do banco (debito automatico apenas) 9[03] 063 a 065
|
91
|
+
detalhe << pagamento.codigo_multa # campo da multa (0 = sem, 2 = com) 9[01] 066 a 066 *
|
92
|
+
detalhe << pagamento.formata_percentual_multa # percentual multa 9[04] 067 a 070 *
|
93
|
+
detalhe << pagamento.nosso_numero.to_s.rjust(11, '0') # identificacao do titulo (nosso numero) 9[11] 071 a 081
|
94
|
+
detalhe << digito_nosso_numero(pagamento.nosso_numero).to_s # digito de conferencia do nosso numero (dv) X[01] 082 a 082
|
95
|
+
detalhe << ''.rjust(10, '0') # desconto por dia 9[10] 083 a 092
|
96
|
+
detalhe << '2' # condicao emissao boleto (2 = cliente) 9[01] 093 a 093
|
97
|
+
detalhe << 'N' # emite boleto para debito X[01] 094 a 094
|
98
|
+
detalhe << ''.rjust(10, ' ') # operacao no banco (brancos) X[10] 095 a 104
|
99
|
+
detalhe << ' ' # indicador rateio X[01] 105 a 105
|
100
|
+
detalhe << '2' # endereco para aviso debito (op 2 = ignora) 9[01] 106 a 106
|
101
|
+
detalhe << ''.rjust(2, ' ') # brancos X[02] 107 a 108
|
102
|
+
detalhe << pagamento.identificacao_ocorrencia # identificacao ocorrencia 9[02]
|
103
|
+
detalhe << pagamento.numero.to_s.ljust(10, ' ') # numero do documento alfanum. X[10] 111 a 120
|
104
|
+
detalhe << pagamento.data_vencimento.strftime('%d%m%y') # data de vencimento 9[06] 121 a 126
|
105
|
+
detalhe << pagamento.formata_valor # valor do titulo 9[13] 127 a 139
|
106
|
+
detalhe << ''.rjust(3, '0') # banco encarregado (zeros) 9[03] 140 a 142
|
107
|
+
detalhe << ''.rjust(5, '0') # agencia depositaria (zeros) 9[05] 143 a 147
|
108
|
+
detalhe << '01' # especie do titulo 9[02] 148 a 149
|
109
|
+
detalhe << 'N' # identificacao (sempre N) X[01] 150 a 150
|
110
|
+
detalhe << pagamento.data_emissao.strftime('%d%m%y') # data de emissao 9[06] 151 a 156
|
111
|
+
detalhe << ''.rjust(2, '0') # 1a instrucao 9[02] 157 a 158
|
112
|
+
detalhe << ''.rjust(2, '0') # 2a instrucao 9[02] 159 a 160
|
113
|
+
detalhe << pagamento.formata_valor_mora # mora 9[13] 161 a 173
|
114
|
+
detalhe << pagamento.formata_data_desconto # data desconto 9[06] 174 a 179
|
115
|
+
detalhe << pagamento.formata_valor_desconto # valor desconto 9[13] 180 a 192
|
116
|
+
detalhe << pagamento.formata_valor_iof # valor iof 9[13] 193 a 205
|
117
|
+
detalhe << pagamento.formata_valor_abatimento # valor abatimento 9[13] 206 a 218
|
118
|
+
detalhe << pagamento.identificacao_sacado # identificacao do pagador 9[02] 219 a 220
|
119
|
+
detalhe << pagamento.documento_sacado.to_s.rjust(14, '0') # cpf/cnpj do pagador 9[14] 221 a 234
|
120
|
+
detalhe << pagamento.nome_sacado.format_size(40) # nome do pagador 9[40] 235 a 274
|
121
|
+
detalhe << formata_endereco_sacado(pagamento) # endereco do pagador X[40] 275 a 314
|
122
|
+
detalhe << ''.rjust(12, ' ') # 1a mensagem X[12] 315 a 326
|
123
|
+
detalhe << pagamento.cep_sacado[0..4] # cep do pagador 9[05] 327 a 331
|
124
|
+
detalhe << pagamento.cep_sacado[5..7] # sufixo do cep do pagador 9[03] 332 a 334
|
125
|
+
detalhe << ''.rjust(60, ' ') # sacador/2a mensagem - verificar X[60] 335 a 394
|
126
|
+
detalhe << sequencial.to_s.rjust(6, '0') # numero do registro do arquivo 9[06] 395 a 400
|
127
|
+
detalhe
|
128
|
+
end
|
129
|
+
|
130
|
+
def monta_descontos_adicionais(pagamento, sequencial)
|
131
|
+
raise Brcobranca::RemessaInvalida, pagamento if pagamento.invalid?
|
132
|
+
|
133
|
+
detalhe = '2' # identificacao do registro 9[01] 001 a 001
|
134
|
+
detalhe += ''.rjust(80, ' ') # mensagem 1 X[80] 002 a 081
|
135
|
+
detalhe << ''.rjust(80, ' ') # mensagem 2 X[80] 082 a 161
|
136
|
+
detalhe << ''.rjust(80, ' ') # mensagem 3 X[80] 162 a 241
|
137
|
+
detalhe << ''.rjust(80, ' ') # mensagem 4 X[80] 242 a 321
|
138
|
+
detalhe << pagamento.formata_data_segundo_desconto # data limite para o terceiro desconto 9[06] 322 a 327
|
139
|
+
detalhe << pagamento.formata_valor_segundo_desconto # valor do segundo desconto 9[13] 328 a 340
|
140
|
+
detalhe << pagamento.formata_data_terceiro_desconto # data limite para o terceiro desconto 9[06] 341 a 346
|
141
|
+
detalhe << pagamento.formata_valor_terceiro_desconto # valor do terceiro desconto 9[13] 347 a 359
|
142
|
+
detalhe << ''.rjust(7, ' ') # reserva X[07] 360 a 366
|
143
|
+
detalhe << carteira.to_s.rjust(3, '0') # carteira 9[03] 367 a 369
|
144
|
+
detalhe << agencia # codigo da agencia (sem dv) 9[05] 370 a 374
|
145
|
+
detalhe << conta_corrente # codigo da conta 9[07] 375 a 381
|
146
|
+
detalhe << digito_conta # digito da conta X[01] 382 a 382
|
147
|
+
detalhe << pagamento.nosso_numero.to_s.rjust(11, '0') # identificacao do titulo (nosso numero) 9[11] 383 a 393
|
148
|
+
detalhe << digito_nosso_numero(pagamento.nosso_numero).to_s # digito de conferencia do nosso numero (dv) X[01] 394 a 394
|
149
|
+
detalhe << sequencial.to_s.rjust(6, '0') # numero do registro do arquivo 9[06] 395 a 400
|
150
|
+
detalhe
|
151
|
+
end
|
152
|
+
end
|
153
|
+
end
|
154
|
+
end
|
155
|
+
end
|