formatos-febraban 0.3.45 → 0.3.47

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 10dc05ffecd855898d818a82595eae00355de820
4
- data.tar.gz: cc8df21f1b29e5edc93d13f00fe32032c956ba53
3
+ metadata.gz: e5e1d25d5e13fa8592863452305082b1400c29be
4
+ data.tar.gz: ab52a53391c7d3191c6ca0fbd1938e8acbcae411
5
5
  SHA512:
6
- metadata.gz: efc479d863a4dc5f001f88baffdb3edd41bd3c26a2bc22d9822fa1762073cbeceb613e9c55a553ab0ae4aef1d82461f567e8717de26230a21af7f53f67e7a520
7
- data.tar.gz: 89e1a5056060464eea5a144b7b49e8284ee2493f64e5b5db56bebbf60c67ee892b417c69a1f437d9ddf93dbe4ca84f305c3fa24864df545749410eaa93b07283
6
+ metadata.gz: accbc1fa02460e1f28dda23487526324bf63238794fdd9895f566016b89c09f4d2a5ae18592ad5909bc58caac57c31684a6713f38b1998abf26c684b4f1cab33
7
+ data.tar.gz: 6de5dbf219fd232793654823d454d910fbfaf59cb327968d0bc98d4dae92a6e1bfc528683e4b068020706307cd320cdd19815d0118afcc0ab7ac7051c552a20b
@@ -98,7 +98,7 @@ class Cielo
98
98
  section.set_reservado_3
99
99
  section.set_valor_parcela
100
100
  section.set_reservado_4
101
- section.set_reservado_5
101
+ section.set_reservado_5 params[:reservado]
102
102
  section.set_status_venda
103
103
  section.set_data_liquidacao
104
104
  section.set_reservado_6
@@ -100,6 +100,10 @@ class CieloDetalhe < FormatSection
100
100
  self.get_section_value(16)
101
101
  end
102
102
 
103
+ def get_reservado
104
+ self.get_section_value(15)
105
+ end
106
+
103
107
  def set_sequencial valor
104
108
  self.set_section_value(1, valor)
105
109
  end
@@ -2,25 +2,23 @@
2
2
  class Cnab400
3
3
  require 'date'
4
4
 
5
- VERSAO = "05"
6
-
7
5
  # Carrega todas as dependências de Layout
8
6
  Dir[File.join(File.dirname(__FILE__), '../..', 'base', '**/*.rb')].sort.each do |file|
9
7
  require file
10
8
  end
11
9
 
12
10
  # Partes do Layout
13
- require_relative 'cnab_400_0' # Header
14
- require_relative 'cnab_400_1' # Transação
15
- require_relative 'cnab_400_2' # Mensagem (Opcional)
16
- require_relative 'cnab_400_3' # Rateio de Crétido (Opcional)
17
- require_relative 'cnab_400_7' # Débito em Conta - Empresa
18
- require_relative 'cnab_400_9' # Trailler
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
19
17
 
20
18
  #-------------------------------------------------------------------
21
19
  #-------------------------------------------------------------------
22
20
  # Construtor
23
- def initialize file = ""
21
+ def initialize file = ''
24
22
  @sections = []
25
23
 
26
24
  if file.length > 0
@@ -57,51 +55,144 @@ class Cnab400
57
55
  public
58
56
 
59
57
  # Seção 0
60
- def create_header(codigo_remessa, codigo_convenio, nome_empresa,
61
- codigo_banco, nome_banco, numero_sequencial)
58
+ def create_header(codigo_empresa, nome_empresa, codigo_banco,
59
+ nome_banco, data_geracao, numero_sequencial)
62
60
 
63
61
  if self.get_header.nil?
64
- section = self.get_new_section("0")
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)
65
81
 
66
- section.set_codigo_remessa codigo_remessa
67
- section.set_codigo_convenio codigo_convenio
68
- section.set_nome_empresa nome_empresa
69
- section.set_codigo_banco codigo_banco
70
- section.set_nome_banco nome_banco
71
- section.set_data_geracao Time.new
72
- section.set_numero_sequencial numero_sequencial
73
- section.set_versao_layout Febraban150::VERSAO
74
- section.set_identificacao_servico Febraban150A::ID_SERVICO
75
- section.set_reservado ""
82
+ else
83
+ raise 'Header já declarado!'
84
+ end
85
+ end
76
86
 
77
- self.add_section_from_business section
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)
78
138
 
79
139
  else
80
- raise "Header declarado!"
140
+ raise 'Header não declarado!'
141
+ end
142
+ end
143
+
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)
156
+
157
+ else
158
+ raise 'Trailler já declarado!'
159
+ end
160
+
161
+ else
162
+ raise 'Header não declarado!'
81
163
  end
82
164
  end
83
165
 
84
166
  #-------------------------------------------------------------------
85
167
  #-------------------------------------------------------------------
86
- # Validações
87
- protected
88
- def valida_existe_header
89
- raise "Header (Seção A) ainda não declarado" if self.get_header.nil?
168
+ # Getters
169
+ public
170
+ def sections
171
+ @sections.to_a
90
172
  end
91
173
 
92
- public
93
- def is_valid?
94
- if self.layout_empresa?
95
- raise "Layout de Empresa inválido!" unless self.is_empresa_valid?
174
+ def has_section section
175
+ self.get_section(section).length > 0
176
+ end
96
177
 
97
- elsif self.layout_banco?
98
- raise "Layout de Banco inválido!" unless self.is_banco_valid?
178
+ def get_section section
179
+ self.sections.select {|c| c.is_section?(section) == true }
180
+ end
99
181
 
100
- else
101
- raise "Código de Remessa desconhecido: #{codigo_remessa}"
102
- end
182
+ def is_sections_valid?
183
+ self.sections.select {|b| b.is_valid? == false }.length == 0
184
+ end
185
+
186
+ def to_s
187
+ self.sections.map {|a| a.to_s}.join("\r\n")
188
+ end
103
189
 
104
- result = self.is_sections_valid?
190
+ def get_header
191
+ self.get_section('0').first()
192
+ end
193
+
194
+ def get_trailler
195
+ self.get_section('9').first()
105
196
  end
106
197
 
107
198
  #-------------------------------------------------------------------
@@ -113,8 +204,8 @@ class Cnab400
113
204
  "CD#{data_geracao.day}#{data_geracao.month}00.REM"
114
205
  end
115
206
 
116
- #--------------------------------------------------------------------------------------
117
- #--------------------------------------------------------------------------------------
207
+ #-------------------------------------------------------------------
208
+ #-------------------------------------------------------------------
118
209
  # Carregamento de Arquivo
119
210
  protected
120
211
  def get_new_section section_type
@@ -133,4 +224,23 @@ class Cnab400
133
224
  Cnab4009.new(self)
134
225
  end
135
226
  end
227
+
228
+ def process_file location
229
+ file = File.new(location, 'r')
230
+
231
+ while (line = file.gets)
232
+ process_string line
233
+ end
234
+
235
+ file.close
236
+ end
237
+
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
136
246
  end
@@ -5,134 +5,122 @@
5
5
  class Cnab4000 < FormatSection
6
6
  require 'date'
7
7
 
8
- ID_SERVICO = "DÉBITO AUTOMÁTICO"
9
-
10
8
  def initialize master
11
9
  super(master, true, true, false)
12
10
 
13
11
  @section = Section.new({
14
- 0 => Position.new(1, 1, false, "A", true), # Código do Registro
15
- 1 => Position.new(2, 1, true), # Código Remessa (1-Remessa, 2-Retorno)
16
- 2 => Position.new(3, 20, false), # Código de ID enviado pelo Banco
17
- 3 => Position.new(4, 20, false), # Nome da Empresa
18
- 4 => Position.new(5, 3, true), # Código do Banco
19
- 5 => Position.new(6, 20, false), # Nome do Banco
20
- 6 => Position.new(7, 8, true), # Data de Geração de Arquivo
21
- 7 => Position.new(8, 6, true), # Número Sequencial do Arquivo
22
- 8 => Position.new(9, 2, true, 5), # Versão do Layout (5, desde 05.05.2008)
23
- 9 => Position.new(10, 17, false, Febraban150A::ID_SERVICO), # Identificação ("DÉBITO AUTOMÁTICO")
24
- 10 => Position.new(11, 52, false), # Reservado pelo Sistema
12
+ 0 => Position.new(1, 1, true, '0', true), # Identificação do Registro
13
+ 1 => Position.new(2, 1, true, '1'), # Código Remessa (1-Remessa, 2-Retorno)
14
+ 2 => Position.new(3, 7, false,'REMESSA'), # Literal Remessa
15
+ 3 => Position.new(4, 2, true, '01'), # Código do Serviço
16
+ 4 => Position.new(5, 15, false,'COBRANCA'), # Literal Serviço
17
+ 5 => Position.new(6, 20, true), # Código da Empresa
18
+ 6 => Position.new(7, 30, false), # Nome da Empresa
19
+ 7 => Position.new(8, 3, true), # Código do Banco
20
+ 8 => Position.new(9, 15, false, 'BRADESCO'), # Nome do Banco
21
+ 9 => Position.new(10, 6, true), # Data de Geração de Arquivo
22
+ 10 => Position.new(11, 8, false), # Brancos
23
+ 11 => Position.new(12, 2, false), # Identificação do Sistema
24
+ 12 => Position.new(13, 7, true), # Número Sequencial do Arquivo
25
+ 13 => Position.new(14, 277, false), # Brancos
26
+ 14 => Position.new(15, 6, true, '1'), # Sequencial de Regsitro
25
27
  })
26
28
  end
27
29
 
28
30
  #-------------------------------------------------------------------
29
31
  #-------------------------------------------------------------------
30
32
  # Gerais
31
- def process_section file
32
- self.set_codigo_remessa file[1..1]
33
- self.set_codigo_convenio file[2..21]
34
- self.set_nome_empresa file[22..41]
35
- self.set_codigo_banco file[42..44]
36
- self.set_nome_banco file[45..64]
37
- self.set_data_geracao file[65..72]
38
- self.set_numero_sequencial file[73..78]
39
- self.set_versao_layout file[79..80]
40
- self.set_identificacao_servico file[81..99]
41
- self.set_reservado file[98..149]
42
- end
43
-
44
- #-------------------------------------------------------------------
45
- #-------------------------------------------------------------------
46
- # Validações
47
- def is_valid?
48
- result = (self.get_codigo_remessa > 0 and
49
- self.get_codigo_convenio.length > 0 and
50
- self.get_nome_empresa.length > 0 and
51
- self.get_codigo_banco > 0 and
52
- self.get_nome_banco.length > 0 and
53
- !self.get_data_geracao.nil? and
54
- self.get_numero_sequencial > 0 and
55
- self.get_versao_layout > 0 and
56
- self.get_identificacao_servico.length > 0)
33
+ def process_section(file)
34
+ self.set_id_registro (file[1..1])
35
+ self.set_codigo_remessa (file[2..2])
36
+ self.set_literal (file[3..9])
37
+ self.set_codigo_servico (file[10..11])
38
+ self.set_servico (file[12..26])
39
+ self.set_codigo_empresa (file[27..46])
40
+ self.set_nome_empresa (file[47..76])
41
+ self.set_codigo_banco (file[77..79])
42
+ self.set_nome_banco (file[80..94])
43
+ self.set_data_geracao (file[95..100])
44
+ self.set_branco_1 (file[101..108])
45
+ self.set_id_sistema (file[109..110])
46
+ self.set_seq_arquivo (file[111..117])
47
+ self.set_branco_2 (file[118..394])
48
+ self.set_seq_registro (file[395..400])
57
49
  end
58
50
 
59
51
  #-------------------------------------------------------------------
60
52
  #-------------------------------------------------------------------
61
- # Getters
62
- def get_codigo_remessa
63
- self.get_section_value(1).to_i
64
- end
65
-
66
- def get_codigo_convenio
67
- self.get_section_value(2)
68
- end
53
+ # Setters
54
+ def set_id_registro code
55
+ code = code.to_i
69
56
 
70
- def get_nome_empresa
71
- self.get_section_value(3)
57
+ unless code
58
+ self.set_section_value(0, code)
59
+ else
60
+ raise
61
+ end
72
62
  end
73
63
 
74
- def get_codigo_banco
75
- self.get_section_value(4).to_i
76
- end
64
+ def set_codigo_remessa code
65
+ code = code.to_s
77
66
 
78
- def get_nome_banco
79
- self.get_section_value(5)
67
+ if code.length >= 1
68
+ self.set_section_value(1, code)
69
+ else
70
+ raise
71
+ end
80
72
  end
81
73
 
82
- def get_data_geracao
83
- data = self.get_section_value(6)
84
- Date.new(data[0..3].to_i, data[4..5].to_i, data[6..7].to_i)
85
- end
74
+ def set_literal literal
75
+ nome = literal.to_s
86
76
 
87
- def get_numero_sequencial
88
- data = self.get_section_value(7).to_i
77
+ if nome.to_s.length > 0
78
+ self.set_section_value(2, nome)
79
+ else
80
+ raise
81
+ end
89
82
  end
90
83
 
91
- def get_versao_layout
92
- data = self.get_section_value(8).to_i
93
- end
84
+ def set_codigo_servico codigo
85
+ codigo = codigo.to_i
94
86
 
95
- def get_identificacao_servico
96
- data = self.get_section_value(9)
87
+ if codigo > 0
88
+ self.set_section_value(3, codigo)
89
+ else
90
+ raise
91
+ end
97
92
  end
98
93
 
99
- #-------------------------------------------------------------------
100
- #-------------------------------------------------------------------
101
- # Setters
102
- def set_codigo_remessa code
103
- code = code.to_i
94
+ def set_servico nome
95
+ nome = nome.to_s
104
96
 
105
- if code == 1 or code == 2
106
- self.set_section_value(1, code)
97
+ if nome.to_s.length > 0
98
+ self.set_section_value(4, nome)
107
99
  else
108
- raise "#{get_id}: 1 = Remessa - Enviado pela Empresa para o Banco
109
- 2 = Retorno - Enviado pelo Banco para a Empresa
110
- Valor: #{code}"
100
+ raise
111
101
  end
112
102
  end
113
103
 
114
- def set_codigo_convenio code
115
- code = code.to_s
116
-
117
- if !code.nil? and
118
- (code.length > 0 and code.length <= 20)
104
+ def set_codigo_empresa codigo
105
+ begin
106
+ if codigo.length == 20
107
+ self.set_section_value(5, codigo)
108
+ else
109
+ raise
110
+ end
119
111
 
120
- self.set_section_value(2, code)
121
- else
122
- raise "#{get_id}: Código atribuído pelo Banco, para seu controle interno.
123
- Este código será informado à Empresa, pelo Banco, antes
124
- da implantação do serviço de débito automático.
125
- Valor: #{code}"
112
+ rescue
113
+ raise
126
114
  end
127
115
  end
128
116
 
129
117
  def set_nome_empresa nome
130
118
  nome = nome.to_s
131
119
 
132
- if nome.to_s.length > 0
133
- self.set_section_value(3, nome)
120
+ if nome
121
+ self.set_section_value(6, nome)
134
122
  else
135
- raise "#{get_id}: Nome da Empresa não pode estar vazio"
123
+ raise
136
124
  end
137
125
  end
138
126
 
@@ -140,29 +128,29 @@ class Cnab4000 < FormatSection
140
128
  codigo = codigo.to_i
141
129
 
142
130
  if codigo > 0
143
- self.set_section_value(4, codigo)
131
+ self.set_section_value(7, codigo)
144
132
  else
145
- raise "#{get_id}: Código do Banco não pode estar vazio"
133
+ raise
146
134
  end
147
135
  end
148
136
 
149
137
  def set_nome_banco nome
150
138
  nome = nome.to_s
151
139
 
152
- if nome.to_s.length > 0
153
- self.set_section_value(5, nome)
140
+ if nome.length > 0
141
+ self.set_section_value(8, nome)
154
142
  else
155
- raise "#{get_id}: Nome do Banco não pode estar vazio"
143
+ raise
156
144
  end
157
145
  end
158
146
 
159
147
  def set_data_geracao data
160
148
  begin
161
- data = Date.strptime(data, "%Y%m%d") if data.is_a?(String)
162
- real_data = data.strftime("%Y%m%d")
149
+ data = Date.strptime(data, "%d%m%y") if data.is_a?(String)
150
+ real_data = data.strftime('%d%m%y')
163
151
 
164
- if real_data.length == 8
165
- self.set_section_value(6, real_data)
152
+ if real_data.length == 6
153
+ self.set_section_value(9, real_data)
166
154
  else
167
155
  raise
168
156
  end
@@ -173,41 +161,34 @@ class Cnab4000 < FormatSection
173
161
  end
174
162
  end
175
163
 
176
- def set_numero_sequencial numero
177
- numero = numero.to_i
178
-
179
- if numero > 0
180
- self.set_section_value(7, numero)
181
- else
182
- raise "#{get_id}: Número Sequencial deve ser positivo e maior que 0
183
- Valor: #{numero}"
184
- end
164
+ def set_branco_1 branco
165
+ branco = branco.to_s
166
+ self.set_section_value(10, branco)
185
167
  end
186
168
 
187
- def set_versao_layout versao
188
- versao = versao.to_i
189
-
190
- if versao > 0
191
- self.set_section_value(8, versao)
192
- else
193
- raise "#{get_id}: Versão deve ser 05 (a partir de 05.05.2008)
194
- Valor: #{versao}"
195
- end
169
+ def set_id_sistema id
170
+ id = id.to_s
171
+ self.set_section_value(11, id)
196
172
  end
197
173
 
198
- def set_identificacao_servico identificacao
199
- identificacao = identificacao.to_s
174
+ def set_seq_arquivo sequencial
175
+ sequencial = sequencial.to_i
176
+ self.set_section_value(12, sequencial)
177
+ end
200
178
 
201
- if identificacao.length > 0
202
- self.set_section_value(9, identificacao)
203
- else
204
- raise "#{get_id}: Deve ser Débito Automático
205
- Valor: #{identificacao}"
206
- end
179
+ def set_branco_2 branco
180
+ branco = branco.to_s
181
+ self.set_section_value(13, branco)
207
182
  end
208
183
 
209
- def set_reservado reservado
210
- reservado = reservado.to_s
211
- self.set_section_value(10, reservado)
184
+ def set_seq_registro sequencial
185
+ sequencial = sequencial.to_i
186
+ self.set_section_value(14, sequencial)
212
187
  end
213
188
  end
189
+
190
+
191
+
192
+
193
+
194
+