teodoro 0.6.1 → 0.10.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.
Files changed (34) hide show
  1. checksums.yaml +4 -4
  2. data/lib/teodoro.rb +3 -2
  3. data/lib/teodoro/arquivo_data.rb +87 -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 +42 -12
  7. data/lib/teodoro/arquivo_de_origem.rb +7 -7
  8. data/lib/teodoro/arquivo_xml.rb +48 -24
  9. data/lib/teodoro/console.rb +3 -1
  10. data/lib/teodoro/empresa.rb +181 -161
  11. data/lib/teodoro/leiaute/arquivo_s1000.rb +20 -24
  12. data/lib/teodoro/leiaute/arquivo_s1005.rb +12 -18
  13. data/lib/teodoro/leiaute/arquivo_s1010.rb +9 -13
  14. data/lib/teodoro/leiaute/arquivo_s1020.rb +6 -10
  15. data/lib/teodoro/leiaute/arquivo_s1030.rb +4 -8
  16. data/lib/teodoro/leiaute/arquivo_s1040.rb +3 -7
  17. data/lib/teodoro/leiaute/arquivo_s1050.rb +6 -12
  18. data/lib/teodoro/leiaute/arquivo_s1070.rb +9 -13
  19. data/lib/teodoro/leiaute/arquivo_s2190.rb +16 -17
  20. data/lib/teodoro/leiaute/arquivo_s2200.rb +161 -185
  21. data/lib/teodoro/leiaute/arquivo_s2205.rb +132 -167
  22. data/lib/teodoro/leiaute/arquivo_s2206.rb +72 -75
  23. data/lib/teodoro/leiaute/arquivo_s2230.rb +87 -91
  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 +135 -159
  27. data/lib/teodoro/leiaute/arquivo_s2306.rb +148 -151
  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: a18d582f633bc372e5c951b9434e69b7ba86c0dbd8b636486fea005797dd57ae
4
- data.tar.gz: ab12d7b4afbf8eed6d9ee153e252c7e7423324cf25b44fb94eb7dbf3e51f6b45
3
+ metadata.gz: 29d6e699440fb8443030736d64cf8d3221496f215101d78be08384bc3a16d260
4
+ data.tar.gz: 35c1b51f6c8843e1af874452d1b4bf06042c2934ffdc368ab08a3fecba39624e
5
5
  SHA512:
6
- metadata.gz: ad3aeead52c1a3da2d00f437c8c99cf92fa528b9272de0be66ab0d3201c6baa3005f376f65cef971c220a94de60280b79748b401df29bfa6018c83b395ecf405
7
- data.tar.gz: 3e22a950534546f877d1b3ab67c2e186b1439fd10539d36cdf219d32c8ae1b3afe155d1420301c8301d860e5f0020e0884e74cea89812f6e45e534dedf31fdaa
6
+ metadata.gz: 777e26331b02a0dc2d8c8ad386699ce39b02b00f1d5a343f84a75d34cba9e63b9ebe7efbc142416108e25d144a5876fe8153d32110c4732049f9e7eed187d582
7
+ data.tar.gz: 1657318ad6a4b6da9d12f762d6d3d72411aeb9cad695b756d3c9f64b106256a36a4be5308c770bec7e8c7b26449aef5cc4e9b36c8427f5be4b2b919d415d3069
data/lib/teodoro.rb CHANGED
@@ -72,11 +72,12 @@ module Teodoro
72
72
  end
73
73
 
74
74
  def processar_empresas
75
- empresas.each(&:processar)
75
+ # otimizacao do gerenciamento de memoria
76
+ empresas.shift.processar while empresas.any?
76
77
  end
77
78
 
78
79
  def empresas
79
- Dir[File.join(origem, '*')].map { |caminho| Empresa.new(caminho: caminho, destino: destino) }
80
+ @empresas ||= Dir[File.join(origem, '*')].map { |caminho| Empresa.new(caminho: caminho, destino: destino) }
80
81
  end
81
82
  end
82
83
  end
@@ -0,0 +1,87 @@
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)}" } + ['']).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
+ mes_ano: proc { "#{_1[-2..]}/#{_1[0..3]}" if _1 }
62
+ }.freeze
63
+
64
+ private
65
+
66
+ def initialize(arg)
67
+ @arg = arg
68
+ end
69
+
70
+ attr_reader :arg
71
+
72
+ public
73
+
74
+ def to_s
75
+ @to_s ||= (tipo ? FORMATADORES[tipo].call(valor) : valor).to_s
76
+ end
77
+
78
+ def tipo
79
+ @tipo ||= arg[1] if arg.is_a?(Array)
80
+ end
81
+
82
+ def valor
83
+ @valor ||= arg.is_a?(Array) ? arg[0] : arg
84
+ end
85
+ end
86
+ end
87
+ 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,25 +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
- deletar_arquivos_data_originais if retificacao?
8
- registrar_arquivo_data
9
- criar_arquivo_data
6
+ if retificado?
7
+ processar_retificacao
8
+ else
9
+ registrar_arquivos_data
10
+ criar_arquivos_data
11
+ end
10
12
  end
11
13
 
12
14
  private
13
15
 
14
- def registrar_arquivo_data
15
- arquivos_data.registrar(
16
- nome: nome_do_arquivo_data,
17
- recibo: numero_do_recibo
18
- )
16
+ def retificado?
17
+ arquivo_xml_de_retificacao
19
18
  end
20
19
 
21
- def caminho_do_arquivo_data
22
- criar_caminho_do_arquivo_data(nome_do_arquivo_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
+ end
27
+
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
+ }
23
53
  end
24
54
  end
25
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'
@@ -9,7 +7,7 @@ require_relative 'leiaute'
9
7
  require_relative 'xml'
10
8
 
11
9
  module Teodoro
12
- class ArquivoXML
10
+ class ArquivoXML # rubocop:disable Metrics/ClassLength
13
11
  TIPOS_DE_EVENTO_PROCESSAVEIS = %w[
14
12
  S1000
15
13
  S1005
@@ -32,6 +30,18 @@ module Teodoro
32
30
  S3000
33
31
  ].freeze
34
32
 
33
+ TIPOS_DE_EVENTO_RETIFICAVEIS = %w[
34
+ S2200
35
+ S2205
36
+ S2206
37
+ S2230
38
+ S2250
39
+ S2299
40
+ S2300
41
+ S2306
42
+ S2399
43
+ ].freeze
44
+
35
45
  private
36
46
 
37
47
  def initialize(empresa:, caminho:)
@@ -43,16 +53,25 @@ module Teodoro
43
53
 
44
54
  public
45
55
 
46
- def processavel?
47
- TIPOS_DE_EVENTO_PROCESSAVEIS.include?(tipo_de_evento)
56
+ attr_reader :numero_do_recibo_a_retificar, :momento_de_processamento_pelo_e_social
57
+
58
+ # otimizacao do gerenciamento de memoria
59
+ def carregar
60
+ Console.print "carregando #{nome}.xml..." do
61
+ evento, recibo = carregar_evento_e_recibo
62
+
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
48
67
  end
49
68
 
50
- def momento_de_processamento_pelo_e_social
51
- # otimizacao do gerenciamento de memoria
52
- carregar_xml
53
- .then { |xml| Nokogiri::XML(xml.css('eSocial/retornoProcessamentoDownload/recibo/*').to_s) }
54
- .then { |xml_do_recibo| XML.new(xml_do_recibo) }
55
- .then { |recibo| recibo['retornoEvento/processamento/dhProcessamento'] }
69
+ def retificacao?
70
+ @retificacao
71
+ end
72
+
73
+ def processavel?
74
+ TIPOS_DE_EVENTO_PROCESSAVEIS.include?(tipo_de_evento)
56
75
  end
57
76
 
58
77
  def nome
@@ -60,15 +79,20 @@ module Teodoro
60
79
  end
61
80
 
62
81
  def processar
63
- dar_feedback_para_o_usuario
64
- validar_versao_do_leiaute
65
- processar_arquivo
82
+ Console.print "processando #{nome}.xml..." do
83
+ validar_versao_do_leiaute
84
+ processar_arquivo
85
+ end
66
86
  end
67
87
 
68
88
  private
69
89
 
70
- def tipo_de_evento
71
- @tipo_de_evento ||= nome[-6..].delete('-')
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
72
96
  end
73
97
 
74
98
  def carregar_xml
@@ -79,12 +103,12 @@ module Teodoro
79
103
  File.read(caminho)
80
104
  end
81
105
 
82
- def dar_feedback_para_o_usuario
83
- Console.print "processando #{nome}.xml..."
106
+ def tipo_de_evento
107
+ @tipo_de_evento ||= nome[-6..].delete('-')
84
108
  end
85
109
 
86
110
  def validar_versao_do_leiaute
87
- raise unless %w[02_04_01 02_04_02 02_05_00 _S_01_00_00].include?(versao_do_leiaute)
111
+ raise unless %w[02_04_01 02_04_02 02_05_00 _S_01_00_00].include?(versao_do_leiaute) # FIXME: Tales
88
112
  end
89
113
 
90
114
  def versao_do_leiaute
@@ -92,11 +116,11 @@ module Teodoro
92
116
  end
93
117
 
94
118
  def namespace_do_evento
95
- xml_do_evento.css('eSocial')[0].namespace.href
119
+ xml_do_evento.css('/eSocial')[0].namespace.href
96
120
  end
97
121
 
98
122
  def xml_do_evento
99
- @xml_do_evento ||= Nokogiri::XML(xml.css('eSocial/retornoProcessamentoDownload/evento/*').to_s)
123
+ @xml_do_evento ||= Nokogiri::XML(xml.css('/eSocial/retornoProcessamentoDownload/evento/*').to_s)
100
124
  end
101
125
 
102
126
  def xml
@@ -119,7 +143,7 @@ module Teodoro
119
143
  end
120
144
 
121
145
  def evento
122
- XML.new(xml_do_evento)
146
+ XML.new(Nokogiri::XML(xml_do_evento.css('/*/*').to_s))
123
147
  end
124
148
 
125
149
  def recibo
@@ -127,7 +151,7 @@ module Teodoro
127
151
  end
128
152
 
129
153
  def xml_do_recibo
130
- Nokogiri::XML(xml.css('eSocial/retornoProcessamentoDownload/recibo/*').to_s)
154
+ Nokogiri::XML(xml.css('/eSocial/retornoProcessamentoDownload/recibo/*/*').to_s)
131
155
  end
132
156
  end
133
157
  end