teodoro 0.0.13 → 0.3.1

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d13e1befb47f42baadda75f5ee3fbab43f2903ad4853c22d9f8a5dc2d3e5b484
4
- data.tar.gz: 7d200caa9e141f52a9a486b033247d4f49c3c158839dd808985e38f9480d2f86
3
+ metadata.gz: 2e6c7d2702336deb603b6bf1af61cfcb1cb3dc0c7e51c4d3fc7aa9af64dcebc6
4
+ data.tar.gz: 6168b994e77d309e4851373489f17b9e552f18a7d00f13cecd7a075be6c481d6
5
5
  SHA512:
6
- metadata.gz: 7cb73aef9770bc0de0c95d311257d470166d852509d03977dc8e7aedb77236aca8e1eb7b127ce7d6ddcefc932b4a2ecb7e7b8e80de77068ea2e6a497187956f4
7
- data.tar.gz: 6d3c6f76c54af41cdde69b54fc2a6d9245dec8e258fada8b22a8162d587b46cdf36c8bfac99bc47af2a13f63614b52f81fab74ba25efa10b27743d9ca6c9dc3d
6
+ metadata.gz: 753c9e372d0186e738cd617cbe541c21f969d11c90f6f9e5b01af5369e430d361d9f1aba9204809a2cebd35bd00c6b711a5652930fc995f1090da9d132f29202
7
+ data.tar.gz: 4033bae8e9b865508a384958a42c5c5f5331c9c694b9460b7ad211b88a2560c587fafb3a55dfa8c3cb93f427bae6473b8322f9402bcc4dc60ef1f6a958d27679
data/lib/teodoro.rb CHANGED
@@ -1,5 +1,6 @@
1
1
  require 'nokogiri'
2
2
  require 'os'
3
+ require 'rainbow'
3
4
  require 'zip'
4
5
 
5
6
  require_relative 'teodoro/console'
@@ -27,6 +28,7 @@ module Teodoro
27
28
  def call
28
29
  validar_argumentos
29
30
  validar_existencia_do_diretorio_de_origem
31
+ validar_existencia_do_diretorio_de_destino
30
32
  validar_que_diretorio_de_origem_nao_esta_vazio
31
33
  validar_que_diretorio_de_destino_esta_vazio
32
34
 
@@ -44,7 +46,15 @@ module Teodoro
44
46
  end
45
47
 
46
48
  def origem
47
- @origem ||= args[0]
49
+ @origem ||= args[0].tr('\\', '/')
50
+ end
51
+
52
+ def validar_existencia_do_diretorio_de_destino
53
+ erro 'Diretório de destino não existe.' unless File.directory?(destino)
54
+ end
55
+
56
+ def destino
57
+ @destino ||= args[1].tr('\\', '/')
48
58
  end
49
59
 
50
60
  def validar_que_diretorio_de_origem_nao_esta_vazio
@@ -55,10 +65,6 @@ module Teodoro
55
65
  erro 'Diretório de destino deve estar vazio.' unless Dir.empty?(destino)
56
66
  end
57
67
 
58
- def destino
59
- @destino ||= args[1]
60
- end
61
-
62
68
  def erro(erro)
63
69
  puts erro
64
70
  exit
@@ -2,36 +2,31 @@ module Teodoro
2
2
  module ArquivoDeEvento
3
3
  private
4
4
 
5
- def initialize(empresa:, versao_do_leiaute:, evento:, recibo:)
5
+ def initialize(empresa:, arquivo_xml:)
6
6
  @empresa = empresa
7
- @versao_do_leiaute = versao_do_leiaute
8
- @evento = evento
9
- @recibo = recibo
7
+ @arquivo_xml = arquivo_xml
10
8
  end
11
9
 
12
- attr_reader :empresa, :versao_do_leiaute, :evento, :recibo
10
+ attr_reader :empresa, :arquivo_xml
13
11
 
14
- def leiaute_simplificado?
15
- versao_do_leiaute.start_with?('_S_')
12
+ def versao_do_leiaute
13
+ arquivo_xml.versao_do_leiaute
16
14
  end
17
15
 
18
- def processo_de_emissao_do_evento
19
- evento["#{noh_principal_do_evento}/ideEvento/procEmi"]
16
+ def evento
17
+ arquivo_xml.evento
20
18
  end
21
19
 
22
- def criar_caminho_do_arquivo_data(nome_do_arquivo)
23
- File.join(
24
- destino_dos_arquivos_data,
25
- "#{windows? ? nome_do_arquivo.gsub(%r{[<|>:"/\\?*]}, '_') : nome_do_arquivo}.data"
26
- )
20
+ def recibo
21
+ arquivo_xml.recibo
27
22
  end
28
23
 
29
- def destino_dos_arquivos_data
30
- empresa.destino_dos_arquivos_data
24
+ def versao_do_aplicativo_de_processamento_do_evento
25
+ @versao_do_aplicativo_de_processamento_do_evento ||= recibo['retornoEvento/processamento/versaoAppProcessamento']
31
26
  end
32
27
 
33
- def windows?
34
- OS.windows?
28
+ def numero_do_recibo
29
+ @numero_do_recibo ||= recibo['retornoEvento/recibo/nrRecibo']
35
30
  end
36
31
  end
37
32
  end
@@ -1,6 +1,6 @@
1
1
  module Teodoro
2
- module ArquivoDeEventoExcetoDeExclusao
3
- include ArquivoDeEvento
2
+ module ArquivoDeEventoCriadorDeArquivoData
3
+ include ArquivoDeEventoProcessadorDeArquivoData
4
4
 
5
5
  private
6
6
 
@@ -14,10 +14,6 @@ module Teodoro
14
14
  (itens_do_conteudo_do_arquivo_data.map { "#{_1}=#{_2}" } + ['']).join("\n")
15
15
  end
16
16
 
17
- def versao_do_aplicativo_de_processamento_do_evento
18
- recibo['retornoEvento/processamento/versaoAppProcessamento']
19
- end
20
-
21
17
  def tipo_de_inscricao_do_empregador
22
18
  @tipo_de_inscricao_do_empregador ||= evento["#{noh_principal_do_evento}/ideEmpregador/tpInsc"]
23
19
  end
@@ -1,6 +1,6 @@
1
1
  module Teodoro
2
2
  module ArquivoDeEventoDeTabela
3
- include ArquivoDeEventoExcetoDeExclusao
3
+ include ArquivoDeEventoCriadorDeArquivoData
4
4
 
5
5
  def processar
6
6
  deletar_arquivo_data_original if alteracao? || exclusao?
@@ -1,45 +1,21 @@
1
1
  module Teodoro
2
2
  module ArquivoDeEventoNaoPeriodico
3
- include ArquivoDeEventoExcetoDeExclusao
3
+ include ArquivoDeEventoCriadorDeArquivoData
4
+ include ArquivoDeEventoRetificavel
4
5
 
5
6
  def processar
6
- deletar_arquivo_data_original if retificacao?
7
- registrar_recibo
7
+ deletar_arquivos_data_originais if retificacao?
8
+ registrar_arquivo_data
8
9
  criar_arquivo_data
9
10
  end
10
11
 
11
12
  private
12
13
 
13
- def retificacao?
14
- evento["#{noh_principal_do_evento}/ideEvento/indRetif"] == '2'
15
- end
16
-
17
- def deletar_arquivo_data_original
18
- File.delete(caminho_do_arquivo_data_original)
19
- end
20
-
21
- def caminho_do_arquivo_data_original
22
- criar_caminho_do_arquivo_data(nome_do_arquivo_original)
23
- end
24
-
25
- def nome_do_arquivo_original
26
- de_recibo_para_nome_do_arquivo_data[numero_do_recibo_a_retificar]
27
- end
28
-
29
- def de_recibo_para_nome_do_arquivo_data
30
- empresa.de_recibo_para_nome_do_arquivo_data
31
- end
32
-
33
- def numero_do_recibo_a_retificar
34
- evento["#{noh_principal_do_evento}/ideEvento/nrRecibo"]
35
- end
36
-
37
- def registrar_recibo
38
- de_recibo_para_nome_do_arquivo_data[numero_do_recibo] = nome_do_arquivo_data
39
- end
40
-
41
- def numero_do_recibo
42
- recibo['retornoEvento/recibo/nrRecibo']
14
+ def registrar_arquivo_data
15
+ arquivos_data.registrar(
16
+ nome: nome_do_arquivo_data,
17
+ recibo: numero_do_recibo
18
+ )
43
19
  end
44
20
 
45
21
  def caminho_do_arquivo_data
@@ -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
@@ -0,0 +1,23 @@
1
+ module Teodoro
2
+ module ArquivoDeEventoRetificavel
3
+ include ArquivoDeEvento
4
+
5
+ private
6
+
7
+ def retificacao?
8
+ @retificacao ||= evento["#{noh_principal_do_evento}/ideEvento/indRetif"] == '2'
9
+ end
10
+
11
+ def deletar_arquivos_data_originais
12
+ arquivos_data.excluir(numero_do_recibo_a_retificar)
13
+ end
14
+
15
+ def arquivos_data
16
+ empresa.arquivos_data
17
+ end
18
+
19
+ def numero_do_recibo_a_retificar
20
+ @numero_do_recibo_a_retificar ||= evento["#{noh_principal_do_evento}/ideEvento/nrRecibo"]
21
+ end
22
+ end
23
+ end
@@ -1,5 +1,7 @@
1
1
  require_relative 'arquivo_de_evento'
2
- require_relative 'arquivo_de_evento_exceto_de_exclusao'
2
+ require_relative 'arquivo_de_evento_processador_de_arquivo_data'
3
+ require_relative 'arquivo_de_evento_criador_de_arquivo_data'
4
+ require_relative 'arquivo_de_evento_retificavel'
3
5
  require_relative 'arquivo_de_evento_de_tabela'
4
6
  require_relative 'arquivo_de_evento_nao_periodico'
5
7
  require_relative 'cnpj'
@@ -106,7 +108,10 @@ module Teodoro
106
108
  end
107
109
 
108
110
  def arquivo
109
- classe_do_arquivo.new(empresa: empresa, versao_do_leiaute: versao_do_leiaute, evento: evento, recibo: recibo)
111
+ classe_do_arquivo.new(
112
+ empresa: empresa,
113
+ arquivo_xml: Obj.new(versao_do_leiaute: versao_do_leiaute, evento: evento, recibo: recibo)
114
+ )
110
115
  end
111
116
 
112
117
  def classe_do_arquivo
@@ -28,7 +28,7 @@ module Teodoro
28
28
  private
29
29
 
30
30
  def dar_feedback_para_o_usuario
31
- puts "\e[32m#{nome_do_diretorio}\e[0m" # green
31
+ puts Rainbow(nome_do_diretorio).green
32
32
  end
33
33
 
34
34
  def nome_do_diretorio
@@ -83,9 +83,9 @@ module Teodoro
83
83
  def empresa
84
84
  @empresa ||= Obj.new(
85
85
  destino_dos_arquivos_data: destino_dos_arquivos_data,
86
- de_recibo_para_nome_do_arquivo_data: {},
87
- admissoes_por_matricula: {},
88
- contratos_de_trabalhado_sem_vinculo: ContratosDeTrabalhadorSemVinculo.new
86
+ arquivos_data: ArquivosData.new(destino_dos_arquivos_data),
87
+ contratos_de_emprego: ContratosDeEmprego.new,
88
+ contratos_de_trabalho_sem_vinculo: ContratosDeTrabalhoSemVinculo.new
89
89
  )
90
90
  end
91
91
 
@@ -93,19 +93,113 @@ module Teodoro
93
93
  Console.print
94
94
  end
95
95
 
96
- class ContratosDeTrabalhadorSemVinculo
97
- def <<(contrato)
98
- contratos << contrato
96
+ class ArquivosData
97
+ private
98
+
99
+ def initialize(destino_dos_arquivos_data)
100
+ @destino_dos_arquivos_data = destino_dos_arquivos_data
101
+ end
102
+
103
+ attr_reader :destino_dos_arquivos_data
104
+
105
+ public
106
+
107
+ def registrar(recibo:, nome:)
108
+ (nomes_por_recibo[recibo] ||= []) << nome
109
+ end
110
+
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) }
115
+ end
116
+
117
+ private
118
+
119
+ def nomes_por_recibo
120
+ @nomes_por_recibo ||= {}
121
+ end
122
+ end
123
+
124
+ class ContratosDeEmprego
125
+ def registrar_admissao(admissao)
126
+ Contrato.new(**admissao).then do
127
+ contratos_por_matricula[_1.matricula] = _1
128
+ end
129
+ end
130
+
131
+ def [](matricula)
132
+ contratos_por_matricula[matricula]
133
+ end
134
+
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)
139
+ end
140
+
141
+ def remover(recibo)
142
+ contratos_por_matricula.delete_if { _2.recibo == recibo }
143
+ end
144
+
145
+ private
146
+
147
+ def contratos_por_matricula
148
+ @contratos_por_matricula ||= {}
149
+ end
150
+
151
+ def contratos
152
+ contratos_por_matricula.values
153
+ end
154
+
155
+ class Contrato
156
+ private
157
+
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
164
+ end
165
+
166
+ attr_reader :data_de_desligamento
167
+
168
+ public
169
+
170
+ attr_reader :matricula, :data_de_admissao, :categoria_do_trabalhador, :cpf_do_trabalhador, :recibo
171
+
172
+ attr_writer :data_de_desligamento
173
+
174
+ def ativo?(data)
175
+ data_de_admissao <= data && (!data_de_desligamento || data_de_desligamento >= data)
176
+ end
177
+ end
178
+ end
179
+
180
+ class ContratosDeTrabalhoSemVinculo
181
+ def registrar_inicio_de_contrato(inicio_de_contrato)
182
+ contratos << Contrato.new(**inicio_de_contrato)
99
183
  end
100
184
 
101
185
  def [](cpf_do_trabalhador:, categoria_do_trabalhador:, data:)
102
186
  contratos
103
187
  .select {
104
- [_1.cpf_do_trabalhador, _1.categoria_do_trabalhador] == [cpf_do_trabalhador, categoria_do_trabalhador]
188
+ _1.cpf_do_trabalhador == cpf_do_trabalhador &&
189
+ _1.categoria_do_trabalhador == categoria_do_trabalhador &&
190
+ _1.ativo?(data)
105
191
  }
192
+ .max_by(&:data_de_inicio)
193
+ end
194
+
195
+ def *(cpf_do_trabalhador:, data:)
196
+ contratos
197
+ .select { _1.cpf_do_trabalhador == cpf_do_trabalhador && _1.ativo?(data) }
106
198
  .sort_by(&:data_de_inicio)
107
- .reverse
108
- .find { _1.data_de_inicio <= data }
199
+ end
200
+
201
+ def remover(recibo)
202
+ contratos.delete_if { _1.recibo == recibo }
109
203
  end
110
204
 
111
205
  private
@@ -113,6 +207,29 @@ module Teodoro
113
207
  def contratos
114
208
  @contratos ||= []
115
209
  end
210
+
211
+ class Contrato
212
+ private
213
+
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
219
+ end
220
+
221
+ attr_reader :data_do_termino
222
+
223
+ public
224
+
225
+ attr_reader :cpf_do_trabalhador, :categoria_do_trabalhador, :data_de_inicio, :recibo
226
+
227
+ attr_writer :data_do_termino
228
+
229
+ def ativo?(data)
230
+ data_de_inicio <= data && (!data_do_termino || data_do_termino >= data)
231
+ end
232
+ end
116
233
  end
117
234
  end
118
235
  end
@@ -1,7 +1,6 @@
1
1
  module Teodoro
2
2
  module Leiaute
3
- # rubocop:disable Metrics/ClassLength
4
- class ArquivoS1000
3
+ class ArquivoS1000 # rubocop:disable Metrics/ClassLength
5
4
  include ArquivoDeEventoDeTabela
6
5
 
7
6
  private
@@ -64,9 +63,9 @@ module Teodoro
64
63
  'idePeriodo'
65
64
  end
66
65
 
67
- # rubocop:disable Layout/LineLength, Metrics/MethodLength, Metrics/AbcSize
68
- def itens_do_conteudo_do_arquivo_data
66
+ def itens_do_conteudo_do_arquivo_data # rubocop:disable Metrics/MethodLength, Metrics/AbcSize
69
67
  [
68
+ # rubocop:disable Layout/LineLength
70
69
  ['TipoInscricaoEmpregador', tipo_de_inscricao],
71
70
  ['FapBdContrib'],
72
71
  ['AlteracaoEmPeriodoExistente'],
@@ -150,14 +149,13 @@ module Teodoro
150
149
  ["ListaSoftHouses_#{seq}_Email", software_house['email']]
151
150
  ]
152
151
  end.sum([])
152
+ # rubocop:enable Layout/LineLength
153
153
  ]
154
154
  end
155
- # rubocop:enable Layout/LineLength, Metrics/MethodLength, Metrics/AbcSize
156
155
 
157
156
  def softwares_house
158
157
  evento.*('evtInfoEmpregador/infoEmpregador/*/infoCadastro/softwareHouse')
159
158
  end
160
159
  end
161
- # rubocop:enable Metrics/ClassLength
162
160
  end
163
161
  end