formatos-febraban 0.3.53 → 0.3.54
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/base/position.rb +2 -2
- data/lib/formatos/cnab400/cnab_400.rb +78 -24
- data/lib/formatos/cnab400/cnab_400_detalhe.rb +520 -137
- data/lib/formatos/cnab400/cnab_400_header.rb +135 -25
- data/lib/formatos/cnab400/cnab_400_trailler.rb +207 -33
- data/lib/formatos/febraban/version.rb +1 -1
- metadata +2 -2
@@ -5,33 +5,78 @@
|
|
5
5
|
class Cnab4000Header < FormatSection
|
6
6
|
require 'date'
|
7
7
|
|
8
|
-
def initialize
|
8
|
+
def initialize(master, tipo)
|
9
9
|
super(master, true, true, false)
|
10
|
-
|
10
|
+
|
11
|
+
@versao = tipo
|
12
|
+
|
13
|
+
case @versao
|
14
|
+
when :remessa
|
15
|
+
header_remessa
|
16
|
+
when :retorno
|
17
|
+
header_retorno
|
18
|
+
else
|
19
|
+
raise "Versão não suportada: #{tipo}"
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def header_remessa
|
24
|
+
|
11
25
|
@section = Section.new({
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
26
|
+
0 => Position.new(1, 1, false, "0", true), # Código do Registro
|
27
|
+
1 => Position.new(2, 1, false, "1"), # Código Arquivo (1-Remessa, 2-Retorno)
|
28
|
+
2 => Position.new(3, 7, false, "REMESSA"), # Identificação literal do arquivo (REMESSA/RETORNO)
|
29
|
+
3 => Position.new(4, 2, false, "01"), # Código do serviço
|
30
|
+
4 => Position.new(5, 15, false, "COBRANCA"), # Literal do serviço (COBRANÇA)
|
31
|
+
5 => Position.new(6, 20, true), # Código da Empresa
|
32
|
+
6 => Position.new(7, 30, false), # Nome da Empresa
|
33
|
+
7 => Position.new(8, 3, true), # Número do Banco (BRADESCO: 237)
|
34
|
+
8 => Position.new(9, 15, false), # Nome do Banco
|
35
|
+
9 => Position.new(10, 6, false), # Data de gravacao do arquivo (DDMMAA)
|
36
|
+
10 => Position.new(11, 8, false), # Reservado pelo Sistema - branco
|
37
|
+
11 => Position.new(12, 2, false, "01"), # Identificacao do sistema (01: remessa)
|
38
|
+
12 => Position.new(13, 7, true), # Numero sequencial da remessa
|
39
|
+
13 => Position.new(14, 277, false), # Reservado pelo Sistema - branco
|
40
|
+
14 => Position.new(15, 6, false, "000001") # Numero sequencial no arquivo
|
41
|
+
})
|
42
|
+
end
|
43
|
+
|
44
|
+
def header_retorno
|
45
|
+
@section = Section.new({
|
46
|
+
0 => Position.new(1, 1, false, "0", true), # Código do Registro
|
47
|
+
1 => Position.new(2, 1, false, "2"), # Código Arquivo (1-Remessa, 2-Retorno)
|
48
|
+
2 => Position.new(3, 7, false, "RETORNO"), # Identificação literal do arquivo (REMESSA/RETORNO)
|
49
|
+
3 => Position.new(4, 2, false, "01"), # Código do serviço
|
50
|
+
4 => Position.new(5, 15, false, "COBRANCA"), # Literal do serviço (COBRANÇA)
|
51
|
+
5 => Position.new(6, 20, true), # Código da Empresa
|
52
|
+
6 => Position.new(7, 30, false), # Nome da Empresa
|
53
|
+
7 => Position.new(8, 3, true), # Número do Banco (BRADESCO: 237)
|
54
|
+
8 => Position.new(9, 15, false), # Nome do Banco
|
55
|
+
9 => Position.new(10, 6, false), # Data de gravacao do arquivo (DDMMAA)
|
56
|
+
10 => Position.new(11, 8, false), # Densidade da gravacao do arquivo
|
57
|
+
11 => Position.new(12, 5, false), # Numero do aviso bancario
|
58
|
+
12 => Position.new(13, 266, false), # Reservado pelo Sistema - branco
|
59
|
+
13 => Position.new(14, 6, false), # Data do crédito (DDMMAA)
|
60
|
+
14 => Position.new(15, 9, false), # Reservado pelo Sistema - branco
|
61
|
+
15 => Position.new(16, 6, false, "000001") # Numero sequencial no arquivo
|
62
|
+
})
|
27
63
|
end
|
28
64
|
|
29
65
|
#-------------------------------------------------------------------
|
30
66
|
#-------------------------------------------------------------------
|
31
67
|
# Gerais
|
32
|
-
def process_section
|
68
|
+
def process_section(file)
|
69
|
+
case @versao
|
70
|
+
when :remessa
|
71
|
+
processa_remessa file
|
72
|
+
when :retorno
|
73
|
+
processa_retorno file
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
def processa_remessa file
|
33
78
|
self.set_codigo_arquivo file[1..1]
|
34
|
-
self.
|
79
|
+
self.set_literal_arquivo file[2..8]
|
35
80
|
self.set_codigo_servico file[9..10]
|
36
81
|
self.set_literal_servico file[11..25]
|
37
82
|
self.set_codigo_empresa file[26..45]
|
@@ -40,11 +85,30 @@ class Cnab4000Header < FormatSection
|
|
40
85
|
self.set_nome_banco file[79..93]
|
41
86
|
self.set_data_gravacao file[94..99]
|
42
87
|
self.set_reservado_1 file[100..107]
|
43
|
-
self.set_identificacao_sistema file[108..
|
88
|
+
self.set_identificacao_sistema file[108..109]
|
89
|
+
self.set_sequencial_remessa file[110..116]
|
44
90
|
self.set_reservado_2 file[117..393]
|
45
91
|
self.set_sequencial file[394..399]
|
46
92
|
end
|
47
93
|
|
94
|
+
def processa_retorno file
|
95
|
+
self.set_codigo_arquivo file[1..1]
|
96
|
+
self.set_literal_arquivo file[2..8]
|
97
|
+
self.set_codigo_servico file[9..10]
|
98
|
+
self.set_literal_servico file[11..25]
|
99
|
+
self.set_codigo_empresa file[26..45]
|
100
|
+
self.set_nome_empresa file[46..75]
|
101
|
+
self.set_numero_banco file[76..78]
|
102
|
+
self.set_nome_banco file[79..93]
|
103
|
+
self.set_data_gravacao file[94..99]
|
104
|
+
self.set_densidade_arquivo file[100..107]
|
105
|
+
self.set_numero_aviso file[108..112]
|
106
|
+
self.set_brancos_1 file[113..378]
|
107
|
+
self.set_data_credito file[379..384]
|
108
|
+
self.set_brancos_2 file[385..393]
|
109
|
+
self.set_sequencial_retorno file[394..399]
|
110
|
+
end
|
111
|
+
|
48
112
|
#-------------------------------------------------------------------
|
49
113
|
#-------------------------------------------------------------------
|
50
114
|
# Validações
|
@@ -99,8 +163,12 @@ class Cnab4000Header < FormatSection
|
|
99
163
|
self.get_section_value(11)
|
100
164
|
end
|
101
165
|
|
166
|
+
def get_sequencial_remessa
|
167
|
+
self.get_section_value(12)
|
168
|
+
end
|
169
|
+
|
102
170
|
def get_sequencial
|
103
|
-
self.get_section_value(
|
171
|
+
self.get_section_value(14)
|
104
172
|
end
|
105
173
|
|
106
174
|
|
@@ -156,20 +224,62 @@ class Cnab4000Header < FormatSection
|
|
156
224
|
end
|
157
225
|
end
|
158
226
|
|
159
|
-
def set_reservado_1 valor = ""
|
227
|
+
def set_reservado_1 valor = " "
|
160
228
|
self.set_section_value(10, valor)
|
161
229
|
end
|
162
230
|
|
163
|
-
def
|
231
|
+
def set_densidade_arquivo valor = " "
|
232
|
+
self.set_section_value(10, valor)
|
233
|
+
end
|
234
|
+
|
235
|
+
def set_identificacao_sistema valor
|
236
|
+
self.set_section_value(11, valor)
|
237
|
+
end
|
238
|
+
|
239
|
+
def set_numero_aviso valor
|
164
240
|
self.set_section_value(11, valor)
|
165
241
|
end
|
166
242
|
|
167
|
-
def
|
243
|
+
def set_sequencial_remessa valor = ""
|
168
244
|
self.set_section_value(12, valor)
|
169
245
|
end
|
170
246
|
|
171
|
-
def
|
247
|
+
def set_brancos_1 valor = " "
|
248
|
+
self.set_section_value(12, valor)
|
249
|
+
end
|
250
|
+
|
251
|
+
def set_reservado_2 valor = " "
|
172
252
|
self.set_section_value(13, valor)
|
173
253
|
end
|
174
254
|
|
255
|
+
def set_data_credito valor
|
256
|
+
begin
|
257
|
+
valor = Date.strptime(valor, "%d%m%Y") if valor.is_a?(String)
|
258
|
+
real_data = valor.strftime("%d%m%y")
|
259
|
+
|
260
|
+
if real_data.length == 6
|
261
|
+
self.set_section_value(13, real_data)
|
262
|
+
else
|
263
|
+
raise "tamanho de data incorreto"
|
264
|
+
end
|
265
|
+
|
266
|
+
rescue
|
267
|
+
raise "#{get_id}: Data de Geração Inválida
|
268
|
+
Valor: #{valor}"
|
269
|
+
end
|
270
|
+
end
|
271
|
+
|
272
|
+
def set_sequencial valor
|
273
|
+
self.set_section_value(14, valor)
|
274
|
+
end
|
275
|
+
|
276
|
+
def set_brancos_2 valor = " "
|
277
|
+
self.set_section_value(14, valor)
|
278
|
+
end
|
279
|
+
|
280
|
+
|
281
|
+
def set_sequencial_retorno valor
|
282
|
+
self.set_section_value(15, valor)
|
283
|
+
end
|
284
|
+
|
175
285
|
end
|
@@ -5,41 +5,118 @@
|
|
5
5
|
class Cnab4000Trailler < FormatSection
|
6
6
|
require 'date'
|
7
7
|
|
8
|
-
def initialize
|
8
|
+
def initialize(master, tipo)
|
9
9
|
super(master, true, true, false)
|
10
10
|
|
11
|
+
@versao = tipo
|
12
|
+
|
13
|
+
case @versao
|
14
|
+
when :remessa
|
15
|
+
trailler_remessa
|
16
|
+
when :retorno
|
17
|
+
trailler_retorno
|
18
|
+
else
|
19
|
+
raise "Versão não suportada: #{tipo}"
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
|
24
|
+
def trailler_remessa
|
25
|
+
@section = Section.new({
|
26
|
+
0 => Position.new(1, 1, false, "9", true), # Código do Registro
|
27
|
+
1 => Position.new(2, 393, false), # Reservado - Brancos
|
28
|
+
2 => Position.new(3, 6, true), # Numero sequencial do registro
|
29
|
+
})
|
30
|
+
end
|
31
|
+
|
32
|
+
def trailler_retorno
|
11
33
|
@section = Section.new({
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
34
|
+
0 => Position.new(1, 1, false, "9", true), # Código do Registro
|
35
|
+
1 => Position.new(2, 1, true, "2"), # Código Arquivo (1-Remessa, 2-Retorno)
|
36
|
+
2 => Position.new(3, 2, true, "01"), # Id tipo de registro
|
37
|
+
3 => Position.new(4, 3, true), # Codigo do banco
|
38
|
+
4 => Position.new(5, 10, false), # Reservado - branco
|
39
|
+
5 => Position.new(6, 8, false), # Qtde de titulo na cobranca
|
40
|
+
6 => Position.new(7, 14, false), # Valor total em cobranca
|
41
|
+
7 => Position.new(8, 8, false), # Numero aviso bancario
|
42
|
+
8 => Position.new(9, 10, false), # Reservado - branco
|
43
|
+
9 => Position.new(10, 5, false), # Qtde de registros - confirmacao
|
44
|
+
10 => Position.new(11, 12, false), # Valor dos registros - confirmacao
|
45
|
+
11 => Position.new(12, 12, false), # Valor dos registros - liquidacao
|
46
|
+
12 => Position.new(13, 5, false), # Qtde dos registros - liquidacao
|
47
|
+
13 => Position.new(14, 12, false), # Valor dos registros - ocorrencia 06
|
48
|
+
14 => Position.new(15, 5, false), # Qtde dos registros - baixados
|
49
|
+
15 => Position.new(16, 12, false), # Valor dos registros - baixados
|
50
|
+
16 => Position.new(17, 5, false), # Qtde dos registros - abatimento cancelado
|
51
|
+
17 => Position.new(18, 12, false), # Valor dos registros - abatimento cancelado
|
52
|
+
18 => Position.new(19, 5, false), # Qtde dos registros - vencimento alterado
|
53
|
+
19 => Position.new(20, 12, false), # Valor dos registros - vencimento alterado
|
54
|
+
20 => Position.new(21, 5, false), # Qtde dos registros - abatimento concedido
|
55
|
+
21 => Position.new(22, 12, false), # Valor dos registros - abatimento concedido
|
56
|
+
22 => Position.new(23, 5, false), # Qtde dos registros - confirmacao instrucao protesto
|
57
|
+
23 => Position.new(24, 12, false), # Valor dos registros - confirmacao instrucao protesto
|
58
|
+
24 => Position.new(25, 174, false), # Reservado - branco
|
59
|
+
25 => Position.new(26, 15, false), # Valor total rateios
|
60
|
+
26 => Position.new(27, 8, false), # Qtde total rateios
|
61
|
+
27 => Position.new(28, 9, false), # Reservado - branco
|
62
|
+
28 => Position.new(29, 6, false) # Numero sequencial do registro
|
63
|
+
})
|
18
64
|
end
|
19
65
|
|
20
66
|
#-------------------------------------------------------------------
|
21
67
|
#-------------------------------------------------------------------
|
22
68
|
# Gerais
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
69
|
+
|
70
|
+
def process_section(file)
|
71
|
+
case @versao
|
72
|
+
when :remessa
|
73
|
+
processa_remessa file
|
74
|
+
when :retorno
|
75
|
+
processa_retorno file
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
def processa_remessa file
|
80
|
+
self.set_branco file[1..393]
|
27
81
|
self.set_sequencial file[394..399]
|
28
82
|
end
|
29
83
|
|
84
|
+
def processa_retorno file
|
85
|
+
self.set_codigo_arquivo file[1..1]
|
86
|
+
self.set_tipo_registro file[2..3]
|
87
|
+
self.set_codigo_banco file[4..6]
|
88
|
+
self.set_reservado_1 file[7..16]
|
89
|
+
self.set_qtde_titulos file[17..24]
|
90
|
+
self.set_valor_cobranca file[25..38]
|
91
|
+
self.set_numero_aviso file[39..46]
|
92
|
+
self.set_reservado_2 file[47..56]
|
93
|
+
self.set_qtde_confirmados file[57..61]
|
94
|
+
self.set_valor_confirmados file[62..73]
|
95
|
+
self.set_valor_liquidados file[74..85]
|
96
|
+
self.set_qtde_liquidados file[86..90]
|
97
|
+
self.set_valor_ocorrencia_06 file[91..102]
|
98
|
+
self.set_qtde_baixados file[103..107]
|
99
|
+
self.set_valor_baixados file[108..119]
|
100
|
+
self.set_qtde_abatimento_cancelado file[120..124]
|
101
|
+
self.set_valor_abatimento_cancelado file[125..136]
|
102
|
+
self.set_qtde_vencimento_alterado file[137..141]
|
103
|
+
self.set_valor_vencimento_alterado file[142..153]
|
104
|
+
self.set_qtde_abatimento_concedido file[154..158]
|
105
|
+
self.set_valor_abatimento_concedido file[159..170]
|
106
|
+
self.set_qtde_protesto_confirmado file[171..175]
|
107
|
+
self.set_valor_protesto_confirmado file[176..187]
|
108
|
+
self.set_reservado_3 file[188..361]
|
109
|
+
self.set_valor_rateios file[362..376]
|
110
|
+
self.set_qtde_rateios file[377..384]
|
111
|
+
self.set_reservado_4 file[385..393]
|
112
|
+
self.set_sequencial_retorno file[394..399]
|
113
|
+
end
|
114
|
+
|
30
115
|
#-------------------------------------------------------------------
|
31
116
|
#-------------------------------------------------------------------
|
32
117
|
# Validações
|
33
118
|
def is_valid?
|
34
|
-
|
35
|
-
self.get_codigo_convenio.length > 0 and
|
36
|
-
self.get_nome_empresa.length > 0 and
|
37
|
-
self.get_codigo_banco > 0 and
|
38
|
-
self.get_nome_banco.length > 0 and
|
39
|
-
!self.get_data_geracao.nil? and
|
40
|
-
self.get_numero_sequencial > 0 and
|
41
|
-
self.get_versao_layout > 0 and
|
42
|
-
self.get_identificacao_servico.length > 0)
|
119
|
+
self.get_codigo_remessa > 0 and self.get_sequencial.length > 0
|
43
120
|
end
|
44
121
|
|
45
122
|
#-------------------------------------------------------------------
|
@@ -49,36 +126,133 @@ class Cnab4000Trailler < FormatSection
|
|
49
126
|
self.get_section_value(1).to_i
|
50
127
|
end
|
51
128
|
|
52
|
-
def get_total_registros
|
53
|
-
self.get_section_value(2)
|
54
|
-
end
|
55
|
-
|
56
|
-
def get_mensagem
|
57
|
-
self.get_section_value(3)
|
58
|
-
end
|
59
|
-
|
60
129
|
def get_sequencial
|
61
|
-
self.get_section_value(
|
130
|
+
self.get_section_value(3)
|
62
131
|
end
|
63
132
|
|
64
133
|
|
65
134
|
#-------------------------------------------------------------------
|
66
135
|
#-------------------------------------------------------------------
|
67
136
|
# Setters
|
68
|
-
|
137
|
+
|
138
|
+
def set_branco valor = " "
|
69
139
|
self.set_section_value(1, valor)
|
70
140
|
end
|
71
141
|
|
72
|
-
def
|
142
|
+
def set_codigo_arquivo valor = ""
|
143
|
+
self.set_section_value(1, valor)
|
144
|
+
end
|
145
|
+
|
146
|
+
def set_sequencial valor
|
147
|
+
self.set_section_value(2, valor.to_s)
|
148
|
+
end
|
149
|
+
|
150
|
+
def set_tipo_registro valor = ""
|
73
151
|
self.set_section_value(2, valor)
|
74
152
|
end
|
75
153
|
|
76
|
-
def
|
154
|
+
def set_codigo_banco valor = ""
|
77
155
|
self.set_section_value(3, valor)
|
78
156
|
end
|
79
157
|
|
80
|
-
def
|
158
|
+
def set_reservado_1 valor = " "
|
81
159
|
self.set_section_value(4, valor)
|
82
160
|
end
|
83
161
|
|
162
|
+
def set_qtde_titulos valor = ""
|
163
|
+
self.set_section_value(5, valor)
|
164
|
+
end
|
165
|
+
|
166
|
+
def set_valor_cobranca valor = ""
|
167
|
+
self.set_section_value(6, valor)
|
168
|
+
end
|
169
|
+
|
170
|
+
def set_numero_aviso valor = ""
|
171
|
+
self.set_section_value(7, valor)
|
172
|
+
end
|
173
|
+
|
174
|
+
def set_reservado_2 valor = " "
|
175
|
+
self.set_section_value(8, valor)
|
176
|
+
end
|
177
|
+
|
178
|
+
def set_qtde_confirmados valor = ""
|
179
|
+
self.set_section_value(9, valor)
|
180
|
+
end
|
181
|
+
|
182
|
+
def set_valor_confirmados valor = ""
|
183
|
+
self.set_section_value(10, valor)
|
184
|
+
end
|
185
|
+
|
186
|
+
def set_valor_liquidados valor = ""
|
187
|
+
self.set_section_value(11, valor)
|
188
|
+
end
|
189
|
+
|
190
|
+
def set_qtde_liquidados valor = ""
|
191
|
+
self.set_section_value(12, valor)
|
192
|
+
end
|
193
|
+
|
194
|
+
def set_valor_ocorrencia_06 valor = ""
|
195
|
+
self.set_section_value(13, valor)
|
196
|
+
end
|
197
|
+
|
198
|
+
def set_qtde_baixados valor = ""
|
199
|
+
self.set_section_value(14, valor)
|
200
|
+
end
|
201
|
+
|
202
|
+
def set_valor_baixados valor = ""
|
203
|
+
self.set_section_value(15, valor)
|
204
|
+
end
|
205
|
+
|
206
|
+
def set_qtde_abatimento_cancelado valor = ""
|
207
|
+
self.set_section_value(16, valor)
|
208
|
+
end
|
209
|
+
|
210
|
+
def set_valor_abatimento_cancelado valor = ""
|
211
|
+
self.set_section_value(17, valor)
|
212
|
+
end
|
213
|
+
|
214
|
+
def set_qtde_vencimento_alterado valor = ""
|
215
|
+
self.set_section_value(18, valor)
|
216
|
+
end
|
217
|
+
|
218
|
+
def set_valor_vencimento_alterado valor = ""
|
219
|
+
self.set_section_value(19, valor)
|
220
|
+
end
|
221
|
+
|
222
|
+
def set_qtde_abatimento_concedido valor = ""
|
223
|
+
self.set_section_value(20, valor)
|
224
|
+
end
|
225
|
+
|
226
|
+
def set_valor_abatimento_concedido valor = ""
|
227
|
+
self.set_section_value(21, valor)
|
228
|
+
end
|
229
|
+
|
230
|
+
def set_qtde_protesto_confirmado valor = ""
|
231
|
+
self.set_section_value(22, valor)
|
232
|
+
end
|
233
|
+
|
234
|
+
def set_valor_protesto_confirmado valor = ""
|
235
|
+
self.set_section_value(23, valor)
|
236
|
+
end
|
237
|
+
|
238
|
+
def set_reservado_3 valor = " "
|
239
|
+
self.set_section_value(24, valor)
|
240
|
+
end
|
241
|
+
|
242
|
+
def set_valor_rateios valor = ""
|
243
|
+
self.set_section_value(25, valor)
|
244
|
+
end
|
245
|
+
|
246
|
+
def set_qtde_rateios valor = ""
|
247
|
+
self.set_section_value(26, valor)
|
248
|
+
end
|
249
|
+
|
250
|
+
def set_reservado_4 valor = ""
|
251
|
+
self.set_section_value(27, valor)
|
252
|
+
end
|
253
|
+
|
254
|
+
def set_sequencial_retorno valor = ""
|
255
|
+
self.set_section_value(28, valor)
|
256
|
+
end
|
257
|
+
|
84
258
|
end
|