teodoro 0.7.0 → 0.11.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 (34) hide show
  1. checksums.yaml +4 -4
  2. data/lib/teodoro.rb +8 -2
  3. data/lib/teodoro/arquivo_data.rb +81 -0
  4. data/lib/teodoro/arquivo_de_evento.rb +14 -2
  5. data/lib/teodoro/arquivo_de_evento_de_tabela.rb +32 -14
  6. data/lib/teodoro/arquivo_de_evento_nao_periodico.rb +36 -13
  7. data/lib/teodoro/arquivo_de_origem.rb +7 -7
  8. data/lib/teodoro/arquivo_xml.rb +29 -22
  9. data/lib/teodoro/console.rb +3 -1
  10. data/lib/teodoro/empresa.rb +15 -17
  11. data/lib/teodoro/leiaute/arquivo_s1000.rb +24 -30
  12. data/lib/teodoro/leiaute/arquivo_s1005.rb +14 -20
  13. data/lib/teodoro/leiaute/arquivo_s1010.rb +11 -15
  14. data/lib/teodoro/leiaute/arquivo_s1020.rb +8 -12
  15. data/lib/teodoro/leiaute/arquivo_s1030.rb +6 -10
  16. data/lib/teodoro/leiaute/arquivo_s1040.rb +5 -9
  17. data/lib/teodoro/leiaute/arquivo_s1050.rb +8 -14
  18. data/lib/teodoro/leiaute/arquivo_s1070.rb +12 -16
  19. data/lib/teodoro/leiaute/arquivo_s2190.rb +15 -14
  20. data/lib/teodoro/leiaute/arquivo_s2200.rb +152 -156
  21. data/lib/teodoro/leiaute/arquivo_s2205.rb +132 -166
  22. data/lib/teodoro/leiaute/arquivo_s2206.rb +72 -75
  23. data/lib/teodoro/leiaute/arquivo_s2230.rb +87 -90
  24. data/lib/teodoro/leiaute/arquivo_s2250.rb +36 -40
  25. data/lib/teodoro/leiaute/arquivo_s2299.rb +171 -169
  26. data/lib/teodoro/leiaute/arquivo_s2300.rb +127 -131
  27. data/lib/teodoro/leiaute/arquivo_s2306.rb +148 -147
  28. data/lib/teodoro/leiaute/arquivo_s2399.rb +123 -127
  29. data/lib/teodoro/leiaute/arquivo_s3000.rb +4 -8
  30. data/lib/teodoro/xml.rb +2 -2
  31. metadata +3 -5
  32. data/lib/teodoro/arquivo_de_evento_criador_de_arquivo_data.rb +0 -52
  33. data/lib/teodoro/arquivo_de_evento_processador_de_arquivo_data.rb +0 -30
  34. data/lib/teodoro/arquivo_de_evento_retificavel.rb +0 -23
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 948116a90b820e721da13b71f2abee576b7154819653eecf1ef63452b9375c9b
4
- data.tar.gz: c23144f5cae471db91509309da02f1b611218082ba3af45bfc31b7d6b2ae74d6
3
+ metadata.gz: b1fd9fa53d0f193758abd01b8afa4af04e8c95f1f8e00b48ebbe923142c44294
4
+ data.tar.gz: 145f509fe6f6de7c4a8bd3be65f169cbea6ad4f6d20d5293e011d236b4493b83
5
5
  SHA512:
6
- metadata.gz: bf4ed05a27bc7ecde19dbd6a98115d464d736d3a2da197a37240e42946bd3df40ed4e55d0a96cdbde81321558f3659656aeea1b99114ef66daf360abd0430460
7
- data.tar.gz: f6a047db79b4da62c8b6783765e4e398fe15ae07ed99dfd55a9eefcd48b0f783bdd782d333af98fc94f1784448f2fa0f3c13fb4955f95ef8fbe3ba409cbbeb85
6
+ metadata.gz: bba2d47683c8ad4b7cd1aa63d21e236e885cb9f9701c35717b8ad98d0e03fedb3a348857f691ae343ccfd00870b5513b27121aecf5e465ab272c0ee630d18dd0
7
+ data.tar.gz: 386eec6ca613785e8a1193300ea81f24053cfe378f7638d02c038a7bb430dc631462aa4a9205e5666ed1e2f36660c6ae977e816962e34a2884aa630b4dd28ad9
data/lib/teodoro.rb CHANGED
@@ -13,6 +13,11 @@ module Teodoro
13
13
  Execution.new(args).call
14
14
  end
15
15
 
16
+ @production = true
17
+ def self.production?
18
+ @production
19
+ end
20
+
16
21
  class Execution
17
22
  NOME_DO_PROGRAMA = 'teodoro'.freeze
18
23
 
@@ -72,11 +77,12 @@ module Teodoro
72
77
  end
73
78
 
74
79
  def processar_empresas
75
- empresas.each(&:processar)
80
+ # otimizacao do gerenciamento de memoria
81
+ empresas.shift.processar while empresas.any?
76
82
  end
77
83
 
78
84
  def empresas
79
- Dir[File.join(origem, '*')].map { |caminho| Empresa.new(caminho: caminho, destino: destino) }
85
+ @empresas ||= Dir[File.join(origem, '*')].map { |caminho| Empresa.new(caminho: caminho, destino: destino) }
80
86
  end
81
87
  end
82
88
  end
@@ -0,0 +1,81 @@
1
+ module Teodoro
2
+ class ArquivoData
3
+ private
4
+
5
+ def initialize(destino_dos_arquivos_data:, nome:, itens_do_conteudo:)
6
+ @destino_dos_arquivos_data = destino_dos_arquivos_data
7
+ @nome = nome
8
+ @itens_do_conteudo = itens_do_conteudo
9
+ end
10
+
11
+ attr_reader :destino_dos_arquivos_data, :itens_do_conteudo
12
+
13
+ public
14
+
15
+ attr_reader :nome
16
+
17
+ def criar
18
+ raise caminho if File.exist?(caminho)
19
+
20
+ File.write(caminho, (itens_do_conteudo.map { "#{_1}=#{Valor.new(_2, formato: _3)}" } + ['']).join("\r\n"))
21
+ end
22
+
23
+ private
24
+
25
+ def caminho
26
+ @caminho ||= Caminho.new(destino_dos_arquivos_data: destino_dos_arquivos_data, nome_do_arquivo: nome)
27
+ end
28
+
29
+ class Caminho
30
+ private
31
+
32
+ def initialize(destino_dos_arquivos_data:, nome_do_arquivo:)
33
+ @destino_dos_arquivos_data = destino_dos_arquivos_data
34
+ @nome_do_arquivo = nome_do_arquivo
35
+ end
36
+
37
+ attr_reader :destino_dos_arquivos_data, :nome_do_arquivo
38
+
39
+ public
40
+
41
+ def to_str
42
+ @to_str ||=
43
+ File.join(
44
+ destino_dos_arquivos_data,
45
+ "#{windows? ? nome_do_arquivo.gsub(%r{[<|>:"/\\?*]}, '_') : nome_do_arquivo}.data"
46
+ )
47
+ end
48
+
49
+ private
50
+
51
+ def windows?
52
+ OS.windows?
53
+ end
54
+ end
55
+
56
+ class Valor
57
+ FORMATADORES = {
58
+ bool: proc { _1 ? 'True' : 'False' },
59
+ data: proc { "#{_1[-2..]}/#{_1[5..6]}/#{_1[0..3]}" if _1 },
60
+ data_aaaammdd: proc { _1.delete('-') if _1 },
61
+ decimal: proc { _1.tr('.', ',') if _1 },
62
+ mes_ano: proc { "#{_1[-2..]}/#{_1[0..3]}" if _1 }
63
+ }.freeze
64
+
65
+ private
66
+
67
+ def initialize(valor, formato:)
68
+ @valor = valor
69
+ @formato = formato
70
+ end
71
+
72
+ attr_reader :valor, :formato
73
+
74
+ public
75
+
76
+ def to_s
77
+ @to_s ||= (formato ? FORMATADORES[formato].call(valor) : valor).to_s
78
+ end
79
+ end
80
+ end
81
+ end
@@ -17,12 +17,24 @@ module Teodoro
17
17
  arquivo_xml.recibo
18
18
  end
19
19
 
20
+ def id_do_evento
21
+ @id_do_evento ||= evento.css('/*').first.attributes['Id'].value
22
+ end
23
+
24
+ def processo_de_emissao_do_evento
25
+ @processo_de_emissao_do_evento ||= evento['ideEvento/procEmi']
26
+ end
27
+
28
+ def tipo_de_inscricao_do_empregador
29
+ @tipo_de_inscricao_do_empregador ||= evento['ideEmpregador/tpInsc']
30
+ end
31
+
20
32
  def versao_do_aplicativo_de_processamento_do_evento
21
- @versao_do_aplicativo_de_processamento_do_evento ||= recibo['retornoEvento/processamento/versaoAppProcessamento']
33
+ @versao_do_aplicativo_de_processamento_do_evento ||= recibo['processamento/versaoAppProcessamento']
22
34
  end
23
35
 
24
36
  def numero_do_recibo
25
- @numero_do_recibo ||= recibo['retornoEvento/recibo/nrRecibo']
37
+ @numero_do_recibo ||= recibo['recibo/nrRecibo']
26
38
  end
27
39
  end
28
40
  end
@@ -1,6 +1,6 @@
1
1
  module Teodoro
2
2
  module ArquivoDeEventoDeTabela
3
- include ArquivoDeEventoCriadorDeArquivoData
3
+ include ArquivoDeEvento
4
4
 
5
5
  def processar
6
6
  deletar_arquivo_data_original if alteracao? || exclusao?
@@ -12,23 +12,26 @@ 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
23
- File.delete(obter_caminho_do_arquivo_data(inicio_da_validade_original))
23
+ File.delete(caminho_do_arquivo_data_original)
24
24
  end
25
25
 
26
- def inicio_da_validade_original
27
- evento[noh_principal_do_evento, noh_de_informacoes_do_evento, '*', noh_de_identificacao_do_periodo, 'iniValid']
26
+ def caminho_do_arquivo_data_original
27
+ ArquivoData::Caminho.new(
28
+ destino_dos_arquivos_data: empresa.destino_dos_arquivos_data,
29
+ nome_do_arquivo: nome_do_arquivo_data_original
30
+ )
28
31
  end
29
32
 
30
- def obter_caminho_do_arquivo_data(inicio_da_validade)
31
- criar_caminho_do_arquivo_data("#{nome_base_do_arquivo_data}[#{inicio_da_validade.delete('-')}]")
33
+ def nome_do_arquivo_data_original
34
+ "#{nome_base_do_arquivo_data}[#{inicio_da_validade_original.delete('-')}]"
32
35
  end
33
36
 
34
37
  def nome_base_do_arquivo_data
@@ -36,9 +39,24 @@ module Teodoro
36
39
  identificacao_do_arquivo_data[0] + identificacao_do_arquivo_data[1..].map { "[#{_1}]" }.join
37
40
  end
38
41
 
39
- def caminho_do_arquivo_data
40
- # FIXME: Tales inicio de validade ou inicio da nova validade?
41
- obter_caminho_do_arquivo_data(inicio_da_validade)
42
+ def inicio_da_validade_original
43
+ evento[noh_de_informacoes_do_evento, '*', noh_de_identificacao_do_periodo, 'iniValid']
44
+ end
45
+
46
+ def criar_arquivo_data
47
+ arquivo_data.criar
48
+ end
49
+
50
+ def arquivo_data
51
+ ArquivoData.new(
52
+ destino_dos_arquivos_data: empresa.destino_dos_arquivos_data,
53
+ nome: nome_do_arquivo_data,
54
+ itens_do_conteudo: itens_do_conteudo_do_arquivo_data
55
+ )
56
+ end
57
+
58
+ def nome_do_arquivo_data
59
+ "#{nome_base_do_arquivo_data}[#{inicio_da_validade.delete('-')}]"
42
60
  end
43
61
 
44
62
  def inicio_da_validade
@@ -48,14 +66,14 @@ module Teodoro
48
66
  def validade
49
67
  @validade ||=
50
68
  if inclusao? || (alteracao? && !nova_validade?)
51
- evento[noh_principal_do_evento, noh_de_informacoes_do_evento, '*', noh_de_identificacao_do_periodo]
69
+ evento[noh_de_informacoes_do_evento, '*', noh_de_identificacao_do_periodo]
52
70
  elsif alteracao?
53
71
  nova_validade
54
72
  end
55
73
  end
56
74
 
57
75
  def inclusao?
58
- @inclusao ||= evento[noh_principal_do_evento, noh_de_informacoes_do_evento, 'inclusao']
76
+ @inclusao ||= evento[noh_de_informacoes_do_evento, 'inclusao']
59
77
  end
60
78
 
61
79
  def nova_validade?
@@ -63,7 +81,7 @@ module Teodoro
63
81
  end
64
82
 
65
83
  def nova_validade
66
- @nova_validade ||= evento[noh_principal_do_evento, noh_de_informacoes_do_evento, 'alteracao', 'novaValidade']
84
+ @nova_validade ||= evento[noh_de_informacoes_do_evento, 'alteracao', 'novaValidade']
67
85
  end
68
86
 
69
87
  def fim_da_validade
@@ -1,32 +1,55 @@
1
1
  module Teodoro
2
2
  module ArquivoDeEventoNaoPeriodico
3
- include ArquivoDeEventoCriadorDeArquivoData
4
- include ArquivoDeEventoRetificavel
3
+ include ArquivoDeEvento
5
4
 
6
5
  def processar
7
6
  if retificado?
8
7
  processar_retificacao
9
8
  else
10
- registrar_arquivo_data
11
- criar_arquivo_data
9
+ registrar_arquivos_data
10
+ criar_arquivos_data
12
11
  end
13
12
  end
14
13
 
15
14
  private
16
15
 
17
- def registrar_arquivo_data
18
- arquivos_data.registrar(
19
- nome: nome_do_arquivo_data,
20
- recibo: numero_do_recibo
21
- )
16
+ def retificado?
17
+ arquivo_xml_de_retificacao
22
18
  end
23
19
 
24
- def arquivos_data
25
- empresa.arquivos_data
20
+ def arquivo_xml_de_retificacao
21
+ @arquivo_xml_de_retificacao ||= arquivos_xml_por_recibo_a_retificar.delete(numero_do_recibo)
22
+ end
23
+
24
+ def arquivos_xml_por_recibo_a_retificar
25
+ empresa.arquivos_xml_por_recibo_a_retificar
26
26
  end
27
27
 
28
- def caminho_do_arquivo_data
29
- criar_caminho_do_arquivo_data(nome_do_arquivo_data)
28
+ def processar_retificacao
29
+ arquivo_xml_de_retificacao.processar
30
+ end
31
+
32
+ def registrar_arquivos_data
33
+ arquivos_data.each do
34
+ empresa.arquivos_data.registrar(
35
+ nome: _1.nome,
36
+ recibo: numero_do_recibo
37
+ )
38
+ end
39
+ end
40
+
41
+ def criar_arquivos_data
42
+ arquivos_data.shift.criar while arquivos_data.any?
43
+ end
44
+
45
+ def arquivos_data
46
+ @arquivos_data ||= dados_dos_arquivos_data.map {
47
+ ArquivoData.new(
48
+ destino_dos_arquivos_data: empresa.destino_dos_arquivos_data,
49
+ nome: _1.nome,
50
+ itens_do_conteudo: _1.itens_do_conteudo
51
+ )
52
+ }
30
53
  end
31
54
  end
32
55
  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
@@ -1,7 +1,5 @@
1
+ require_relative 'arquivo_data'
1
2
  require_relative 'arquivo_de_evento'
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'
5
3
  require_relative 'arquivo_de_evento_de_tabela'
6
4
  require_relative 'arquivo_de_evento_nao_periodico'
7
5
  require_relative 'cnpj'
@@ -59,17 +57,13 @@ module Teodoro
59
57
 
60
58
  # otimizacao do gerenciamento de memoria
61
59
  def carregar
62
- Console.print "carregando #{nome}.xml..."
60
+ Console.print "carregando #{nome}.xml..." do
61
+ evento, recibo = carregar_evento_e_recibo
63
62
 
64
- evento, recibo =
65
- carregar_xml
66
- .then do |xml|
67
- %w[evento recibo].map { XML.new(Nokogiri::XML(xml.css("eSocial/retornoProcessamentoDownload/#{_1}/*").to_s)) }
68
- end
69
-
70
- @retificacao = TIPOS_DE_EVENTO_RETIFICAVEIS.include?(tipo_de_evento) && evento['*/ideEvento/indRetif'] == '2'
71
- @numero_do_recibo_a_retificar = evento['*/ideEvento/nrRecibo'] if retificacao?
72
- @momento_de_processamento_pelo_e_social = recibo['retornoEvento/processamento/dhProcessamento']
63
+ @retificacao = TIPOS_DE_EVENTO_RETIFICAVEIS.include?(tipo_de_evento) && evento['ideEvento/indRetif'] == '2'
64
+ @numero_do_recibo_a_retificar = evento['ideEvento/nrRecibo'] if retificacao?
65
+ @momento_de_processamento_pelo_e_social = recibo['processamento/dhProcessamento']
66
+ end
73
67
  end
74
68
 
75
69
  def retificacao?
@@ -85,14 +79,22 @@ module Teodoro
85
79
  end
86
80
 
87
81
  def processar
88
- Console.print "processando #{nome}.xml..."
89
-
90
- validar_versao_do_leiaute
91
- processar_arquivo
82
+ Console.print "processando #{nome}.xml..." do
83
+ validar_versao_do_leiaute
84
+ processar_arquivo
85
+ end
92
86
  end
93
87
 
94
88
  private
95
89
 
90
+ def carregar_evento_e_recibo
91
+ carregar_xml
92
+ .then do |xml|
93
+ %w[evento recibo]
94
+ .map { XML.new(Nokogiri::XML(xml.css("eSocial/retornoProcessamentoDownload/#{_1}/*/*").to_s)) }
95
+ end
96
+ end
97
+
96
98
  def carregar_xml
97
99
  Nokogiri::XML(carregar_conteudo)
98
100
  end
@@ -106,7 +108,12 @@ module Teodoro
106
108
  end
107
109
 
108
110
  def validar_versao_do_leiaute
109
- raise unless %w[02_04_01 02_04_02 02_05_00 _S_01_00_00].include?(versao_do_leiaute)
111
+ raise unless [
112
+ '02_04_01',
113
+ '02_04_02',
114
+ '02_05_00',
115
+ *('_S_01_00_00' unless Teodoro.production?)
116
+ ].include?(versao_do_leiaute)
110
117
  end
111
118
 
112
119
  def versao_do_leiaute
@@ -114,11 +121,11 @@ module Teodoro
114
121
  end
115
122
 
116
123
  def namespace_do_evento
117
- xml_do_evento.css('eSocial')[0].namespace.href
124
+ xml_do_evento.css('/eSocial')[0].namespace.href
118
125
  end
119
126
 
120
127
  def xml_do_evento
121
- @xml_do_evento ||= Nokogiri::XML(xml.css('eSocial/retornoProcessamentoDownload/evento/*').to_s)
128
+ @xml_do_evento ||= Nokogiri::XML(xml.css('/eSocial/retornoProcessamentoDownload/evento/*').to_s)
122
129
  end
123
130
 
124
131
  def xml
@@ -141,7 +148,7 @@ module Teodoro
141
148
  end
142
149
 
143
150
  def evento
144
- XML.new(xml_do_evento)
151
+ XML.new(Nokogiri::XML(xml_do_evento.css('/*/*').to_s))
145
152
  end
146
153
 
147
154
  def recibo
@@ -149,7 +156,7 @@ module Teodoro
149
156
  end
150
157
 
151
158
  def xml_do_recibo
152
- Nokogiri::XML(xml.css('eSocial/retornoProcessamentoDownload/recibo/*').to_s)
159
+ Nokogiri::XML(xml.css('/eSocial/retornoProcessamentoDownload/recibo/*/*').to_s)
153
160
  end
154
161
  end
155
162
  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