teodoro 0.67.1 → 0.67.3

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
  SHA256:
3
- metadata.gz: dd434d937c342ccebfd1946cbce175d3f752f2084dfeb3e6c55af824f3000942
4
- data.tar.gz: 731f94e39d2a467522b5d57f3711261e5fa9897ff34c47fbf076f3b3f2d5aa45
3
+ metadata.gz: 9bd232ff7396766bbf22931a10bdb93cebb1165d5afea355a49cacffb3f8d981
4
+ data.tar.gz: 288f9b35d3d605d50e537d685442646b57a6d80278ad6be2670eb4e0af10a3c5
5
5
  SHA512:
6
- metadata.gz: a89cfe230bde7f4ba322bb9c4c47d250cdaac3ab785d19807fdaf11a774e9653ceffa0efeca065b47aa7bd185c49ffcfcfd01f56b9a188b2a4d7cbc8bf99eabc
7
- data.tar.gz: 78b3cea554caf9c3f01c7dee1af176ad3e84a784f5c3892a8fdfabc6ce24abeb0512b75ece47ab766fda9e8c4f1c59209a0c4b85f0c32b7428897667982d4050
6
+ metadata.gz: 44c240a32c5c8ead1b19b8378b66069683f8e765113231bc841a43b8bf0c30a1b8988333f6fdfc870f56863f7e3dd567fe1a6848fc2a391b07e9a020a90e664a
7
+ data.tar.gz: 5fb8688f5af27f19127deba394ae08d78b626d0cd50184755ce7a400b180486ecda4bf2800b3f1aa714661990a4b4c004820ac87a35a25322a12cf5827e59d86
@@ -25,8 +25,7 @@ module Teodoro
25
25
  def validar_existencia_do_arquivo_data_original
26
26
  return if File.exist?(caminho_do_arquivo_data_original)
27
27
 
28
- puts '', Rainbow('Erro! Evento de alteração/exclusão sem inclusão anterior.').red
29
- exit
28
+ Teodoro.exit('', Rainbow('Erro! Evento de alteração/exclusão sem inclusão anterior.').red)
30
29
  end
31
30
 
32
31
  def deletar_arquivo_data_original
@@ -31,6 +31,7 @@ module Teodoro
31
31
  end
32
32
 
33
33
  def processar_retificacao
34
+ arquivo_xml_de_retificacao.arquivo_retificado = arquivo_xml
34
35
  arquivo_xml_de_retificacao.processar
35
36
  end
36
37
 
@@ -4,28 +4,37 @@ module Teodoro
4
4
 
5
5
  private
6
6
 
7
- def initialize(caminho:, destino_dos_arquivos_xml:)
7
+ def initialize(empresa:, caminho:, indice:, destino_dos_arquivos_xml:)
8
+ @empresa = empresa
8
9
  @caminho = caminho
10
+ @indice = indice
9
11
  @destino_dos_arquivos_xml = destino_dos_arquivos_xml
10
12
  end
11
13
 
12
- attr_reader :caminho, :destino_dos_arquivos_xml
14
+ attr_reader :empresa, :caminho, :indice, :destino_dos_arquivos_xml
13
15
 
14
16
  public
15
17
 
16
18
  def descompactar
17
- if File.directory?(caminho)
18
- puts '', Rainbow("Erro! \"#{p(caminho)}\" é um diretório.").red
19
- exit
20
- end
19
+ validar_que_nao_eh_diretorio
21
20
 
22
- Console.print "descompactando #{File.basename(caminho)}..." do
21
+ Console.print "descompactando #{File.basename(caminho)} (#{percentual}%)..." do
23
22
  descompactar_arquivo_zip
24
23
  end
25
24
  end
26
25
 
27
26
  private
28
27
 
28
+ def validar_que_nao_eh_diretorio
29
+ return unless File.directory?(caminho)
30
+
31
+ Teodoro.exit('', Rainbow("Erro! \"#{caminho}\" é um diretório.").red)
32
+ end
33
+
34
+ def percentual
35
+ (indice + 1) * 100 / empresa.qtd_de_arquivos_de_origem
36
+ end
37
+
29
38
  def descompactar_arquivo_zip
30
39
  Zip::File.open(caminho) do |zip|
31
40
  zip
@@ -35,8 +44,7 @@ module Teodoro
35
44
  end
36
45
  end
37
46
  rescue Zip::Error
38
- puts '', Rainbow("Erro! Arquivo \"#{caminho}\" corrompido.").red
39
- exit
47
+ Teodoro.exit('', Rainbow("Erro! Arquivo \"#{caminho}\" corrompido.").red)
40
48
  end
41
49
 
42
50
  def extrair(entrada)
@@ -99,20 +99,23 @@ module Teodoro
99
99
 
100
100
  private
101
101
 
102
- def initialize(empresa:, caminho:)
102
+ def initialize(empresa:, caminho:, indice:)
103
103
  @empresa = empresa
104
104
  @caminho = caminho
105
+ @indice = indice
105
106
  end
106
107
 
107
108
  attr_reader :empresa, :caminho
108
109
 
109
110
  public
110
111
 
112
+ attr_accessor :indice, :arquivo_retificado
113
+
111
114
  attr_reader :recibo_do_evento_a_excluir, :recibo_do_evento_a_retificar, :momento_de_processamento_pelo_e_social
112
115
 
113
116
  # otimizacao do gerenciamento de memoria
114
117
  def carregar
115
- Console.print "carregando #{nome}.xml..." do
118
+ Console.print "carregando #{nome}.xml (#{percentual}%)..." do
116
119
  evento, recibo = carregar_evento_e_recibo
117
120
 
118
121
  @recibo_do_evento_a_excluir = evento['infoExclusao/nrRecEvt'] if exclusao_por_recibo?
@@ -126,6 +129,10 @@ module Teodoro
126
129
  tratar_excecao(e)
127
130
  end
128
131
 
132
+ def nome
133
+ @nome ||= File.basename(caminho, '.xml')
134
+ end
135
+
129
136
  def exclusao_por_recibo?
130
137
  tipo_de_evento == 'S3000'
131
138
  end
@@ -138,16 +145,12 @@ module Teodoro
138
145
  TIPOS_DE_EVENTO_PROCESSAVEIS.include?(tipo_de_evento)
139
146
  end
140
147
 
141
- def nome
142
- @nome ||= File.basename(caminho, '.xml')
143
- end
144
-
145
148
  def s1000?
146
149
  tipo_de_evento == 'S1000'
147
150
  end
148
151
 
149
152
  def processar
150
- Console.print "processando #{nome}.xml..." do
153
+ Console.print "processando #{nome}.xml (#{percentual}%)..." do
151
154
  validar_versao_do_leiaute
152
155
  processar_arquivo
153
156
  end
@@ -187,6 +190,10 @@ module Teodoro
187
190
  raise 'arquivo corrompido (sem data e horário do processamento do evento)'
188
191
  end
189
192
 
193
+ def percentual
194
+ retificacao? ? arquivo_retificado.percentual : (indice + 1) * 100 / empresa.qtd_de_arquivos_xml
195
+ end
196
+
190
197
  def validar_versao_do_leiaute
191
198
  raise unless (VERSOES_DE_LEIAUTE_2 + VERSOES_DE_LEIAUTE_SIMPLIFICADO).include?(versao_do_leiaute)
192
199
  end
@@ -218,7 +225,12 @@ module Teodoro
218
225
  def arquivo
219
226
  classe_do_arquivo.new(
220
227
  empresa: empresa,
221
- arquivo_xml: Obj.new(leiaute_simplificado?: leiaute_simplificado?, evento: evento, recibo: recibo)
228
+ arquivo_xml: Obj.new(
229
+ percentual: percentual,
230
+ leiaute_simplificado?: leiaute_simplificado?,
231
+ evento: evento,
232
+ recibo: recibo
233
+ )
222
234
  )
223
235
  end
224
236
 
@@ -29,12 +29,14 @@ module Teodoro
29
29
  class Impl # rubocop:disable Metrics/ClassLength
30
30
  private
31
31
 
32
- def initialize(caminho:, destino:)
32
+ def initialize(caminho:, qtd_de_empresas:, indice:, destino:)
33
33
  @caminho = caminho
34
+ @qtd_de_empresas = qtd_de_empresas
35
+ @indice = indice
34
36
  @destino = File.join(destino, nome_do_diretorio)
35
37
  end
36
38
 
37
- attr_reader :caminho, :destino
39
+ attr_reader :caminho, :qtd_de_empresas, :indice, :destino
38
40
 
39
41
  public
40
42
 
@@ -57,6 +59,14 @@ module Teodoro
57
59
  ajustar_nome_do_ultimo_arquivo_emp_data
58
60
  end
59
61
 
62
+ def qtd_de_arquivos_de_origem
63
+ @qtd_de_arquivos_de_origem ||= caminhos_dos_arquivos_de_origem.size
64
+ end
65
+
66
+ def qtd_de_arquivos_xml
67
+ @qtd_de_arquivos_xml ||= arquivos_xml.size
68
+ end
69
+
60
70
  def destino_dos_arquivos_data
61
71
  @destino_dos_arquivos_data ||= File.join(destino, 'data')
62
72
  end
@@ -104,7 +114,7 @@ module Teodoro
104
114
  private
105
115
 
106
116
  def dar_feedback_para_o_usuario
107
- puts Rainbow(nome_do_diretorio).green
117
+ puts Rainbow(nome_do_diretorio).green + " (#{indice + 1} de #{qtd_de_empresas})"
108
118
  end
109
119
 
110
120
  def nome_do_diretorio
@@ -140,8 +150,19 @@ module Teodoro
140
150
 
141
151
  def arquivos_de_origem
142
152
  @arquivos_de_origem ||=
143
- Dir[File.join(caminho, '*.zip')]
144
- .map { |caminho| ArquivoDeOrigem.new(caminho: caminho, destino_dos_arquivos_xml: destino_dos_arquivos_xml) }
153
+ caminhos_dos_arquivos_de_origem
154
+ .map.with_index do |caminho, indice|
155
+ ArquivoDeOrigem.new(
156
+ empresa: self,
157
+ caminho: caminho,
158
+ indice: indice,
159
+ destino_dos_arquivos_xml: destino_dos_arquivos_xml
160
+ )
161
+ end
162
+ end
163
+
164
+ def caminhos_dos_arquivos_de_origem
165
+ @caminhos_dos_arquivos_de_origem ||= Dir[File.join(caminho, '*.zip')]
145
166
  end
146
167
 
147
168
  def carregar_arquivos_xml
@@ -150,14 +171,18 @@ module Teodoro
150
171
 
151
172
  def arquivos_xml
152
173
  @arquivos_xml ||=
153
- Dir[File.join(destino_dos_arquivos_xml, '*.xml')]
154
- .map { |caminho| ArquivoXML.new(empresa: self, caminho: caminho) }
174
+ caminhos_dos_arquivos_xml
175
+ .map.with_index { |caminho, indice| ArquivoXML.new(empresa: self, caminho: caminho, indice: indice) }
176
+ end
177
+
178
+ def caminhos_dos_arquivos_xml
179
+ @caminhos_dos_arquivos_xml ||= Dir[File.join(destino_dos_arquivos_xml, '*.xml')]
155
180
  end
156
181
 
157
182
  def classificar_arquivos_xml # rubocop:disable Metrics/MethodLength
158
183
  Console.print 'classificando os arquivos XML...' do
159
184
  arquivos_xml
160
- .tap { @arquivos_xml = [] }
185
+ .tap { reinicializar_arquivos_xml }
161
186
  .select(&:processavel?)
162
187
  .each do |arquivo_xml|
163
188
  if arquivo_xml.exclusao_por_recibo?
@@ -171,17 +196,24 @@ module Teodoro
171
196
  end
172
197
  end
173
198
 
199
+ def reinicializar_arquivos_xml
200
+ @arquivos_xml = []
201
+ @qtd_de_arquivos_xml = nil
202
+ end
203
+
174
204
  def ordenar_arquivos_xml
175
205
  Console.print 'ordenando os arquivos XML...' do
176
206
  arquivos_xml.sort_by! { [_1.momento_de_processamento_pelo_e_social, _1.nome] }
207
+ arquivos_xml.each.with_index do |arquivo_xml, indice|
208
+ arquivo_xml.indice = indice
209
+ end
177
210
  end
178
211
  end
179
212
 
180
213
  def validar_que_primeiro_arquivo_xml_eh_s1000
181
214
  return if primeiro_arquivo_xml_eh_s1000?
182
215
 
183
- puts '', Rainbow('Erro! Primeiro arquivo XML (evento) deve ser S-1000.').red
184
- exit
216
+ Teodoro.exit('', Rainbow('Erro! Primeiro arquivo XML (evento) deve ser S-1000.').red)
185
217
  end
186
218
 
187
219
  def primeiro_arquivo_xml_eh_s1000?
@@ -190,20 +222,24 @@ module Teodoro
190
222
 
191
223
  def processar_arquivos_xml
192
224
  # otimizacao do gerenciamento de memoria
193
- arquivos_xml.shift.processar while arquivos_xml.any?
225
+ while arquivos_xml.any?
226
+ arquivos_xml.first.processar
227
+ arquivos_xml.shift
228
+ end
194
229
  end
195
230
 
196
231
  def validar_que_nao_houve_evento_de_retificacao_sem_inclusao_correspondente
197
232
  return if arquivo_xml_por_recibo_de_evento_retificado.empty?
198
233
 
199
- puts ''
200
- puts [
201
- 'Erro! Evento(s) de retificação sem inclusão correspondente:',
202
- *arquivo_xml_por_recibo_de_evento_retificado
203
- .values
204
- .map { "#{_1.nome}.xml" }
205
- ].map { Rainbow(_1).red }
206
- exit
234
+ Teodoro.exit(
235
+ '',
236
+ [
237
+ 'Erro! Evento(s) de retificação sem inclusão correspondente:',
238
+ *arquivo_xml_por_recibo_de_evento_retificado
239
+ .values
240
+ .map { "#{_1.nome}.xml" }
241
+ ].map { Rainbow(_1).red }
242
+ )
207
243
  end
208
244
 
209
245
  def salvar_arquivo_de_dados_gerais
@@ -215,15 +251,21 @@ module Teodoro
215
251
  end
216
252
 
217
253
  def processar_cargos_gerados
218
- cargos_gerados.each(&:processar)
254
+ Console.print 'gerando arquivos de cargos...' do
255
+ cargos_gerados.each(&:processar)
256
+ end
219
257
  end
220
258
 
221
259
  def processar_funcoes_geradas
222
- funcoes_geradas.each(&:processar)
260
+ Console.print 'gerando arquivos de funções...' do
261
+ funcoes_geradas.each(&:processar)
262
+ end
223
263
  end
224
264
 
225
265
  def setar_proximo_identificador_de_tabela_de_rubricas_nos_arquivos_data_emp
226
- arquivos_data_emp.each(&:setar_proximo_identificador_de_tabela_de_rubricas)
266
+ Console.print 'definindo próximo identificador de rubrica...' do
267
+ arquivos_data_emp.each(&:setar_proximo_identificador_de_tabela_de_rubricas)
268
+ end
227
269
  end
228
270
 
229
271
  def arquivos_data_emp
@@ -237,7 +279,7 @@ module Teodoro
237
279
  end
238
280
 
239
281
  def proximo_identificador_de_tabela_de_rubricas
240
- (ultimo_identificador_de_tabela_de_rubricas || 0) + 1
282
+ @proximo_identificador_de_tabela_de_rubricas ||= (ultimo_identificador_de_tabela_de_rubricas || 0) + 1
241
283
  end
242
284
 
243
285
  def ultimo_identificador_de_tabela_de_rubricas
@@ -257,7 +299,9 @@ module Teodoro
257
299
  end
258
300
 
259
301
  def ajustar_nome_do_ultimo_arquivo_emp_data
260
- File.rename(caminho_do_ultimo_arquivo_emp_data, novo_caminho_do_ultimo_arquivo_emp_data)
302
+ Console.print 'ajustando nome do último arquivo da empresa...' do
303
+ File.rename(caminho_do_ultimo_arquivo_emp_data, novo_caminho_do_ultimo_arquivo_emp_data)
304
+ end
261
305
  end
262
306
 
263
307
  def caminho_do_ultimo_arquivo_emp_data
@@ -14,8 +14,7 @@ module Teodoro
14
14
  def validar_existencia_do_contrato_de_trabalho
15
15
  return if empresa.trabalhadores[cpf_do_trabalhador]
16
16
 
17
- puts '', Rainbow('Erro! Evento de início de contrato de trabalho inexistente.').red
18
- exit
17
+ Teodoro.exit('', Rainbow('Erro! Evento de início de contrato de trabalho inexistente.').red)
19
18
  end
20
19
 
21
20
  def salvar_arquivos_data
@@ -134,7 +134,9 @@ module Teodoro
134
134
  end
135
135
 
136
136
  def contrato_de_emprego
137
- @contrato_de_emprego ||= contratos_de_emprego[alteracao_contratual.matricula_do_trabalhador]
137
+ @contrato_de_emprego ||=
138
+ contratos_de_emprego[alteracao_contratual.matricula_do_trabalhador]
139
+ .tap { Teodoro.exit('', Rainbow('Erro! S-2200 correspondente não encontrado.').red) unless _1 }
138
140
  end
139
141
 
140
142
  def contratos_de_emprego
@@ -185,7 +187,7 @@ module Teodoro
185
187
  ['ESX_DATAADMISSAO', data_de_admissao, :data],
186
188
  ['ESX_DATAALTERACAO', data_da_alteracao, :data],
187
189
  ['cpfTrabalhador', cpf_do_trabalhador],
188
- %w[nomeTrabalhador nomeTrabalhador], # FIXME: Tales
190
+ %w[nomeTrabalhador nomeTrabalhador], # TODO: Tales
189
191
  ['IdentificacaoVinculo_Cpf', cpf_do_trabalhador],
190
192
  ['IdentificacaoVinculo_Matricula', alteracao_contratual.matricula_do_trabalhador],
191
193
  ['TipoInscricaoEmpregador', tipo_de_inscricao_do_empregador],
@@ -22,14 +22,13 @@ module Teodoro
22
22
  empresa.contratos_de_trabalho_sem_vinculo
23
23
  end
24
24
 
25
- def inicio_de_contrato # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
25
+ def inicio_de_contrato
26
26
  @inicio_de_contrato ||= Obj.new(
27
27
  trabalhador: trabalhador,
28
28
  matricula_do_trabalhador: evento['infoTSVInicio/matricula'],
29
29
  categoria_do_trabalhador: evento['infoTSVInicio/codCateg'],
30
30
  data_de_inicio: evento['infoTSVInicio/dtInicio'],
31
31
  natureza_da_atividade: evento['infoTSVInicio/natAtividade'],
32
- matricula: evento['infoTSVInicio/matricula'],
33
32
  opcao_pelo_fgts: leiaute.opcao_pelo_fgts,
34
33
  data_de_opcao_pelo_fgts: leiaute.data_de_opcao_pelo_fgts,
35
34
  recibo: numero_do_recibo
@@ -239,7 +238,7 @@ module Teodoro
239
238
  ['localTrabGeral_nrInsc', evento['infoTSVInicio/infoComplementares/localTrabGeral/nrInsc']],
240
239
  ['localTrabGeral_descComp', evento['infoTSVInicio/infoComplementares/localTrabGeral/descComp']],
241
240
  ['EventoAdmissao_InformacoesInicio_CodigoCategoria', inicio_de_contrato.categoria_do_trabalhador],
242
- ['EventoAdmissao_InformacoesInicio_Matricula', inicio_de_contrato.matricula],
241
+ ['EventoAdmissao_InformacoesInicio_Matricula', inicio_de_contrato.matricula_do_trabalhador],
243
242
  ['DescricaoProcEmi', processo_de_emissao_do_evento],
244
243
  ['IdEventoXml', id_do_evento],
245
244
  ['EventoAdmissao_InfoTrabalhador_InfoEndereco_EnderecoResidencialBR_Bairro', trabalhador.endereco.bairro],
@@ -1,3 +1,3 @@
1
1
  module Teodoro
2
- VERSION = '0.67.1'.freeze
2
+ VERSION = '0.67.3'.freeze
3
3
  end
data/lib/teodoro.rb CHANGED
@@ -41,6 +41,11 @@ module Teodoro
41
41
  Execution.new(args).call
42
42
  end
43
43
 
44
+ def self.exit(*args)
45
+ puts(*args)
46
+ Kernel.exit
47
+ end
48
+
44
49
  class Execution
45
50
  NOME_DO_PROGRAMA = 'teodoro'.freeze
46
51
 
@@ -142,8 +147,7 @@ module Teodoro
142
147
  end
143
148
 
144
149
  def erro(erro, saiba_mais: false)
145
- puts [erro, *('Saiba mais em sites.google.com/fortestecnologia.com.br/teodoro.' if saiba_mais)]
146
- exit
150
+ Teodoro.exit([erro, *('Saiba mais em sites.google.com/fortestecnologia.com.br/teodoro.' if saiba_mais)])
147
151
  end
148
152
 
149
153
  def processar_empresas
@@ -152,7 +156,23 @@ module Teodoro
152
156
  end
153
157
 
154
158
  def empresas
155
- @empresas ||= Dir[File.join(origem, '*')].map { |caminho| Empresa.new(caminho: caminho, destino: destino) }
159
+ @empresas ||=
160
+ caminhos_das_empresas.map.with_index do |caminho, indice|
161
+ Empresa.new(
162
+ caminho: caminho,
163
+ qtd_de_empresas: qtd_de_empresas,
164
+ indice: indice,
165
+ destino: destino
166
+ )
167
+ end
168
+ end
169
+
170
+ def caminhos_das_empresas
171
+ @caminhos_das_empresas ||= Dir[File.join(origem, '*')]
172
+ end
173
+
174
+ def qtd_de_empresas
175
+ @qtd_de_empresas ||= caminhos_das_empresas.size
156
176
  end
157
177
  end
158
178
  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.67.1
4
+ version: 0.67.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Fortes Tecnologia
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-02-28 00:00:00.000000000 Z
11
+ date: 2024-03-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: nokogiri