teodoro 0.0.9 → 0.0.14

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 (36) hide show
  1. checksums.yaml +4 -4
  2. data/lib/teodoro.rb +3 -9
  3. data/lib/teodoro/arquivo_de_evento.rb +22 -8
  4. data/lib/teodoro/arquivo_de_evento_de_tabela.rb +1 -11
  5. data/lib/teodoro/arquivo_de_evento_exceto_de_exclusao.rb +1 -7
  6. data/lib/teodoro/arquivo_de_evento_nao_periodico.rb +5 -18
  7. data/lib/teodoro/arquivo_de_evento_processador_de_arquivo_data.rb +30 -0
  8. data/lib/teodoro/arquivo_de_origem.rb +1 -1
  9. data/lib/teodoro/arquivo_xml.rb +49 -74
  10. data/lib/teodoro/console.rb +2 -6
  11. data/lib/teodoro/empresa.rb +74 -15
  12. data/lib/teodoro/leiaute.rb +24 -0
  13. data/lib/teodoro/{leiaute_2_4_1 → leiaute}/arquivo_s1000.rb +7 -9
  14. data/lib/teodoro/{leiaute_2_4_1 → leiaute}/arquivo_s1005.rb +4 -4
  15. data/lib/teodoro/{leiaute_2_4_1 → leiaute}/arquivo_s1010.rb +3 -5
  16. data/lib/teodoro/{leiaute_2_4_1 → leiaute}/arquivo_s1020.rb +4 -4
  17. data/lib/teodoro/{leiaute_2_4_1 → leiaute}/arquivo_s1030.rb +4 -4
  18. data/lib/teodoro/{leiaute_2_4_1 → leiaute}/arquivo_s1040.rb +2 -4
  19. data/lib/teodoro/{leiaute_2_4_1 → leiaute}/arquivo_s1050.rb +4 -4
  20. data/lib/teodoro/{leiaute_2_4_1 → leiaute}/arquivo_s1070.rb +2 -4
  21. data/lib/teodoro/{leiaute_2_4_1 → leiaute}/arquivo_s2190.rb +2 -2
  22. data/lib/teodoro/{leiaute_2_4_1 → leiaute}/arquivo_s2200.rb +131 -22
  23. data/lib/teodoro/leiaute/arquivo_s2205.rb +254 -0
  24. data/lib/teodoro/{leiaute_2_4_1 → leiaute}/arquivo_s2206.rb +18 -7
  25. data/lib/teodoro/{leiaute_2_4_1 → leiaute}/arquivo_s2230.rb +56 -12
  26. data/lib/teodoro/{leiaute_2_4_1 → leiaute}/arquivo_s2250.rb +25 -9
  27. data/lib/teodoro/leiaute/arquivo_s2299.rb +313 -0
  28. data/lib/teodoro/{leiaute_2_4_1 → leiaute}/arquivo_s2300.rb +24 -5
  29. data/lib/teodoro/{leiaute_2_4_1 → leiaute}/arquivo_s2306.rb +27 -7
  30. data/lib/teodoro/leiaute/arquivo_s2399.rb +306 -0
  31. data/lib/teodoro/leiaute/arquivo_s3000.rb +41 -0
  32. data/lib/teodoro/obj.rb +5 -0
  33. metadata +24 -20
  34. data/lib/teodoro/leiaute_2_4_1.rb +0 -22
  35. data/lib/teodoro/leiaute_2_4_1/arquivo_s2205.rb +0 -157
  36. data/lib/teodoro/leiaute_2_4_1/arquivo_s3000.rb +0 -45
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: fb5c4d48569ca39e7f8ef5498b4a66f76d236e5aa8d8ab94c5c648769e5c8968
4
- data.tar.gz: 29d4363f9f97443cfc6f727cd83008b5b1d416f4e4b0af19429cd0a5af1ae911
3
+ metadata.gz: e696e8f08a36cd8a03c594889275036e4d7c93450fdd726695f7f459324e397e
4
+ data.tar.gz: 5a681ee9a32067f055efa512a0244770d7b9745ee30a267758a5cc8a79ec7171
5
5
  SHA512:
6
- metadata.gz: 874c4435734ba86267f19342c25e20a3b2b5fbcf030b284550a1f68ad66886f54f624a78f4ee88b39fd5b865c57234740e5a34f9b0e89e4cafffef93fd7366e8
7
- data.tar.gz: 8dd3e540b5c26080612e79a0196f2a5eb9aa316a4d9e1f63c06bdf4cb4be79b51c9487174b35b30f84c861c1f9699f636aebb356f56d55a73fe5eac267fffbe4
6
+ metadata.gz: 65b6daa91ab167768a7167f99957cb310448c7dd93ac1d0f918ec25827398c1562d2db40bbc6b7b008ac6f43ccadddf25ba5410b467d0caa470b699b4a68ffcb
7
+ data.tar.gz: c600d82615cd701367aa868155d67494549bd5b3f5d28cf34661f39f55bdb6cf244dfaf23bce9b39e288247f8fc5004bc467a5527ca287bb6327c2da65ada080
data/lib/teodoro.rb CHANGED
@@ -4,6 +4,7 @@ require 'zip'
4
4
 
5
5
  require_relative 'teodoro/console'
6
6
  require_relative 'teodoro/empresa'
7
+ require_relative 'teodoro/obj'
7
8
 
8
9
  module Teodoro
9
10
  def self.call(args)
@@ -24,15 +25,6 @@ module Teodoro
24
25
  public
25
26
 
26
27
  def call
27
- executar
28
- rescue StandardError => e
29
- Console.print e.message, *e.backtrace, color: :red
30
- exit
31
- end
32
-
33
- private
34
-
35
- def executar
36
28
  validar_argumentos
37
29
  validar_existencia_do_diretorio_de_origem
38
30
  validar_que_diretorio_de_origem_nao_esta_vazio
@@ -41,6 +33,8 @@ module Teodoro
41
33
  processar_empresas
42
34
  end
43
35
 
36
+ private
37
+
44
38
  def validar_argumentos
45
39
  erro "#{NOME_DO_PROGRAMA} [diretório de origem] [diretório de destino]" unless args.size == 2
46
40
  end
@@ -2,17 +2,31 @@ module Teodoro
2
2
  module ArquivoDeEvento
3
3
  private
4
4
 
5
- attr_reader :evento, :destino_dos_arquivos_data
5
+ def initialize(empresa:, arquivo_xml:)
6
+ @empresa = empresa
7
+ @arquivo_xml = arquivo_xml
8
+ end
9
+
10
+ attr_reader :empresa, :arquivo_xml
11
+
12
+ def versao_do_leiaute
13
+ arquivo_xml.versao_do_leiaute
14
+ end
15
+
16
+ def evento
17
+ arquivo_xml.evento
18
+ end
19
+
20
+ def recibo
21
+ arquivo_xml.recibo
22
+ end
6
23
 
7
- def criar_caminho_do_arquivo_data(nome_do_arquivo)
8
- File.join(
9
- destino_dos_arquivos_data,
10
- "#{windows? ? nome_do_arquivo.gsub(%r{[<|>:"/\\?*]}, '_') : nome_do_arquivo}.data"
11
- )
24
+ def versao_do_aplicativo_de_processamento_do_evento
25
+ @versao_do_aplicativo_de_processamento_do_evento ||= recibo['retornoEvento/processamento/versaoAppProcessamento']
12
26
  end
13
27
 
14
- def windows?
15
- OS.windows?
28
+ def numero_do_recibo
29
+ @numero_do_recibo ||= recibo['retornoEvento/recibo/nrRecibo']
16
30
  end
17
31
  end
18
32
  end
@@ -2,16 +2,6 @@ module Teodoro
2
2
  module ArquivoDeEventoDeTabela
3
3
  include ArquivoDeEventoExcetoDeExclusao
4
4
 
5
- private
6
-
7
- def initialize(evento:, recibo:, destino_dos_arquivos_data:)
8
- @evento = evento
9
- @recibo = recibo
10
- @destino_dos_arquivos_data = destino_dos_arquivos_data
11
- end
12
-
13
- public
14
-
15
5
  def processar
16
6
  deletar_arquivo_data_original if alteracao? || exclusao?
17
7
  return if exclusao?
@@ -47,7 +37,7 @@ module Teodoro
47
37
  end
48
38
 
49
39
  def caminho_do_arquivo_data
50
- # FIXME: Tales inicio de validade
40
+ # FIXME: Tales inicio de validade ou inicio da nova validade?
51
41
  obter_caminho_do_arquivo_data(inicio_da_validade)
52
42
  end
53
43
 
@@ -1,11 +1,9 @@
1
1
  module Teodoro
2
2
  module ArquivoDeEventoExcetoDeExclusao
3
- include ArquivoDeEvento
3
+ include ArquivoDeEventoProcessadorDeArquivoData
4
4
 
5
5
  private
6
6
 
7
- attr_reader :recibo
8
-
9
7
  def criar_arquivo_data
10
8
  raise caminho_do_arquivo_data if File.exist?(caminho_do_arquivo_data)
11
9
 
@@ -16,10 +14,6 @@ module Teodoro
16
14
  (itens_do_conteudo_do_arquivo_data.map { "#{_1}=#{_2}" } + ['']).join("\n")
17
15
  end
18
16
 
19
- def versao_do_aplicativo_de_processamento_do_evento
20
- recibo['retornoEvento/processamento/versaoAppProcessamento']
21
- end
22
-
23
17
  def tipo_de_inscricao_do_empregador
24
18
  @tipo_de_inscricao_do_empregador ||= evento["#{noh_principal_do_evento}/ideEmpregador/tpInsc"]
25
19
  end
@@ -2,19 +2,6 @@ module Teodoro
2
2
  module ArquivoDeEventoNaoPeriodico
3
3
  include ArquivoDeEventoExcetoDeExclusao
4
4
 
5
- private
6
-
7
- def initialize(evento:, recibo:, destino_dos_arquivos_data:, de_recibo_para_nome_do_arquivo_data:)
8
- @evento = evento
9
- @recibo = recibo
10
- @destino_dos_arquivos_data = destino_dos_arquivos_data
11
- @de_recibo_para_nome_do_arquivo_data = de_recibo_para_nome_do_arquivo_data
12
- end
13
-
14
- attr_reader :de_recibo_para_nome_do_arquivo_data
15
-
16
- public
17
-
18
5
  def processar
19
6
  deletar_arquivo_data_original if retificacao?
20
7
  registrar_recibo
@@ -39,18 +26,18 @@ module Teodoro
39
26
  de_recibo_para_nome_do_arquivo_data[numero_do_recibo_a_retificar]
40
27
  end
41
28
 
29
+ def de_recibo_para_nome_do_arquivo_data
30
+ empresa.de_recibo_para_nome_do_arquivo_data
31
+ end
32
+
42
33
  def numero_do_recibo_a_retificar
43
- @numero_do_recibo_a_retificar ||= evento["#{noh_principal_do_evento}/ideEvento/nrRecibo"]
34
+ evento["#{noh_principal_do_evento}/ideEvento/nrRecibo"]
44
35
  end
45
36
 
46
37
  def registrar_recibo
47
38
  de_recibo_para_nome_do_arquivo_data[numero_do_recibo] = nome_do_arquivo_data
48
39
  end
49
40
 
50
- def numero_do_recibo
51
- recibo['retornoEvento/recibo/nrRecibo']
52
- end
53
-
54
41
  def caminho_do_arquivo_data
55
42
  criar_caminho_do_arquivo_data(nome_do_arquivo_data)
56
43
  end
@@ -0,0 +1,30 @@
1
+ module Teodoro
2
+ module ArquivoDeEventoProcessadorDeArquivoData
3
+ include ArquivoDeEvento
4
+
5
+ private
6
+
7
+ def leiaute_simplificado?
8
+ versao_do_leiaute.start_with?('_S_')
9
+ end
10
+
11
+ def processo_de_emissao_do_evento
12
+ evento["#{noh_principal_do_evento}/ideEvento/procEmi"]
13
+ end
14
+
15
+ def criar_caminho_do_arquivo_data(nome_do_arquivo)
16
+ File.join(
17
+ destino_dos_arquivos_data,
18
+ "#{windows? ? nome_do_arquivo.gsub(%r{[<|>:"/\\?*]}, '_') : nome_do_arquivo}.data"
19
+ )
20
+ end
21
+
22
+ def destino_dos_arquivos_data
23
+ empresa.destino_dos_arquivos_data
24
+ end
25
+
26
+ def windows?
27
+ OS.windows?
28
+ end
29
+ end
30
+ end
@@ -14,7 +14,7 @@ module Teodoro
14
14
  public
15
15
 
16
16
  def descompactar
17
- print "\e[2Kdescompactando #{File.basename(caminho)}...\r"
17
+ Console.print "descompactando #{File.basename(caminho)}..."
18
18
 
19
19
  Zip::File.open(caminho) do |zip|
20
20
  zip
@@ -1,13 +1,14 @@
1
1
  require_relative 'arquivo_de_evento'
2
+ require_relative 'arquivo_de_evento_processador_de_arquivo_data'
2
3
  require_relative 'arquivo_de_evento_exceto_de_exclusao'
3
4
  require_relative 'arquivo_de_evento_de_tabela'
4
5
  require_relative 'arquivo_de_evento_nao_periodico'
5
6
  require_relative 'cnpj'
6
- require_relative 'leiaute_2_4_1'
7
+ require_relative 'leiaute'
7
8
  require_relative 'xml'
8
9
 
9
10
  module Teodoro
10
- class ArquivoXML # rubocop:disable Metrics/ClassLength
11
+ class ArquivoXML
11
12
  TIPOS_DE_EVENTO_PROCESSAVEIS = %w[
12
13
  S1000
13
14
  S1005
@@ -23,25 +24,34 @@ module Teodoro
23
24
  S2206
24
25
  S2230
25
26
  S2250
27
+ S2299
26
28
  S2300
27
29
  S2306
30
+ S2399
28
31
  S3000
29
32
  ].freeze
30
33
 
31
34
  private
32
35
 
33
- def initialize(caminho:, destino_dos_arquivos_data:, de_recibo_para_nome_do_arquivo_data:)
36
+ def initialize(empresa:, caminho:)
37
+ @empresa = empresa
34
38
  @caminho = caminho
35
- @destino_dos_arquivos_data = destino_dos_arquivos_data
36
- @de_recibo_para_nome_do_arquivo_data = de_recibo_para_nome_do_arquivo_data
37
39
  end
38
40
 
39
- attr_reader :caminho, :destino_dos_arquivos_data, :de_recibo_para_nome_do_arquivo_data
41
+ attr_reader :empresa, :caminho
40
42
 
41
43
  public
42
44
 
45
+ def processavel?
46
+ TIPOS_DE_EVENTO_PROCESSAVEIS.include?(tipo_de_evento)
47
+ end
48
+
43
49
  def momento_de_processamento_pelo_e_social
44
- recibo['retornoEvento/processamento/dhProcessamento']
50
+ # otimizacao do gerenciamento de memoria
51
+ carregar_xml
52
+ .then { |xml| Nokogiri::XML(xml.css('eSocial/retornoProcessamentoDownload/recibo/*').to_s) }
53
+ .then { |xml_do_recibo| XML.new(xml_do_recibo) }
54
+ .then { |recibo| recibo['retornoEvento/processamento/dhProcessamento'] }
45
55
  end
46
56
 
47
57
  def nome
@@ -49,109 +59,74 @@ module Teodoro
49
59
  end
50
60
 
51
61
  def processar
52
- print "\e[2Kprocessando #{nome}.xml...\r"
53
-
54
- return unless TIPOS_DE_EVENTO_PROCESSAVEIS.include?(tipo_de_evento)
55
-
56
- arquivo.processar
62
+ dar_feedback_para_o_usuario
63
+ validar_versao_do_leiaute
64
+ processar_arquivo
57
65
  end
58
66
 
59
67
  private
60
68
 
61
- def recibo
62
- @recibo ||= XML.new(xml_do_recibo)
63
- end
64
-
65
- def xml_do_recibo
66
- Nokogiri::XML(xml.css('eSocial/retornoProcessamentoDownload/recibo/*').to_s)
69
+ def tipo_de_evento
70
+ @tipo_de_evento ||= nome[-6..].delete('-')
67
71
  end
68
72
 
69
- def xml
70
- @xml ||= Nokogiri::XML(conteudo)
73
+ def carregar_xml
74
+ Nokogiri::XML(carregar_conteudo)
71
75
  end
72
76
 
73
- def conteudo
77
+ def carregar_conteudo
74
78
  File.read(caminho)
75
79
  end
76
80
 
77
- def tipo_de_evento
78
- nome[-6..].delete('-')
81
+ def dar_feedback_para_o_usuario
82
+ Console.print "processando #{nome}.xml..."
79
83
  end
80
84
 
81
- def arquivo
82
- if evento_de_tabela?
83
- evento_de_tabela
84
- elsif evento_nao_periodico?
85
- evento_nao_periodico
86
- elsif evento_de_exclusao?
87
- evento_de_exclusao
88
- end
85
+ def validar_versao_do_leiaute
86
+ raise unless %w[02_04_01 02_04_02 02_05_00 _S_01_00_00].include?(versao_do_leiaute)
89
87
  end
90
88
 
91
- def evento_de_tabela?
92
- tipo_de_evento.start_with?('S10')
89
+ def versao_do_leiaute
90
+ @versao_do_leiaute ||= namespace_do_evento.match(%r{.+/v(.+)$})[1]
93
91
  end
94
92
 
95
- def evento_de_tabela
96
- classe_do_arquivo.new(
97
- evento: evento,
98
- recibo: recibo,
99
- destino_dos_arquivos_data: destino_dos_arquivos_data
100
- )
93
+ def namespace_do_evento
94
+ xml_do_evento.css('eSocial')[0].namespace.href
101
95
  end
102
96
 
103
- def evento_nao_periodico?
104
- tipo_de_evento.start_with?('S2')
97
+ def xml_do_evento
98
+ @xml_do_evento ||= Nokogiri::XML(xml.css('eSocial/retornoProcessamentoDownload/evento/*').to_s)
105
99
  end
106
100
 
107
- def evento_nao_periodico
108
- classe_do_arquivo.new(
109
- evento: evento,
110
- recibo: recibo,
111
- destino_dos_arquivos_data: destino_dos_arquivos_data,
112
- de_recibo_para_nome_do_arquivo_data: de_recibo_para_nome_do_arquivo_data
113
- )
101
+ def xml
102
+ @xml ||= carregar_xml
114
103
  end
115
104
 
116
- def evento_de_exclusao?
117
- tipo_de_evento == 'S3000'
105
+ def processar_arquivo
106
+ arquivo.processar
118
107
  end
119
108
 
120
- def evento_de_exclusao
109
+ def arquivo
121
110
  classe_do_arquivo.new(
122
- evento: evento,
123
- de_recibo_para_nome_do_arquivo_data: de_recibo_para_nome_do_arquivo_data,
124
- destino_dos_arquivos_data: destino_dos_arquivos_data
111
+ empresa: empresa,
112
+ arquivo_xml: Obj.new(versao_do_leiaute: versao_do_leiaute, evento: evento, recibo: recibo)
125
113
  )
126
114
  end
127
115
 
128
116
  def classe_do_arquivo
129
- modulo_do_leiaute.const_get("Arquivo#{tipo_de_evento}")
117
+ Leiaute.const_get("Arquivo#{tipo_de_evento}")
130
118
  end
131
119
 
132
- def modulo_do_leiaute
133
- {
134
- '02_04_01' => Leiaute_2_4_1,
135
- '02_04_02' => Leiaute_2_4_1, # FIXME: Tales
136
- '02_05_00' => Leiaute_2_4_1, # FIXME: Tales
137
- '01_00_00' => Leiaute_2_4_1 # FIXME: Tales
138
- }[versao_do_leiaute_no_xml]
139
- end
140
-
141
- def versao_do_leiaute_no_xml
142
- namespace_do_evento.match(%r{.+/v(.+)$})[1]
143
- end
144
-
145
- def namespace_do_evento
146
- xml_do_evento.css('eSocial')[0].namespace.href
120
+ def evento
121
+ XML.new(xml_do_evento)
147
122
  end
148
123
 
149
- def xml_do_evento
150
- @xml_do_evento ||= Nokogiri::XML(xml.css('eSocial/retornoProcessamentoDownload/evento/*').to_s)
124
+ def recibo
125
+ @recibo ||= XML.new(xml_do_recibo)
151
126
  end
152
127
 
153
- def evento
154
- XML.new(xml_do_evento)
128
+ def xml_do_recibo
129
+ Nokogiri::XML(xml.css('eSocial/retornoProcessamentoDownload/recibo/*').to_s)
155
130
  end
156
131
  end
157
132
  end
@@ -1,9 +1,5 @@
1
1
  module Console
2
- class << self
3
- def print(*strings, color: nil)
4
- color_codes = { green: 32, red: 31 }
5
- strings = strings.map { |string| "\e[#{color_codes[color]}m#{string}\e[0m" } if color
6
- puts strings
7
- end
2
+ def self.print(string = nil)
3
+ Kernel.print "\r\e[2K#{string}"
8
4
  end
9
5
  end
@@ -20,6 +20,7 @@ module Teodoro
20
20
  criar_diretorio_dos_arquivos_xml
21
21
  descompactar_arquivos_de_origem
22
22
  criar_diretorio_dos_arquivos_data
23
+ ordenar_arquivos_xml
23
24
  processar_arquivos_xml
24
25
  limpar_linha_de_feedback
25
26
  end
@@ -27,7 +28,7 @@ module Teodoro
27
28
  private
28
29
 
29
30
  def dar_feedback_para_o_usuario
30
- Console.print nome_do_diretorio, color: :green
31
+ puts "\e[32m#{nome_do_diretorio}\e[0m" # green
31
32
  end
32
33
 
33
34
  def nome_do_diretorio
@@ -63,29 +64,87 @@ module Teodoro
63
64
  @destino_dos_arquivos_data ||= File.join(destino, 'data')
64
65
  end
65
66
 
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
71
+
66
72
  def processar_arquivos_xml
67
- arquivos_xml
68
- .sort_by { [_1.momento_de_processamento_pelo_e_social, _1.nome] }
69
- .each(&:processar)
73
+ # otimizacao do gerenciamento de memoria
74
+ arquivos_xml.shift.processar while arquivos_xml.any?
70
75
  end
71
76
 
72
77
  def arquivos_xml
73
- Dir[File.join(destino_dos_arquivos_xml, '*.xml')]
74
- .map do |caminho|
75
- ArquivoXML.new(
76
- caminho: caminho,
77
- destino_dos_arquivos_data: destino_dos_arquivos_data,
78
- de_recibo_para_nome_do_arquivo_data: de_recibo_para_nome_do_arquivo_data
79
- )
80
- end
78
+ @arquivos_xml ||= Dir[File.join(destino_dos_arquivos_xml, '*.xml')]
79
+ .map { |caminho| ArquivoXML.new(empresa: empresa, caminho: caminho) }
80
+ .select(&:processavel?)
81
81
  end
82
82
 
83
- def de_recibo_para_nome_do_arquivo_data
84
- @de_recibo_para_nome_do_arquivo_data ||= {}
83
+ def empresa
84
+ @empresa ||= Obj.new(
85
+ destino_dos_arquivos_data: destino_dos_arquivos_data,
86
+ de_recibo_para_nome_do_arquivo_data: {},
87
+ contratos_de_emprego: ContratosDeEmprego.new,
88
+ contratos_de_trabalho_sem_vinculo: ContratosDeTrabalhoSemVinculo.new
89
+ )
85
90
  end
86
91
 
87
92
  def limpar_linha_de_feedback
88
- print "\e[2K"
93
+ Console.print
94
+ end
95
+
96
+ class ContratosDeEmprego
97
+ def []=(matricula, contrato)
98
+ contratos_por_matricula[matricula] = contrato
99
+ end
100
+
101
+ def [](matricula)
102
+ contratos_por_matricula[matricula]
103
+ end
104
+
105
+ def *(cpf_do_trabalhador:, data:)
106
+ contratos
107
+ .select { _1.cpf_do_trabalhador == cpf_do_trabalhador }
108
+ .select { _1.data_de_admissao <= data } # data de rescisao
109
+ .sort_by(&:data_de_admissao)
110
+ end
111
+
112
+ private
113
+
114
+ def contratos_por_matricula
115
+ @contratos_por_matricula ||= {}
116
+ end
117
+
118
+ def contratos
119
+ contratos_por_matricula.values
120
+ end
121
+ end
122
+
123
+ class ContratosDeTrabalhoSemVinculo
124
+ def <<(contrato)
125
+ contratos << contrato
126
+ end
127
+
128
+ def [](cpf_do_trabalhador:, categoria_do_trabalhador:, data:)
129
+ contratos
130
+ .select { _1.cpf_do_trabalhador == cpf_do_trabalhador }
131
+ .select { _1.categoria_do_trabalhador == categoria_do_trabalhador}
132
+ .select { _1.data_de_inicio <= data }
133
+ .max_by(&:data_de_inicio)
134
+ end
135
+
136
+ def *(cpf_do_trabalhador:, data:)
137
+ contratos
138
+ .select { _1.cpf_do_trabalhador == cpf_do_trabalhador }
139
+ .select { _1.data_de_inicio <= data } # FIXME: Tales data de termino
140
+ .sort_by(&:data_de_inicio)
141
+ end
142
+
143
+ private
144
+
145
+ def contratos
146
+ @contratos ||= []
147
+ end
89
148
  end
90
149
  end
91
150
  end