teodoro 0.12.0 → 0.17.0

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: b415fec3398853b0283d7dcc3b822c7b90c81b75e0b34d6c491daf56259d4bde
4
- data.tar.gz: 6e3f908145c5099bc5b8012deb338edb4c6ae22023fad881215e704d6847e12b
3
+ metadata.gz: 95be697f0016ccf25571d0a21540d704c84f67166b8326e3e1ec4098ca3459be
4
+ data.tar.gz: 89eac7b3fc2876ac75b4753fa471dfcb9d9e67ec87ae0a521139d8bbb6440d30
5
5
  SHA512:
6
- metadata.gz: 7a2bd3938c5ce7740cbb50d6db629401007f86f074278d819883516a88959ec72960794bc276403b73e2f4517849c64d4667120339a9de2deb10705a623d5580
7
- data.tar.gz: 70b459092be50c90f46b9931804a4125bfe6b11f1facd30c39cc9acc0799d52ff8dddeea88088f7fdb6c9e0501b4dbfb221acdf8d2490b178463cef251454e76
6
+ metadata.gz: 22a6e36c97a6c4c31e81e24f963a02823c3c9e02c794787d036f89e131f88867d1673c9f32d57827192bdceefc05c031c8af894388544be116f3970d0728f91a
7
+ data.tar.gz: fcd47ad109f0a9f7802712b8bdc0a1900576cf444874976d3c8c0cd02758f77f14b241d152b006098d1fee6e074596f88f55ddce9f044cad59247750784ec7de
data/lib/teodoro.rb CHANGED
@@ -2,6 +2,7 @@ require 'forwardable'
2
2
  require 'nokogiri'
3
3
  require 'os'
4
4
  require 'rainbow'
5
+ require 'securerandom'
5
6
  require 'zip'
6
7
 
7
8
  require_relative 'teodoro/console'
@@ -1,14 +1,17 @@
1
+ require_relative 'arquivo_data/car'
2
+ require_relative 'arquivo_data/tra_epg_avi'
3
+
1
4
  module Teodoro
2
5
  class ArquivoData
3
6
  private
4
7
 
5
- def initialize(destino_dos_arquivos_data:, nome:, itens_do_conteudo:)
6
- @destino_dos_arquivos_data = destino_dos_arquivos_data
8
+ def initialize(diretorio:, nome:, itens_do_conteudo:)
9
+ @diretorio = diretorio
7
10
  @nome = nome
8
11
  @itens_do_conteudo = itens_do_conteudo
9
12
  end
10
13
 
11
- attr_reader :destino_dos_arquivos_data, :itens_do_conteudo
14
+ attr_reader :diretorio, :itens_do_conteudo
12
15
 
13
16
  public
14
17
 
@@ -17,32 +20,32 @@ module Teodoro
17
20
  def criar
18
21
  raise caminho if File.exist?(caminho)
19
22
 
20
- File.write(caminho, (itens_do_conteudo.map { "#{_1}=#{Valor.new(_2, formato: _3)}" } + ['']).join("\r\n"))
23
+ File.open(caminho, 'w') { |f| f.puts(itens_do_conteudo.map { "#{_1}=#{Valor.new(_2, formato: _3)}" }) }
21
24
  end
22
25
 
23
26
  private
24
27
 
25
28
  def caminho
26
- @caminho ||= Caminho.new(destino_dos_arquivos_data: destino_dos_arquivos_data, nome_do_arquivo: nome)
29
+ @caminho ||= Caminho.new(diretorio: diretorio, nome_do_arquivo: nome)
27
30
  end
28
31
 
29
32
  class Caminho
30
33
  private
31
34
 
32
- def initialize(destino_dos_arquivos_data:, nome_do_arquivo:)
33
- @destino_dos_arquivos_data = destino_dos_arquivos_data
35
+ def initialize(diretorio:, nome_do_arquivo:)
36
+ @diretorio = diretorio
34
37
  @nome_do_arquivo = nome_do_arquivo
35
38
  end
36
39
 
37
- attr_reader :destino_dos_arquivos_data, :nome_do_arquivo
40
+ attr_reader :diretorio, :nome_do_arquivo
38
41
 
39
42
  public
40
43
 
41
44
  def to_str
42
45
  @to_str ||=
43
46
  File.join(
44
- destino_dos_arquivos_data,
45
- "#{windows? ? nome_do_arquivo.gsub(%r{[<|>:"/\\?*]}, '_') : nome_do_arquivo}.data"
47
+ diretorio,
48
+ "#{windows? ? nome_do_arquivo.to_s.gsub(%r{[<|>:"/\\?*]}, '_') : nome_do_arquivo}.data"
46
49
  )
47
50
  end
48
51
 
@@ -0,0 +1,34 @@
1
+ module Teodoro
2
+ class ArquivoData
3
+ module CAR
4
+ module Identificacao
5
+ def self.new(codigo_do_cargo)
6
+ ['CAR', codigo_do_cargo]
7
+ end
8
+ end
9
+
10
+ module ItensDeConteudo
11
+ def self.new(dados) # rubocop:disable Metrics/MethodLength
12
+ [
13
+ ['RequestVerificationToken'],
14
+ ['SomenteVisualizacao'],
15
+ ['BloquearCodigo'],
16
+ ['BloquearAntigoPeriodoValidade'],
17
+ ['CodigoCargo', dados.codigo_do_cargo],
18
+ ['InicioValidade', dados.inicio_da_validade, :mes_ano],
19
+ ['FimValidade', dados.fim_da_validade, :mes_ano],
20
+ ['DadosCargo_DescricaoCargo', dados.nome_do_cargo],
21
+ ['DadosCargo_CodigoCBO', dados.cbo],
22
+ ['DadosCargo_CodigoCBO_TEXT'],
23
+ ['autocomplete_DadosCargo_CodigoCBO'],
24
+ ['PreencherCargoPublico', dados.orgao_publico?, :bool],
25
+ ['IdEventoXml', dados.id_do_evento],
26
+ ['NrReciboEventoOriginal', dados.numero_do_recibo],
27
+ ['DescricaoProcEmi', dados.processo_de_emissao_do_evento],
28
+ ['VerProc', dados.versao_do_aplicativo_de_processamento_do_evento]
29
+ ]
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,55 @@
1
+ module Teodoro
2
+ class ArquivoData
3
+ class TRA_EPG_AVI # rubocop:disable Naming/ClassAndModuleCamelCase
4
+ private
5
+
6
+ def initialize(dados)
7
+ @dados = dados
8
+ end
9
+
10
+ attr_reader :dados
11
+
12
+ public
13
+
14
+ def nome
15
+ [
16
+ 'TRA',
17
+ "[#{dados.cpf_do_trabalhador}]",
18
+ "[EPG_#{dados.matricula_do_trabalhador}_#{dados.data_de_admissao.delete('-')}]",
19
+ '-AVI'
20
+ ].join
21
+ end
22
+
23
+ def itens_do_conteudo # rubocop:disable Metrics/MethodLength, Metrics/AbcSize
24
+ [
25
+ # rubocop:disable Layout/LineLength
26
+ ['ESX_CPF', dados.cpf_do_trabalhador],
27
+ ['ESX_MATRICULA', dados.matricula_do_trabalhador],
28
+ %w[ESX_SEMVINCULO 0],
29
+ ['ESX_DATAADMISSAO', dados.data_de_admissao, :data],
30
+ ['OperacaoAvisoPrevio'],
31
+ ['MostrarCancelamento'],
32
+ ['MostrarAvisoPrevio'],
33
+ ['IdContrato'],
34
+ ['IdCancelamentoAvisoPrevio'],
35
+ ['BloquearCodigo'],
36
+ ['BloquearAntigoPeriodoValidade'],
37
+ ['IdeVinculo_Cpf'],
38
+ ['NomeTrabalhador'],
39
+ ['IdeVinculo_Matricula', dados.matricula_do_trabalhador],
40
+ ['InfoAvisoPrevio_DetalhamentoAvisoPrevio_TipoAvisoPrevio', dados.tipo_do_aviso_previo],
41
+ ['InfoAvisoPrevio_DetalhamentoAvisoPrevio_TipoAvisoPrevio_TEXT'],
42
+ ['InfoAvisoPrevio_DetalhamentoAvisoPrevio_DataAvisoPrevio', dados.data_do_aviso_previo, :data],
43
+ ['InfoAvisoPrevio_DetalhamentoAvisoPrevio_DataPrevistaDesligamento', dados.data_de_previsao_do_desligamento, :data],
44
+ ['InfoAvisoPrevio_DetalhamentoAvisoPrevio_Observacao', dados.observacao],
45
+ ['IdEventoXml', dados.id_do_evento],
46
+ ['NrReciboEventoOriginal', dados.numero_do_recibo],
47
+ ['RequestVerificationToken'],
48
+ ['DescricaoProcEmi', dados.processo_de_emissao_do_evento],
49
+ ['VerProc', dados.versao_do_aplicativo_de_processamento_do_evento]
50
+ # rubocop:enable Layout/LineLength
51
+ ]
52
+ end
53
+ end
54
+ end
55
+ end
@@ -9,6 +9,10 @@ module Teodoro
9
9
 
10
10
  attr_reader :empresa, :arquivo_xml
11
11
 
12
+ def leiaute_simplificado?
13
+ arquivo_xml.leiaute_simplificado?
14
+ end
15
+
12
16
  def evento
13
17
  arquivo_xml.evento
14
18
  end
@@ -25,18 +25,16 @@ module Teodoro
25
25
 
26
26
  def caminho_do_arquivo_data_original
27
27
  ArquivoData::Caminho.new(
28
- destino_dos_arquivos_data: empresa.destino_dos_arquivos_data,
28
+ diretorio: empresa.destino_dos_arquivos_data,
29
29
  nome_do_arquivo: nome_do_arquivo_data_original
30
30
  )
31
31
  end
32
32
 
33
33
  def nome_do_arquivo_data_original
34
- "#{nome_base_do_arquivo_data}[#{inicio_da_validade_original.delete('-')}]"
35
- end
36
-
37
- def nome_base_do_arquivo_data
38
- @nome_base_do_arquivo_data ||=
39
- identificacao_do_arquivo_data[0] + identificacao_do_arquivo_data[1..].map { "[#{_1}]" }.join
34
+ NomeDoArquivoData.new(
35
+ identificacao: identificacao_do_arquivo_data,
36
+ inicio_da_validade: inicio_da_validade_original
37
+ )
40
38
  end
41
39
 
42
40
  def inicio_da_validade_original
@@ -47,18 +45,6 @@ module Teodoro
47
45
  arquivo_data.criar
48
46
  end
49
47
 
50
- def arquivo_data
51
- ArquivoData.new(
52
- destino_dos_arquivos_data: empresa.destino_dos_arquivos_data,
53
- nome: nome_do_arquivo_data,
54
- itens_do_conteudo: itens_do_conteudo_do_arquivo_data
55
- )
56
- end
57
-
58
- def nome_do_arquivo_data
59
- "#{nome_base_do_arquivo_data}[#{inicio_da_validade.delete('-')}]"
60
- end
61
-
62
48
  def inicio_da_validade
63
49
  @inicio_da_validade ||= validade['iniValid']
64
50
  end
@@ -87,5 +73,49 @@ module Teodoro
87
73
  def fim_da_validade
88
74
  validade['fimValid']
89
75
  end
76
+
77
+ module DescritorDeArquivoData
78
+ include ArquivoDeEventoDeTabela
79
+
80
+ private
81
+
82
+ def arquivo_data
83
+ ArquivoData.new(
84
+ diretorio: empresa.destino_dos_arquivos_data,
85
+ nome: nome_do_arquivo_data,
86
+ itens_do_conteudo: itens_do_conteudo_do_arquivo_data
87
+ )
88
+ end
89
+
90
+ def nome_do_arquivo_data
91
+ NomeDoArquivoData.new(
92
+ identificacao: identificacao_do_arquivo_data,
93
+ inicio_da_validade: inicio_da_validade
94
+ )
95
+ end
96
+ end
97
+
98
+ class NomeDoArquivoData
99
+ private
100
+
101
+ def initialize(identificacao:, inicio_da_validade:)
102
+ @identificacao = identificacao
103
+ @inicio_da_validade = inicio_da_validade
104
+ end
105
+
106
+ attr_reader :identificacao, :inicio_da_validade
107
+
108
+ public
109
+
110
+ def to_s
111
+ @to_s ||= "#{nome_base_do_arquivo_data}[#{inicio_da_validade.delete('-')}]"
112
+ end
113
+
114
+ private
115
+
116
+ def nome_base_do_arquivo_data
117
+ identificacao[0] + identificacao[1..].map { "[#{_1}]" }.join
118
+ end
119
+ end
90
120
  end
91
121
  end
@@ -45,7 +45,7 @@ module Teodoro
45
45
  def arquivos_data
46
46
  @arquivos_data ||= dados_dos_arquivos_data.map {
47
47
  ArquivoData.new(
48
- destino_dos_arquivos_data: empresa.destino_dos_arquivos_data,
48
+ diretorio: empresa.destino_dos_arquivos_data,
49
49
  nome: _1.nome,
50
50
  itens_do_conteudo: _1.itens_do_conteudo
51
51
  )
@@ -3,7 +3,25 @@ require_relative 'arquivo_de_evento'
3
3
  require_relative 'arquivo_de_evento_de_tabela'
4
4
  require_relative 'arquivo_de_evento_nao_periodico'
5
5
  require_relative 'cnpj'
6
- require_relative 'leiaute'
6
+ require_relative 'leiaute/arquivo_s1000'
7
+ require_relative 'leiaute/arquivo_s1005'
8
+ require_relative 'leiaute/arquivo_s1010'
9
+ require_relative 'leiaute/arquivo_s1020'
10
+ require_relative 'leiaute/arquivo_s1030'
11
+ require_relative 'leiaute/arquivo_s1040'
12
+ require_relative 'leiaute/arquivo_s1050'
13
+ require_relative 'leiaute/arquivo_s1070'
14
+ require_relative 'leiaute/arquivo_s2190'
15
+ require_relative 'leiaute/arquivo_s2200'
16
+ require_relative 'leiaute/arquivo_s2205'
17
+ require_relative 'leiaute/arquivo_s2206'
18
+ require_relative 'leiaute/arquivo_s2230'
19
+ require_relative 'leiaute/arquivo_s2250'
20
+ require_relative 'leiaute/arquivo_s2299'
21
+ require_relative 'leiaute/arquivo_s2300'
22
+ require_relative 'leiaute/arquivo_s2306'
23
+ require_relative 'leiaute/arquivo_s2399'
24
+ require_relative 'leiaute/arquivo_s3000'
7
25
  require_relative 'xml'
8
26
 
9
27
  module Teodoro
@@ -139,10 +157,14 @@ module Teodoro
139
157
  def arquivo
140
158
  classe_do_arquivo.new(
141
159
  empresa: empresa,
142
- arquivo_xml: Obj.new(evento: evento, recibo: recibo)
160
+ arquivo_xml: Obj.new(leiaute_simplificado?: leiaute_simplificado?, evento: evento, recibo: recibo)
143
161
  )
144
162
  end
145
163
 
164
+ def leiaute_simplificado?
165
+ versao_do_leiaute == '_S_01_00_00'
166
+ end
167
+
146
168
  def classe_do_arquivo
147
169
  Leiaute.const_get("Arquivo#{tipo_de_evento}")
148
170
  end
@@ -1,5 +1,9 @@
1
1
  require_relative 'arquivo_de_origem'
2
2
  require_relative 'arquivo_xml'
3
+ require_relative 'empresa/arquivos_data'
4
+ require_relative 'empresa/cargos_gerados'
5
+ require_relative 'empresa/contratos_de_emprego'
6
+ require_relative 'empresa/contratos_de_trabalho_sem_vinculo'
3
7
 
4
8
  module Teodoro
5
9
  class Empresa
@@ -17,7 +21,7 @@ module Teodoro
17
21
  impl.processar
18
22
  end
19
23
 
20
- class Impl
24
+ class Impl # rubocop:disable Metrics/ClassLength
21
25
  private
22
26
 
23
27
  def initialize(caminho:, destino:)
@@ -29,18 +33,20 @@ module Teodoro
29
33
 
30
34
  public
31
35
 
36
+ attr_accessor :inicio_da_validade
37
+
32
38
  attr_reader :arquivos_xml_por_recibo_a_retificar
33
39
 
34
40
  def processar
35
41
  dar_feedback_para_o_usuario
36
- criar_diretorio_destino
37
- criar_diretorio_dos_arquivos_xml
42
+ criar_diretorios_destino
38
43
  descompactar_arquivos_de_origem
39
- criar_diretorio_dos_arquivos_data
40
44
  carregar_arquivos_xml
41
45
  classificar_arquivos_xml
42
46
  ordenar_arquivos_xml
43
47
  processar_arquivos_xml
48
+ processar_cargos_gerados
49
+ ajustar_nome_do_ultimo_arquivo_emp_data
44
50
  end
45
51
 
46
52
  def destino_dos_arquivos_data
@@ -59,6 +65,10 @@ module Teodoro
59
65
  @contratos_de_trabalho_sem_vinculo ||= ContratosDeTrabalhoSemVinculo.new
60
66
  end
61
67
 
68
+ def cargos_gerados
69
+ @cargos_gerados ||= CargosGerados.new(self)
70
+ end
71
+
62
72
  private
63
73
 
64
74
  def dar_feedback_para_o_usuario
@@ -69,6 +79,12 @@ module Teodoro
69
79
  @nome_do_diretorio ||= File.basename(caminho)
70
80
  end
71
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
+
72
88
  def criar_diretorio_destino
73
89
  Dir.mkdir(destino)
74
90
  end
@@ -81,6 +97,10 @@ module Teodoro
81
97
  @destino_dos_arquivos_xml ||= File.join(destino, 'xmls')
82
98
  end
83
99
 
100
+ def criar_diretorio_dos_arquivos_data
101
+ Dir.mkdir(destino_dos_arquivos_data)
102
+ end
103
+
84
104
  def descompactar_arquivos_de_origem
85
105
  # otimizacao do gerenciamento de memoria
86
106
  arquivos_de_origem.shift.descompactar while arquivos_de_origem.any?
@@ -92,10 +112,6 @@ module Teodoro
92
112
  .map { |caminho| ArquivoDeOrigem.new(caminho: caminho, destino_dos_arquivos_xml: destino_dos_arquivos_xml) }
93
113
  end
94
114
 
95
- def criar_diretorio_dos_arquivos_data
96
- Dir.mkdir(destino_dos_arquivos_data)
97
- end
98
-
99
115
  def carregar_arquivos_xml
100
116
  arquivos_xml.each(&:carregar)
101
117
  end
@@ -129,144 +145,24 @@ module Teodoro
129
145
  arquivos_xml.shift.processar while arquivos_xml.any?
130
146
  end
131
147
 
132
- class ArquivosData
133
- private
134
-
135
- def initialize(destino_dos_arquivos_data)
136
- @destino_dos_arquivos_data = destino_dos_arquivos_data
137
- end
138
-
139
- attr_reader :destino_dos_arquivos_data
140
-
141
- public
142
-
143
- def registrar(recibo:, nome:)
144
- (nomes_por_recibo[recibo] ||= []) << nome
145
- end
146
-
147
- def excluir(recibo)
148
- (nomes_por_recibo.delete(recibo) || [])
149
- .map { |nome| File.join(destino_dos_arquivos_data, "#{nome}.data") }
150
- .each { File.delete(_1) }
151
- end
152
-
153
- private
154
-
155
- def nomes_por_recibo
156
- @nomes_por_recibo ||= {}
157
- end
148
+ def processar_cargos_gerados
149
+ cargos_gerados.each(&:processar)
158
150
  end
159
151
 
160
- class ContratosDeEmprego
161
- def registrar_admissao(admissao:, afastamento:)
162
- contratos_por_matricula[admissao.matricula] = Contrato.new(admissao: admissao, afastamento: afastamento)
163
- end
164
-
165
- def [](matricula)
166
- contratos_por_matricula[matricula]
167
- end
168
-
169
- def *(cpf_do_trabalhador:, data:)
170
- contratos
171
- .select { _1.cpf_do_trabalhador == cpf_do_trabalhador && _1.ativo?(data) }
172
- .sort_by(&:data_de_admissao)
173
- end
174
-
175
- def remover(recibo)
176
- contratos_por_matricula.delete_if { _2.recibo == recibo }
177
- end
178
-
179
- private
180
-
181
- def contratos_por_matricula
182
- @contratos_por_matricula ||= {}
183
- end
184
-
185
- def contratos
186
- contratos_por_matricula.values
187
- end
188
-
189
- class Contrato
190
- private
191
-
192
- def initialize(admissao:, afastamento:)
193
- @admissao = admissao
194
- @afastamento = afastamento
195
- end
196
-
197
- attr_reader :admissao, :data_de_desligamento
198
-
199
- public
200
-
201
- extend Forwardable
202
-
203
- def_delegators :admissao, :matricula, :data_de_admissao, :categoria_do_trabalhador, :cpf_do_trabalhador,
204
- :recibo
205
-
206
- attr_accessor :afastamento
207
-
208
- attr_writer :data_de_desligamento
209
-
210
- def ativo?(data)
211
- data_de_admissao <= data && (!data_de_desligamento || data_de_desligamento >= data)
212
- end
213
- end
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)
214
154
  end
215
155
 
216
- class ContratosDeTrabalhoSemVinculo
217
- def registrar_inicio_de_contrato(inicio_de_contrato:, afastamento:)
218
- contratos << Contrato.new(inicio_de_contrato: inicio_de_contrato, afastamento: afastamento)
219
- end
220
-
221
- def [](cpf_do_trabalhador:, categoria_do_trabalhador:, data:)
222
- contratos
223
- .select {
224
- _1.cpf_do_trabalhador == cpf_do_trabalhador && _1.categoria_do_trabalhador == categoria_do_trabalhador &&
225
- _1.ativo?(data)
226
- }
227
- .max_by(&:data_de_inicio)
228
- end
229
-
230
- def *(cpf_do_trabalhador:, data:)
231
- contratos
232
- .select { _1.cpf_do_trabalhador == cpf_do_trabalhador && _1.ativo?(data) }
233
- .sort_by(&:data_de_inicio)
234
- end
235
-
236
- def remover(recibo)
237
- contratos.delete_if { _1.recibo == recibo }
238
- end
239
-
240
- private
241
-
242
- def contratos
243
- @contratos ||= []
244
- end
245
-
246
- class Contrato
247
- private
248
-
249
- def initialize(inicio_de_contrato:, afastamento:)
250
- @inicio_de_contrato = inicio_de_contrato
251
- @afastamento = afastamento
252
- end
253
-
254
- attr_reader :inicio_de_contrato, :data_do_termino
255
-
256
- public
257
-
258
- extend Forwardable
259
-
260
- def_delegators :inicio_de_contrato, :cpf_do_trabalhador, :categoria_do_trabalhador, :data_de_inicio, :recibo
261
-
262
- attr_accessor :afastamento
156
+ def caminho_do_ultimo_arquivo_emp_data
157
+ @caminho_do_ultimo_arquivo_emp_data ||= caminhos_dos_arquivos_emp_data.last
158
+ end
263
159
 
264
- attr_writer :data_do_termino
160
+ def caminhos_dos_arquivos_emp_data
161
+ Dir[File.join(destino_dos_arquivos_data, 'EMP*.data')]
162
+ end
265
163
 
266
- def ativo?(data)
267
- data_de_inicio <= data && (!data_do_termino || data_do_termino >= data)
268
- end
269
- end
164
+ def novo_caminho_do_ultimo_arquivo_emp_data
165
+ caminho_do_ultimo_arquivo_emp_data.sub(/\[[^\]]*\]\.data$/, '.data')
270
166
  end
271
167
  end
272
168
  end