inovadora_xml 0.0.3 → 0.0.4
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.
- 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
|