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.
- checksums.yaml +4 -4
- data/lib/teodoro.rb +3 -9
- data/lib/teodoro/arquivo_de_evento.rb +22 -8
- data/lib/teodoro/arquivo_de_evento_de_tabela.rb +1 -11
- data/lib/teodoro/arquivo_de_evento_exceto_de_exclusao.rb +1 -7
- data/lib/teodoro/arquivo_de_evento_nao_periodico.rb +5 -18
- data/lib/teodoro/arquivo_de_evento_processador_de_arquivo_data.rb +30 -0
- data/lib/teodoro/arquivo_de_origem.rb +1 -1
- data/lib/teodoro/arquivo_xml.rb +49 -74
- data/lib/teodoro/console.rb +2 -6
- data/lib/teodoro/empresa.rb +74 -15
- data/lib/teodoro/leiaute.rb +24 -0
- data/lib/teodoro/{leiaute_2_4_1 → leiaute}/arquivo_s1000.rb +7 -9
- data/lib/teodoro/{leiaute_2_4_1 → leiaute}/arquivo_s1005.rb +4 -4
- data/lib/teodoro/{leiaute_2_4_1 → leiaute}/arquivo_s1010.rb +3 -5
- data/lib/teodoro/{leiaute_2_4_1 → leiaute}/arquivo_s1020.rb +4 -4
- data/lib/teodoro/{leiaute_2_4_1 → leiaute}/arquivo_s1030.rb +4 -4
- data/lib/teodoro/{leiaute_2_4_1 → leiaute}/arquivo_s1040.rb +2 -4
- data/lib/teodoro/{leiaute_2_4_1 → leiaute}/arquivo_s1050.rb +4 -4
- data/lib/teodoro/{leiaute_2_4_1 → leiaute}/arquivo_s1070.rb +2 -4
- data/lib/teodoro/{leiaute_2_4_1 → leiaute}/arquivo_s2190.rb +2 -2
- data/lib/teodoro/{leiaute_2_4_1 → leiaute}/arquivo_s2200.rb +131 -22
- data/lib/teodoro/leiaute/arquivo_s2205.rb +254 -0
- data/lib/teodoro/{leiaute_2_4_1 → leiaute}/arquivo_s2206.rb +18 -7
- data/lib/teodoro/{leiaute_2_4_1 → leiaute}/arquivo_s2230.rb +56 -12
- data/lib/teodoro/{leiaute_2_4_1 → leiaute}/arquivo_s2250.rb +25 -9
- data/lib/teodoro/leiaute/arquivo_s2299.rb +313 -0
- data/lib/teodoro/{leiaute_2_4_1 → leiaute}/arquivo_s2300.rb +24 -5
- data/lib/teodoro/{leiaute_2_4_1 → leiaute}/arquivo_s2306.rb +27 -7
- data/lib/teodoro/leiaute/arquivo_s2399.rb +306 -0
- data/lib/teodoro/leiaute/arquivo_s3000.rb +41 -0
- data/lib/teodoro/obj.rb +5 -0
- metadata +24 -20
- data/lib/teodoro/leiaute_2_4_1.rb +0 -22
- data/lib/teodoro/leiaute_2_4_1/arquivo_s2205.rb +0 -157
- 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:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e696e8f08a36cd8a03c594889275036e4d7c93450fdd726695f7f459324e397e
|
4
|
+
data.tar.gz: 5a681ee9a32067f055efa512a0244770d7b9745ee30a267758a5cc8a79ec7171
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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
|
-
|
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
|
8
|
-
|
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
|
15
|
-
|
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
|
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
|
-
|
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
|
data/lib/teodoro/arquivo_xml.rb
CHANGED
@@ -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 '
|
7
|
+
require_relative 'leiaute'
|
7
8
|
require_relative 'xml'
|
8
9
|
|
9
10
|
module Teodoro
|
10
|
-
class ArquivoXML
|
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(
|
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 :
|
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
|
-
|
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
|
-
|
53
|
-
|
54
|
-
|
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
|
62
|
-
@
|
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
|
70
|
-
|
73
|
+
def carregar_xml
|
74
|
+
Nokogiri::XML(carregar_conteudo)
|
71
75
|
end
|
72
76
|
|
73
|
-
def
|
77
|
+
def carregar_conteudo
|
74
78
|
File.read(caminho)
|
75
79
|
end
|
76
80
|
|
77
|
-
def
|
78
|
-
nome
|
81
|
+
def dar_feedback_para_o_usuario
|
82
|
+
Console.print "processando #{nome}.xml..."
|
79
83
|
end
|
80
84
|
|
81
|
-
def
|
82
|
-
|
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
|
92
|
-
|
89
|
+
def versao_do_leiaute
|
90
|
+
@versao_do_leiaute ||= namespace_do_evento.match(%r{.+/v(.+)$})[1]
|
93
91
|
end
|
94
92
|
|
95
|
-
def
|
96
|
-
|
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
|
104
|
-
|
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
|
108
|
-
|
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
|
117
|
-
|
105
|
+
def processar_arquivo
|
106
|
+
arquivo.processar
|
118
107
|
end
|
119
108
|
|
120
|
-
def
|
109
|
+
def arquivo
|
121
110
|
classe_do_arquivo.new(
|
122
|
-
|
123
|
-
|
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
|
-
|
117
|
+
Leiaute.const_get("Arquivo#{tipo_de_evento}")
|
130
118
|
end
|
131
119
|
|
132
|
-
def
|
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
|
150
|
-
@
|
124
|
+
def recibo
|
125
|
+
@recibo ||= XML.new(xml_do_recibo)
|
151
126
|
end
|
152
127
|
|
153
|
-
def
|
154
|
-
XML.
|
128
|
+
def xml_do_recibo
|
129
|
+
Nokogiri::XML(xml.css('eSocial/retornoProcessamentoDownload/recibo/*').to_s)
|
155
130
|
end
|
156
131
|
end
|
157
132
|
end
|
data/lib/teodoro/console.rb
CHANGED
@@ -1,9 +1,5 @@
|
|
1
1
|
module Console
|
2
|
-
|
3
|
-
|
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
|
data/lib/teodoro/empresa.rb
CHANGED
@@ -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
|
-
|
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
|
-
|
68
|
-
|
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
|
-
|
75
|
-
|
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
|
84
|
-
@
|
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
|
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
|