teodoro 0.8.0 → 0.12.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 (31) 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 +12 -0
  5. data/lib/teodoro/arquivo_de_evento_de_tabela.rb +27 -9
  6. data/lib/teodoro/arquivo_de_evento_nao_periodico.rb +36 -13
  7. data/lib/teodoro/arquivo_xml.rb +10 -7
  8. data/lib/teodoro/empresa.rb +4 -2
  9. data/lib/teodoro/leiaute/arquivo_s1000.rb +5 -7
  10. data/lib/teodoro/leiaute/arquivo_s1005.rb +4 -4
  11. data/lib/teodoro/leiaute/arquivo_s1010.rb +2 -2
  12. data/lib/teodoro/leiaute/arquivo_s1020.rb +2 -2
  13. data/lib/teodoro/leiaute/arquivo_s1030.rb +3 -3
  14. data/lib/teodoro/leiaute/arquivo_s1040.rb +2 -2
  15. data/lib/teodoro/leiaute/arquivo_s1050.rb +3 -3
  16. data/lib/teodoro/leiaute/arquivo_s1070.rb +3 -3
  17. data/lib/teodoro/leiaute/arquivo_s2190.rb +14 -13
  18. data/lib/teodoro/leiaute/arquivo_s2200.rb +163 -146
  19. data/lib/teodoro/leiaute/arquivo_s2205.rb +130 -160
  20. data/lib/teodoro/leiaute/arquivo_s2206.rb +76 -67
  21. data/lib/teodoro/leiaute/arquivo_s2230.rb +85 -84
  22. data/lib/teodoro/leiaute/arquivo_s2250.rb +34 -34
  23. data/lib/teodoro/leiaute/arquivo_s2299.rb +170 -164
  24. data/lib/teodoro/leiaute/arquivo_s2300.rb +137 -123
  25. data/lib/teodoro/leiaute/arquivo_s2306.rb +145 -144
  26. data/lib/teodoro/leiaute/arquivo_s2399.rb +120 -120
  27. data/lib/teodoro/leiaute/arquivo_s3000.rb +2 -6
  28. metadata +3 -5
  29. data/lib/teodoro/arquivo_de_evento_criador_de_arquivo_data.rb +0 -52
  30. data/lib/teodoro/arquivo_de_evento_processador_de_arquivo_data.rb +0 -30
  31. 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: 345feac649f9964beffbb9200c2d19281413f03e4950aa440d6208a189f6c337
4
- data.tar.gz: b30953d58a711b552b936ffccb125792a548e3fd00075b0e52f7b37473224a04
3
+ metadata.gz: b415fec3398853b0283d7dcc3b822c7b90c81b75e0b34d6c491daf56259d4bde
4
+ data.tar.gz: 6e3f908145c5099bc5b8012deb338edb4c6ae22023fad881215e704d6847e12b
5
5
  SHA512:
6
- metadata.gz: e02f37a099b65f6fe97f7d888c25638bcfc6e5cd48ea4512d353b3952188f76c547b17b4e72a27b7979d4c0765ab602e65c80b81e2d8ff7903376ec4d6ab61e8
7
- data.tar.gz: 86d96c5129045d68f65ebfa4a6cdc4ff942185f3510b2a7c32af7b6fdc74661c26bd8a0154f8c7d14c309f7e6c21daeffc42f7b1e28fbec0ad9c645743d2890b
6
+ metadata.gz: 7a2bd3938c5ce7740cbb50d6db629401007f86f074278d819883516a88959ec72960794bc276403b73e2f4517849c64d4667120339a9de2deb10705a623d5580
7
+ data.tar.gz: 70b459092be50c90f46b9931804a4125bfe6b11f1facd30c39cc9acc0799d52ff8dddeea88088f7fdb6c9e0501b4dbfb221acdf8d2490b178463cef251454e76
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,6 +17,18 @@ 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
33
  @versao_do_aplicativo_de_processamento_do_evento ||= recibo['processamento/versaoAppProcessamento']
22
34
  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?
@@ -20,15 +20,18 @@ module Teodoro
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_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
@@ -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
@@ -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'
@@ -110,7 +108,12 @@ module Teodoro
110
108
  end
111
109
 
112
110
  def validar_versao_do_leiaute
113
- 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)
114
117
  end
115
118
 
116
119
  def versao_do_leiaute
@@ -122,7 +125,7 @@ module Teodoro
122
125
  end
123
126
 
124
127
  def xml_do_evento
125
- @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)
126
129
  end
127
130
 
128
131
  def xml
@@ -145,7 +148,7 @@ module Teodoro
145
148
  end
146
149
 
147
150
  def evento
148
- XML.new(Nokogiri::XML(xml_do_evento.css('*/*').to_s))
151
+ XML.new(Nokogiri::XML(xml_do_evento.css('/*/*').to_s))
149
152
  end
150
153
 
151
154
  def recibo
@@ -153,7 +156,7 @@ module Teodoro
153
156
  end
154
157
 
155
158
  def xml_do_recibo
156
- Nokogiri::XML(xml.css('eSocial/retornoProcessamentoDownload/recibo/*/*').to_s)
159
+ Nokogiri::XML(xml.css('/eSocial/retornoProcessamentoDownload/recibo/*/*').to_s)
157
160
  end
158
161
  end
159
162
  end
@@ -82,11 +82,13 @@ module Teodoro
82
82
  end
83
83
 
84
84
  def descompactar_arquivos_de_origem
85
- arquivos_de_origem.each(&:descompactar)
85
+ # otimizacao do gerenciamento de memoria
86
+ arquivos_de_origem.shift.descompactar while arquivos_de_origem.any?
86
87
  end
87
88
 
88
89
  def arquivos_de_origem
89
- Dir[File.join(caminho, '*.zip')]
90
+ @arquivos_de_origem ||=
91
+ Dir[File.join(caminho, '*.zip')]
90
92
  .map { |caminho| ArquivoDeOrigem.new(caminho: caminho, destino_dos_arquivos_xml: destino_dos_arquivos_xml) }
91
93
  end
92
94
 
@@ -61,7 +61,6 @@ module Teodoro
61
61
 
62
62
  def itens_do_conteudo_do_arquivo_data # rubocop:disable Metrics/MethodLength, Metrics/AbcSize
63
63
  [
64
- # rubocop:disable Layout/LineLength
65
64
  ['TipoInscricaoEmpregador', tipo_de_inscricao],
66
65
  ['FapBdContrib'],
67
66
  ['AlteracaoEmPeriodoExistente'],
@@ -73,12 +72,12 @@ module Teodoro
73
72
  ['EhRetificacao'],
74
73
  ['EhInclusaoNovoPeriodo'],
75
74
  ['RetornoAction'],
76
- ['ehOrgaoPublico', [orgao_publico?, :bool]],
77
- ['ehOrgaoPublicoUniao', [orgao_publico?, :bool]],
78
- ['ehOrgaoPublicoEstadualMunicipalDistrital', [evento['infoEmpregador/*/infoCadastro/infoOP/infoEnte'], :bool]],
75
+ ['ehOrgaoPublico', orgao_publico?, :bool],
76
+ ['ehOrgaoPublicoUniao', orgao_publico?, :bool],
77
+ ['ehOrgaoPublicoEstadualMunicipalDistrital', evento['infoEmpregador/*/infoCadastro/infoOP/infoEnte'], :bool],
79
78
  ['ExibeModoCompleto'],
80
- ['InicioValidade', [inicio_da_validade, :mes_ano]],
81
- ['FimValidade', [fim_da_validade, :mes_ano]],
79
+ ['InicioValidade', inicio_da_validade, :mes_ano],
80
+ ['FimValidade', fim_da_validade, :mes_ano],
82
81
  ['NomeRazaoSocial', nome_ou_razao_social],
83
82
  ['ClassificacaoTributaria', evento['infoEmpregador/*/infoCadastro/classTrib']],
84
83
  ['NaturezaJuridica', evento['infoEmpregador/*/infoCadastro/natJurid']],
@@ -117,7 +116,6 @@ module Teodoro
117
116
  ["ListaSoftHouses_#{seq}_Email", software_house['email']]
118
117
  ]
119
118
  end.sum([])
120
- # rubocop:enable Layout/LineLength
121
119
  ]
122
120
  end
123
121
 
@@ -33,15 +33,15 @@ module Teodoro
33
33
  ['TipoInscricaoEstabelecimento', evento['infoEstab/*/ideEstab/tpInsc']],
34
34
  ['NumeroInscricaoEstabelecimento', numero_de_inscricao],
35
35
  ['NomeEstabelecimento'],
36
- ['InicioValidade', [inicio_da_validade, :mes_ano]],
37
- ['FimValidade', [fim_da_validade, :mes_ano]],
36
+ ['InicioValidade', inicio_da_validade, :mes_ano],
37
+ ['FimValidade', fim_da_validade, :mes_ano],
38
38
  ['TipoCaepf', evento['infoEstab/*/dadosEstab/infoCaepf/tpCaepf']],
39
39
  ['CnaePreponderanteCodigoDescricaoAutoComplete'],
40
40
  ['CnaePreponderante', evento['infoEstab/*/dadosEstab/cnaePrep']],
41
41
  ['CnaePreponderantePreenchido'],
42
42
  ['AliquotaRat', evento['infoEstab/*/dadosEstab/aliqGilrat/aliqRat']],
43
- ['Fap', evento['infoEstab/*/dadosEstab/aliqGilrat/fap']],
44
- ['AliquotaRatAjustada', evento['infoEstab/*/dadosEstab/aliqGilrat/aliqRatAjust']],
43
+ ['Fap', evento['infoEstab/*/dadosEstab/aliqGilrat/fap'], :decimal],
44
+ ['AliquotaRatAjustada', evento['infoEstab/*/dadosEstab/aliqGilrat/aliqRatAjust'], :decimal],
45
45
  ['FapRecuperado'],
46
46
  ['AliquotaRatRecuperada'],
47
47
  ['DesejaIncluirProcessoAdminJudRat'],
@@ -32,8 +32,8 @@ module Teodoro
32
32
  ['BloquearCodigo'],
33
33
  ['BloquearAntigoPeriodoValidade'],
34
34
  ['Codigo', codigo],
35
- ['InicioValidade', [inicio_da_validade, :mes_ano]],
36
- ['FimValidade', [fim_da_validade, :mes_ano]],
35
+ ['InicioValidade', inicio_da_validade, :mes_ano],
36
+ ['FimValidade', fim_da_validade, :mes_ano],
37
37
  ['chkIdTabelaRubrica'],
38
38
  ['IdTabelaRubrica', identificador_da_tabela_de_rubricas],
39
39
  ['IdTabelaRubricaText'],
@@ -30,8 +30,8 @@ module Teodoro
30
30
  ['CodigoConvenioTerceirosHidden'],
31
31
  ['IdEvento'],
32
32
  ['CodigoLotacao', codigo_da_lotacao_tributaria],
33
- ['InicioValidade', [inicio_da_validade, :mes_ano]],
34
- ['FimValidade', [fim_da_validade, :mes_ano]],
33
+ ['InicioValidade', inicio_da_validade, :mes_ano],
34
+ ['FimValidade', fim_da_validade, :mes_ano],
35
35
  ['TipoLotacao', evento['infoLotacao/*/dadosLotacao/tpLotacao']],
36
36
  ['Tipo'],
37
37
  ['TipoInscricaoEstab', evento['infoLotacao/*/dadosLotacao/tpInsc']],
@@ -28,13 +28,13 @@ module Teodoro
28
28
  ['BloquearCodigo'],
29
29
  ['BloquearAntigoPeriodoValidade'],
30
30
  ['CodigoCargo', codigo_do_cargo],
31
- ['InicioValidade', [inicio_da_validade, :mes_ano]],
32
- ['FimValidade', [fim_da_validade, :mes_ano]],
31
+ ['InicioValidade', inicio_da_validade, :mes_ano],
32
+ ['FimValidade', fim_da_validade, :mes_ano],
33
33
  ['DadosCargo_DescricaoCargo', evento['infoCargo/*/dadosCargo/nmCargo']],
34
34
  ['DadosCargo_CodigoCBO', evento['infoCargo/*/dadosCargo/codCBO']],
35
35
  ['DadosCargo_CodigoCBO_TEXT'],
36
36
  ['autocomplete_DadosCargo_CodigoCBO'],
37
- ['PreencherCargoPublico', [evento['infoCargo/*/dadosCargo/cargoPublico'], :bool]],
37
+ ['PreencherCargoPublico', evento['infoCargo/*/dadosCargo/cargoPublico'], :bool],
38
38
  ['IdEventoXml', id_do_evento],
39
39
  ['NrReciboEventoOriginal', numero_do_recibo],
40
40
  ['DescricaoProcEmi', processo_de_emissao_do_evento],
@@ -26,8 +26,8 @@ module Teodoro
26
26
  ['BloquearCodigo'],
27
27
  ['BloquearAntigoPeriodoValidade'],
28
28
  ['CodigoFuncao', codigo_da_funcao],
29
- ['InicioValidade', [inicio_da_validade, :mes_ano]],
30
- ['FimValidade', [fim_da_validade, :mes_ano]],
29
+ ['InicioValidade', inicio_da_validade, :mes_ano],
30
+ ['FimValidade', fim_da_validade, :mes_ano],
31
31
  ['DadosFuncao_DescricaoFuncao', evento['infoFuncao/*/dadosFuncao/dscFuncao']],
32
32
  ['DadosFuncao_CodigoCBO', evento['infoFuncao/*/dadosFuncao/codCBO']],
33
33
  ['DadosFuncao_CodigoCBO_TEXT'],