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.
Files changed (126) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +3 -0
  3. data/LICENSE +20 -0
  4. data/README.md +91 -0
  5. data/Rakefile +8 -0
  6. data/lib/brcobranca/arquivos/logos/ailos.eps +412 -0
  7. data/lib/brcobranca/arquivos/logos/ailos_carne.eps +412 -0
  8. data/lib/brcobranca/arquivos/logos/bancobrasil.eps +5402 -0
  9. data/lib/brcobranca/arquivos/logos/bancobrasil_carne.eps +5410 -0
  10. data/lib/brcobranca/arquivos/logos/bancobrasilia.eps +0 -0
  11. data/lib/brcobranca/arquivos/logos/bancobrasilia_carne.eps +0 -0
  12. data/lib/brcobranca/arquivos/logos/banconordeste.eps +0 -0
  13. data/lib/brcobranca/arquivos/logos/banconordeste_carne.eps +0 -0
  14. data/lib/brcobranca/arquivos/logos/banestes.eps +5198 -0
  15. data/lib/brcobranca/arquivos/logos/banestes_carne.eps +5206 -0
  16. data/lib/brcobranca/arquivos/logos/banrisul.eps +121 -0
  17. data/lib/brcobranca/arquivos/logos/banrisul_carne.eps +121 -0
  18. data/lib/brcobranca/arquivos/logos/bradesco.eps +5210 -0
  19. data/lib/brcobranca/arquivos/logos/bradesco_carne.eps +5214 -0
  20. data/lib/brcobranca/arquivos/logos/caixa.eps +5111 -0
  21. data/lib/brcobranca/arquivos/logos/caixa_carne.eps +5115 -0
  22. data/lib/brcobranca/arquivos/logos/cecred.eps +0 -0
  23. data/lib/brcobranca/arquivos/logos/cecred_carne.eps +0 -0
  24. data/lib/brcobranca/arquivos/logos/citibank.eps +745 -0
  25. data/lib/brcobranca/arquivos/logos/citibank_carne.eps +745 -0
  26. data/lib/brcobranca/arquivos/logos/credisis.eps +0 -0
  27. data/lib/brcobranca/arquivos/logos/credisis_carne.eps +0 -0
  28. data/lib/brcobranca/arquivos/logos/hsbc.eps +5124 -0
  29. data/lib/brcobranca/arquivos/logos/hsbc_carne.eps +5128 -0
  30. data/lib/brcobranca/arquivos/logos/itau.eps +5318 -0
  31. data/lib/brcobranca/arquivos/logos/itau_carne.eps +5322 -0
  32. data/lib/brcobranca/arquivos/logos/safra.eps +0 -0
  33. data/lib/brcobranca/arquivos/logos/safra_carne.eps +0 -0
  34. data/lib/brcobranca/arquivos/logos/santander.eps +5305 -0
  35. data/lib/brcobranca/arquivos/logos/santander_carne.eps +5313 -0
  36. data/lib/brcobranca/arquivos/logos/sicoob.eps +5375 -0
  37. data/lib/brcobranca/arquivos/logos/sicoob_carne.eps +5379 -0
  38. data/lib/brcobranca/arquivos/logos/sicredi.eps +5379 -0
  39. data/lib/brcobranca/arquivos/logos/sicredi_carne.eps +5383 -0
  40. data/lib/brcobranca/arquivos/logos/unicred.eps +0 -0
  41. data/lib/brcobranca/arquivos/logos/unicred_carne.eps +0 -0
  42. data/lib/brcobranca/arquivos/templates/modelo_carne.eps +1112 -0
  43. data/lib/brcobranca/arquivos/templates/modelo_generico.eps +0 -0
  44. data/lib/brcobranca/arquivos/templates/modelo_generico2.eps +9967 -0
  45. data/lib/brcobranca/boleto/ailos.rb +89 -0
  46. data/lib/brcobranca/boleto/banco_brasil.rb +165 -0
  47. data/lib/brcobranca/boleto/banco_brasilia.rb +102 -0
  48. data/lib/brcobranca/boleto/banco_nordeste.rb +80 -0
  49. data/lib/brcobranca/boleto/banestes.rb +86 -0
  50. data/lib/brcobranca/boleto/banrisul.rb +95 -0
  51. data/lib/brcobranca/boleto/base.rb +256 -0
  52. data/lib/brcobranca/boleto/bradesco.rb +100 -0
  53. data/lib/brcobranca/boleto/caixa.rb +123 -0
  54. data/lib/brcobranca/boleto/citibank.rb +97 -0
  55. data/lib/brcobranca/boleto/credisis.rb +118 -0
  56. data/lib/brcobranca/boleto/hsbc.rb +96 -0
  57. data/lib/brcobranca/boleto/itau.rb +138 -0
  58. data/lib/brcobranca/boleto/safra.rb +152 -0
  59. data/lib/brcobranca/boleto/santander.rb +86 -0
  60. data/lib/brcobranca/boleto/sicoob.rb +120 -0
  61. data/lib/brcobranca/boleto/sicredi.rb +145 -0
  62. data/lib/brcobranca/boleto/template/base.rb +28 -0
  63. data/lib/brcobranca/boleto/template/rghost.rb +308 -0
  64. data/lib/brcobranca/boleto/template/rghost2.rb +264 -0
  65. data/lib/brcobranca/boleto/template/rghost_bolepix.rb +286 -0
  66. data/lib/brcobranca/boleto/template/rghost_carne.rb +319 -0
  67. data/lib/brcobranca/boleto/unicred.rb +99 -0
  68. data/lib/brcobranca/calculo.rb +120 -0
  69. data/lib/brcobranca/calculo_data.rb +63 -0
  70. data/lib/brcobranca/currency.rb +69 -0
  71. data/lib/brcobranca/formatacao.rb +104 -0
  72. data/lib/brcobranca/formatacao_string.rb +37 -0
  73. data/lib/brcobranca/limpeza.rb +20 -0
  74. data/lib/brcobranca/remessa/base.rb +72 -0
  75. data/lib/brcobranca/remessa/cnab240/ailos.rb +156 -0
  76. data/lib/brcobranca/remessa/cnab240/banco_brasil.rb +249 -0
  77. data/lib/brcobranca/remessa/cnab240/base.rb +529 -0
  78. data/lib/brcobranca/remessa/cnab240/base_correspondente.rb +307 -0
  79. data/lib/brcobranca/remessa/cnab240/caixa.rb +171 -0
  80. data/lib/brcobranca/remessa/cnab240/santander.rb +225 -0
  81. data/lib/brcobranca/remessa/cnab240/sicoob.rb +229 -0
  82. data/lib/brcobranca/remessa/cnab240/sicoob_banco_brasil.rb +101 -0
  83. data/lib/brcobranca/remessa/cnab240/sicredi.rb +183 -0
  84. data/lib/brcobranca/remessa/cnab240/unicred.rb +10 -0
  85. data/lib/brcobranca/remessa/cnab400/banco_brasil.rb +169 -0
  86. data/lib/brcobranca/remessa/cnab400/banco_brasilia.rb +167 -0
  87. data/lib/brcobranca/remessa/cnab400/banco_nordeste.rb +161 -0
  88. data/lib/brcobranca/remessa/cnab400/banrisul.rb +158 -0
  89. data/lib/brcobranca/remessa/cnab400/base.rb +132 -0
  90. data/lib/brcobranca/remessa/cnab400/bradesco.rb +155 -0
  91. data/lib/brcobranca/remessa/cnab400/citibank.rb +139 -0
  92. data/lib/brcobranca/remessa/cnab400/credisis.rb +130 -0
  93. data/lib/brcobranca/remessa/cnab400/itau.rb +162 -0
  94. data/lib/brcobranca/remessa/cnab400/santander.rb +233 -0
  95. data/lib/brcobranca/remessa/cnab400/sicoob.rb +305 -0
  96. data/lib/brcobranca/remessa/cnab400/sicredi.rb +117 -0
  97. data/lib/brcobranca/remessa/cnab400/unicred.rb +259 -0
  98. data/lib/brcobranca/remessa/pagamento.rb +320 -0
  99. data/lib/brcobranca/retorno/base.rb +11 -0
  100. data/lib/brcobranca/retorno/cnab240/ailos.rb +104 -0
  101. data/lib/brcobranca/retorno/cnab240/base.rb +41 -0
  102. data/lib/brcobranca/retorno/cnab240/caixa.rb +47 -0
  103. data/lib/brcobranca/retorno/cnab240/santander.rb +99 -0
  104. data/lib/brcobranca/retorno/cnab240/sicoob.rb +101 -0
  105. data/lib/brcobranca/retorno/cnab240/sicredi.rb +82 -0
  106. data/lib/brcobranca/retorno/cnab400/banco_brasil.rb +130 -0
  107. data/lib/brcobranca/retorno/cnab400/banco_brasilia.rb +90 -0
  108. data/lib/brcobranca/retorno/cnab400/banco_nordeste.rb +113 -0
  109. data/lib/brcobranca/retorno/cnab400/banrisul.rb +42 -0
  110. data/lib/brcobranca/retorno/cnab400/base.rb +53 -0
  111. data/lib/brcobranca/retorno/cnab400/bradesco.rb +124 -0
  112. data/lib/brcobranca/retorno/cnab400/credisis.rb +116 -0
  113. data/lib/brcobranca/retorno/cnab400/itau.rb +144 -0
  114. data/lib/brcobranca/retorno/cnab400/santander.rb +58 -0
  115. data/lib/brcobranca/retorno/cnab400/sicredi.rb +78 -0
  116. data/lib/brcobranca/retorno/cnab400/unicred.rb +123 -0
  117. data/lib/brcobranca/retorno/retorno_cbr643.rb +48 -0
  118. data/lib/brcobranca/retorno/retorno_cnab240.rb +99 -0
  119. data/lib/brcobranca/retorno/retorno_cnab400.rb +71 -0
  120. data/lib/brcobranca/util/date.rb +21 -0
  121. data/lib/brcobranca/util/empresa.rb +29 -0
  122. data/lib/brcobranca/util/errors.rb +76 -0
  123. data/lib/brcobranca/validations.rb +208 -0
  124. data/lib/brcobranca/version.rb +5 -0
  125. data/lib/brcobranca.rb +200 -0
  126. 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