teodoro 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/bin/teodoro +3 -0
- data/lib/teodoro.rb +7 -0
- data/lib/teodoro/arquivo_de_evento.rb +31 -0
- data/lib/teodoro/arquivo_de_evento_de_tabela.rb +86 -0
- data/lib/teodoro/arquivo_de_evento_nao_periodico.rb +58 -0
- data/lib/teodoro/arquivo_de_origem.rb +28 -0
- data/lib/teodoro/arquivo_xml.rb +112 -0
- data/lib/teodoro/cnpj.rb +64 -0
- data/lib/teodoro/console.rb +9 -0
- data/lib/teodoro/empresa.rb +85 -0
- data/lib/teodoro/execucao.rb +62 -0
- data/lib/teodoro/leiaute_2_4_1.rb +21 -0
- data/lib/teodoro/leiaute_2_4_1/arquivo_s1000.rb +163 -0
- data/lib/teodoro/leiaute_2_4_1/arquivo_s1005.rb +83 -0
- data/lib/teodoro/leiaute_2_4_1/arquivo_s1010.rb +61 -0
- data/lib/teodoro/leiaute_2_4_1/arquivo_s1020.rb +68 -0
- data/lib/teodoro/leiaute_2_4_1/arquivo_s1030.rb +59 -0
- data/lib/teodoro/leiaute_2_4_1/arquivo_s1040.rb +49 -0
- data/lib/teodoro/leiaute_2_4_1/arquivo_s1050.rb +68 -0
- data/lib/teodoro/leiaute_2_4_1/arquivo_s1070.rb +75 -0
- data/lib/teodoro/leiaute_2_4_1/arquivo_s2190.rb +30 -0
- data/lib/teodoro/leiaute_2_4_1/arquivo_s2200.rb +300 -0
- data/lib/teodoro/leiaute_2_4_1/arquivo_s2205.rb +157 -0
- data/lib/teodoro/leiaute_2_4_1/arquivo_s2206.rb +187 -0
- data/lib/teodoro/leiaute_2_4_1/arquivo_s2230.rb +147 -0
- data/lib/teodoro/leiaute_2_4_1/arquivo_s2250.rb +62 -0
- data/lib/teodoro/leiaute_2_4_1/arquivo_s2300.rb +284 -0
- data/lib/teodoro/leiaute_2_4_1/arquivo_s2306.rb +167 -0
- data/lib/teodoro/xml.rb +31 -0
- metadata +71 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: f52315cdc04dcedfa262aeffbbcf9b562edaeca3a7b6fa628790965eb7e6350d
|
4
|
+
data.tar.gz: 4aa688c1be3f577d88961bd083c2f1a70fa6a63bb7e652ea16bd4ddc79ff4c15
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 6ed9f5becb3bb8e962c67498c2c5ce28bc38699328c51697d59e2e0f41385512d15c2f8b67b23f1355727458c52043b8660f59ad7b13446c84c37c81babb171a
|
7
|
+
data.tar.gz: 563df80495ef39e03876bb3a0c8a15729c94f1cd7fbb21d5e375d53daabce2d20dc95e110eca9453c547bf616e017cde8798ca6c4c2a0b4bd5f69e9b74adc408
|
data/bin/teodoro
ADDED
data/lib/teodoro.rb
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
module Teodoro
|
2
|
+
module ArquivoDeEvento
|
3
|
+
private
|
4
|
+
|
5
|
+
attr_reader :xml_do_evento, :xml_do_recibo, :destino_dos_arquivos_data
|
6
|
+
|
7
|
+
def criar_arquivo_data
|
8
|
+
File.write(caminho_do_arquivo_data, conteudo_do_arquivo_data)
|
9
|
+
end
|
10
|
+
|
11
|
+
def evento
|
12
|
+
@evento ||= XML.new(xml_do_evento)
|
13
|
+
end
|
14
|
+
|
15
|
+
def conteudo_do_arquivo_data
|
16
|
+
(itens_do_conteudo_do_arquivo_data.map { "#{_1}=#{_2}" } + ['']).join("\n")
|
17
|
+
end
|
18
|
+
|
19
|
+
def versao_do_aplicativo_de_processamento_do_evento
|
20
|
+
recibo['retornoEvento/processamento/versaoAppProcessamento']
|
21
|
+
end
|
22
|
+
|
23
|
+
def tipo_de_inscricao_do_empregador
|
24
|
+
@tipo_de_inscricao_do_empregador ||= evento["#{noh_principal_do_evento}/ideEmpregador/tpInsc"]
|
25
|
+
end
|
26
|
+
|
27
|
+
def recibo
|
28
|
+
@recibo ||= XML.new(xml_do_recibo)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,86 @@
|
|
1
|
+
module Teodoro
|
2
|
+
module ArquivoDeEventoDeTabela
|
3
|
+
include ArquivoDeEvento
|
4
|
+
|
5
|
+
private
|
6
|
+
|
7
|
+
def initialize(xml_do_evento:, xml_do_recibo:, destino_dos_arquivos_data:)
|
8
|
+
@xml_do_evento = xml_do_evento
|
9
|
+
@xml_do_recibo = xml_do_recibo
|
10
|
+
@destino_dos_arquivos_data = destino_dos_arquivos_data
|
11
|
+
end
|
12
|
+
|
13
|
+
public
|
14
|
+
|
15
|
+
def processar
|
16
|
+
deletar_arquivo_data_original if alteracao? || exclusao?
|
17
|
+
return if exclusao?
|
18
|
+
|
19
|
+
criar_arquivo_data
|
20
|
+
end
|
21
|
+
|
22
|
+
private
|
23
|
+
|
24
|
+
def alteracao?
|
25
|
+
@alteracao ||= evento[noh_principal_do_evento, noh_de_informacoes_do_evento, 'alteracao']
|
26
|
+
end
|
27
|
+
|
28
|
+
def exclusao?
|
29
|
+
@exclusao ||= evento[noh_principal_do_evento, noh_de_informacoes_do_evento, 'exclusao']
|
30
|
+
end
|
31
|
+
|
32
|
+
def deletar_arquivo_data_original
|
33
|
+
File.delete(obter_caminho_do_arquivo_data(inicio_da_validade_original))
|
34
|
+
end
|
35
|
+
|
36
|
+
def inicio_da_validade_original
|
37
|
+
evento[noh_principal_do_evento, noh_de_informacoes_do_evento, '*', noh_de_identificacao_do_periodo, 'iniValid']
|
38
|
+
end
|
39
|
+
|
40
|
+
def obter_caminho_do_arquivo_data(inicio_da_validade)
|
41
|
+
File.join(
|
42
|
+
destino_dos_arquivos_data,
|
43
|
+
"#{nome_base_do_arquivo_data}[#{inicio_da_validade.delete('-')}].data"
|
44
|
+
)
|
45
|
+
end
|
46
|
+
|
47
|
+
def nome_base_do_arquivo_data
|
48
|
+
@nome_base_do_arquivo_data ||=
|
49
|
+
identificacao_do_arquivo_data[0] + identificacao_do_arquivo_data[1..].map { "[#{_1}]" }.join
|
50
|
+
end
|
51
|
+
|
52
|
+
def caminho_do_arquivo_data
|
53
|
+
# FIXME: Tales inicio de validade
|
54
|
+
obter_caminho_do_arquivo_data(inicio_da_validade)
|
55
|
+
end
|
56
|
+
|
57
|
+
def inicio_da_validade
|
58
|
+
@inicio_da_validade ||= validade['iniValid']
|
59
|
+
end
|
60
|
+
|
61
|
+
def validade
|
62
|
+
@validade ||=
|
63
|
+
if inclusao? || (alteracao? && !nova_validade?)
|
64
|
+
evento[noh_principal_do_evento, noh_de_informacoes_do_evento, '*', noh_de_identificacao_do_periodo]
|
65
|
+
elsif alteracao?
|
66
|
+
nova_validade
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
def inclusao?
|
71
|
+
@inclusao ||= evento[noh_principal_do_evento, noh_de_informacoes_do_evento, 'inclusao']
|
72
|
+
end
|
73
|
+
|
74
|
+
def nova_validade?
|
75
|
+
nova_validade
|
76
|
+
end
|
77
|
+
|
78
|
+
def nova_validade
|
79
|
+
@nova_validade ||= evento[noh_principal_do_evento, noh_de_informacoes_do_evento, 'alteracao', 'novaValidade']
|
80
|
+
end
|
81
|
+
|
82
|
+
def fim_da_validade
|
83
|
+
validade['fimValid']
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
module Teodoro
|
2
|
+
module ArquivoDeEventoNaoPeriodico
|
3
|
+
include ArquivoDeEvento
|
4
|
+
|
5
|
+
private
|
6
|
+
|
7
|
+
def initialize(xml_do_evento:, xml_do_recibo:, destino_dos_arquivos_data:, de_recibo_para_nome_do_arquivo_data:)
|
8
|
+
@xml_do_evento = xml_do_evento
|
9
|
+
@xml_do_recibo = xml_do_recibo
|
10
|
+
@destino_dos_arquivos_data = destino_dos_arquivos_data
|
11
|
+
@de_recibo_para_nome_do_arquivo_data = de_recibo_para_nome_do_arquivo_data
|
12
|
+
end
|
13
|
+
|
14
|
+
attr_reader :de_recibo_para_nome_do_arquivo_data
|
15
|
+
|
16
|
+
public
|
17
|
+
|
18
|
+
def processar
|
19
|
+
deletar_arquivo_data_original if retificacao?
|
20
|
+
registrar_recibo
|
21
|
+
criar_arquivo_data
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
def retificacao?
|
27
|
+
evento["#{noh_principal_do_evento}/ideEvento/indRetif"] == '2'
|
28
|
+
end
|
29
|
+
|
30
|
+
def deletar_arquivo_data_original
|
31
|
+
File.delete(caminho_do_arquivo_data_original)
|
32
|
+
end
|
33
|
+
|
34
|
+
def caminho_do_arquivo_data_original
|
35
|
+
File.join(destino_dos_arquivos_data, "#{nome_do_arquivo_original}.data")
|
36
|
+
end
|
37
|
+
|
38
|
+
def nome_do_arquivo_original
|
39
|
+
de_recibo_para_nome_do_arquivo_data[numero_do_recibo_a_retificar]
|
40
|
+
end
|
41
|
+
|
42
|
+
def numero_do_recibo_a_retificar
|
43
|
+
@numero_do_recibo_a_retificar ||= evento["#{noh_principal_do_evento}/ideEvento/nrRecibo"]
|
44
|
+
end
|
45
|
+
|
46
|
+
def registrar_recibo
|
47
|
+
de_recibo_para_nome_do_arquivo_data[numero_do_recibo] = nome_do_arquivo_data
|
48
|
+
end
|
49
|
+
|
50
|
+
def numero_do_recibo
|
51
|
+
recibo['retornoEvento/recibo/nrRecibo']
|
52
|
+
end
|
53
|
+
|
54
|
+
def caminho_do_arquivo_data
|
55
|
+
File.join(destino_dos_arquivos_data, "#{nome_do_arquivo_data}.data")
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module Teodoro
|
2
|
+
class ArquivoDeOrigem
|
3
|
+
PREFIXO_DE_TOTALIZADOR = '5'.freeze
|
4
|
+
|
5
|
+
private
|
6
|
+
|
7
|
+
def initialize(caminho:, destino_dos_arquivos_xml:)
|
8
|
+
@caminho = caminho
|
9
|
+
@destino_dos_arquivos_xml = destino_dos_arquivos_xml
|
10
|
+
end
|
11
|
+
|
12
|
+
attr_reader :caminho, :destino_dos_arquivos_xml
|
13
|
+
|
14
|
+
public
|
15
|
+
|
16
|
+
def descompactar
|
17
|
+
puts 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))
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,112 @@
|
|
1
|
+
require_relative 'arquivo_de_evento'
|
2
|
+
require_relative 'arquivo_de_evento_de_tabela'
|
3
|
+
require_relative 'arquivo_de_evento_nao_periodico'
|
4
|
+
require_relative 'cnpj'
|
5
|
+
require_relative 'leiaute_2_4_1'
|
6
|
+
require_relative 'xml'
|
7
|
+
|
8
|
+
module Teodoro
|
9
|
+
class ArquivoXML
|
10
|
+
private
|
11
|
+
|
12
|
+
def initialize(caminho:, destino_dos_arquivos_data:, de_recibo_para_nome_do_arquivo_data:)
|
13
|
+
@caminho = caminho
|
14
|
+
@destino_dos_arquivos_data = destino_dos_arquivos_data
|
15
|
+
@de_recibo_para_nome_do_arquivo_data = de_recibo_para_nome_do_arquivo_data
|
16
|
+
end
|
17
|
+
|
18
|
+
attr_reader :caminho, :destino_dos_arquivos_data, :de_recibo_para_nome_do_arquivo_data
|
19
|
+
|
20
|
+
public
|
21
|
+
|
22
|
+
def nome
|
23
|
+
@nome ||= File.basename(caminho, '.xml')
|
24
|
+
end
|
25
|
+
|
26
|
+
def processar
|
27
|
+
return unless %w[S1000 S1005 S1010 S1020 S1030 S1040 S1050 S1070 S2190 S2200 S2205 S2206 S2230 S2250 S2300 S2306]
|
28
|
+
.include?(tipo_de_evento)
|
29
|
+
|
30
|
+
arquivo.processar
|
31
|
+
end
|
32
|
+
|
33
|
+
private
|
34
|
+
|
35
|
+
def tipo_de_evento
|
36
|
+
nome[-6..].delete('-')
|
37
|
+
end
|
38
|
+
|
39
|
+
def arquivo
|
40
|
+
if evento_de_tabela?
|
41
|
+
evento_de_tabela
|
42
|
+
elsif evento_nao_periodico?
|
43
|
+
evento_nao_periodico
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def evento_de_tabela?
|
48
|
+
tipo_de_evento.start_with?('S10')
|
49
|
+
end
|
50
|
+
|
51
|
+
def evento_de_tabela
|
52
|
+
classe_do_arquivo.new(
|
53
|
+
xml_do_evento: xml_do_evento,
|
54
|
+
xml_do_recibo: xml_do_recibo,
|
55
|
+
destino_dos_arquivos_data: destino_dos_arquivos_data
|
56
|
+
)
|
57
|
+
end
|
58
|
+
|
59
|
+
def evento_nao_periodico?
|
60
|
+
tipo_de_evento.start_with?('S2')
|
61
|
+
end
|
62
|
+
|
63
|
+
def evento_nao_periodico
|
64
|
+
classe_do_arquivo.new(
|
65
|
+
xml_do_evento: xml_do_evento,
|
66
|
+
xml_do_recibo: xml_do_recibo,
|
67
|
+
destino_dos_arquivos_data: destino_dos_arquivos_data,
|
68
|
+
de_recibo_para_nome_do_arquivo_data: de_recibo_para_nome_do_arquivo_data
|
69
|
+
)
|
70
|
+
end
|
71
|
+
|
72
|
+
def classe_do_arquivo
|
73
|
+
modulo_do_leiaute.const_get("Arquivo#{tipo_de_evento}")
|
74
|
+
end
|
75
|
+
|
76
|
+
def modulo_do_leiaute
|
77
|
+
{
|
78
|
+
'02_04_01' => Leiaute_2_4_1,
|
79
|
+
'02_04_02' => Leiaute_2_4_1, # FIXME: Tales
|
80
|
+
'02_05_00' => Leiaute_2_4_1, # FIXME: Tales
|
81
|
+
'01_00_00' => Leiaute_2_4_1 # FIXME: Tales
|
82
|
+
}[versao_do_leiaute_no_xml]
|
83
|
+
end
|
84
|
+
|
85
|
+
def versao_do_leiaute_no_xml
|
86
|
+
namespace_do_evento.match(%r{.+/v(.+)$})[1]
|
87
|
+
end
|
88
|
+
|
89
|
+
def namespace_do_evento
|
90
|
+
xml_do_evento.css('eSocial')[0].namespace.href
|
91
|
+
end
|
92
|
+
|
93
|
+
def xml_do_evento
|
94
|
+
@xml_do_evento ||= Nokogiri::XML(xml.css('eSocial/retornoProcessamentoDownload/evento/*').to_s)
|
95
|
+
end
|
96
|
+
|
97
|
+
def xml
|
98
|
+
@xml ||= Nokogiri::XML(conteudo)
|
99
|
+
end
|
100
|
+
|
101
|
+
def conteudo
|
102
|
+
File.read(caminho)
|
103
|
+
end
|
104
|
+
|
105
|
+
def xml_do_recibo
|
106
|
+
Nokogiri::XML(xml.css('eSocial/retornoProcessamentoDownload/recibo/*').to_s)
|
107
|
+
end
|
108
|
+
|
109
|
+
module Base
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
data/lib/teodoro/cnpj.rb
ADDED
@@ -0,0 +1,64 @@
|
|
1
|
+
module Teodoro
|
2
|
+
class CNPJ
|
3
|
+
class Raiz
|
4
|
+
private
|
5
|
+
|
6
|
+
def initialize(string)
|
7
|
+
@string = string
|
8
|
+
end
|
9
|
+
|
10
|
+
attr_reader :string
|
11
|
+
|
12
|
+
public
|
13
|
+
|
14
|
+
def cnpj0001
|
15
|
+
RaizSufixo.new("#{string}0001").cnpj
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
class RaizSufixo
|
20
|
+
private
|
21
|
+
|
22
|
+
def initialize(string)
|
23
|
+
@string = string
|
24
|
+
end
|
25
|
+
|
26
|
+
attr_reader :string
|
27
|
+
|
28
|
+
public
|
29
|
+
|
30
|
+
def cnpj
|
31
|
+
"#{string}#{dv}"
|
32
|
+
end
|
33
|
+
|
34
|
+
def dv
|
35
|
+
Numero.new(string).dv.then do |dv|
|
36
|
+
dv + Numero.new(string + dv).dv
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
class Numero
|
41
|
+
private
|
42
|
+
|
43
|
+
attr_reader :string
|
44
|
+
|
45
|
+
def initialize(string)
|
46
|
+
@string = string
|
47
|
+
end
|
48
|
+
|
49
|
+
public
|
50
|
+
|
51
|
+
def dv
|
52
|
+
string.chars
|
53
|
+
.reverse
|
54
|
+
.map(&:to_i)
|
55
|
+
.map.with_index { |digito, indice| [digito, indice % 8 + 2] }
|
56
|
+
.sum { |digito, peso| digito * peso }
|
57
|
+
.then { |r| 11 - r % 11 }
|
58
|
+
.then { |r| r >= 10 ? 0 : r }
|
59
|
+
.to_s
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
@@ -0,0 +1,85 @@
|
|
1
|
+
require_relative 'arquivo_de_origem'
|
2
|
+
require_relative 'arquivo_xml'
|
3
|
+
|
4
|
+
module Teodoro
|
5
|
+
class Empresa
|
6
|
+
private
|
7
|
+
|
8
|
+
def initialize(caminho:, destino:)
|
9
|
+
@caminho = caminho
|
10
|
+
@destino = File.join(destino, nome_do_diretorio)
|
11
|
+
end
|
12
|
+
|
13
|
+
attr_reader :caminho, :destino
|
14
|
+
|
15
|
+
public
|
16
|
+
|
17
|
+
def processar
|
18
|
+
dar_feedback_para_o_usuario
|
19
|
+
criar_diretorio_destino
|
20
|
+
criar_diretorio_dos_arquivos_xml
|
21
|
+
descompactar_arquivos_de_origem
|
22
|
+
criar_diretorio_dos_arquivos_data
|
23
|
+
processar_arquivos_xml
|
24
|
+
end
|
25
|
+
|
26
|
+
private
|
27
|
+
|
28
|
+
def dar_feedback_para_o_usuario
|
29
|
+
puts ''
|
30
|
+
Console.print nome_do_diretorio, color: :green
|
31
|
+
end
|
32
|
+
|
33
|
+
def nome_do_diretorio
|
34
|
+
@nome_do_diretorio ||= File.basename(caminho)
|
35
|
+
end
|
36
|
+
|
37
|
+
def criar_diretorio_destino
|
38
|
+
Dir.mkdir(destino)
|
39
|
+
end
|
40
|
+
|
41
|
+
def criar_diretorio_dos_arquivos_xml
|
42
|
+
Dir.mkdir(destino_dos_arquivos_xml)
|
43
|
+
end
|
44
|
+
|
45
|
+
def destino_dos_arquivos_xml
|
46
|
+
@destino_dos_arquivos_xml ||= File.join(destino, 'xmls')
|
47
|
+
end
|
48
|
+
|
49
|
+
def descompactar_arquivos_de_origem
|
50
|
+
arquivos_de_origem.each(&:descompactar)
|
51
|
+
end
|
52
|
+
|
53
|
+
def arquivos_de_origem
|
54
|
+
Dir[File.join(caminho, '*.zip')]
|
55
|
+
.map { |caminho| ArquivoDeOrigem.new(caminho: caminho, destino_dos_arquivos_xml: destino_dos_arquivos_xml) }
|
56
|
+
end
|
57
|
+
|
58
|
+
def criar_diretorio_dos_arquivos_data
|
59
|
+
Dir.mkdir(destino_dos_arquivos_data)
|
60
|
+
end
|
61
|
+
|
62
|
+
def destino_dos_arquivos_data
|
63
|
+
@destino_dos_arquivos_data ||= File.join(destino, 'data')
|
64
|
+
end
|
65
|
+
|
66
|
+
def processar_arquivos_xml
|
67
|
+
arquivos_xml.each(&:processar)
|
68
|
+
end
|
69
|
+
|
70
|
+
def arquivos_xml
|
71
|
+
Dir[File.join(destino_dos_arquivos_xml, '*.xml')]
|
72
|
+
.map do |caminho|
|
73
|
+
ArquivoXML.new(
|
74
|
+
caminho: caminho,
|
75
|
+
destino_dos_arquivos_data: destino_dos_arquivos_data,
|
76
|
+
de_recibo_para_nome_do_arquivo_data: de_recibo_para_nome_do_arquivo_data
|
77
|
+
)
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
def de_recibo_para_nome_do_arquivo_data
|
82
|
+
@de_recibo_para_nome_do_arquivo_data ||= {}
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|