inovadora_xml 0.0.3 → 0.0.4
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/inovadora_xml/assinador.rb +4 -4
- data/lib/inovadora_xml/modules/dados_nfse_service.rb +6 -6
- data/lib/inovadora_xml/modules/xml_retorno.rb +105 -0
- data/lib/inovadora_xml/modules.rb +1 -0
- data/lib/inovadora_xml/version.rb +1 -1
- data/lib/inovadora_xml.rb +3 -3
- metadata +3 -3
- data/lib/inovadora_xml/xml.rb +0 -76
@@ -108,10 +108,10 @@ module InovadoraXml
|
|
108
108
|
end
|
109
109
|
|
110
110
|
def valid?
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
111
|
+
self.errors.add(:base, "Chave não informada" ) unless self.key.present?
|
112
|
+
self.errors.add(:base, "Certificado não informado" ) unless self.cert.present?
|
113
|
+
self.errors.add(:base, "Arquivo chave não encontrado") unless File.exists?(self.key.to_s)
|
114
|
+
self.errors.add(:base, "Arquivo certificado não encontrado") unless File.exists?(self.cert.to_s)
|
115
115
|
|
116
116
|
rescue Exception => e
|
117
117
|
self.errors.add(:base, e.message)
|
@@ -126,18 +126,18 @@ module InovadoraXml
|
|
126
126
|
self.hospital.cidade_ibge.try(:ibge_com_digito)
|
127
127
|
end
|
128
128
|
|
129
|
-
def persistir_fnnfses_xml(xml)
|
129
|
+
def persistir_fnnfses_xml(xml, tipo_documento = 17)
|
130
130
|
xml_tratado = Nokogiri::XML(CGI.unescapeHTML(xml.to_xml.to_s), &:noblanks)
|
131
131
|
xml_tratado = xml_tratado.to_xml(indent: 2).to_s
|
132
132
|
if xml_tratado.blank?
|
133
133
|
xml_tratado = "xml não recebido da prefeitura"
|
134
134
|
end
|
135
|
-
|
136
|
-
if retorno_service.retornou_dados_nota?
|
137
|
-
retorno_service.save
|
138
|
-
end
|
139
|
-
end
|
135
|
+
# $b = {fnnfse: self.fnnfse, xml_envio: self.xml_gerado().to_s, xml_retorno: xml_tratado, errors: self.errors, tipo_documento: tipo_documento}
|
140
136
|
|
137
|
+
retorno_service = InovadoraXml::Modules::XmlRetorno.new(fnnfse: self.fnnfse, xml_envio: self.xml_gerado().to_s, xml_retorno: xml_tratado, errors: self.errors, tipo_documento: tipo_documento)
|
138
|
+
|
139
|
+
retorno_service.save
|
140
|
+
end
|
141
141
|
end
|
142
142
|
end
|
143
143
|
end
|
@@ -0,0 +1,105 @@
|
|
1
|
+
#encoding=utf-8
|
2
|
+
module InovadoraXml
|
3
|
+
module Modules
|
4
|
+
class XmlRetorno
|
5
|
+
extend ActiveModel::Naming # Requer dependencias para uso do ActiveModel::Errors
|
6
|
+
attr_accessor :errors, :fnnfse, :fnnfses_xml, :numero_nota, :link_nota, :protocolo_prefeitura,
|
7
|
+
:codigo_verificacao_nfse, :datahora_aprovacao,
|
8
|
+
:cancelada, :data_hora_cancelamento
|
9
|
+
|
10
|
+
def initialize args={}
|
11
|
+
self.errors = args[:errors] || ActiveModel::Errors.new(self)
|
12
|
+
self.fnnfse = args[:fnnfse]
|
13
|
+
validar_dados_iniciais(args)
|
14
|
+
persistir_fnnfses_xml(args)
|
15
|
+
end
|
16
|
+
|
17
|
+
def validar_dados_iniciais(args)
|
18
|
+
if self.fnnfse.nil?
|
19
|
+
self.errors.add(:base, "NFSe não encontrada")
|
20
|
+
end
|
21
|
+
if args.blank? || args[:xml_envio].blank?
|
22
|
+
self.errors.add(:base, "XML para envio está em branco")
|
23
|
+
end
|
24
|
+
if args.blank? || args[:xml_retorno].blank?
|
25
|
+
self.errors.add(:base, "XML de retorno está em branco")
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def valid?
|
30
|
+
self.errors.blank?
|
31
|
+
end
|
32
|
+
|
33
|
+
def retornou_dados_nota?
|
34
|
+
self.errors.add(:base, "Número da nota não encontrado no XML de retorno da prefeitura") if self.numero_nota.blank?
|
35
|
+
# self.errors.add(:base, "Link da nota não encontrado no XML de retorno da prefeitura") if self.link_nota.blank?
|
36
|
+
self.errors.add(:base, "Código verificação da nota não encontrado no XML de retorno da prefeitura") if self.codigo_verificacao_nfse.blank?
|
37
|
+
self.errors.add(:base, "Data aprovação da nota não encontrado no XML de retorno da prefeitura") if self.datahora_aprovacao.blank?
|
38
|
+
self.valid?
|
39
|
+
end
|
40
|
+
|
41
|
+
def save
|
42
|
+
if retornou_dados_nota?
|
43
|
+
if self.valid?
|
44
|
+
self.fnnfse.nao_validar_nota_autenticada = true
|
45
|
+
self.fnnfse.fnnfses_sancionada.numero_nota = self.numero_nota
|
46
|
+
self.fnnfse.fnnfses_sancionada.link_nota = self.link_nota
|
47
|
+
self.fnnfse.fnnfses_sancionada.codigo_verificacao_nfse = self.codigo_verificacao_nfse
|
48
|
+
self.fnnfse.fnnfses_sancionada.datahora_aprovacao = self.datahora_aprovacao
|
49
|
+
self.fnnfse.fnnfses_sancionada.protocolo_prefeitura = self.protocolo_prefeitura
|
50
|
+
self.fnnfse.save
|
51
|
+
end
|
52
|
+
if self.cancelada && self.data_hora_cancelamento.present?
|
53
|
+
self.fnnfse.reload
|
54
|
+
fnnfses_sancionada = self.fnnfse.fnnfses_sancionada
|
55
|
+
fnnfses_sancionada.cancelada = true
|
56
|
+
fnnfses_sancionada.motivo_cancelamento = fnnfses_sancionada.motivo_cancelamento.to_s + " Data/Hora cancelamento: #{self.data_hora_cancelamento.to_s_br}"
|
57
|
+
fnnfses_sancionada.save
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
def get_texto_errors
|
63
|
+
texto_errors = '<erros>\n'
|
64
|
+
texto_errors += "<erro>XML apresentou erros na geração e transmissão para o webservice</erro>\n"
|
65
|
+
if self.errors.present?
|
66
|
+
self.errors.full_messages.each do |msg|
|
67
|
+
texto_errors += "<erro>#{msg}</erro>\n"
|
68
|
+
end
|
69
|
+
end
|
70
|
+
texto_errors += '</erros>\n'
|
71
|
+
texto_errors
|
72
|
+
end
|
73
|
+
|
74
|
+
def persistir_fnnfses_xml(args)
|
75
|
+
xml_resposta_ws = (args[:xml_retorno] rescue get_texto_errors)
|
76
|
+
if xml_resposta_ws.blank?
|
77
|
+
xml_resposta_ws = get_texto_errors
|
78
|
+
end
|
79
|
+
self.fnnfses_xml = FnnfsesXml.create(
|
80
|
+
fnnfse_id: self.fnnfse.id,
|
81
|
+
tipo_documento: args[:tipo_documento],
|
82
|
+
xml_envio: (args[:xml_envio] rescue get_texto_errors),
|
83
|
+
xml_resposta: xml_resposta_ws
|
84
|
+
)
|
85
|
+
if self.fnnfses_xml.try(:get_erros).present?
|
86
|
+
self.fnnfses_xml.get_erros.each do |erro|
|
87
|
+
self.errors.add(:base, "Erro retornado pela prefeitura: #{erro}")
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
if self.errors.blank?
|
92
|
+
self.numero_nota = self.fnnfses_xml.get_numero_nota if (self.fnnfses_xml.get_numero_nota.present?)
|
93
|
+
self.link_nota = self.fnnfses_xml.get_link_nota if (self.fnnfses_xml.get_link_nota.present?)
|
94
|
+
self.codigo_verificacao_nfse = self.fnnfses_xml.get_codigo_verificacao_nfse if (self.fnnfses_xml.get_codigo_verificacao_nfse.present?)
|
95
|
+
self.datahora_aprovacao = self.fnnfses_xml.get_data_emissao if (self.fnnfses_xml.get_data_emissao.present?)
|
96
|
+
self.protocolo_prefeitura = self.fnnfses_xml.get_protocolo_prefeitura if (self.fnnfses_xml.get_protocolo_prefeitura.present?)
|
97
|
+
if (self.fnnfses_xml.get_data_hora_cancelamento.present? rescue false)
|
98
|
+
self.cancelada = true
|
99
|
+
self.data_hora_cancelamento = self.fnnfses_xml.get_data_hora_cancelamento
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
@@ -4,5 +4,6 @@ module InovadoraXml
|
|
4
4
|
autoload :FormatadorNfse, "inovadora_xml/modules/formatador_nfse"
|
5
5
|
autoload :GeradorXml, "inovadora_xml/modules/gerador_xml"
|
6
6
|
autoload :DadosNfseService, "inovadora_xml/modules/dados_nfse_service"
|
7
|
+
autoload :XmlRetorno, "inovadora_xml/modules/xml_retorno"
|
7
8
|
end
|
8
9
|
end
|
data/lib/inovadora_xml.rb
CHANGED
@@ -19,7 +19,7 @@ module InovadoraXml
|
|
19
19
|
include InovadoraXml::Modules::FormatadorNfse
|
20
20
|
include InovadoraXml::Modules::GeradorXml
|
21
21
|
|
22
|
-
def initialize(args
|
22
|
+
def initialize(*args)
|
23
23
|
self.errors = ActiveModel::Errors.new(self)
|
24
24
|
self.xml_gerado = self.gerar_xml()
|
25
25
|
|
@@ -85,8 +85,8 @@ module InovadoraXml
|
|
85
85
|
assinador = InovadoraXml::Assinador.new(self.xml_gerado, tag_assinar, self.cert, self.key)
|
86
86
|
assinador.assinar_xml
|
87
87
|
|
88
|
-
assinador.errors.each do |error|
|
89
|
-
self.errors.add(:base, error
|
88
|
+
assinador.errors.full_messages.each do |error|
|
89
|
+
self.errors.add(:base, error)
|
90
90
|
end
|
91
91
|
|
92
92
|
self.xml_gerado = assinador.xml_assinado if assinador.errors.blank?
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: inovadora_xml
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.4
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: exe
|
11
11
|
cert_chain: []
|
12
|
-
date: 2019-06-
|
12
|
+
date: 2019-06-24 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: bundler
|
@@ -132,9 +132,9 @@ files:
|
|
132
132
|
- lib/inovadora_xml/modules/dados_nfse_service.rb
|
133
133
|
- lib/inovadora_xml/modules/formatador_nfse.rb
|
134
134
|
- lib/inovadora_xml/modules/gerador_xml.rb
|
135
|
+
- lib/inovadora_xml/modules/xml_retorno.rb
|
135
136
|
- lib/inovadora_xml/servidor_wsdl.rb
|
136
137
|
- lib/inovadora_xml/version.rb
|
137
|
-
- lib/inovadora_xml/xml.rb
|
138
138
|
homepage:
|
139
139
|
licenses:
|
140
140
|
- MIT
|
data/lib/inovadora_xml/xml.rb
DELETED
@@ -1,76 +0,0 @@
|
|
1
|
-
#encoding: utf-8
|
2
|
-
module InovadoraXml
|
3
|
-
class Xml
|
4
|
-
attr_accessor :xml_nfse, :schema, :metodo_soap, :xml_gerado, :retorno, :wsdl, :cert, :key, :errors
|
5
|
-
|
6
|
-
include InovadoraXml::Modules::FormatadorMfse
|
7
|
-
include InovadoraXml::Modules::GeradorXml
|
8
|
-
|
9
|
-
def initialize(args = {})
|
10
|
-
self.errors = ActiveModel::Errors.new(self)
|
11
|
-
self.xml_gerado = self.gerar_xml()
|
12
|
-
|
13
|
-
self.validar_args
|
14
|
-
# self.valid?
|
15
|
-
end
|
16
|
-
|
17
|
-
def comunicar(request_args = {})
|
18
|
-
self.valid?
|
19
|
-
|
20
|
-
if self.errors.blank?
|
21
|
-
servidor = InovadoraXml::ServidorWsdl.new(
|
22
|
-
envelopar(),
|
23
|
-
self.metodo_soap,
|
24
|
-
self.wsdl,
|
25
|
-
request_args
|
26
|
-
)
|
27
|
-
|
28
|
-
unless servidor.enviar
|
29
|
-
raise InovadoraXml::CustomExceptions::ServerError.new(servidor), "Server Error"
|
30
|
-
end
|
31
|
-
#usage: self.retorno.to_xml ou self.retorno.body
|
32
|
-
self.retorno = servidor.retorno
|
33
|
-
end
|
34
|
-
|
35
|
-
rescue InovadoraXml::CustomExceptions::ServerError => e
|
36
|
-
e.object.errors.full_messages.each {|e| self.errors.add(:base, e)}
|
37
|
-
rescue Exception => e
|
38
|
-
self.errors.add(:base, e.message)
|
39
|
-
ensure
|
40
|
-
return self.errors.blank?
|
41
|
-
end
|
42
|
-
|
43
|
-
def validar_args
|
44
|
-
self.errors.add(:base, "Metodo SOAP não especificado") if self.metodo_soap.blank?
|
45
|
-
self.errors.add(:base, "Schema não especificado") if self.schema.blank?
|
46
|
-
self.errors.add(:base, "WSDL não especificado") if self.wsdl.blank?
|
47
|
-
|
48
|
-
return self.errors.blank?
|
49
|
-
end
|
50
|
-
|
51
|
-
def valid?
|
52
|
-
erros = []
|
53
|
-
schema = open(self.schema)
|
54
|
-
xsd = Nokogiri::XML::Schema(schema)
|
55
|
-
xsd.validate(self.xml_gerado).each do |error|
|
56
|
-
unless error.message.to_s.include?("{http://www.w3.org/2000/09/xmldsig#}Signature") ||
|
57
|
-
error.message.to_s.include?("{http://www.w3.org/2000/09/xmldsig#}SignedInfo")
|
58
|
-
erros << "(Linha: " + error.line.to_s + ") => " + error.message.to_s
|
59
|
-
end
|
60
|
-
end
|
61
|
-
|
62
|
-
erros.each {|erro| self.errors.add(:base, erro)}
|
63
|
-
rescue Errno::ENOENT => e
|
64
|
-
self.errors.add(:base, "Arquivo schema não existe")
|
65
|
-
rescue Exception => e
|
66
|
-
self.errors.add(:base, e)
|
67
|
-
ensure
|
68
|
-
self.errors.blank?
|
69
|
-
end
|
70
|
-
|
71
|
-
def assinar(xml_assinar, tag_assinar)
|
72
|
-
Assinador.new(xml_assinar, tag_assinar).xml_assinado
|
73
|
-
end
|
74
|
-
|
75
|
-
end
|
76
|
-
end
|