teodoro 0.5.0 → 0.9.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.
Files changed (33) hide show
  1. checksums.yaml +4 -4
  2. data/lib/teodoro.rb +1 -0
  3. data/lib/teodoro/arquivo_de_evento.rb +2 -2
  4. data/lib/teodoro/arquivo_de_evento_criador_de_arquivo_data.rb +1 -1
  5. data/lib/teodoro/arquivo_de_evento_de_tabela.rb +6 -6
  6. data/lib/teodoro/arquivo_de_evento_nao_periodico.rb +10 -3
  7. data/lib/teodoro/arquivo_de_evento_processador_de_arquivo_data.rb +2 -2
  8. data/lib/teodoro/arquivo_de_evento_retificavel.rb +8 -8
  9. data/lib/teodoro/arquivo_de_origem.rb +7 -7
  10. data/lib/teodoro/arquivo_xml.rb +45 -19
  11. data/lib/teodoro/console.rb +3 -1
  12. data/lib/teodoro/empresa.rb +179 -161
  13. data/lib/teodoro/leiaute/arquivo_s1000.rb +20 -24
  14. data/lib/teodoro/leiaute/arquivo_s1005.rb +12 -18
  15. data/lib/teodoro/leiaute/arquivo_s1010.rb +9 -13
  16. data/lib/teodoro/leiaute/arquivo_s1020.rb +6 -10
  17. data/lib/teodoro/leiaute/arquivo_s1030.rb +4 -8
  18. data/lib/teodoro/leiaute/arquivo_s1040.rb +3 -7
  19. data/lib/teodoro/leiaute/arquivo_s1050.rb +6 -12
  20. data/lib/teodoro/leiaute/arquivo_s1070.rb +9 -13
  21. data/lib/teodoro/leiaute/arquivo_s2190.rb +6 -8
  22. data/lib/teodoro/leiaute/arquivo_s2200.rb +90 -114
  23. data/lib/teodoro/leiaute/arquivo_s2205.rb +57 -62
  24. data/lib/teodoro/leiaute/arquivo_s2206.rb +16 -20
  25. data/lib/teodoro/leiaute/arquivo_s2230.rb +12 -17
  26. data/lib/teodoro/leiaute/arquivo_s2250.rb +12 -25
  27. data/lib/teodoro/leiaute/arquivo_s2299.rb +5 -9
  28. data/lib/teodoro/leiaute/arquivo_s2300.rb +87 -244
  29. data/lib/teodoro/leiaute/arquivo_s2306.rb +36 -40
  30. data/lib/teodoro/leiaute/arquivo_s2399.rb +4 -154
  31. data/lib/teodoro/leiaute/arquivo_s3000.rb +2 -2
  32. data/lib/teodoro/xml.rb +2 -2
  33. metadata +2 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: bc0fdaa8976a77fcfe8760f85e927809fc404ccc6a6370a5fb741de1e4aaab80
4
- data.tar.gz: e3cb4bccfedfac4627c3523bd68f0a6e57c40e374d68669f927929d4f204dfc3
3
+ metadata.gz: de3ebb9e45e3e9b980c944f4cc6b74cc0946612f106f709ed6733fdfe25f6a76
4
+ data.tar.gz: 9b5e67fd6437621dbc95dfe09be177dd5ac147e8b3b9c05012b1a66903412002
5
5
  SHA512:
6
- metadata.gz: 0125d15c79ec2194387ac7c36da97822410b2682f9074cacf043fd11e1e5bb7e25987d980c3dd062efc3ed68a65867ed37a7fd75cb5bd83dc8bf470062f646c4
7
- data.tar.gz: 0763aa9d7635ef62ff4abcaaff6c97779a5d01281a9708c0a709d5e77d771d4fbe7354b88b6622962c6cb2d9ede7ac40087d61f200f6390d4a00c929605a981b
6
+ metadata.gz: 6b0021d42bf9f1ab1bdf39b80098faeb6c0adc8aec9dc7c80da299f724baf3adba6f19ebf40941b907b2a0a78285274c02d0c0df85c8fc90120cc3875461e6f8
7
+ data.tar.gz: d8bc4bb61f6df69d8ad241e97efaff55abb71816311973d9c604b2bf4085243c88a5bee4840a34cbc72d793bcfbea88f52b598a983e884837c2bdba586bb8424
data/lib/teodoro.rb CHANGED
@@ -1,3 +1,4 @@
1
+ require 'forwardable'
1
2
  require 'nokogiri'
2
3
  require 'os'
3
4
  require 'rainbow'
@@ -18,11 +18,11 @@ module Teodoro
18
18
  end
19
19
 
20
20
  def versao_do_aplicativo_de_processamento_do_evento
21
- @versao_do_aplicativo_de_processamento_do_evento ||= recibo['retornoEvento/processamento/versaoAppProcessamento']
21
+ @versao_do_aplicativo_de_processamento_do_evento ||= recibo['processamento/versaoAppProcessamento']
22
22
  end
23
23
 
24
24
  def numero_do_recibo
25
- @numero_do_recibo ||= recibo['retornoEvento/recibo/nrRecibo']
25
+ @numero_do_recibo ||= recibo['recibo/nrRecibo']
26
26
  end
27
27
  end
28
28
  end
@@ -15,7 +15,7 @@ module Teodoro
15
15
  end
16
16
 
17
17
  def tipo_de_inscricao_do_empregador
18
- @tipo_de_inscricao_do_empregador ||= evento["#{noh_principal_do_evento}/ideEmpregador/tpInsc"]
18
+ @tipo_de_inscricao_do_empregador ||= evento['ideEmpregador/tpInsc']
19
19
  end
20
20
 
21
21
  class Valor
@@ -12,11 +12,11 @@ module Teodoro
12
12
  private
13
13
 
14
14
  def alteracao?
15
- @alteracao ||= evento[noh_principal_do_evento, noh_de_informacoes_do_evento, 'alteracao']
15
+ @alteracao ||= evento[noh_de_informacoes_do_evento, 'alteracao']
16
16
  end
17
17
 
18
18
  def exclusao?
19
- @exclusao ||= evento[noh_principal_do_evento, noh_de_informacoes_do_evento, 'exclusao']
19
+ @exclusao ||= evento[noh_de_informacoes_do_evento, 'exclusao']
20
20
  end
21
21
 
22
22
  def deletar_arquivo_data_original
@@ -24,7 +24,7 @@ module Teodoro
24
24
  end
25
25
 
26
26
  def inicio_da_validade_original
27
- evento[noh_principal_do_evento, noh_de_informacoes_do_evento, '*', noh_de_identificacao_do_periodo, 'iniValid']
27
+ evento[noh_de_informacoes_do_evento, '*', noh_de_identificacao_do_periodo, 'iniValid']
28
28
  end
29
29
 
30
30
  def obter_caminho_do_arquivo_data(inicio_da_validade)
@@ -48,14 +48,14 @@ module Teodoro
48
48
  def validade
49
49
  @validade ||=
50
50
  if inclusao? || (alteracao? && !nova_validade?)
51
- evento[noh_principal_do_evento, noh_de_informacoes_do_evento, '*', noh_de_identificacao_do_periodo]
51
+ evento[noh_de_informacoes_do_evento, '*', noh_de_identificacao_do_periodo]
52
52
  elsif alteracao?
53
53
  nova_validade
54
54
  end
55
55
  end
56
56
 
57
57
  def inclusao?
58
- @inclusao ||= evento[noh_principal_do_evento, noh_de_informacoes_do_evento, 'inclusao']
58
+ @inclusao ||= evento[noh_de_informacoes_do_evento, 'inclusao']
59
59
  end
60
60
 
61
61
  def nova_validade?
@@ -63,7 +63,7 @@ module Teodoro
63
63
  end
64
64
 
65
65
  def nova_validade
66
- @nova_validade ||= evento[noh_principal_do_evento, noh_de_informacoes_do_evento, 'alteracao', 'novaValidade']
66
+ @nova_validade ||= evento[noh_de_informacoes_do_evento, 'alteracao', 'novaValidade']
67
67
  end
68
68
 
69
69
  def fim_da_validade
@@ -4,9 +4,12 @@ module Teodoro
4
4
  include ArquivoDeEventoRetificavel
5
5
 
6
6
  def processar
7
- deletar_arquivos_data_originais if retificacao?
8
- registrar_arquivo_data
9
- criar_arquivo_data
7
+ if retificado?
8
+ processar_retificacao
9
+ else
10
+ registrar_arquivo_data
11
+ criar_arquivo_data
12
+ end
10
13
  end
11
14
 
12
15
  private
@@ -18,6 +21,10 @@ module Teodoro
18
21
  )
19
22
  end
20
23
 
24
+ def arquivos_data
25
+ empresa.arquivos_data
26
+ end
27
+
21
28
  def caminho_do_arquivo_data
22
29
  criar_caminho_do_arquivo_data(nome_do_arquivo_data)
23
30
  end
@@ -5,11 +5,11 @@ module Teodoro
5
5
  private
6
6
 
7
7
  def id_do_evento
8
- evento.css(noh_principal_do_evento).first.attributes['Id'].value
8
+ evento.css('/*').first.attributes['Id'].value
9
9
  end
10
10
 
11
11
  def processo_de_emissao_do_evento
12
- evento["#{noh_principal_do_evento}/ideEvento/procEmi"]
12
+ evento['ideEvento/procEmi']
13
13
  end
14
14
 
15
15
  def criar_caminho_do_arquivo_data(nome_do_arquivo)
@@ -4,20 +4,20 @@ module Teodoro
4
4
 
5
5
  private
6
6
 
7
- def retificacao?
8
- @retificacao ||= evento["#{noh_principal_do_evento}/ideEvento/indRetif"] == '2'
7
+ def retificado?
8
+ arquivo_xml_de_retificacao
9
9
  end
10
10
 
11
- def deletar_arquivos_data_originais
12
- arquivos_data.excluir(numero_do_recibo_a_retificar)
11
+ def arquivo_xml_de_retificacao
12
+ @arquivo_xml_de_retificacao ||= arquivos_xml_por_recibo_a_retificar.delete(numero_do_recibo)
13
13
  end
14
14
 
15
- def arquivos_data
16
- empresa.arquivos_data
15
+ def arquivos_xml_por_recibo_a_retificar
16
+ empresa.arquivos_xml_por_recibo_a_retificar
17
17
  end
18
18
 
19
- def numero_do_recibo_a_retificar
20
- @numero_do_recibo_a_retificar ||= evento["#{noh_principal_do_evento}/ideEvento/nrRecibo"]
19
+ def processar_retificacao
20
+ arquivo_xml_de_retificacao.processar
21
21
  end
22
22
  end
23
23
  end
@@ -14,13 +14,13 @@ module Teodoro
14
14
  public
15
15
 
16
16
  def descompactar
17
- Console.print "descompactando #{File.basename(caminho)}..."
18
-
19
- Zip::File.open(caminho) do |zip|
20
- zip
21
- .reject { |entrada| entrada.name[-8] == PREFIXO_DE_TOTALIZADOR }
22
- .each do |entrada|
23
- entrada.extract(File.join(destino_dos_arquivos_xml, entrada.name))
17
+ Console.print "descompactando #{File.basename(caminho)}..." do
18
+ Zip::File.open(caminho) do |zip|
19
+ zip
20
+ .reject { |entrada| entrada.name[-8] == PREFIXO_DE_TOTALIZADOR }
21
+ .each do |entrada|
22
+ entrada.extract(File.join(destino_dos_arquivos_xml, entrada.name))
23
+ end
24
24
  end
25
25
  end
26
26
  end
@@ -9,7 +9,7 @@ require_relative 'leiaute'
9
9
  require_relative 'xml'
10
10
 
11
11
  module Teodoro
12
- class ArquivoXML
12
+ class ArquivoXML # rubocop:disable Metrics/ClassLength
13
13
  TIPOS_DE_EVENTO_PROCESSAVEIS = %w[
14
14
  S1000
15
15
  S1005
@@ -32,6 +32,18 @@ module Teodoro
32
32
  S3000
33
33
  ].freeze
34
34
 
35
+ TIPOS_DE_EVENTO_RETIFICAVEIS = %w[
36
+ S2200
37
+ S2205
38
+ S2206
39
+ S2230
40
+ S2250
41
+ S2299
42
+ S2300
43
+ S2306
44
+ S2399
45
+ ].freeze
46
+
35
47
  private
36
48
 
37
49
  def initialize(empresa:, caminho:)
@@ -43,16 +55,25 @@ module Teodoro
43
55
 
44
56
  public
45
57
 
46
- def processavel?
47
- TIPOS_DE_EVENTO_PROCESSAVEIS.include?(tipo_de_evento)
58
+ attr_reader :numero_do_recibo_a_retificar, :momento_de_processamento_pelo_e_social
59
+
60
+ # otimizacao do gerenciamento de memoria
61
+ def carregar
62
+ Console.print "carregando #{nome}.xml..." do
63
+ evento, recibo = carregar_evento_e_recibo
64
+
65
+ @retificacao = TIPOS_DE_EVENTO_RETIFICAVEIS.include?(tipo_de_evento) && evento['ideEvento/indRetif'] == '2'
66
+ @numero_do_recibo_a_retificar = evento['ideEvento/nrRecibo'] if retificacao?
67
+ @momento_de_processamento_pelo_e_social = recibo['processamento/dhProcessamento']
68
+ end
48
69
  end
49
70
 
50
- def momento_de_processamento_pelo_e_social
51
- # otimizacao do gerenciamento de memoria
52
- carregar_xml
53
- .then { |xml| Nokogiri::XML(xml.css('eSocial/retornoProcessamentoDownload/recibo/*').to_s) }
54
- .then { |xml_do_recibo| XML.new(xml_do_recibo) }
55
- .then { |recibo| recibo['retornoEvento/processamento/dhProcessamento'] }
71
+ def retificacao?
72
+ @retificacao
73
+ end
74
+
75
+ def processavel?
76
+ TIPOS_DE_EVENTO_PROCESSAVEIS.include?(tipo_de_evento)
56
77
  end
57
78
 
58
79
  def nome
@@ -60,15 +81,20 @@ module Teodoro
60
81
  end
61
82
 
62
83
  def processar
63
- dar_feedback_para_o_usuario
64
- validar_versao_do_leiaute
65
- processar_arquivo
84
+ Console.print "processando #{nome}.xml..." do
85
+ validar_versao_do_leiaute
86
+ processar_arquivo
87
+ end
66
88
  end
67
89
 
68
90
  private
69
91
 
70
- def tipo_de_evento
71
- @tipo_de_evento ||= nome[-6..].delete('-')
92
+ def carregar_evento_e_recibo
93
+ carregar_xml
94
+ .then do |xml|
95
+ %w[evento recibo]
96
+ .map { XML.new(Nokogiri::XML(xml.css("eSocial/retornoProcessamentoDownload/#{_1}/*/*").to_s)) }
97
+ end
72
98
  end
73
99
 
74
100
  def carregar_xml
@@ -79,8 +105,8 @@ module Teodoro
79
105
  File.read(caminho)
80
106
  end
81
107
 
82
- def dar_feedback_para_o_usuario
83
- Console.print "processando #{nome}.xml..."
108
+ def tipo_de_evento
109
+ @tipo_de_evento ||= nome[-6..].delete('-')
84
110
  end
85
111
 
86
112
  def validar_versao_do_leiaute
@@ -92,7 +118,7 @@ module Teodoro
92
118
  end
93
119
 
94
120
  def namespace_do_evento
95
- xml_do_evento.css('eSocial')[0].namespace.href
121
+ xml_do_evento.css('/eSocial')[0].namespace.href
96
122
  end
97
123
 
98
124
  def xml_do_evento
@@ -119,7 +145,7 @@ module Teodoro
119
145
  end
120
146
 
121
147
  def evento
122
- XML.new(xml_do_evento)
148
+ XML.new(Nokogiri::XML(xml_do_evento.css('*/*').to_s))
123
149
  end
124
150
 
125
151
  def recibo
@@ -127,7 +153,7 @@ module Teodoro
127
153
  end
128
154
 
129
155
  def xml_do_recibo
130
- Nokogiri::XML(xml.css('eSocial/retornoProcessamentoDownload/recibo/*').to_s)
156
+ Nokogiri::XML(xml.css('eSocial/retornoProcessamentoDownload/recibo/*/*').to_s)
131
157
  end
132
158
  end
133
159
  end
@@ -1,5 +1,7 @@
1
1
  module Console
2
- def self.print(string = nil)
2
+ def self.print(string)
3
3
  Kernel.print "\r\e[2K#{string}"
4
+ yield
5
+ Kernel.print "\r\e[2K"
4
6
  end
5
7
  end
@@ -5,195 +5,218 @@ module Teodoro
5
5
  class Empresa
6
6
  private
7
7
 
8
- def initialize(caminho:, destino:)
9
- @caminho = caminho
10
- @destino = File.join(destino, nome_do_diretorio)
8
+ def initialize(args)
9
+ @impl = Impl.new(**args)
11
10
  end
12
11
 
13
- attr_reader :caminho, :destino
12
+ attr_reader :impl
14
13
 
15
14
  public
16
15
 
17
16
  def processar
18
- dar_feedback_para_o_usuario
19
- criar_diretorio_destino
20
- criar_diretorio_dos_arquivos_xml
21
- descompactar_arquivos_de_origem
22
- criar_diretorio_dos_arquivos_data
23
- ordenar_arquivos_xml
24
- processar_arquivos_xml
25
- limpar_linha_de_feedback
17
+ impl.processar
26
18
  end
27
19
 
28
- private
29
-
30
- def dar_feedback_para_o_usuario
31
- puts Rainbow(nome_do_diretorio).green
32
- end
33
-
34
- def nome_do_diretorio
35
- @nome_do_diretorio ||= File.basename(caminho)
36
- end
37
-
38
- def criar_diretorio_destino
39
- Dir.mkdir(destino)
40
- end
41
-
42
- def criar_diretorio_dos_arquivos_xml
43
- Dir.mkdir(destino_dos_arquivos_xml)
44
- end
45
-
46
- def destino_dos_arquivos_xml
47
- @destino_dos_arquivos_xml ||= File.join(destino, 'xmls')
48
- end
49
-
50
- def descompactar_arquivos_de_origem
51
- arquivos_de_origem.each(&:descompactar)
52
- end
20
+ class Impl
21
+ private
53
22
 
54
- def arquivos_de_origem
55
- Dir[File.join(caminho, '*.zip')]
56
- .map { |caminho| ArquivoDeOrigem.new(caminho: caminho, destino_dos_arquivos_xml: destino_dos_arquivos_xml) }
57
- end
23
+ def initialize(caminho:, destino:)
24
+ @caminho = caminho
25
+ @destino = File.join(destino, nome_do_diretorio)
26
+ end
58
27
 
59
- def criar_diretorio_dos_arquivos_data
60
- Dir.mkdir(destino_dos_arquivos_data)
61
- end
28
+ attr_reader :caminho, :destino
62
29
 
63
- def destino_dos_arquivos_data
64
- @destino_dos_arquivos_data ||= File.join(destino, 'data')
65
- end
30
+ public
66
31
 
67
- def ordenar_arquivos_xml
68
- Console.print 'ordenando os arquivos XML...'
69
- arquivos_xml.sort_by! { [_1.momento_de_processamento_pelo_e_social, _1.nome] }
70
- end
32
+ attr_reader :arquivos_xml_por_recibo_a_retificar
33
+
34
+ def processar
35
+ dar_feedback_para_o_usuario
36
+ criar_diretorio_destino
37
+ criar_diretorio_dos_arquivos_xml
38
+ descompactar_arquivos_de_origem
39
+ criar_diretorio_dos_arquivos_data
40
+ carregar_arquivos_xml
41
+ classificar_arquivos_xml
42
+ ordenar_arquivos_xml
43
+ processar_arquivos_xml
44
+ end
71
45
 
72
- def processar_arquivos_xml
73
- # otimizacao do gerenciamento de memoria
74
- arquivos_xml.shift.processar while arquivos_xml.any?
75
- end
46
+ def destino_dos_arquivos_data
47
+ @destino_dos_arquivos_data ||= File.join(destino, 'data')
48
+ end
76
49
 
77
- def arquivos_xml
78
- @arquivos_xml ||= Dir[File.join(destino_dos_arquivos_xml, '*.xml')]
79
- .map { |caminho| ArquivoXML.new(empresa: empresa, caminho: caminho) }
80
- .select(&:processavel?)
81
- end
50
+ def arquivos_data
51
+ @arquivos_data ||= ArquivosData.new(destino_dos_arquivos_data)
52
+ end
82
53
 
83
- def empresa
84
- @empresa ||= Obj.new(
85
- destino_dos_arquivos_data: destino_dos_arquivos_data,
86
- arquivos_data: ArquivosData.new(destino_dos_arquivos_data),
87
- contratos_de_emprego: ContratosDeEmprego.new,
88
- contratos_de_trabalho_sem_vinculo: ContratosDeTrabalhoSemVinculo.new
89
- )
90
- end
54
+ def contratos_de_emprego
55
+ @contratos_de_emprego ||= ContratosDeEmprego.new
56
+ end
91
57
 
92
- def limpar_linha_de_feedback
93
- Console.print
94
- end
58
+ def contratos_de_trabalho_sem_vinculo
59
+ @contratos_de_trabalho_sem_vinculo ||= ContratosDeTrabalhoSemVinculo.new
60
+ end
95
61
 
96
- class ArquivosData
97
62
  private
98
63
 
99
- def initialize(destino_dos_arquivos_data)
100
- @destino_dos_arquivos_data = destino_dos_arquivos_data
64
+ def dar_feedback_para_o_usuario
65
+ puts Rainbow(nome_do_diretorio).green
101
66
  end
102
67
 
103
- attr_reader :destino_dos_arquivos_data
104
-
105
- public
68
+ def nome_do_diretorio
69
+ @nome_do_diretorio ||= File.basename(caminho)
70
+ end
106
71
 
107
- def registrar(recibo:, nome:)
108
- (nomes_por_recibo[recibo] ||= []) << nome
72
+ def criar_diretorio_destino
73
+ Dir.mkdir(destino)
109
74
  end
110
75
 
111
- def excluir(recibo)
112
- (nomes_por_recibo.delete(recibo) || [])
113
- .map { |nome| File.join(destino_dos_arquivos_data, "#{nome}.data") }
114
- .each { File.delete(_1) }
76
+ def criar_diretorio_dos_arquivos_xml
77
+ Dir.mkdir(destino_dos_arquivos_xml)
115
78
  end
116
79
 
117
- private
80
+ def destino_dos_arquivos_xml
81
+ @destino_dos_arquivos_xml ||= File.join(destino, 'xmls')
82
+ end
118
83
 
119
- def nomes_por_recibo
120
- @nomes_por_recibo ||= {}
84
+ def descompactar_arquivos_de_origem
85
+ arquivos_de_origem.each(&:descompactar)
121
86
  end
122
- end
123
87
 
124
- class ContratosDeEmprego
125
- def registrar_admissao(admissao:, afastamento:)
126
- contratos_por_matricula[admissao.matricula] = Contrato.new(admissao: admissao, afastamento: afastamento)
88
+ def arquivos_de_origem
89
+ Dir[File.join(caminho, '*.zip')]
90
+ .map { |caminho| ArquivoDeOrigem.new(caminho: caminho, destino_dos_arquivos_xml: destino_dos_arquivos_xml) }
127
91
  end
128
92
 
129
- def [](matricula = nil, recibo: nil)
130
- if matricula
131
- contratos_por_matricula[matricula]
132
- else
133
- contratos.find { _1.recibo == recibo }
134
- end
93
+ def criar_diretorio_dos_arquivos_data
94
+ Dir.mkdir(destino_dos_arquivos_data)
135
95
  end
136
96
 
137
- def *(cpf_do_trabalhador:, data:)
138
- contratos
139
- .select { _1.cpf_do_trabalhador == cpf_do_trabalhador && _1.ativo?(data) }
140
- .sort_by(&:data_de_admissao)
97
+ def carregar_arquivos_xml
98
+ arquivos_xml.each(&:carregar)
141
99
  end
142
100
 
143
- def remover(recibo)
144
- contratos_por_matricula.delete_if { _2.recibo == recibo }
101
+ def arquivos_xml
102
+ @arquivos_xml ||=
103
+ Dir[File.join(destino_dos_arquivos_xml, '*.xml')]
104
+ .map { |caminho| ArquivoXML.new(empresa: self, caminho: caminho) }
145
105
  end
146
106
 
147
- private
107
+ def classificar_arquivos_xml
108
+ Console.print 'classificando os arquivos XML...' do
109
+ arquivos_xml
110
+ .select(&:processavel?)
111
+ .partition(&:retificacao?)
112
+ .then do |de_retificacao, exceto_de_retificacao|
113
+ @arquivos_xml_por_recibo_a_retificar = de_retificacao.map { [_1.numero_do_recibo_a_retificar, _1] }.to_h
114
+ @arquivos_xml = exceto_de_retificacao
115
+ end
116
+ end
117
+ end
148
118
 
149
- def contratos_por_matricula
150
- @contratos_por_matricula ||= {}
119
+ def ordenar_arquivos_xml
120
+ Console.print 'ordenando os arquivos XML...' do
121
+ arquivos_xml.sort_by! { [_1.momento_de_processamento_pelo_e_social, _1.nome] }
122
+ end
151
123
  end
152
124
 
153
- def contratos
154
- contratos_por_matricula.values
125
+ def processar_arquivos_xml
126
+ # otimizacao do gerenciamento de memoria
127
+ arquivos_xml.shift.processar while arquivos_xml.any?
155
128
  end
156
129
 
157
- class Contrato
130
+ class ArquivosData
158
131
  private
159
132
 
160
- def initialize(admissao:, afastamento:)
161
- @admissao = admissao
162
- @afastamento = afastamento
133
+ def initialize(destino_dos_arquivos_data)
134
+ @destino_dos_arquivos_data = destino_dos_arquivos_data
163
135
  end
164
136
 
165
- attr_reader :admissao, :data_de_desligamento
137
+ attr_reader :destino_dos_arquivos_data
166
138
 
167
139
  public
168
140
 
169
- extend Forwardable
141
+ def registrar(recibo:, nome:)
142
+ (nomes_por_recibo[recibo] ||= []) << nome
143
+ end
144
+
145
+ def excluir(recibo)
146
+ (nomes_por_recibo.delete(recibo) || [])
147
+ .map { |nome| File.join(destino_dos_arquivos_data, "#{nome}.data") }
148
+ .each { File.delete(_1) }
149
+ end
170
150
 
171
- def_delegators :admissao, :matricula, :data_de_admissao, :categoria_do_trabalhador, :cpf_do_trabalhador, :recibo
151
+ private
172
152
 
173
- attr_accessor :afastamento
153
+ def nomes_por_recibo
154
+ @nomes_por_recibo ||= {}
155
+ end
156
+ end
174
157
 
175
- attr_writer :data_de_desligamento
158
+ class ContratosDeEmprego
159
+ def registrar_admissao(admissao:, afastamento:)
160
+ contratos_por_matricula[admissao.matricula] = Contrato.new(admissao: admissao, afastamento: afastamento)
161
+ end
176
162
 
177
- def ativo?(data)
178
- data_de_admissao <= data && (!data_de_desligamento || data_de_desligamento >= data)
163
+ def [](matricula)
164
+ contratos_por_matricula[matricula]
179
165
  end
180
166
 
181
- def retificar_admissao(admissao:, afastamento:)
182
- @admissao = Obj.new({ matricula: matricula }.merge(admissao.to_h))
183
- @afastamento = afastamento if afastamento
167
+ def *(cpf_do_trabalhador:, data:)
168
+ contratos
169
+ .select { _1.cpf_do_trabalhador == cpf_do_trabalhador && _1.ativo?(data) }
170
+ .sort_by(&:data_de_admissao)
184
171
  end
185
- end
186
- end
187
172
 
188
- class ContratosDeTrabalhoSemVinculo
189
- def registrar_inicio_de_contrato(inicio_de_contrato:, afastamento:)
190
- contratos << Contrato.new(inicio_de_contrato: inicio_de_contrato, afastamento: afastamento)
173
+ def remover(recibo)
174
+ contratos_por_matricula.delete_if { _2.recibo == recibo }
175
+ end
176
+
177
+ private
178
+
179
+ def contratos_por_matricula
180
+ @contratos_por_matricula ||= {}
181
+ end
182
+
183
+ def contratos
184
+ contratos_por_matricula.values
185
+ end
186
+
187
+ class Contrato
188
+ private
189
+
190
+ def initialize(admissao:, afastamento:)
191
+ @admissao = admissao
192
+ @afastamento = afastamento
193
+ end
194
+
195
+ attr_reader :admissao, :data_de_desligamento
196
+
197
+ public
198
+
199
+ extend Forwardable
200
+
201
+ def_delegators :admissao, :matricula, :data_de_admissao, :categoria_do_trabalhador, :cpf_do_trabalhador,
202
+ :recibo
203
+
204
+ attr_accessor :afastamento
205
+
206
+ attr_writer :data_de_desligamento
207
+
208
+ def ativo?(data)
209
+ data_de_admissao <= data && (!data_de_desligamento || data_de_desligamento >= data)
210
+ end
211
+ end
191
212
  end
192
213
 
193
- def [](cpf_do_trabalhador: nil, categoria_do_trabalhador: nil, data: nil, recibo: nil)
194
- if recibo
195
- contratos.find { _1.recibo == recibo }
196
- else
214
+ class ContratosDeTrabalhoSemVinculo
215
+ def registrar_inicio_de_contrato(inicio_de_contrato:, afastamento:)
216
+ contratos << Contrato.new(inicio_de_contrato: inicio_de_contrato, afastamento: afastamento)
217
+ end
218
+
219
+ def [](cpf_do_trabalhador:, categoria_do_trabalhador:, data:)
197
220
  contratos
198
221
  .select {
199
222
  _1.cpf_do_trabalhador == cpf_do_trabalhador && _1.categoria_do_trabalhador == categoria_do_trabalhador &&
@@ -201,51 +224,46 @@ module Teodoro
201
224
  }
202
225
  .max_by(&:data_de_inicio)
203
226
  end
204
- end
205
-
206
- def *(cpf_do_trabalhador:, data:)
207
- contratos
208
- .select { _1.cpf_do_trabalhador == cpf_do_trabalhador && _1.ativo?(data) }
209
- .sort_by(&:data_de_inicio)
210
- end
211
227
 
212
- def remover(recibo)
213
- contratos.delete_if { _1.recibo == recibo }
214
- end
215
-
216
- private
228
+ def *(cpf_do_trabalhador:, data:)
229
+ contratos
230
+ .select { _1.cpf_do_trabalhador == cpf_do_trabalhador && _1.ativo?(data) }
231
+ .sort_by(&:data_de_inicio)
232
+ end
217
233
 
218
- def contratos
219
- @contratos ||= []
220
- end
234
+ def remover(recibo)
235
+ contratos.delete_if { _1.recibo == recibo }
236
+ end
221
237
 
222
- class Contrato
223
238
  private
224
239
 
225
- def initialize(inicio_de_contrato:, afastamento:)
226
- @inicio_de_contrato = inicio_de_contrato
227
- @afastamento = afastamento
240
+ def contratos
241
+ @contratos ||= []
228
242
  end
229
243
 
230
- attr_reader :inicio_de_contrato, :data_do_termino
244
+ class Contrato
245
+ private
231
246
 
232
- public
247
+ def initialize(inicio_de_contrato:, afastamento:)
248
+ @inicio_de_contrato = inicio_de_contrato
249
+ @afastamento = afastamento
250
+ end
233
251
 
234
- extend Forwardable
252
+ attr_reader :inicio_de_contrato, :data_do_termino
235
253
 
236
- def_delegators :inicio_de_contrato, :cpf_do_trabalhador, :categoria_do_trabalhador, :data_de_inicio, :recibo
254
+ public
237
255
 
238
- attr_accessor :afastamento
256
+ extend Forwardable
239
257
 
240
- attr_writer :data_do_termino
258
+ def_delegators :inicio_de_contrato, :cpf_do_trabalhador, :categoria_do_trabalhador, :data_de_inicio, :recibo
241
259
 
242
- def ativo?(data)
243
- data_de_inicio <= data && (!data_do_termino || data_do_termino >= data)
244
- end
260
+ attr_accessor :afastamento
261
+
262
+ attr_writer :data_do_termino
245
263
 
246
- def retificar_inicio_de_contrato(inicio_de_contrato:, afastamento:)
247
- @inicio_de_contrato = inicio_de_contrato
248
- @afastamento = afastamento if afastamento
264
+ def ativo?(data)
265
+ data_de_inicio <= data && (!data_do_termino || data_do_termino >= data)
266
+ end
249
267
  end
250
268
  end
251
269
  end