formatos-febraban 0.3.48 → 0.3.49

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: 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