teodoro 0.11.0 → 0.16.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: b1fd9fa53d0f193758abd01b8afa4af04e8c95f1f8e00b48ebbe923142c44294
4
- data.tar.gz: 145f509fe6f6de7c4a8bd3be65f169cbea6ad4f6d20d5293e011d236b4493b83
3
+ metadata.gz: f341fed6ea7a5070e4abf7e28517c4bdc380d4b416911df29be0aeaa10dd63ec
4
+ data.tar.gz: bb82b0556bc58101136ae7c92351ab273a5a80ea5122fa44e314ad68678709ff
5
5
  SHA512:
6
- metadata.gz: bba2d47683c8ad4b7cd1aa63d21e236e885cb9f9701c35717b8ad98d0e03fedb3a348857f691ae343ccfd00870b5513b27121aecf5e465ab272c0ee630d18dd0
7
- data.tar.gz: 386eec6ca613785e8a1193300ea81f24053cfe378f7638d02c038a7bb430dc631462aa4a9205e5666ed1e2f36660c6ae977e816962e34a2884aa630b4dd28ad9
6
+ metadata.gz: be0f3f4feae90ee3b59ca1053971572dfbcc848855d99457169b77e2017d5b1216cecbe7f38d84a448586e1b81899d29f520181eaf493ffd0a019c03e102d7c4
7
+ data.tar.gz: daec189dc224a65acd9e8969eef7939269832429b0c9252e1f08518d502c1ababc81cbb10fda22753c42f108cadf14fd2638b57f4dd43f86b3a902b2198c9b5c
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
@@ -29,6 +33,8 @@ 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
@@ -41,6 +47,7 @@ module Teodoro
41
47
  classificar_arquivos_xml
42
48
  ordenar_arquivos_xml
43
49
  processar_arquivos_xml
50
+ processar_cargos_gerados
44
51
  end
45
52
 
46
53
  def destino_dos_arquivos_data
@@ -59,6 +66,10 @@ module Teodoro
59
66
  @contratos_de_trabalho_sem_vinculo ||= ContratosDeTrabalhoSemVinculo.new
60
67
  end
61
68
 
69
+ def cargos_gerados
70
+ @cargos_gerados ||= CargosGerados.new(self)
71
+ end
72
+
62
73
  private
63
74
 
64
75
  def dar_feedback_para_o_usuario
@@ -129,144 +140,8 @@ module Teodoro
129
140
  arquivos_xml.shift.processar while arquivos_xml.any?
130
141
  end
131
142
 
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
158
- end
159
-
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
214
- end
215
-
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
263
-
264
- attr_writer :data_do_termino
265
-
266
- def ativo?(data)
267
- data_de_inicio <= data && (!data_do_termino || data_do_termino >= data)
268
- end
269
- end
143
+ def processar_cargos_gerados
144
+ cargos_gerados.each(&:processar)
270
145
  end
271
146
  end
272
147
  end