formatos-febraban 0.3.48 → 0.3.49

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 85d094dad8a67461bedee2b802f20fad26926f6c
4
- data.tar.gz: 580aadc36eb900809ed0429c735fa54f1ed1039a
3
+ metadata.gz: 987c9458d97877aca613838288688e24857f4867
4
+ data.tar.gz: e99f6a7743086a35fac50122218efaf7bdac09e9
5
5
  SHA512:
6
- metadata.gz: 1b2d8343477b03b1009b47cf37b729c3170d9dbaf27cdc55979da6f96195f5b559f343ec46c905fb803bc43e40c3960bbb243ad05973b25fffcc0ed0841ec74f
7
- data.tar.gz: 4443ac5b52f55734396b603987fbe7753d705b4eb03637c31a97990f393c098b692e35aae2817dc5613ad02f00182d5762ff4c070be53d1776ff3a4886be96a2
6
+ metadata.gz: c5c333fb415aa36768b5670619eb552cc529c916f8c3d65d030928470d5cc8ba0d1037fbd7f22743c10a5ce88d1c1514e0128928833a900a44931ce2c7ffffcb
7
+ data.tar.gz: 7b6992ab5a097fa17d0a232c783b61cb5b5a095bcbd24ffef39f74ce89244effd8329833f2e98b4bb7059f280d9c0b96b9d584db008eef73e4ad26c8a0c7b98b
@@ -2,26 +2,27 @@
2
2
  class Cnab400
3
3
  require 'date'
4
4
 
5
- # Carrega todas as dependências de Layout
5
+ SECTION_TYPES = {header: '00', client: "01", trailler: '99'}
6
+
7
+ VERSAO = "05"
8
+
9
+ # Carrega todas as dependências de Layout
6
10
  Dir[File.join(File.dirname(__FILE__), '../..', 'base', '**/*.rb')].sort.each do |file|
7
11
  require file
8
12
  end
9
13
 
10
14
  # Partes do Layout
11
- require_relative 'cnab_400_0' # Header
12
- require_relative 'cnab_400_1' # Transação
13
- require_relative 'cnab_400_2' # Mensagem (Opcional)
14
- require_relative 'cnab_400_3' # Rateio de Crétido (Opcional)
15
- require_relative 'cnab_400_7' # Dados do Sacador Avalista (Opcional)
16
- require_relative 'cnab_400_9' # Trailler
15
+ require_relative 'cnab_400_header' # Header
16
+ require_relative 'cnab_400_detalhe' # Transação
17
+ require_relative 'cnab_400_trailler' # Trailler
17
18
 
18
19
  #-------------------------------------------------------------------
19
20
  #-------------------------------------------------------------------
20
21
  # Construtor
21
- def initialize file = ''
22
+ def initialize file = ""
22
23
  @sections = []
23
24
 
24
- if file.length > 0
25
+ if file.size > 0
25
26
  self.process_file file
26
27
  end
27
28
  end
@@ -34,133 +35,69 @@ class Cnab400
34
35
  if section.is_valid?
35
36
  self.sections << section
36
37
  else
37
- raise "Seção #{section.get_id} está inválida:
38
+ raise "Seção #{section.get_id} está inválida:
38
39
  #{section.errors.inspect}
39
40
  #{section.to_s}"
40
41
  end
41
42
  end
42
43
 
43
44
  def add_section_from_business section
44
- if section.is_empresa?
45
- self.add_section section
46
- self
47
- else
48
- raise "Seção #{section.get_id} não pode ser criada pela Empresa"
49
- end
45
+ self.add_section section
46
+ self
50
47
  end
51
48
 
52
49
  #-------------------------------------------------------------------
53
50
  #-------------------------------------------------------------------
54
- # Criação das Partes
51
+ # Criação das Partes
55
52
  public
56
53
 
57
- # Seção 0
58
- def create_header(codigo_empresa, nome_empresa, codigo_banco,
59
- nome_banco, data_geracao, numero_sequencial)
54
+ def create_header(params = {})
60
55
 
61
56
  if self.get_header.nil?
62
- section = self.get_new_section('0')
63
-
64
- section.set_id_registro ('0')
65
- section.set_codigo_remessa ('1')
66
- section.set_literal ('REMESSA')
67
- section.set_codigo_servico ('01')
68
- section.set_servico ('COBRANCA')
69
- section.set_codigo_empresa (codigo_empresa)
70
- section.set_nome_empresa (nome_empresa)
71
- section.set_codigo_banco (codigo_banco)
72
- section.set_nome_banco (nome_banco)
73
- section.set_data_geracao (data_geracao)
74
- section.set_branco_1 ('')
75
- section.set_id_sistema ('MX')
76
- section.set_seq_arquivo (numero_sequencial)
77
- section.set_branco_2 ('')
78
- section.set_seq_registro ('1')
79
-
80
- self.add_section_from_business(section)
57
+ section = self.get_new_section(:header)
58
+
59
+ section.set_codigo_arquivo params[:codigo_arquivo]
60
+ section.set_identificacao_arquivo params[:tipo_literal]
61
+ section.set_codigo_servico params[:codigo_servico]
62
+ section.set_literal_servico params[:servico_literal]
63
+ section.set_codigo_empresa params[:codigo_empresa]
64
+ section.set_nome_empresa params[:nome_empresa]
65
+ section.set_numero_banco params[:numero_banco]
66
+ section.set_nome_banco params[:nome_banco]
67
+ section.set_data_gravacao Date.today
68
+ section.set_reservado_1
69
+ section.set_identificacao_sistema params[:id_sistema]
70
+ section.set_reservado_2
71
+ section.set_sequencial
72
+
73
+ self.add_section_from_business section
81
74
 
82
75
  else
83
- raise 'Header declarado!'
76
+ raise "Header já declarado!"
84
77
  end
85
78
  end
86
79
 
87
- # Seção 1
88
- def create_transacao(agencia_debito, razao_conta, conta_corrente,
89
- codigo_empresa, id_cliente_empresa, codigo_banco,
90
- existe_multa, percent_multa, codigo_barras,
91
- digito_conferencia, desconto_dia, condicao_emissao)
92
-
93
- if self.get_header
94
- section = self.get_new_section('1')
95
-
96
- section.set_agencia_debito (agencia_debito)
97
- section.set_razao_conta (razao_conta)
98
- section.set_conta_corrente (conta_corrente)
99
- section.set_codigo_empresa (codigo_empresa)
100
- section.set_numero_controle (id_cliente_empresa)
101
- section.set_codigo_banco (codigo_banco)
102
- section.set_multa (existe_multa)
103
- section.set_percent_multa (percent_multa)
104
- section.set_id_titulo (codigo_barras)
105
- section.set_digito_conferencia (digito_conferencia)
106
- section.set_desconto_dia (desconto_dia)
107
- section.set_condicao_emissao (condicao_emissao)
108
- section.set_emite_boleto (file[94, 94])
109
- section.set_id_operacao (file[95, 104])
110
- section.set_indicador_rateio (file[105, 105])
111
- section.set_enderecamento (file[106, 106])
112
- section.set_branco (file[107, 108])
113
- section.set_id_ocorrencia (file[109, 110])
114
- section.set_numero_documento (file[111, 120])
115
- section.set_data_vencimento (file[121, 126])
116
- section.set_valor (file[127, 139])
117
- section.set_banco_cobranca (file[140, 152])
118
- section.set_agencia_depositaria (file[143, 147])
119
- section.set_especie_titulo (file[148, 149])
120
- section.set_data_emissao (file[151, 156])
121
- section.set_primeira_instrucao (file[157, 158])
122
- section.set_segunda_instrucao (file[159, 160])
123
- section.set_valor_dia_atraso (file[161, 173])
124
- section.set_data_limite_concessao (file[174, 179])
125
- section.set_valor_desconto (file[180, 192])
126
- section.set_valor_iof (file[193, 205])
127
- section.set_valor_abatimento (file[206, 218])
128
- section.set_tipo_inscricao (file[219, 220])
129
- section.set_numero_inscricao (file[221, 234])
130
- section.set_nome_sacado (file[235, 274])
131
- section.set_endereco_sacado (file[235, 314])
132
- section.set_primeira_mensagem (file[315, 326])
133
- section.set_cep (file[317, 334])
134
- section.set_sacador_avalista (file[335, 394])
135
- section.set_seq_registro (file[395, 400])
136
-
137
- self.add_section_from_business(section)
138
-
139
- else
140
- raise 'Header não declarado!'
141
- end
80
+ #-------------------------------------------------------------------
81
+ #-------------------------------------------------------------------
82
+ # Validações
83
+ protected
84
+ def valida_existe_header
85
+ raise "Header (Seção A) ainda não declarado" if self.get_header.nil?
142
86
  end
143
87
 
144
- # Seção 9
145
- def create_trailler(numero_sequencial)
146
-
147
- if self.get_header
148
- if self.get_trailler.nil?
149
- section = self.get_new_section('9')
150
-
151
- section.set_id_registro ('9')
152
- section.set_branco ('')
153
- section.set_seq_registro (numero_sequencial)
154
-
155
- self.add_section_from_business(section)
88
+ public
89
+ def is_valid?
90
+ if self.layout_empresa?
91
+ raise "Layout de Empresa inválido!" unless self.is_empresa_valid?
156
92
 
157
- else
158
- raise 'Trailler declarado!'
159
- end
93
+ elsif self.layout_banco?
94
+ raise "Layout de Banco inválido!" unless self.is_banco_valid?
160
95
 
161
96
  else
162
- raise 'Header não declarado!'
97
+ raise "Código de Remessa desconhecido: #{codigo_remessa}"
163
98
  end
99
+
100
+ result = self.is_sections_valid?
164
101
  end
165
102
 
166
103
  #-------------------------------------------------------------------
@@ -179,68 +116,35 @@ class Cnab400
179
116
  self.sections.select {|c| c.is_section?(section) == true }
180
117
  end
181
118
 
182
- def is_sections_valid?
119
+ def is_valid?
183
120
  self.sections.select {|b| b.is_valid? == false }.length == 0
184
121
  end
185
122
 
186
123
  def to_s
187
- self.sections.map {|a| a.to_s}.join("\r\n")
124
+ self.sections.map{|a| a.to_s.concat("\r\n")}.join("")
188
125
  end
189
126
 
190
127
  def get_header
191
- self.get_section('0').first()
128
+ self.get_section(SECTION_TYPES[:header]).first()
192
129
  end
193
130
 
194
131
  def get_trailler
195
- self.get_section('9').first()
132
+ self.get_section(SECTION_TYPES[:trailler]).first()
196
133
  end
197
134
 
198
- #-------------------------------------------------------------------
199
- #-------------------------------------------------------------------
200
- # Getters
201
- public
202
- def get_nome_arquivo
203
- data_geracao = Date.new
204
- "CD#{data_geracao.day}#{data_geracao.month}00.REM"
205
- end
206
-
207
- #-------------------------------------------------------------------
208
- #-------------------------------------------------------------------
135
+ #--------------------------------------------------------------------------------------
136
+ #--------------------------------------------------------------------------------------
209
137
  # Carregamento de Arquivo
210
138
  protected
211
139
  def get_new_section section_type
212
140
  case section_type
213
- when "0"
214
- Cnab4000.new(self)
215
- when "1"
216
- Cnab4001.new(self)
217
- when "2"
218
- Cnab4002.new(self)
219
- when "3"
220
- Cnab4003.new(self)
221
- when "7"
222
- Cnab4007.new(self)
223
- when "9"
224
- Cnab4009.new(self)
225
- end
226
- end
227
-
228
- def process_file location
229
- file = File.new(location, 'r')
230
-
231
- while (line = file.gets)
232
- process_string line
141
+ when :header
142
+ Cnab4000Header.new(self)
143
+ when :client
144
+ Cnab4000Detalhe.new(self)
145
+ when :trailler
146
+ Cnab4000Trailler.new(self)
233
147
  end
234
-
235
- file.close
236
148
  end
149
+ end
237
150
 
238
- def process_string file
239
- section_type = file[0,1]
240
-
241
- section = get_new_section(section_type)
242
- section.process_section(file)
243
-
244
- self.add_section section
245
- end
246
- end
@@ -0,0 +1,276 @@
1
+
2
+ #-------------------------------------------------------------------
3
+ #-------------------------------------------------------------------
4
+ # Detalhe - Empresa e Banco
5
+ class Cnab4000Detalhe < FormatSection
6
+ require 'date'
7
+
8
+ def initialize master
9
+ super(master, true, true, false)
10
+
11
+ @section = Section.new({
12
+ 0 => Position.new(1, 1, false, "1", true), # Código do Registro
13
+ 1 => Position.new(2, 5, true), # Agencia
14
+ 2 => Position.new(3, 3, false), # Reservado - Zeros
15
+ 3 => Position.new(4, 7, false), # Conta Corrente
16
+ 4 => Position.new(5, 1, true), # Dv
17
+ 5 => Position.new(6, 2, false), # Carteira
18
+ 6 => Position.new(7, 3, true), # Reservado - Zeros
19
+ 7 => Position.new(8, 12, true), # Nosso numero
20
+ 8 => Position.new(9, 4, true), # Reservado - Zeros
21
+ 9 => Position.new(10, 11, false), # Documento
22
+ 10 => Position.new(11, 4, false), # Reservado - Zeros
23
+ 11 => Position.new(12, 6, false), # Data do documento (DDMMAA)
24
+ 12 => Position.new(13, 4, false), # Reservado - Zeros
25
+ 13 => Position.new(14, 6, false), # Data de validade (DDMMAA)
26
+ 14 => Position.new(15, 40, false), # Nome do cliente
27
+ 15 => Position.new(16, 60, false), # Logradouro
28
+ 16 => Position.new(17, 10, false), # Número
29
+ 17 => Position.new(18, 10, false), # Complemento
30
+ 18 => Position.new(19, 30, false), # Bairro
31
+ 19 => Position.new(20, 30, false), # Cidade
32
+ 20 => Position.new(21, 2, false), # Estado
33
+ 21 => Position.new(22, 8, false), # Cep
34
+ 22 => Position.new(23, 15, false), # Valor
35
+ 23 => Position.new(24, 44, false), # Codigo de Barras
36
+ 24 => Position.new(25, 4, false), # Reservado - Zeros
37
+ 25 => Position.new(26, 56, false), # Linha digitada
38
+ 26 => Position.new(27, 14, false), # Reservado - Brancos
39
+ 27 => Position.new(128, 6, false) # Sequencial
40
+ })
41
+ end
42
+
43
+ #-------------------------------------------------------------------
44
+ #-------------------------------------------------------------------
45
+ # Gerais
46
+ def process_section file
47
+ self.set_agencia file[1..5]
48
+ self.set_reservado_1 file[6..8]
49
+ self.set_conta_corrente file[9..15]
50
+ self.set_dv file[16..16]
51
+ self.set_carteira file[17..18]
52
+ self.set_reservado_2 file[19..21]
53
+ self.set_nosso_numero file[22..33]
54
+ self.set_reservado_3 file[34..37]
55
+ self.set_documento file[38..48]
56
+ self.set_reservado_4 file[49..52]
57
+ self.set_data_documento file[53..58]
58
+ self.set_reservado_5 file[59..62]
59
+ self.set_data_validade file[63..68]
60
+ self.set_nome_cliente file[69..108]
61
+ self.set_logradouro file[109..168]
62
+ self.set_numero file[169..178]
63
+ self.set_complemento file[179..188]
64
+ self.set_bairro file[189..218]
65
+ self.set_cidade file[219..248]
66
+ self.set_estado file[249..250]
67
+ self.set_cep file[251..258]
68
+ self.set_valor file[259..273]
69
+ self.set_codigo_barras file[274..317]
70
+ self.set_reservado_6 file[318..321]
71
+ self.set_linha file[322..377]
72
+ self.set_reservado_7 file[378..391]
73
+ self.set_sequencial file[392..399]
74
+ end
75
+
76
+ #-------------------------------------------------------------------
77
+ #-------------------------------------------------------------------
78
+ # Validações
79
+ def is_valid?
80
+ result = (self.get_codigo_remessa > 0 and
81
+ self.get_codigo_convenio.length > 0 and
82
+ self.get_nome_empresa.length > 0 and
83
+ self.get_codigo_banco > 0 and
84
+ self.get_nome_banco.length > 0 and
85
+ !self.get_data_geracao.nil? and
86
+ self.get_numero_sequencial > 0 and
87
+ self.get_versao_layout > 0 and
88
+ self.get_identificacao_servico.length > 0)
89
+ end
90
+
91
+ #-------------------------------------------------------------------
92
+ #-------------------------------------------------------------------
93
+ # Getters
94
+ def get_codigo_remessa
95
+ self.get_section_value(1).to_i
96
+ end
97
+
98
+ def get_identificacao_arquivo
99
+ self.get_section_value(2)
100
+ end
101
+
102
+ def get_codigo_servico
103
+ self.get_section_value(3)
104
+ end
105
+
106
+ def get_literal_servico
107
+ self.get_section_value(4)
108
+ end
109
+
110
+ def get_codigo_empresa
111
+ self.get_section_value(5)
112
+ end
113
+
114
+ def get_nome_empresa
115
+ self.get_section_value(6)
116
+ end
117
+
118
+ def get_numero_banco
119
+ self.get_section_value(7)
120
+ end
121
+
122
+ def get_nome_banco
123
+ self.get_section_value(8)
124
+ end
125
+
126
+ def get_data_gravacao
127
+ self.get_section_value(9)
128
+ end
129
+
130
+ def get_identificacao_sistema
131
+ self.get_section_value(11)
132
+ end
133
+
134
+ def get_sequencial
135
+ self.get_section_value(13)
136
+ end
137
+
138
+
139
+ #-------------------------------------------------------------------
140
+ #-------------------------------------------------------------------
141
+ # Setters
142
+ def set_agencia valor
143
+ self.set_section_value(1, valor)
144
+ end
145
+
146
+ def set_reservado_1 valor
147
+ self.set_section_value(2, valor)
148
+ end
149
+
150
+ def set_conta_corrente valor
151
+ self.set_section_value(3, valor)
152
+ end
153
+
154
+ def set_dv valor
155
+ self.set_section_value(4, valor)
156
+ end
157
+
158
+ def set_carteira valor
159
+ self.set_section_value(5, valor)
160
+ end
161
+
162
+ def set_reservado_2 valor
163
+ self.set_section_value(6, valor)
164
+ end
165
+
166
+ def set_nosso_numero valor
167
+ self.set_section_value(7, valor)
168
+ end
169
+
170
+ def set_reservado_3 valor
171
+ self.set_section_value(8, valor)
172
+ end
173
+
174
+ def set_documento valor
175
+ self.set_section_value(9, valor)
176
+ end
177
+
178
+ def set_reservado_4 valor
179
+ self.set_section_value(10, valor)
180
+ end
181
+
182
+ def set_data_documento valor
183
+ begin
184
+ valor = Date.strptime(valor, "%d%m%Y") if valor.is_a?(String)
185
+ real_data = valor.strftime("%d%m%y")
186
+
187
+ if real_data.length == 6
188
+ self.set_section_value(11, real_data)
189
+ else
190
+ raise "tamanho de data incorreto"
191
+ end
192
+
193
+ rescue
194
+ raise "#{get_id}: Data do Documento Inválida
195
+ Valor: #{valor}"
196
+ end
197
+ end
198
+
199
+ def set_reservado_5 valor
200
+ self.set_section_value(12, valor)
201
+ end
202
+
203
+ def set_data_validade valor
204
+ begin
205
+ valor = Date.strptime(valor, "%d%m%Y") if valor.is_a?(String)
206
+ real_data = valor.strftime("%d%m%y")
207
+
208
+ if real_data.length == 6
209
+ self.set_section_value(13, real_data)
210
+ else
211
+ raise "tamanho de data incorreto"
212
+ end
213
+
214
+ rescue
215
+ raise "#{get_id}: Data de Validade Inválida
216
+ Valor: #{valor}"
217
+ end
218
+ end
219
+
220
+ def set_nome_cliente valor
221
+ self.set_section_value(14, valor)
222
+ end
223
+
224
+ def set_logradouro valor
225
+ self.set_section_value(15, valor)
226
+ end
227
+
228
+ def set_numero valor
229
+ self.set_section_value(16, valor)
230
+ end
231
+
232
+ def set_complemento valor
233
+ self.set_section_value(17, valor)
234
+ end
235
+
236
+
237
+ def set_bairro valor
238
+ self.set_section_value(18, valor)
239
+ end
240
+
241
+ def set_cidade valor
242
+ self.set_section_value(19, valor)
243
+ end
244
+
245
+ def set_estado valor
246
+ self.set_section_value(20, valor)
247
+ end
248
+
249
+ def set_cep valor
250
+ self.set_section_value(21, valor)
251
+ end
252
+
253
+ def set_valor valor
254
+ self.set_section_value(22, valor)
255
+ end
256
+
257
+ def set_codigo_barras valor
258
+ self.set_section_value(23, valor)
259
+ end
260
+
261
+ def set_reservado_6 valor
262
+ self.set_section_value(24, valor)
263
+ end
264
+
265
+ def set_linha valor
266
+ self.set_section_value(25, valor)
267
+ end
268
+
269
+ def set_reservado_7 valor
270
+ self.set_section_value(26, valor)
271
+ end
272
+
273
+ def set_sequencial valor
274
+ self.set_section_value(27, valor)
275
+ end
276
+ end