teodoro 0.4.1 → 0.8.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 -6
  4. data/lib/teodoro/arquivo_de_evento_criador_de_arquivo_data.rb +33 -2
  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 +3 -3
  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 +46 -20
  11. data/lib/teodoro/console.rb +3 -1
  12. data/lib/teodoro/empresa.rb +190 -154
  13. data/lib/teodoro/leiaute/arquivo_s1000.rb +35 -59
  14. data/lib/teodoro/leiaute/arquivo_s1005.rb +18 -38
  15. data/lib/teodoro/leiaute/arquivo_s1010.rb +11 -15
  16. data/lib/teodoro/leiaute/arquivo_s1020.rb +13 -32
  17. data/lib/teodoro/leiaute/arquivo_s1030.rb +10 -23
  18. data/lib/teodoro/leiaute/arquivo_s1040.rb +5 -9
  19. data/lib/teodoro/leiaute/arquivo_s1050.rb +11 -20
  20. data/lib/teodoro/leiaute/arquivo_s1070.rb +12 -16
  21. data/lib/teodoro/leiaute/arquivo_s2190.rb +6 -8
  22. data/lib/teodoro/leiaute/arquivo_s2200.rb +111 -318
  23. data/lib/teodoro/leiaute/arquivo_s2205.rb +64 -95
  24. data/lib/teodoro/leiaute/arquivo_s2206.rb +29 -121
  25. data/lib/teodoro/leiaute/arquivo_s2230.rb +98 -96
  26. data/lib/teodoro/leiaute/arquivo_s2250.rb +13 -26
  27. data/lib/teodoro/leiaute/arquivo_s2299.rb +8 -121
  28. data/lib/teodoro/leiaute/arquivo_s2300.rb +99 -232
  29. data/lib/teodoro/leiaute/arquivo_s2306.rb +40 -44
  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 +8 -2
  33. metadata +2 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 905e1629662ff97b0f26cc744324a33340493a6d52db50dace468a5b43316af2
4
- data.tar.gz: 44a2b98aa7635e493c09fb2279f3243021d45c9837e9d9aac919f7772e50367a
3
+ metadata.gz: 345feac649f9964beffbb9200c2d19281413f03e4950aa440d6208a189f6c337
4
+ data.tar.gz: b30953d58a711b552b936ffccb125792a548e3fd00075b0e52f7b37473224a04
5
5
  SHA512:
6
- metadata.gz: 630607661d6e549efd1f8567409a896332fba0fc34ff5f81c264e8e4be6b7f477930111ff4c224dd6fa844a1b56803a156f82162ba190ae8962e487d3e05f7b2
7
- data.tar.gz: b938889b832c73153e579039882d9cb97d299e9958163c93cfee7be4ef25cb50302a49c29cc358614dcc9ad56b4b982232e07a7602a07e1c6eb23e6ceb3b538a
6
+ metadata.gz: e02f37a099b65f6fe97f7d888c25638bcfc6e5cd48ea4512d353b3952188f76c547b17b4e72a27b7979d4c0765ab602e65c80b81e2d8ff7903376ec4d6ab61e8
7
+ data.tar.gz: 86d96c5129045d68f65ebfa4a6cdc4ff942185f3510b2a7c32af7b6fdc74661c26bd8a0154f8c7d14c309f7e6c21daeffc42f7b1e28fbec0ad9c645743d2890b
data/lib/teodoro.rb CHANGED
@@ -1,3 +1,4 @@
1
+ require 'forwardable'
1
2
  require 'nokogiri'
2
3
  require 'os'
3
4
  require 'rainbow'
@@ -9,10 +9,6 @@ module Teodoro
9
9
 
10
10
  attr_reader :empresa, :arquivo_xml
11
11
 
12
- def versao_do_leiaute
13
- arquivo_xml.versao_do_leiaute
14
- end
15
-
16
12
  def evento
17
13
  arquivo_xml.evento
18
14
  end
@@ -22,11 +18,11 @@ module Teodoro
22
18
  end
23
19
 
24
20
  def versao_do_aplicativo_de_processamento_do_evento
25
- @versao_do_aplicativo_de_processamento_do_evento ||= recibo['retornoEvento/processamento/versaoAppProcessamento']
21
+ @versao_do_aplicativo_de_processamento_do_evento ||= recibo['processamento/versaoAppProcessamento']
26
22
  end
27
23
 
28
24
  def numero_do_recibo
29
- @numero_do_recibo ||= recibo['retornoEvento/recibo/nrRecibo']
25
+ @numero_do_recibo ||= recibo['recibo/nrRecibo']
30
26
  end
31
27
  end
32
28
  end
@@ -11,11 +11,42 @@ module Teodoro
11
11
  end
12
12
 
13
13
  def conteudo_do_arquivo_data
14
- (itens_do_conteudo_do_arquivo_data.map { "#{_1}=#{_2}" } + ['']).join("\n")
14
+ (itens_do_conteudo_do_arquivo_data.map { "#{_1}=#{Valor.new(_2)}" } + ['']).join("\r\n")
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
+ end
20
+
21
+ class Valor
22
+ FORMATADORES = {
23
+ bool: proc { _1 ? 'True' : 'False' },
24
+ data: proc { "#{_1[-2..]}/#{_1[5..6]}/#{_1[0..3]}" if _1 },
25
+ data_aaaammdd: proc { _1.delete('-') if _1 },
26
+ mes_ano: proc { "#{_1[-2..]}/#{_1[0..3]}" if _1 }
27
+ }.freeze
28
+
29
+ private
30
+
31
+ def initialize(arg)
32
+ @arg = arg
33
+ end
34
+
35
+ attr_reader :arg
36
+
37
+ public
38
+
39
+ def to_s
40
+ @to_s ||= (tipo ? FORMATADORES[tipo].call(valor) : valor).to_s
41
+ end
42
+
43
+ def tipo
44
+ @tipo ||= arg[1] if arg.is_a?(Array)
45
+ end
46
+
47
+ def valor
48
+ @valor ||= arg.is_a?(Array) ? arg[0] : arg
49
+ end
19
50
  end
20
51
  end
21
52
  end
@@ -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
@@ -4,12 +4,12 @@ module Teodoro
4
4
 
5
5
  private
6
6
 
7
- def leiaute_simplificado?
8
- versao_do_leiaute.start_with?('_S_')
7
+ def id_do_evento
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
@@ -110,7 +136,7 @@ module Teodoro
110
136
  def arquivo
111
137
  classe_do_arquivo.new(
112
138
  empresa: empresa,
113
- arquivo_xml: Obj.new(versao_do_leiaute: versao_do_leiaute, evento: evento, recibo: recibo)
139
+ arquivo_xml: Obj.new(evento: evento, recibo: recibo)
114
140
  )
115
141
  end
116
142
 
@@ -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,229 +5,265 @@ 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)
126
- Contrato.new(**admissao).then do
127
- contratos_por_matricula[_1.matricula] = _1
128
- end
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) }
129
91
  end
130
92
 
131
- def [](matricula)
132
- contratos_por_matricula[matricula]
93
+ def criar_diretorio_dos_arquivos_data
94
+ Dir.mkdir(destino_dos_arquivos_data)
133
95
  end
134
96
 
135
- def *(cpf_do_trabalhador:, data:)
136
- contratos
137
- .select { _1.cpf_do_trabalhador == cpf_do_trabalhador && _1.ativo?(data) }
138
- .sort_by(&:data_de_admissao)
97
+ def carregar_arquivos_xml
98
+ arquivos_xml.each(&:carregar)
139
99
  end
140
100
 
141
- def remover(recibo)
142
- 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) }
143
105
  end
144
106
 
145
- 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
146
118
 
147
- def contratos_por_matricula
148
- @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
149
123
  end
150
124
 
151
- def contratos
152
- contratos_por_matricula.values
125
+ def processar_arquivos_xml
126
+ # otimizacao do gerenciamento de memoria
127
+ arquivos_xml.shift.processar while arquivos_xml.any?
153
128
  end
154
129
 
155
- class Contrato
130
+ class ArquivosData
156
131
  private
157
132
 
158
- def initialize(matricula:, data_de_admissao:, categoria_do_trabalhador:, cpf_do_trabalhador:, recibo:)
159
- @matricula = matricula
160
- @data_de_admissao = data_de_admissao
161
- @categoria_do_trabalhador = categoria_do_trabalhador
162
- @cpf_do_trabalhador = cpf_do_trabalhador
163
- @recibo = recibo
133
+ def initialize(destino_dos_arquivos_data)
134
+ @destino_dos_arquivos_data = destino_dos_arquivos_data
164
135
  end
165
136
 
166
- attr_reader :data_de_desligamento
137
+ attr_reader :destino_dos_arquivos_data
167
138
 
168
139
  public
169
140
 
170
- attr_reader :matricula, :data_de_admissao, :categoria_do_trabalhador, :cpf_do_trabalhador, :recibo
141
+ def registrar(recibo:, nome:)
142
+ (nomes_por_recibo[recibo] ||= []) << nome
143
+ end
171
144
 
172
- attr_writer :data_de_desligamento
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
150
+
151
+ private
173
152
 
174
- def ativo?(data)
175
- data_de_admissao <= data && (!data_de_desligamento || data_de_desligamento >= data)
153
+ def nomes_por_recibo
154
+ @nomes_por_recibo ||= {}
176
155
  end
177
156
  end
178
- end
179
157
 
180
- class ContratosDeTrabalhoSemVinculo
181
- def registrar_inicio_de_contrato(inicio_de_contrato)
182
- contratos << Contrato.new(**inicio_de_contrato)
183
- end
158
+ class ContratosDeEmprego
159
+ def registrar_admissao(admissao:, afastamento:)
160
+ contratos_por_matricula[admissao.matricula] = Contrato.new(admissao: admissao, afastamento: afastamento)
161
+ end
184
162
 
185
- def [](cpf_do_trabalhador:, categoria_do_trabalhador:, data:)
186
- contratos
187
- .select {
188
- _1.cpf_do_trabalhador == cpf_do_trabalhador &&
189
- _1.categoria_do_trabalhador == categoria_do_trabalhador &&
190
- _1.ativo?(data)
191
- }
192
- .max_by(&:data_de_inicio)
193
- end
163
+ def [](matricula)
164
+ contratos_por_matricula[matricula]
165
+ end
194
166
 
195
- def *(cpf_do_trabalhador:, data:)
196
- contratos
197
- .select { _1.cpf_do_trabalhador == cpf_do_trabalhador && _1.ativo?(data) }
198
- .sort_by(&:data_de_inicio)
199
- end
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)
171
+ end
200
172
 
201
- def remover(recibo)
202
- contratos.delete_if { _1.recibo == recibo }
203
- end
173
+ def remover(recibo)
174
+ contratos_por_matricula.delete_if { _2.recibo == recibo }
175
+ end
204
176
 
205
- private
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
206
194
 
207
- def contratos
208
- @contratos ||= []
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
209
212
  end
210
213
 
211
- class Contrato
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:)
220
+ contratos
221
+ .select {
222
+ _1.cpf_do_trabalhador == cpf_do_trabalhador && _1.categoria_do_trabalhador == categoria_do_trabalhador &&
223
+ _1.ativo?(data)
224
+ }
225
+ .max_by(&:data_de_inicio)
226
+ end
227
+
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
233
+
234
+ def remover(recibo)
235
+ contratos.delete_if { _1.recibo == recibo }
236
+ end
237
+
212
238
  private
213
239
 
214
- def initialize(cpf_do_trabalhador:, categoria_do_trabalhador:, data_de_inicio:, recibo:)
215
- @cpf_do_trabalhador = cpf_do_trabalhador
216
- @categoria_do_trabalhador = categoria_do_trabalhador
217
- @data_de_inicio = data_de_inicio
218
- @recibo = recibo
240
+ def contratos
241
+ @contratos ||= []
219
242
  end
220
243
 
221
- attr_reader :data_do_termino
244
+ class Contrato
245
+ private
222
246
 
223
- public
247
+ def initialize(inicio_de_contrato:, afastamento:)
248
+ @inicio_de_contrato = inicio_de_contrato
249
+ @afastamento = afastamento
250
+ end
251
+
252
+ attr_reader :inicio_de_contrato, :data_do_termino
253
+
254
+ public
255
+
256
+ extend Forwardable
257
+
258
+ def_delegators :inicio_de_contrato, :cpf_do_trabalhador, :categoria_do_trabalhador, :data_de_inicio, :recibo
224
259
 
225
- attr_reader :cpf_do_trabalhador, :categoria_do_trabalhador, :data_de_inicio, :recibo
260
+ attr_accessor :afastamento
226
261
 
227
- attr_writer :data_do_termino
262
+ attr_writer :data_do_termino
228
263
 
229
- def ativo?(data)
230
- data_de_inicio <= data && (!data_do_termino || data_do_termino >= data)
264
+ def ativo?(data)
265
+ data_de_inicio <= data && (!data_do_termino || data_do_termino >= data)
266
+ end
231
267
  end
232
268
  end
233
269
  end