teodoro 0.15.1 → 0.19.1

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.
data/lib/teodoro.rb CHANGED
@@ -1,4 +1,6 @@
1
1
  require 'forwardable'
2
+ require 'json'
3
+ require 'net/http'
2
4
  require 'nokogiri'
3
5
  require 'os'
4
6
  require 'rainbow'
@@ -10,6 +12,13 @@ require_relative 'teodoro/empresa'
10
12
  require_relative 'teodoro/obj'
11
13
 
12
14
  module Teodoro
15
+ VERSION = '0.19.1'.freeze
16
+
17
+ CBOs = JSON.parse(File.read(File.join(File.dirname(__FILE__), 'CBOs.json')))
18
+ .map { [_1['codigo'], _1['titulo']] }
19
+ .to_h
20
+ .freeze
21
+
13
22
  def self.call(args)
14
23
  Execution.new(args).call
15
24
  end
@@ -38,6 +47,7 @@ module Teodoro
38
47
  validar_existencia_do_diretorio_de_destino
39
48
  validar_que_diretorio_de_origem_nao_esta_vazio
40
49
  validar_que_diretorio_de_destino_esta_vazio
50
+ validar_que_nao_ha_nova_versao_disponivel
41
51
 
42
52
  processar_empresas
43
53
  end
@@ -48,6 +58,28 @@ module Teodoro
48
58
  erro "#{NOME_DO_PROGRAMA} [diretório de origem] [diretório de destino]" unless args.size == 2
49
59
  end
50
60
 
61
+ def validar_que_nao_ha_nova_versao_disponivel
62
+ return unless nova_versao_disponivel?
63
+
64
+ erro ['Há uma nova versão disponível. Execute o seguinte comando para atualizar:', 'gem update teodoro']
65
+ end
66
+
67
+ def nova_versao_disponivel?
68
+ carregar_versao_disponivel != versao_corrente
69
+ end
70
+
71
+ def carregar_versao_disponivel
72
+ Console.print 'Verificando se há nova versão disponível...' do
73
+ JSON.parse(Net::HTTP.get(URI('https://rubygems.org/api/v1/gems/teodoro.json')))['version']
74
+ end
75
+ rescue StandardError
76
+ erro 'Erro! Não foi possível carregar a versão disponível. Verifique seu acesso à internet.'
77
+ end
78
+
79
+ def versao_corrente
80
+ Teodoro::VERSION
81
+ end
82
+
51
83
  def validar_existencia_do_diretorio_de_origem
52
84
  erro 'Diretório de origem não existe.' unless File.directory?(origem)
53
85
  end
@@ -21,8 +21,6 @@ module Teodoro
21
21
  raise caminho if File.exist?(caminho)
22
22
 
23
23
  File.open(caminho, 'w') { |f| f.puts(itens_do_conteudo.map { "#{_1}=#{Valor.new(_2, formato: _3)}" }) }
24
- # FIXME: Tales
25
- # File.write(caminho, (itens_do_conteudo.map { "#{_1}=#{Valor.new(_2, formato: _3)}" } + ['']).join("\n"))
26
24
  end
27
25
 
28
26
  private
@@ -19,7 +19,7 @@ module Teodoro
19
19
  ['FimValidade', dados.fim_da_validade, :mes_ano],
20
20
  ['DadosCargo_DescricaoCargo', dados.nome_do_cargo],
21
21
  ['DadosCargo_CodigoCBO', dados.cbo],
22
- ['DadosCargo_CodigoCBO_TEXT'],
22
+ ['DadosCargo_CodigoCBO_TEXT', "#{dados.cbo} - #{CBO.new(dados.cbo).titulo}"],
23
23
  ['autocomplete_DadosCargo_CodigoCBO'],
24
24
  ['PreencherCargoPublico', dados.orgao_publico?, :bool],
25
25
  ['IdEventoXml', dados.id_do_evento],
@@ -28,6 +28,34 @@ module Teodoro
28
28
  ['VerProc', dados.versao_do_aplicativo_de_processamento_do_evento]
29
29
  ]
30
30
  end
31
+
32
+ class CBO
33
+ private
34
+
35
+ def initialize(codigo)
36
+ @codigo = codigo
37
+
38
+ alertar unless encontrado?
39
+ end
40
+
41
+ attr_reader :codigo
42
+
43
+ public
44
+
45
+ def titulo
46
+ CBOs[codigo] || codigo
47
+ end
48
+
49
+ private
50
+
51
+ def encontrado?
52
+ CBOs.key?(codigo)
53
+ end
54
+
55
+ def alertar
56
+ puts "\n #{Rainbow("CBO #{codigo} não encontrado").yellow}"
57
+ end
58
+ end
31
59
  end
32
60
  end
33
61
  end
@@ -1,7 +1,11 @@
1
1
  module Console
2
2
  def self.print(string)
3
3
  Kernel.print "\r\e[2K#{string}"
4
- yield
5
- Kernel.print "\r\e[2K"
4
+ begin
5
+ result = yield
6
+ ensure
7
+ Kernel.print "\r\e[2K"
8
+ end
9
+ result
6
10
  end
7
11
  end
@@ -21,7 +21,7 @@ module Teodoro
21
21
  impl.processar
22
22
  end
23
23
 
24
- class Impl
24
+ class Impl # rubocop:disable Metrics/ClassLength
25
25
  private
26
26
 
27
27
  def initialize(caminho:, destino:)
@@ -39,15 +39,14 @@ module Teodoro
39
39
 
40
40
  def processar
41
41
  dar_feedback_para_o_usuario
42
- criar_diretorio_destino
43
- criar_diretorio_dos_arquivos_xml
42
+ criar_diretorios_destino
44
43
  descompactar_arquivos_de_origem
45
- criar_diretorio_dos_arquivos_data
46
44
  carregar_arquivos_xml
47
45
  classificar_arquivos_xml
48
46
  ordenar_arquivos_xml
49
47
  processar_arquivos_xml
50
48
  processar_cargos_gerados
49
+ ajustar_nome_do_ultimo_arquivo_emp_data
51
50
  end
52
51
 
53
52
  def destino_dos_arquivos_data
@@ -80,6 +79,12 @@ module Teodoro
80
79
  @nome_do_diretorio ||= File.basename(caminho)
81
80
  end
82
81
 
82
+ def criar_diretorios_destino
83
+ criar_diretorio_destino
84
+ criar_diretorio_dos_arquivos_xml
85
+ criar_diretorio_dos_arquivos_data
86
+ end
87
+
83
88
  def criar_diretorio_destino
84
89
  Dir.mkdir(destino)
85
90
  end
@@ -92,6 +97,10 @@ module Teodoro
92
97
  @destino_dos_arquivos_xml ||= File.join(destino, 'xmls')
93
98
  end
94
99
 
100
+ def criar_diretorio_dos_arquivos_data
101
+ Dir.mkdir(destino_dos_arquivos_data)
102
+ end
103
+
95
104
  def descompactar_arquivos_de_origem
96
105
  # otimizacao do gerenciamento de memoria
97
106
  arquivos_de_origem.shift.descompactar while arquivos_de_origem.any?
@@ -103,10 +112,6 @@ module Teodoro
103
112
  .map { |caminho| ArquivoDeOrigem.new(caminho: caminho, destino_dos_arquivos_xml: destino_dos_arquivos_xml) }
104
113
  end
105
114
 
106
- def criar_diretorio_dos_arquivos_data
107
- Dir.mkdir(destino_dos_arquivos_data)
108
- end
109
-
110
115
  def carregar_arquivos_xml
111
116
  arquivos_xml.each(&:carregar)
112
117
  end
@@ -143,6 +148,22 @@ module Teodoro
143
148
  def processar_cargos_gerados
144
149
  cargos_gerados.each(&:processar)
145
150
  end
151
+
152
+ def ajustar_nome_do_ultimo_arquivo_emp_data
153
+ File.rename(caminho_do_ultimo_arquivo_emp_data, novo_caminho_do_ultimo_arquivo_emp_data)
154
+ end
155
+
156
+ def caminho_do_ultimo_arquivo_emp_data
157
+ @caminho_do_ultimo_arquivo_emp_data ||= caminhos_dos_arquivos_emp_data.last
158
+ end
159
+
160
+ def caminhos_dos_arquivos_emp_data
161
+ Dir[File.join(destino_dos_arquivos_data, 'EMP*.data')]
162
+ end
163
+
164
+ def novo_caminho_do_ultimo_arquivo_emp_data
165
+ caminho_do_ultimo_arquivo_emp_data.sub(/\[[^\]]*\]\.data$/, '.data')
166
+ end
146
167
  end
147
168
  end
148
169
  end
@@ -41,7 +41,7 @@ module Teodoro
41
41
  ['DadosRubrica_Natureza', evento['infoRubrica/*/dadosRubrica/natRubr']],
42
42
  ['DadosRubrica_TipoRubrica', evento['infoRubrica/*/dadosRubrica/tpRubr']],
43
43
  ['DadosRubrica_CodigoIncidenciaPrevidencia', evento['infoRubrica/*/dadosRubrica/codIncCP']],
44
- ['DadosRubrica_CodigoIncidenciaIR', evento['infoRubrica/*/dadosRubrica/codIncIRRF']],
44
+ de_acordo_com_a_versao_do_leiaute['DadosRubrica_CodigoIncidenciaIR'],
45
45
  ['DadosRubrica_CodigoIncidenciaFGTS', evento['infoRubrica/*/dadosRubrica/codIncFGTS']],
46
46
  ['DadosRubrica_CodigoIncidenciaSindical', evento['infoRubrica/*/dadosRubrica/codIncSIND']],
47
47
  ['IdEventoXml'],
@@ -54,6 +54,33 @@ module Teodoro
54
54
  ['hd_ProcessoSindicato']
55
55
  ]
56
56
  end
57
+
58
+ def de_acordo_com_a_versao_do_leiaute # rubocop:disable Metrics/MethodLength
59
+ @de_acordo_com_a_versao_do_leiaute ||=
60
+ (
61
+ if leiaute_simplificado?
62
+ [
63
+ [
64
+ 'DadosRubrica_CodigoIncidenciaIR',
65
+ evento['infoRubrica/*/dadosRubrica/codIncIRRF'].then { {
66
+ '0' => '00',
67
+ '1' => '01',
68
+ '9' => '09',
69
+ '700' => '79',
70
+ '701' => '79'
71
+ }[_1] || _1 }
72
+ ]
73
+ ]
74
+ else
75
+ [
76
+ [
77
+ 'DadosRubrica_CodigoIncidenciaIR',
78
+ evento['infoRubrica/*/dadosRubrica/codIncIRRF']
79
+ ]
80
+ ]
81
+ end
82
+ ).map { [_1.first, _1] }.to_h
83
+ end
57
84
  end
58
85
  end
59
86
  end
@@ -32,8 +32,8 @@ module Teodoro
32
32
  ['CodigoLotacao', codigo_da_lotacao_tributaria],
33
33
  ['InicioValidade', inicio_da_validade, :mes_ano],
34
34
  ['FimValidade', fim_da_validade, :mes_ano],
35
- ['TipoLotacao', evento['infoLotacao/*/dadosLotacao/tpLotacao']],
36
- ['Tipo'],
35
+ ['TipoLotacao', tipo_de_lotacao],
36
+ %w[Tipo 1],
37
37
  ['TipoInscricaoEstab', evento['infoLotacao/*/dadosLotacao/tpInsc']],
38
38
  ['NumeroInscricaoEstab', evento['infoLotacao/*/dadosLotacao/nrInsc']],
39
39
  ['Fpas', evento['infoLotacao/*/dadosLotacao/fpasLotacao/fpas']],
@@ -44,6 +44,10 @@ module Teodoro
44
44
  ['VerProc', versao_do_aplicativo_de_processamento_do_evento]
45
45
  ]
46
46
  end
47
+
48
+ def tipo_de_lotacao
49
+ @tipo_de_lotacao ||= evento['infoLotacao/*/dadosLotacao/tpLotacao']
50
+ end
47
51
  end
48
52
  end
49
53
  end
@@ -180,83 +180,28 @@ module Teodoro
180
180
  @data_da_alteracao ||= evento['infoTSVAlteracao/dtAlteracao']
181
181
  end
182
182
 
183
- def de_acordo_com_a_versao_do_leiaute
183
+ def de_acordo_com_a_versao_do_leiaute # rubocop:disable Metrics/MethodLength
184
184
  @de_acordo_com_a_versao_do_leiaute ||=
185
- if leiaute_simplificado?
186
- LeiauteSimplificado.new(empresa: empresa, evento: evento)
187
- else
188
- Leiaute2.new(evento)
189
- end
190
- end
191
-
192
- module Leiaute
193
- private
194
-
195
- attr_reader :evento
196
-
197
- public
198
-
199
- def [](chave)
200
- indice[chave]
201
- end
202
-
203
- private
204
-
205
- def indice
206
- @indice ||= chaves_valores.map { [_1.first, _1] }.to_h
207
- end
208
- end
209
-
210
- class Leiaute2
211
- include Leiaute
212
-
213
- private
214
-
215
- def initialize(evento)
216
- @evento = evento
217
- end
218
-
219
- def chaves_valores
220
- [
221
- [
222
- 'InfoVinculo_InfoContrato_CodigoCargo',
223
- evento['infoTSVAlteracao/infoComplementares/cargoFuncao/codCargo']
224
- ]
225
- ]
226
- end
227
- end
228
-
229
- class LeiauteSimplificado
230
- include Leiaute
231
-
232
- private
233
-
234
- def initialize(empresa:, evento:)
235
- @empresa = empresa
236
- @evento = evento
237
- end
238
-
239
- attr_reader :empresa
240
-
241
- def chaves_valores
242
- [
243
- [
244
- 'InfoVinculo_InfoContrato_CodigoCargo',
245
- codigo_do_cargo
246
- ]
247
- ]
248
- end
249
-
250
- def codigo_do_cargo
251
- cargo&.codigo
252
- end
253
-
254
- def cargo
255
- empresa.cargos_gerados[
256
- nome: evento['infoTSVAlteracao/infoComplementares/cargoFuncao/nmCargo'],
257
- cbo: evento['infoTSVAlteracao/infoComplementares/cargoFuncao/CBOCargo']
258
- ]
259
- end
185
+ (
186
+ if leiaute_simplificado?
187
+ [
188
+ [
189
+ 'InfoVinculo_InfoContrato_CodigoCargo',
190
+ empresa.cargos_gerados[
191
+ nome: evento['infoTSVAlteracao/infoComplementares/cargoFuncao/nmCargo'],
192
+ cbo: evento['infoTSVAlteracao/infoComplementares/cargoFuncao/CBOCargo']
193
+ ]&.codigo
194
+ ]
195
+ ]
196
+ else
197
+ [
198
+ [
199
+ 'InfoVinculo_InfoContrato_CodigoCargo',
200
+ evento['infoTSVAlteracao/infoComplementares/cargoFuncao/codCargo']
201
+ ]
202
+ ]
203
+ end
204
+ ).map { [_1.first, _1] }.to_h
260
205
  end
261
206
  end
262
207
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: teodoro
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.15.1
4
+ version: 0.19.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Clavius Tales
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-04-27 00:00:00.000000000 Z
11
+ date: 2021-04-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: nokogiri
@@ -186,6 +186,7 @@ extensions: []
186
186
  extra_rdoc_files: []
187
187
  files:
188
188
  - bin/teodoro
189
+ - lib/CBOs.json
189
190
  - lib/teodoro.rb
190
191
  - lib/teodoro/arquivo_data.rb
191
192
  - lib/teodoro/arquivo_data/car.rb