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.
- checksums.yaml +4 -4
- data/lib/teodoro.rb +1 -0
- data/lib/teodoro/arquivo_de_evento.rb +2 -6
- data/lib/teodoro/arquivo_de_evento_criador_de_arquivo_data.rb +33 -2
- data/lib/teodoro/arquivo_de_evento_de_tabela.rb +6 -6
- data/lib/teodoro/arquivo_de_evento_nao_periodico.rb +10 -3
- data/lib/teodoro/arquivo_de_evento_processador_de_arquivo_data.rb +3 -3
- data/lib/teodoro/arquivo_de_evento_retificavel.rb +8 -8
- data/lib/teodoro/arquivo_de_origem.rb +7 -7
- data/lib/teodoro/arquivo_xml.rb +46 -20
- data/lib/teodoro/console.rb +3 -1
- data/lib/teodoro/empresa.rb +190 -154
- data/lib/teodoro/leiaute/arquivo_s1000.rb +35 -59
- data/lib/teodoro/leiaute/arquivo_s1005.rb +18 -38
- data/lib/teodoro/leiaute/arquivo_s1010.rb +11 -15
- data/lib/teodoro/leiaute/arquivo_s1020.rb +13 -32
- data/lib/teodoro/leiaute/arquivo_s1030.rb +10 -23
- data/lib/teodoro/leiaute/arquivo_s1040.rb +5 -9
- data/lib/teodoro/leiaute/arquivo_s1050.rb +11 -20
- data/lib/teodoro/leiaute/arquivo_s1070.rb +12 -16
- data/lib/teodoro/leiaute/arquivo_s2190.rb +6 -8
- data/lib/teodoro/leiaute/arquivo_s2200.rb +111 -318
- data/lib/teodoro/leiaute/arquivo_s2205.rb +64 -95
- data/lib/teodoro/leiaute/arquivo_s2206.rb +29 -121
- data/lib/teodoro/leiaute/arquivo_s2230.rb +98 -96
- data/lib/teodoro/leiaute/arquivo_s2250.rb +13 -26
- data/lib/teodoro/leiaute/arquivo_s2299.rb +8 -121
- data/lib/teodoro/leiaute/arquivo_s2300.rb +99 -232
- data/lib/teodoro/leiaute/arquivo_s2306.rb +40 -44
- data/lib/teodoro/leiaute/arquivo_s2399.rb +4 -154
- data/lib/teodoro/leiaute/arquivo_s3000.rb +2 -2
- data/lib/teodoro/xml.rb +8 -2
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 345feac649f9964beffbb9200c2d19281413f03e4950aa440d6208a189f6c337
|
4
|
+
data.tar.gz: b30953d58a711b552b936ffccb125792a548e3fd00075b0e52f7b37473224a04
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e02f37a099b65f6fe97f7d888c25638bcfc6e5cd48ea4512d353b3952188f76c547b17b4e72a27b7979d4c0765ab602e65c80b81e2d8ff7903376ec4d6ab61e8
|
7
|
+
data.tar.gz: 86d96c5129045d68f65ebfa4a6cdc4ff942185f3510b2a7c32af7b6fdc74661c26bd8a0154f8c7d14c309f7e6c21daeffc42f7b1e28fbec0ad9c645743d2890b
|
data/lib/teodoro.rb
CHANGED
@@ -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['
|
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['
|
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[
|
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[
|
15
|
+
@alteracao ||= evento[noh_de_informacoes_do_evento, 'alteracao']
|
16
16
|
end
|
17
17
|
|
18
18
|
def exclusao?
|
19
|
-
@exclusao ||= evento[
|
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[
|
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[
|
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[
|
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[
|
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
|
-
|
8
|
-
|
9
|
-
|
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
|
8
|
-
|
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[
|
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
|
8
|
-
|
7
|
+
def retificado?
|
8
|
+
arquivo_xml_de_retificacao
|
9
9
|
end
|
10
10
|
|
11
|
-
def
|
12
|
-
|
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
|
16
|
-
empresa.
|
15
|
+
def arquivos_xml_por_recibo_a_retificar
|
16
|
+
empresa.arquivos_xml_por_recibo_a_retificar
|
17
17
|
end
|
18
18
|
|
19
|
-
def
|
20
|
-
|
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
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
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
|
data/lib/teodoro/arquivo_xml.rb
CHANGED
@@ -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
|
-
|
47
|
-
|
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
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
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
|
-
|
64
|
-
|
65
|
-
|
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
|
71
|
-
|
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
|
83
|
-
|
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(
|
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
|
156
|
+
Nokogiri::XML(xml.css('eSocial/retornoProcessamentoDownload/recibo/*/*').to_s)
|
131
157
|
end
|
132
158
|
end
|
133
159
|
end
|
data/lib/teodoro/console.rb
CHANGED
data/lib/teodoro/empresa.rb
CHANGED
@@ -5,229 +5,265 @@ module Teodoro
|
|
5
5
|
class Empresa
|
6
6
|
private
|
7
7
|
|
8
|
-
def initialize(
|
9
|
-
@
|
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 :
|
12
|
+
attr_reader :impl
|
14
13
|
|
15
14
|
public
|
16
15
|
|
17
16
|
def processar
|
18
|
-
|
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
|
-
|
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
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
23
|
+
def initialize(caminho:, destino:)
|
24
|
+
@caminho = caminho
|
25
|
+
@destino = File.join(destino, nome_do_diretorio)
|
26
|
+
end
|
58
27
|
|
59
|
-
|
60
|
-
Dir.mkdir(destino_dos_arquivos_data)
|
61
|
-
end
|
28
|
+
attr_reader :caminho, :destino
|
62
29
|
|
63
|
-
|
64
|
-
@destino_dos_arquivos_data ||= File.join(destino, 'data')
|
65
|
-
end
|
30
|
+
public
|
66
31
|
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
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
|
-
|
73
|
-
|
74
|
-
|
75
|
-
end
|
46
|
+
def destino_dos_arquivos_data
|
47
|
+
@destino_dos_arquivos_data ||= File.join(destino, 'data')
|
48
|
+
end
|
76
49
|
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
.select(&:processavel?)
|
81
|
-
end
|
50
|
+
def arquivos_data
|
51
|
+
@arquivos_data ||= ArquivosData.new(destino_dos_arquivos_data)
|
52
|
+
end
|
82
53
|
|
83
|
-
|
84
|
-
|
85
|
-
|
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
|
-
|
93
|
-
|
94
|
-
|
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
|
100
|
-
|
64
|
+
def dar_feedback_para_o_usuario
|
65
|
+
puts Rainbow(nome_do_diretorio).green
|
101
66
|
end
|
102
67
|
|
103
|
-
|
104
|
-
|
105
|
-
|
68
|
+
def nome_do_diretorio
|
69
|
+
@nome_do_diretorio ||= File.basename(caminho)
|
70
|
+
end
|
106
71
|
|
107
|
-
def
|
108
|
-
(
|
72
|
+
def criar_diretorio_destino
|
73
|
+
Dir.mkdir(destino)
|
109
74
|
end
|
110
75
|
|
111
|
-
def
|
112
|
-
|
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
|
-
|
80
|
+
def destino_dos_arquivos_xml
|
81
|
+
@destino_dos_arquivos_xml ||= File.join(destino, 'xmls')
|
82
|
+
end
|
118
83
|
|
119
|
-
def
|
120
|
-
|
84
|
+
def descompactar_arquivos_de_origem
|
85
|
+
arquivos_de_origem.each(&:descompactar)
|
121
86
|
end
|
122
|
-
end
|
123
87
|
|
124
|
-
|
125
|
-
|
126
|
-
|
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
|
132
|
-
|
93
|
+
def criar_diretorio_dos_arquivos_data
|
94
|
+
Dir.mkdir(destino_dos_arquivos_data)
|
133
95
|
end
|
134
96
|
|
135
|
-
def
|
136
|
-
|
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
|
142
|
-
|
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
|
-
|
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
|
148
|
-
|
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
|
152
|
-
|
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
|
130
|
+
class ArquivosData
|
156
131
|
private
|
157
132
|
|
158
|
-
def initialize(
|
159
|
-
@
|
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 :
|
137
|
+
attr_reader :destino_dos_arquivos_data
|
167
138
|
|
168
139
|
public
|
169
140
|
|
170
|
-
|
141
|
+
def registrar(recibo:, nome:)
|
142
|
+
(nomes_por_recibo[recibo] ||= []) << nome
|
143
|
+
end
|
171
144
|
|
172
|
-
|
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
|
175
|
-
|
153
|
+
def nomes_por_recibo
|
154
|
+
@nomes_por_recibo ||= {}
|
176
155
|
end
|
177
156
|
end
|
178
|
-
end
|
179
157
|
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
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
|
-
|
186
|
-
|
187
|
-
|
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
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
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
|
-
|
202
|
-
|
203
|
-
|
173
|
+
def remover(recibo)
|
174
|
+
contratos_por_matricula.delete_if { _2.recibo == recibo }
|
175
|
+
end
|
204
176
|
|
205
|
-
|
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
|
-
|
208
|
-
|
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
|
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
|
215
|
-
@
|
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
|
-
|
244
|
+
class Contrato
|
245
|
+
private
|
222
246
|
|
223
|
-
|
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
|
-
|
260
|
+
attr_accessor :afastamento
|
226
261
|
|
227
|
-
|
262
|
+
attr_writer :data_do_termino
|
228
263
|
|
229
|
-
|
230
|
-
|
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
|