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,259 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Brcobranca
|
4
|
+
module Remessa
|
5
|
+
module Cnab400
|
6
|
+
class Unicred < Brcobranca::Remessa::Cnab400::Base
|
7
|
+
# codigo da beneficiario (informado pelo Unicred no cadastramento)
|
8
|
+
attr_accessor :codigo_beneficiario
|
9
|
+
|
10
|
+
validates_presence_of :agencia, :conta_corrente, :documento_cedente,
|
11
|
+
:digito_conta, :codigo_beneficiario,
|
12
|
+
message: 'não pode estar em branco.'
|
13
|
+
|
14
|
+
validates_length_of :agencia, maximum: 4,
|
15
|
+
message: 'deve ter 4 dígitos.'
|
16
|
+
validates_length_of :conta_corrente, maximum: 5,
|
17
|
+
message: 'deve ter 5 dígitos.'
|
18
|
+
validates_length_of :documento_cedente, minimum: 11, maximum: 14,
|
19
|
+
message: 'deve ter entre 11 e 14 dígitos.'
|
20
|
+
validates_length_of :carteira, maximum: 2,
|
21
|
+
message: 'deve ter 2 dígitos.'
|
22
|
+
validates_length_of :digito_conta, maximum: 1,
|
23
|
+
message: 'deve ter 1 dígito.'
|
24
|
+
|
25
|
+
validates_inclusion_of :carteira, in: %w[21],
|
26
|
+
message: 'não existente para este banco.'
|
27
|
+
|
28
|
+
# Nova instancia do Unicred
|
29
|
+
def initialize(campos = {})
|
30
|
+
campos = {
|
31
|
+
aceite: 'N'
|
32
|
+
}.merge!(campos)
|
33
|
+
|
34
|
+
super(campos)
|
35
|
+
end
|
36
|
+
|
37
|
+
def agencia=(valor)
|
38
|
+
@agencia = valor.to_s.rjust(4, '0') if valor
|
39
|
+
end
|
40
|
+
|
41
|
+
def conta_corrente=(valor)
|
42
|
+
@conta_corrente = valor.to_s.rjust(5, '0') if valor
|
43
|
+
end
|
44
|
+
|
45
|
+
def carteira=(valor)
|
46
|
+
@carteira = valor.to_s.rjust(2, '0') if valor
|
47
|
+
end
|
48
|
+
|
49
|
+
def cod_banco
|
50
|
+
'136'
|
51
|
+
end
|
52
|
+
|
53
|
+
def nome_banco
|
54
|
+
'UNICRED'.ljust(15, ' ')
|
55
|
+
end
|
56
|
+
|
57
|
+
def identificador_complemento
|
58
|
+
' '
|
59
|
+
end
|
60
|
+
|
61
|
+
# Numero sequencial utilizado para identificar o boleto.
|
62
|
+
# @return [String] 10 caracteres numericos.
|
63
|
+
def nosso_numero(nosso_numero)
|
64
|
+
nosso_numero.to_s.rjust(10, '0')
|
65
|
+
end
|
66
|
+
|
67
|
+
# Digito verificador do nosso numero
|
68
|
+
# @return [Integer] 1 caracteres numericos.
|
69
|
+
def nosso_numero_dv(nosso_numero)
|
70
|
+
nosso_numero.to_s.modulo11(mapeamento: mapeamento_para_modulo_11)
|
71
|
+
end
|
72
|
+
|
73
|
+
def nosso_numero_boleto(nosso_numero)
|
74
|
+
"#{nosso_numero(nosso_numero)}#{nosso_numero_dv(nosso_numero)}"
|
75
|
+
end
|
76
|
+
|
77
|
+
# Retorna o nosso numero
|
78
|
+
#
|
79
|
+
# @return [String]
|
80
|
+
def formata_nosso_numero(nosso_numero)
|
81
|
+
nosso_numero_boleto(nosso_numero).to_s
|
82
|
+
end
|
83
|
+
|
84
|
+
def codigo_beneficiario=(valor)
|
85
|
+
@codigo_beneficiario = valor.to_s.rjust(20, '0') if valor
|
86
|
+
end
|
87
|
+
|
88
|
+
def info_conta
|
89
|
+
codigo_beneficiario
|
90
|
+
end
|
91
|
+
|
92
|
+
# Complemento do header
|
93
|
+
#
|
94
|
+
# @return [String]
|
95
|
+
#
|
96
|
+
def complemento
|
97
|
+
'codigo_beneficiario'.rjust(277, ' ')
|
98
|
+
end
|
99
|
+
|
100
|
+
def sequencial_remessa=(valor)
|
101
|
+
@sequencial_remessa = valor.to_s.rjust(7, '0') if valor
|
102
|
+
end
|
103
|
+
|
104
|
+
def digito_agencia
|
105
|
+
# utilizando a agencia com 4 digitos
|
106
|
+
# para calcular o digito
|
107
|
+
agencia.modulo11(mapeamento: { 10 => 'X' }).to_s
|
108
|
+
end
|
109
|
+
|
110
|
+
def digito_conta
|
111
|
+
# utilizando a conta corrente com 5 digitos
|
112
|
+
# para calcular o digito
|
113
|
+
conta_corrente.modulo11(mapeamento: { 10 => '0' }).to_s
|
114
|
+
end
|
115
|
+
|
116
|
+
def mapeamento_para_modulo_11
|
117
|
+
{
|
118
|
+
10 => 0,
|
119
|
+
11 => 0
|
120
|
+
}
|
121
|
+
end
|
122
|
+
|
123
|
+
# Header do arquivo remessa
|
124
|
+
#
|
125
|
+
# @return [String]
|
126
|
+
#
|
127
|
+
def monta_header
|
128
|
+
# CAMPO TAMANHO VALOR
|
129
|
+
# tipo do registro [1] 0
|
130
|
+
# operacao [1] 1
|
131
|
+
# literal remessa [7] REMESSA
|
132
|
+
# Codigo do serviço [2] 01
|
133
|
+
# cod. servico [15] COBRANCA
|
134
|
+
# info. conta [20]
|
135
|
+
# empresa mae [30]
|
136
|
+
# cod. banco [3]
|
137
|
+
# nome banco [15]
|
138
|
+
# data geracao [6] formato DDMMAA
|
139
|
+
# branco [7]
|
140
|
+
# Codigo da Variacaoo carteira da UNICRED 003
|
141
|
+
# Preencher com 000. [3] 000
|
142
|
+
# Numero Sequencial do arquivo [7]
|
143
|
+
# complemento registro [277]
|
144
|
+
# num. sequencial [6] 000001
|
145
|
+
header = "01REMESSA01COBRANCA #{info_conta}"
|
146
|
+
header += "#{empresa_mae.format_size(30)}#{cod_banco}"
|
147
|
+
header << "#{nome_banco}#{data_geracao} 000"
|
148
|
+
header << "#{sequencial_remessa}#{complemento}000001"
|
149
|
+
header
|
150
|
+
end
|
151
|
+
|
152
|
+
# Detalhe do arquivo
|
153
|
+
#
|
154
|
+
# @param pagamento [PagamentoCnab400]
|
155
|
+
# objeto contendo as informacoes referentes ao
|
156
|
+
# boleto (valor, vencimento, cliente)
|
157
|
+
# @param sequencial
|
158
|
+
# num. sequencial do registro no arquivo
|
159
|
+
#
|
160
|
+
# @return [String]
|
161
|
+
#
|
162
|
+
def monta_detalhe(pagamento, sequencial)
|
163
|
+
raise Brcobranca::RemessaInvalida, pagamento if pagamento.invalid?
|
164
|
+
|
165
|
+
# identificacao transacao 9[01]
|
166
|
+
detalhe = '1'
|
167
|
+
# Agencia do BENEFICIARIO na UNICRED 9[05] 002 a 006
|
168
|
+
detalhe += agencia.rjust(5, '0')
|
169
|
+
# Digito da Agencia 9[01] 007 a 007
|
170
|
+
detalhe << digito_agencia
|
171
|
+
# Conta Corrente 9[12] 008 a 019
|
172
|
+
detalhe << conta_corrente.rjust(12, '0')
|
173
|
+
# Digito da Conta 9[1] 020 a 020
|
174
|
+
detalhe << digito_conta
|
175
|
+
# Zero 9[1] 021 a 021
|
176
|
+
detalhe << '0'
|
177
|
+
# Codigo da Carteira 9[3] 022 a 024
|
178
|
+
detalhe << carteira.rjust(3, '0')
|
179
|
+
# Zeros 9[13] 025 a 037
|
180
|
+
detalhe << ''.rjust(13, '0')
|
181
|
+
# No Controle do Participante Uso
|
182
|
+
# da empresa 9[25] 038 a 062
|
183
|
+
detalhe << ''.rjust(25, ' ')
|
184
|
+
# Codigo do Banco na Camara de Compensacao 9[3] 063 a 065
|
185
|
+
detalhe << cod_banco
|
186
|
+
# Zeros 9[2] 066 a 067
|
187
|
+
detalhe << '00'
|
188
|
+
# Branco 9[25] 068 a 092
|
189
|
+
detalhe << ''.rjust(25, ' ')
|
190
|
+
# Filler 9[01] 093 a 093
|
191
|
+
detalhe << '0'
|
192
|
+
# Codigo da multa 9[1] 094 a 094
|
193
|
+
detalhe << pagamento.codigo_multa
|
194
|
+
# Valor/Percentual da Multa 9[1] 095 a 104
|
195
|
+
detalhe << pagamento.formata_percentual_multa(10)
|
196
|
+
# Tipo de Valor Mora 9[1] 105 a 105
|
197
|
+
detalhe << pagamento.tipo_mora
|
198
|
+
# Identificacao de Titulo Descontavel 9[1] 106 a 106
|
199
|
+
detalhe << 'N'
|
200
|
+
# Branco 9[1] 107 a 108
|
201
|
+
detalhe << ' '
|
202
|
+
# Identificacao da Ocorrencia 9[2] 109 a 110
|
203
|
+
detalhe << pagamento.identificacao_ocorrencia
|
204
|
+
# numero do documento X[10] 111 a 120
|
205
|
+
detalhe << pagamento.numero.to_s.rjust(10, '0')
|
206
|
+
# data do vencimento 9[06] 121 a 126
|
207
|
+
detalhe << pagamento.data_vencimento.strftime('%d%m%y')
|
208
|
+
# valor do documento 9[13] 127 a 139
|
209
|
+
detalhe << pagamento.formata_valor
|
210
|
+
# Filler 9[10] 140 a 149
|
211
|
+
detalhe << ''.rjust(10, '0')
|
212
|
+
# Codigo do Desconto 9[1] 150 a 150
|
213
|
+
detalhe << pagamento.cod_desconto
|
214
|
+
# data de emissao 9[06] 151 a 156
|
215
|
+
detalhe << pagamento.data_emissao.strftime('%d%m%y')
|
216
|
+
# Filler 9[01] 157 a 157
|
217
|
+
detalhe << '0'
|
218
|
+
# Codigo para Protesto 9[1] 158 a 158
|
219
|
+
detalhe << pagamento.codigo_protesto
|
220
|
+
# numero de dias para protesto 9[02] 159 a 160
|
221
|
+
detalhe << pagamento.dias_protesto.rjust(2, '0')
|
222
|
+
# valor mora ao dia 9[13] 161 a 173
|
223
|
+
detalhe << pagamento.formata_valor_mora(13)
|
224
|
+
# data limite para desconto 9[06] 174 a 179
|
225
|
+
detalhe << pagamento.formata_data_desconto
|
226
|
+
# valor do desconto 9[13] 180 a 192
|
227
|
+
detalhe << pagamento.formata_valor_desconto
|
228
|
+
# nosso numero X[11] 193 a 203
|
229
|
+
detalhe << formata_nosso_numero(pagamento.nosso_numero)
|
230
|
+
# Zeros 9[2] 204 a 205
|
231
|
+
detalhe << '00'
|
232
|
+
# valor do abatimento 9[13] 206 a 218
|
233
|
+
detalhe << pagamento.formata_valor_abatimento(13)
|
234
|
+
# Identificacao do Tipo de Inscricao do Pagador 9[2] 219 a 220
|
235
|
+
detalhe << pagamento.identificacao_sacado
|
236
|
+
# documento do pagador 9[14] 221 a 234
|
237
|
+
detalhe << pagamento.documento_sacado.to_s.rjust(14, '0')
|
238
|
+
# nome do pagador X[40] 235 a 274
|
239
|
+
detalhe << pagamento.nome_sacado.format_size(40)
|
240
|
+
# endereco do pagador X[40] 275 a 314
|
241
|
+
detalhe << pagamento.endereco_sacado.format_size(40)
|
242
|
+
# bairro do pagador X[12] 315 a 326
|
243
|
+
detalhe << pagamento.bairro_sacado.format_size(12)
|
244
|
+
# cep do pagador 9[08] 327 a 334
|
245
|
+
detalhe << pagamento.cep_sacado
|
246
|
+
# cidade do pagador X[15] 335 a 354
|
247
|
+
detalhe << pagamento.cidade_sacado.format_size(20)
|
248
|
+
# uf do pagador X[02] 355 a 356
|
249
|
+
detalhe << pagamento.uf_sacado
|
250
|
+
# nome do sacador/avalista X[38] 357 a 394
|
251
|
+
detalhe << pagamento.nome_avalista.format_size(38)
|
252
|
+
# numero do registro no arquivo 9[06] 395 a 400
|
253
|
+
detalhe << sequencial.to_s.rjust(6, '0')
|
254
|
+
detalhe
|
255
|
+
end
|
256
|
+
end
|
257
|
+
end
|
258
|
+
end
|
259
|
+
end
|
@@ -0,0 +1,320 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Brcobranca
|
4
|
+
module Remessa
|
5
|
+
class Pagamento
|
6
|
+
include Brcobranca::Validations
|
7
|
+
|
8
|
+
# <b>REQUERIDO</b>: nosso numero
|
9
|
+
attr_accessor :nosso_numero
|
10
|
+
# <b>REQUERIDO</b>: data do vencimento do boleto
|
11
|
+
attr_accessor :data_vencimento
|
12
|
+
# <b>REQUERIDO</b>: data de emissao do boleto
|
13
|
+
attr_accessor :data_emissao
|
14
|
+
# <b>REQUERIDO</b>: valor do boleto
|
15
|
+
attr_accessor :valor
|
16
|
+
# <b>REQUERIDO</b>: documento do sacado (cliente)
|
17
|
+
attr_accessor :documento_sacado
|
18
|
+
# <b>REQUERIDO</b>: nome do sacado (cliente)
|
19
|
+
attr_accessor :nome_sacado
|
20
|
+
# <b>REQUERIDO</b>: endereco do sacado (cliente)
|
21
|
+
attr_accessor :endereco_sacado
|
22
|
+
# <b>REQUERIDO</b>: bairro do sacado (cliente)
|
23
|
+
attr_accessor :bairro_sacado
|
24
|
+
# <b>REQUERIDO</b>: CEP do sacado (cliente)
|
25
|
+
attr_accessor :cep_sacado
|
26
|
+
# <b>REQUERIDO</b>: cidade do sacado (cliente)
|
27
|
+
attr_accessor :cidade_sacado
|
28
|
+
# <b>REQUERIDO</b>: UF do sacado (cliente)
|
29
|
+
attr_accessor :uf_sacado
|
30
|
+
# <b>REQUERIDO</b>: Código da ocorrência
|
31
|
+
attr_accessor :identificacao_ocorrencia
|
32
|
+
# <b>OPCIONAL</b>: nome do avalista
|
33
|
+
attr_accessor :nome_avalista
|
34
|
+
# <b>OPCIONAL</b>: documento do avalista
|
35
|
+
attr_accessor :documento_avalista
|
36
|
+
# <b>OPCIONAL</b>: codigo da 1a instrucao
|
37
|
+
attr_accessor :cod_primeira_instrucao
|
38
|
+
# <b>OPCIONAL</b>: codigo da 2a instrucao
|
39
|
+
attr_accessor :cod_segunda_instrucao
|
40
|
+
# <b>OPCIONAL</b>: valor da mora ao dia
|
41
|
+
attr_accessor :valor_mora
|
42
|
+
# <b>OPCIONAL</b>: data limite para o desconto
|
43
|
+
attr_accessor :data_desconto
|
44
|
+
# <b>OPCIONAL</b>: valor a ser concedido de desconto
|
45
|
+
attr_accessor :valor_desconto
|
46
|
+
# <b>OPCIONAL</b>: codigo do desconto (para CNAB240)
|
47
|
+
attr_accessor :cod_desconto
|
48
|
+
# <b>OPCIONAL</b>: valor do IOF
|
49
|
+
attr_accessor :valor_iof
|
50
|
+
# <b>OPCIONAL</b>: valor do abatimento
|
51
|
+
attr_accessor :valor_abatimento
|
52
|
+
# <b>OPCIONAL</b>: Número do Documento de Cobrança - Número adotado e controlado pelo Cliente,
|
53
|
+
# para identificar o título de cobrança.
|
54
|
+
# Informação utilizada para referenciar a identificação do documento objeto de cobrança.
|
55
|
+
# Poderá conter número de duplicata, no caso de cobrança de duplicatas; número da apólice,
|
56
|
+
# no caso de cobrança de seguros, etc
|
57
|
+
attr_accessor :numero
|
58
|
+
# <b>OPCIONAL</b>: Número utilizado para controle do beneficiário/cedente
|
59
|
+
attr_accessor :documento
|
60
|
+
# <b>OPCIONAL</b>: data limite para o desconto
|
61
|
+
attr_accessor :data_segundo_desconto
|
62
|
+
# <b>OPCIONAL</b>: valor a ser concedido de desconto
|
63
|
+
attr_accessor :valor_segundo_desconto
|
64
|
+
# <b>OPCIONAL</b>: data limite para o terceiro desconto
|
65
|
+
attr_accessor :data_terceiro_desconto
|
66
|
+
# <b>OPCIONAL</b>: valor a ser concedido de desconto
|
67
|
+
attr_accessor :valor_terceiro_desconto
|
68
|
+
# <b>OPCIONAL</b>: espécie do título
|
69
|
+
attr_accessor :especie_titulo
|
70
|
+
# <b>OPCIONAL</b>: código da multa
|
71
|
+
attr_accessor :codigo_multa
|
72
|
+
# <b>OPCIONAL</b>: Percentual multa por atraso %
|
73
|
+
attr_accessor :percentual_multa
|
74
|
+
# <b>OPCIONAL</b>: Data para cobrança de multa
|
75
|
+
attr_accessor :data_multa
|
76
|
+
# <b>OPCIONAL</b>: tipo de mora (diário, mensal)
|
77
|
+
attr_accessor :tipo_mora
|
78
|
+
# <b>OPCIONAL</b>: Data para cobrança de mora
|
79
|
+
attr_accessor :data_mora
|
80
|
+
# <b>OPCIONAL</b>: codigo dos juros
|
81
|
+
attr_accessor :codigo_juros
|
82
|
+
# <b>OPCIONAL</b>: codigo do protesto
|
83
|
+
attr_accessor :codigo_protesto
|
84
|
+
# <b>OPCIONAL</b>: dias para protesto
|
85
|
+
attr_accessor :dias_protesto
|
86
|
+
# <b>OPCIONAL</b>: codigo baixa
|
87
|
+
attr_accessor :codigo_baixa
|
88
|
+
# <b>OPCIONAL</b>: dias para baixa
|
89
|
+
attr_accessor :dias_baixa
|
90
|
+
# <b>OPCIONAL</b>: Número da Parcela
|
91
|
+
attr_accessor :parcela
|
92
|
+
|
93
|
+
validates_presence_of :nosso_numero, :data_vencimento, :valor,
|
94
|
+
:documento_sacado, :nome_sacado, :endereco_sacado,
|
95
|
+
:cep_sacado, :cidade_sacado, :uf_sacado, message: 'não pode estar em branco.'
|
96
|
+
validates_length_of :uf_sacado, is: 2, message: 'deve ter 2 dígitos.'
|
97
|
+
validates_length_of :cep_sacado, is: 8, message: 'deve ter 8 dígitos.'
|
98
|
+
validates_length_of :cod_desconto, is: 1, message: 'deve ter 1 dígito.'
|
99
|
+
validates_length_of :especie_titulo, is: 2, message: 'deve ter 2 dígitos.', allow_blank: true
|
100
|
+
validates_length_of :identificacao_ocorrencia, is: 2, message: 'deve ter 2 dígitos.'
|
101
|
+
|
102
|
+
# Nova instancia da classe Pagamento
|
103
|
+
#
|
104
|
+
# @param campos [Hash]
|
105
|
+
#
|
106
|
+
def initialize(campos = {})
|
107
|
+
padrao = {
|
108
|
+
data_emissao: Date.current,
|
109
|
+
data_segundo_desconto: '00-00-00',
|
110
|
+
data_terceiro_desconto: '00-00-00',
|
111
|
+
tipo_mora: '3',
|
112
|
+
valor_mora: 0.0,
|
113
|
+
valor_desconto: 0.0,
|
114
|
+
valor_segundo_desconto: 0.0,
|
115
|
+
valor_terceiro_desconto: 0.0,
|
116
|
+
valor_iof: 0.0,
|
117
|
+
valor_abatimento: 0.0,
|
118
|
+
nome_avalista: '',
|
119
|
+
cod_desconto: '0',
|
120
|
+
especie_titulo: '01',
|
121
|
+
identificacao_ocorrencia: '01',
|
122
|
+
codigo_multa: '0',
|
123
|
+
percentual_multa: 0.0,
|
124
|
+
parcela: '01',
|
125
|
+
codigo_protesto: '3',
|
126
|
+
dias_protesto: '00',
|
127
|
+
codigo_baixa: '0',
|
128
|
+
dias_baixa: '000',
|
129
|
+
cod_primeira_instrucao: '00',
|
130
|
+
cod_segunda_instrucao: '00'
|
131
|
+
}
|
132
|
+
|
133
|
+
campos = padrao.merge!(campos)
|
134
|
+
campos.each do |campo, valor|
|
135
|
+
send :"#{campo}=", valor
|
136
|
+
end
|
137
|
+
|
138
|
+
yield self if block_given?
|
139
|
+
end
|
140
|
+
|
141
|
+
# Formata a data de desconto de acordo com o formato passado
|
142
|
+
#
|
143
|
+
# @return [String]
|
144
|
+
#
|
145
|
+
def formata_data_desconto(formato = '%d%m%y')
|
146
|
+
data_desconto.strftime(formato)
|
147
|
+
rescue StandardError
|
148
|
+
if formato == '%d%m%y'
|
149
|
+
'000000'
|
150
|
+
else
|
151
|
+
'00000000'
|
152
|
+
end
|
153
|
+
end
|
154
|
+
|
155
|
+
# Formata a data de segundo desconto de acordo com o formato passado
|
156
|
+
#
|
157
|
+
# @return [String]
|
158
|
+
#
|
159
|
+
def formata_data_segundo_desconto(formato = '%d%m%y')
|
160
|
+
data_segundo_desconto.strftime(formato)
|
161
|
+
rescue StandardError
|
162
|
+
if formato == '%d%m%y'
|
163
|
+
'000000'
|
164
|
+
else
|
165
|
+
'00000000'
|
166
|
+
end
|
167
|
+
end
|
168
|
+
|
169
|
+
# Formata a data de terceiro desconto de acordo com o formato passado
|
170
|
+
#
|
171
|
+
# @return [String]
|
172
|
+
#
|
173
|
+
def formata_data_terceiro_desconto(formato = '%d%m%y')
|
174
|
+
data_terceiro_desconto.strftime(formato)
|
175
|
+
rescue StandardError
|
176
|
+
if formato == '%d%m%y'
|
177
|
+
'000000'
|
178
|
+
else
|
179
|
+
'00000000'
|
180
|
+
end
|
181
|
+
end
|
182
|
+
|
183
|
+
# Formata a valor do percentual da multa
|
184
|
+
#
|
185
|
+
# @param tamanho [Integer]
|
186
|
+
# quantidade de caracteres a ser retornado
|
187
|
+
#
|
188
|
+
# @return [String]
|
189
|
+
#
|
190
|
+
def formata_percentual_multa(tamanho = 4)
|
191
|
+
format_value(:percentual_multa, tamanho)
|
192
|
+
end
|
193
|
+
|
194
|
+
# Formata a data de cobrança da multa
|
195
|
+
#
|
196
|
+
# @return [String]
|
197
|
+
#
|
198
|
+
def formata_data_multa(formato = '%d%m%y')
|
199
|
+
data_multa.strftime(formato)
|
200
|
+
rescue StandardError
|
201
|
+
if formato == '%d%m%y'
|
202
|
+
'000000'
|
203
|
+
else
|
204
|
+
'00000000'
|
205
|
+
end
|
206
|
+
end
|
207
|
+
|
208
|
+
# Formata o campo valor
|
209
|
+
# referentes as casas decimais
|
210
|
+
# exe. R$199,90 => 0000000019990
|
211
|
+
#
|
212
|
+
# @param tamanho [Integer]
|
213
|
+
# quantidade de caracteres a ser retornado
|
214
|
+
#
|
215
|
+
def formata_valor(tamanho = 13)
|
216
|
+
format_value(:valor, tamanho)
|
217
|
+
end
|
218
|
+
|
219
|
+
def documento_ou_numero
|
220
|
+
documento || numero
|
221
|
+
end
|
222
|
+
|
223
|
+
def formata_documento_ou_numero(tamanho = 25, caracter = ' ')
|
224
|
+
doc = documento_ou_numero.to_s.gsub(/[^0-9A-Za-z ]/, '')
|
225
|
+
doc.rjust(tamanho, caracter)[0...tamanho]
|
226
|
+
end
|
227
|
+
|
228
|
+
# Formata o campo valor da mora
|
229
|
+
#
|
230
|
+
# @param tamanho [Integer]
|
231
|
+
# quantidade de caracteres a ser retornado
|
232
|
+
#
|
233
|
+
def formata_valor_mora(tamanho = 13)
|
234
|
+
format_value(:valor_mora, tamanho)
|
235
|
+
end
|
236
|
+
|
237
|
+
# Formata o campo valor da multa
|
238
|
+
#
|
239
|
+
# @param tamanho [Integer]
|
240
|
+
# quantidade de caracteres a ser retornado
|
241
|
+
#
|
242
|
+
def formata_valor_multa(tamanho = 6)
|
243
|
+
format_value(:percentual_multa, tamanho)
|
244
|
+
end
|
245
|
+
|
246
|
+
# Formata o campo valor do desconto
|
247
|
+
#
|
248
|
+
# @param tamanho [Integer]
|
249
|
+
# quantidade de caracteres a ser retornado
|
250
|
+
#
|
251
|
+
def formata_valor_desconto(tamanho = 13)
|
252
|
+
format_value(:valor_desconto, tamanho)
|
253
|
+
end
|
254
|
+
|
255
|
+
# Formata o campo valor do segundo desconto
|
256
|
+
#
|
257
|
+
# @param tamanho [Integer]
|
258
|
+
# quantidade de caracteres a ser retornado
|
259
|
+
#
|
260
|
+
def formata_valor_segundo_desconto(tamanho = 13)
|
261
|
+
format_value(:valor_segundo_desconto, tamanho)
|
262
|
+
end
|
263
|
+
|
264
|
+
# Formata o campo valor do terceiro desconto
|
265
|
+
#
|
266
|
+
# @param tamanho [Integer]
|
267
|
+
# quantidade de caracteres a ser retornado
|
268
|
+
#
|
269
|
+
def formata_valor_terceiro_desconto(tamanho = 13)
|
270
|
+
format_value(:valor_terceiro_desconto, tamanho)
|
271
|
+
end
|
272
|
+
|
273
|
+
# Formata o campo valor do IOF
|
274
|
+
#
|
275
|
+
# @param tamanho [Integer]
|
276
|
+
# quantidade de caracteres a ser retornado
|
277
|
+
#
|
278
|
+
def formata_valor_iof(tamanho = 13)
|
279
|
+
format_value(:valor_iof, tamanho)
|
280
|
+
end
|
281
|
+
|
282
|
+
# Formata o campo valor do IOF
|
283
|
+
#
|
284
|
+
# @param tamanho [Integer]
|
285
|
+
# quantidade de caracteres a ser retornado
|
286
|
+
#
|
287
|
+
def formata_valor_abatimento(tamanho = 13)
|
288
|
+
format_value(:valor_abatimento, tamanho)
|
289
|
+
end
|
290
|
+
|
291
|
+
# Retorna a identificacao do pagador
|
292
|
+
# Se for pessoa fisica (CPF com 11 digitos) é 1
|
293
|
+
# Se for juridica (CNPJ com 14 digitos) é 2
|
294
|
+
#
|
295
|
+
def identificacao_sacado(zero = true)
|
296
|
+
Brcobranca::Util::Empresa.new(documento_sacado, zero).tipo
|
297
|
+
end
|
298
|
+
|
299
|
+
# Retorna a identificacao do avalista
|
300
|
+
# Se for pessoa fisica (CPF com 11 digitos) é 1
|
301
|
+
# Se for juridica (CNPJ com 14 digitos) é 2
|
302
|
+
#
|
303
|
+
def identificacao_avalista(zero = true)
|
304
|
+
return '0' if documento_avalista.nil?
|
305
|
+
|
306
|
+
Brcobranca::Util::Empresa.new(documento_avalista, zero).tipo
|
307
|
+
end
|
308
|
+
|
309
|
+
private
|
310
|
+
|
311
|
+
def format_value(attribute, tamanho)
|
312
|
+
value = send(attribute)
|
313
|
+
|
314
|
+
raise ValorInvalido, "Pagamento##{attribute}: Deve ser um Float" unless value.to_s.include?('.')
|
315
|
+
|
316
|
+
format('%.2f', value).delete('.').rjust(tamanho, '0')
|
317
|
+
end
|
318
|
+
end
|
319
|
+
end
|
320
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Brcobranca
|
4
|
+
module Retorno
|
5
|
+
# Classe base para retornos bancários
|
6
|
+
class Base
|
7
|
+
attr_accessor :codigo_registro, :agencia_com_dv, :agencia_sem_dv, :cedente_com_dv, :convenio, :nosso_numero,
|
8
|
+
:documento_numero, :tipo_cobranca, :tipo_cobranca_anterior, :natureza_recebimento, :carteira_variacao, :desconto, :iof, :carteira, :comando, :data_liquidacao, :data_vencimento, :valor_titulo, :banco_recebedor, :agencia_recebedora_com_dv, :especie_documento, :codigo_ocorrencia, :motivo_ocorrencia, :data_ocorrencia, :data_credito, :valor_tarifa, :outras_despesas, :juros_desconto, :iof_desconto, :valor_abatimento, :desconto_concedito, :valor_recebido, :juros_mora, :outros_recebimento, :abatimento_nao_aproveitado, :valor_lancamento, :indicativo_lancamento, :indicador_valor, :valor_ajuste, :sequencial, :arquivo
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,104 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'parseline'
|
4
|
+
|
5
|
+
module Brcobranca
|
6
|
+
module Retorno
|
7
|
+
module Cnab240
|
8
|
+
class Ailos < Brcobranca::Retorno::Cnab240::Base
|
9
|
+
# Regex para remoção de headers e trailers além de registros diferentes de T ou U
|
10
|
+
REGEX_DE_EXCLUSAO_DE_REGISTROS_NAO_T_OU_U = /^((?!^.{7}3.{5}[T|U].*$).)*$/.freeze
|
11
|
+
|
12
|
+
def self.load_lines(file, options = {})
|
13
|
+
default_options = { except: REGEX_DE_EXCLUSAO_DE_REGISTROS_NAO_T_OU_U }
|
14
|
+
options = default_options.merge!(options)
|
15
|
+
|
16
|
+
Line.load_lines(file, options).each_slice(2).reduce([]) do |retornos, cnab_lines|
|
17
|
+
retornos << generate_retorno_based_on_cnab_lines(cnab_lines)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.generate_retorno_based_on_cnab_lines(cnab_lines)
|
22
|
+
retorno = new
|
23
|
+
cnab_lines.each do |line|
|
24
|
+
if line.tipo_registro == 'T'
|
25
|
+
Line::REGISTRO_T_FIELDS.each do |attr|
|
26
|
+
retorno.send(:"#{attr}=", line.send(attr))
|
27
|
+
end
|
28
|
+
else
|
29
|
+
Line::REGISTRO_U_FIELDS.each do |attr|
|
30
|
+
retorno.send(:"#{attr}=", line.send(attr))
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
retorno
|
35
|
+
end
|
36
|
+
|
37
|
+
# Linha de mapeamento do retorno do arquivo CNAB 240
|
38
|
+
# O registro CNAB 240 possui 2 tipos de registros que juntos geram um registro de retorno bancário
|
39
|
+
# O primeiro é do tipo T que retorna dados gerais sobre a transação
|
40
|
+
# O segundo é do tipo U que retorna os valores da transação
|
41
|
+
class Line < Base
|
42
|
+
extend ParseLine::FixedWidth # Extendendo parseline
|
43
|
+
|
44
|
+
REGISTRO_T_FIELDS = %w[codigo_registro codigo_ocorrencia agencia_com_dv cedente_com_dv nosso_numero carteira
|
45
|
+
data_vencimento valor_titulo banco_recebedor agencia_recebedora_com_dv sequencial valor_tarifa motivo_ocorrencia].freeze
|
46
|
+
REGISTRO_U_FIELDS = %w[desconto_concedito valor_abatimento iof_desconto juros_mora valor_recebido
|
47
|
+
outras_despesas outros_recebimento data_credito data_ocorrencia].freeze
|
48
|
+
|
49
|
+
attr_accessor :tipo_registro
|
50
|
+
|
51
|
+
fixed_width_layout do |parse|
|
52
|
+
# Segmento T
|
53
|
+
parse.field :codigo_registro, 7..7
|
54
|
+
parse.field :sequencial, 8..12
|
55
|
+
parse.field :tipo_registro, 13..13
|
56
|
+
parse.field :codigo_ocorrencia, 15..16
|
57
|
+
parse.field :agencia_com_dv, 17..22
|
58
|
+
parse.field :cedente_com_dv, 23..35
|
59
|
+
parse.field :nosso_numero, 37..56
|
60
|
+
parse.field :carteira, 57..57
|
61
|
+
parse.field :data_vencimento, 73..80
|
62
|
+
parse.field :valor_titulo, 81..95
|
63
|
+
parse.field :banco_recebedor, 96..98
|
64
|
+
parse.field :agencia_recebedora_com_dv, 99..104
|
65
|
+
parse.field :valor_tarifa, 198..212
|
66
|
+
parse.field :motivo_ocorrencia, 213..222, lambda { |motivos|
|
67
|
+
motivos.scan(/.{2}/).reject(&:blank?).reject { |motivo| motivo == '00' }
|
68
|
+
}
|
69
|
+
|
70
|
+
# Segmento U
|
71
|
+
parse.field :data_ocorrencia, 137..144
|
72
|
+
parse.field :data_credito, 145..152
|
73
|
+
parse.field :outras_despesas, 107..121
|
74
|
+
parse.field :iof_desconto, 62..76
|
75
|
+
parse.field :valor_abatimento, 47..61
|
76
|
+
parse.field :desconto_concedito, 32..46
|
77
|
+
parse.field :valor_recebido, 77..91
|
78
|
+
parse.field :juros_mora, 17..31
|
79
|
+
parse.field :outros_recebimento, 122..136
|
80
|
+
|
81
|
+
# Dados que não consegui extrair dos registros T e U
|
82
|
+
# parse.field :convenio,31..37
|
83
|
+
# parse.field :tipo_cobranca,80..80
|
84
|
+
# parse.field :tipo_cobranca_anterior,81..81
|
85
|
+
# parse.field :natureza_recebimento,86..87
|
86
|
+
# parse.field :carteira_variacao,91..93
|
87
|
+
# parse.field :desconto,95..99
|
88
|
+
# parse.field :iof,100..104
|
89
|
+
# parse.field :comando,108..109
|
90
|
+
# parse.field :data_liquidacao,110..115
|
91
|
+
# parse.field :especie_documento,173..174
|
92
|
+
# parse.field :valor_tarifa,181..187
|
93
|
+
# parse.field :juros_desconto,201..213
|
94
|
+
# parse.field :abatimento_nao_aproveitado,292..304
|
95
|
+
# parse.field :valor_lancamento,305..317
|
96
|
+
# parse.field :indicativo_lancamento,318..318
|
97
|
+
# parse.field :indicador_valor,319..319
|
98
|
+
# parse.field :valor_ajuste,320..331
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|