Class: BrNfe::Base
- Inherits:
-
ActiveModelBase
- Object
- ActiveModelBase
- BrNfe::Base
- Includes:
- Association::HaveEmitente
- Defined in:
- lib/br_nfe/base.rb
Direct Known Subclasses
Instance Attribute Summary collapse
-
#certificate_pkcs12_password ⇒ Object
Returns the value of attribute certificate_pkcs12_password.
-
#certificate_pkcs12_path ⇒ Object
Returns the value of attribute certificate_pkcs12_path.
-
#certificate_pkcs12_value ⇒ Object
Caso não tenha o certificate_pkcs12 salvo em arquivo, pode setar a string do certificate_pkcs12 direto pelo atributo certificate_pkcs12_value Caso tenha o certificate_pkcs12 em arquivo, basta setar o atributo certificate_pkcs12_path e deixar o atributo certificate_pkcs12_value em branco.
-
#env ⇒ Object
Returns the value of attribute env.
-
#ibge_code_of_issuer_city ⇒ Object
Código IBGE da cidade emitente.
-
#ibge_code_of_issuer_uf ⇒ Object
Código IBGE do estado emitente.
Attributes inherited from ActiveModelBase
Instance Method Summary collapse
-
#certificado_obrigatorio? ⇒ Boolean
Método que deve ser sobrescrito para as ações que necessitam do certificate_pkcs12 para assinatura.
- #certificate ⇒ Object
- #certificate=(value) ⇒ Object
- #certificate_key ⇒ Object
- #certificate_key=(value) ⇒ Object
- #certificate_pkcs12 ⇒ Object
- #certificate_pkcs12=(value) ⇒ Object
-
#client_wsdl ⇒ Object
Cliente WSDL utilizado para fazer a requisição.
- #client_wsdl_params ⇒ Object
-
#content_xml ⇒ Object
Esse método serve para ser utilizado no Base de cada orgão emissor onde em alguns casos é necessário colocar o xml em um CDATA É esse método que é passado dentro do Body da equisição SOAP.
-
#env_namespace ⇒ Object
Namespace da requisição SOAP.
- #env_test? ⇒ Boolean
- #find_xml(file_name, dir, context = nil, options = {}) ⇒ Object
- #get_xml_dirs(custom_dir_path = nil) ⇒ Object
-
#id_attribute? ⇒ Boolean
Para saber se deve add o attr id na assinatura.
- #message_namespaces ⇒ Object
-
#method_wsdl ⇒ Object
Método que contem qual a operação que deverá ser chamada do WS SOAP.
-
#namespace_for_signature ⇒ Object
Utilizado para colocar o namespace nas tags da assiantura Exemplo: <ns2:Signature Id=“?”> <ns2:SignedInfo Id=“?”> <ns2:CanonicalizationMethod Algorithm=“?”>?</ns2:CanonicalizationMethod> .….
-
#namespace_for_tags ⇒ Object
Utilizado para colocar o namespace nas tags de valores Exemplo: <ns1:LoteRps id=“123”> <ns1:NumeroLote>3311</ns1:NumeroLote> <ns1:Cnpj>23020443000140</ns1:Cnpj>.
-
#namespace_identifier ⇒ Object
O Namespace Indentifier é utilizado para adicionar o namespace na tag principal da requisição.
- #original_response ⇒ Object
-
#render_xml(file_name, opts = {}) ⇒ Object
Renderiza o xml a partir do nome de um arquivo Irá procurar o arquivo a partir dos seguintes diretórios> 1° - A partir do parâmetro :dir_path 2° - A partir do método xml_current_dir_path 3° - A partir do método xml_default_dir_path.
- #response ⇒ Object
- #response_encoding ⇒ Object
-
#sign_xml(xml, sign_nodes = []) ⇒ Object
USE EXAMPLE @xml = <?xml version=“1.0” encoding=“ISO-8859-1”?> <EnviarLoteRpsEnvio xmlns=“www.abrasf.org.br/ABRASF/arquivos/nfse.xsd”> <LoteRps id=“L2”> …
-
#signature_type ⇒ Object
Existem 2 tipos de assinatura da NFS-e * [
:default] Assina o XML no momento em que está sendo montado. - #signature_type?(type) ⇒ Boolean
- #soap_namespaces ⇒ Object
-
#soap_xml ⇒ Object
XML que irá na requisição SOAP.
-
#tag_xml ⇒ Object
Tag XML que vai na requisição SOAP.
-
#url_wsdl ⇒ Object
Deve conter o LINK do webservice a ser chamado TODO: Remover método quando reconfigurar a emissão das notas de serviço.
- #wsdl_encoding ⇒ Object
-
#xml_builder ⇒ Object
O xml_builder é o que contém o conteúdo de cada tipo de requisição e deve ser sobrescrito em cada classe implementada.
-
#xml_current_dir_path ⇒ Object
Diretório personalizado para cada classe Podendo ser sobrescrito em cada herança.
-
#xml_default_dir_path ⇒ Object
Diretório padrão dos arquivos XML.
-
#xml_version ⇒ Object
Versão do XML utilizado Cada Cidade pode utilizar uma versão diferente do XML.
Methods included from Association::HaveEmitente
Methods inherited from ActiveModelBase
#assign_attributes, #default_values, #initialize
Constructor Details
This class inherits a constructor from BrNfe::ActiveModelBase
Instance Attribute Details
#certificate_pkcs12_password ⇒ Object
Returns the value of attribute certificate_pkcs12_password.
5 6 7 |
# File 'lib/br_nfe/base.rb', line 5 def certificate_pkcs12_password @certificate_pkcs12_password end |
#certificate_pkcs12_path ⇒ Object
Returns the value of attribute certificate_pkcs12_path.
6 7 8 |
# File 'lib/br_nfe/base.rb', line 6 def certificate_pkcs12_path @certificate_pkcs12_path end |
#certificate_pkcs12_value ⇒ Object
Caso não tenha o certificate_pkcs12 salvo em arquivo, pode setar a string do certificate_pkcs12 direto pelo atributo certificate_pkcs12_value Caso tenha o certificate_pkcs12 em arquivo, basta setar o atributo certificate_pkcs12_path e deixar o atributo certificate_pkcs12_value em branco
185 186 187 |
# File 'lib/br_nfe/base.rb', line 185 def certificate_pkcs12_value @certificate_pkcs12_value end |
#env ⇒ Object
Returns the value of attribute env.
8 9 10 |
# File 'lib/br_nfe/base.rb', line 8 def env @env end |
#ibge_code_of_issuer_city ⇒ Object
Código IBGE da cidade emitente
11 12 13 |
# File 'lib/br_nfe/base.rb', line 11 def ibge_code_of_issuer_city @ibge_code_of_issuer_city end |
#ibge_code_of_issuer_uf ⇒ Object
Código IBGE do estado emitente
17 18 19 |
# File 'lib/br_nfe/base.rb', line 17 def ibge_code_of_issuer_uf @ibge_code_of_issuer_uf end |
Instance Method Details
#certificado_obrigatorio? ⇒ Boolean
Método que deve ser sobrescrito para as ações que necessitam do certificate_pkcs12 para assinatura
26 27 28 |
# File 'lib/br_nfe/base.rb', line 26 def certificado_obrigatorio? false end |
#certificate ⇒ Object
215 216 217 |
# File 'lib/br_nfe/base.rb', line 215 def certificate @certificate ||= certificate_pkcs12.try :certificate end |
#certificate=(value) ⇒ Object
211 212 213 |
# File 'lib/br_nfe/base.rb', line 211 def certificate=(value) @certificate = value end |
#certificate_key ⇒ Object
219 220 221 |
# File 'lib/br_nfe/base.rb', line 219 def certificate_key @certificate_key ||= certificate_pkcs12.try :key end |
#certificate_key=(value) ⇒ Object
223 224 225 |
# File 'lib/br_nfe/base.rb', line 223 def certificate_key=(value) @certificate_key = value end |
#certificate_pkcs12 ⇒ Object
189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 |
# File 'lib/br_nfe/base.rb', line 189 def certificate_pkcs12 return @certificate_pkcs12 if @certificate_pkcs12 @certificate_pkcs12 = nil # É utilizado uma Thread e limpado os errors do OpenSSL para evitar perda de # conexão com o banco de dados PostgreSQL. # Veja: http://stackoverflow.com/questions/33112155/pgconnectionbad-pqconsumeinput-ssl-error-key-values-mismatch/36283315#36283315 # Veja: https://github.com/tedconf/front_end_builds/pull/66 Thread.new do @certificate_pkcs12 = OpenSSL::PKCS12.new(certificate_pkcs12_value, certificate_pkcs12_password) OpenSSL.errors.clear end.join OpenSSL.errors.clear @certificate_pkcs12 rescue end |
#certificate_pkcs12=(value) ⇒ Object
207 208 209 |
# File 'lib/br_nfe/base.rb', line 207 def certificate_pkcs12=(value) @certificate_pkcs12 = value end |
#client_wsdl ⇒ Object
Cliente WSDL utilizado para fazer a requisição. Utilizando a gem savon. Veja mais detalhes em savonrb.com/version2/client.html
179 180 181 |
# File 'lib/br_nfe/base.rb', line 179 def client_wsdl @client_wsdl ||= Savon.client client_wsdl_params end |
#client_wsdl_params ⇒ Object
167 168 169 170 171 172 173 174 |
# File 'lib/br_nfe/base.rb', line 167 def client_wsdl_params { wsdl: url_wsdl, log: BrNfe.client_wsdl_log, pretty_print_xml: BrNfe.client_wsdl_pretty_print_xml, ssl_verify_mode: :none } end |
#content_xml ⇒ Object
Esse método serve para ser utilizado no Base de cada orgão emissor onde em alguns casos é necessário colocar o xml em um CDATA É esse método que é passado dentro do Body da equisição SOAP
83 84 85 |
# File 'lib/br_nfe/base.rb', line 83 def content_xml xml_builder end |
#env_namespace ⇒ Object
Namespace da requisição SOAP
48 49 50 |
# File 'lib/br_nfe/base.rb', line 48 def env_namespace :soapenv end |
#env_test? ⇒ Boolean
34 35 36 |
# File 'lib/br_nfe/base.rb', line 34 def env_test? env == :test end |
#find_xml(file_name, dir, context = nil, options = {}) ⇒ Object
262 263 264 265 266 |
# File 'lib/br_nfe/base.rb', line 262 def find_xml(file_name, dir, context=nil, ={}) if File.exists?("#{dir}/#{file_name}.xml.slim") Slim::Template.new("#{dir}/#{file_name}.xml.slim").render(context, ).html_safe end end |
#get_xml_dirs(custom_dir_path = nil) ⇒ Object
268 269 270 |
# File 'lib/br_nfe/base.rb', line 268 def get_xml_dirs(custom_dir_path=nil) [custom_dir_path, xml_current_dir_path, xml_default_dir_path].flatten.select(&:present?) end |
#id_attribute? ⇒ Boolean
Para saber se deve add o attr id na assinatura
53 54 55 |
# File 'lib/br_nfe/base.rb', line 53 def id_attribute? true end |
#message_namespaces ⇒ Object
121 122 123 |
# File 'lib/br_nfe/base.rb', line 121 def {} end |
#method_wsdl ⇒ Object
Método que contem qual a operação que deverá ser chamada do WS SOAP.
67 68 69 |
# File 'lib/br_nfe/base.rb', line 67 def method_wsdl raise "Não implementado." end |
#namespace_for_signature ⇒ Object
Utilizado para colocar o namespace nas tags da assiantura Exemplo: <ns2:Signature Id=“?”>
<ns2:SignedInfo Id="?">
<ns2:CanonicalizationMethod Algorithm="?">?</ns2:CanonicalizationMethod>
.....
118 119 |
# File 'lib/br_nfe/base.rb', line 118 def namespace_for_signature end |
#namespace_for_tags ⇒ Object
Utilizado para colocar o namespace nas tags de valores Exemplo: <ns1:LoteRps id=“123”>
<ns1:NumeroLote>3311</ns1:NumeroLote>
<ns1:Cnpj>23020443000140</ns1:Cnpj>
108 109 |
# File 'lib/br_nfe/base.rb', line 108 def end |
#namespace_identifier ⇒ Object
O Namespace Indentifier é utilizado para adicionar o namespace na tag principal da requisição. Normalmente deve seguir o namespace utilizado para identificar o namespace da mensagem.
Exemplo: se o método message_namespaces for BrNfe::Base.xmlns:ns1=“httpxmlns:ns1=“http.…” então o namespace_identifier deveria ser ‘ns1:’. E com isso irá adicionar o namespace na tag principal da requsição. Exemplo com a requisição EnviarLoteRps: COM namespace_identifier => ns1:EnviarLoteRpsEnvio SEM namespace_identifier => EnviarLoteRpsEnvio
Tipo de retorno: String OR Nil
100 101 |
# File 'lib/br_nfe/base.rb', line 100 def namespace_identifier end |
#original_response ⇒ Object
38 39 40 |
# File 'lib/br_nfe/base.rb', line 38 def original_response @original_response end |
#render_xml(file_name, opts = {}) ⇒ Object
Renderiza o xml a partir do nome de um arquivo Irá procurar o arquivo a partir dos seguintes diretórios> 1° - A partir do parâmetro :dir_path 2° - A partir do método xml_current_dir_path 3° - A partir do método xml_default_dir_path
Se não encontrar o arquivo em nenhum dos diretórios irá execurar uma excessão de RuntimeError
Utilização ‘render_xml(’file_name’, ‘/my/custom/dir’, context: Object‘
<b>Tipo de retorno: <b> String (XML)
241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 |
# File 'lib/br_nfe/base.rb', line 241 def render_xml file_name, opts={} opts ||= {} = opts.extract!(:dir_path, :context) [:context] ||= self # Inicializa a variavel xml com nil para comparar se oa rquivo foi de fato encontrado. xml = nil get_xml_dirs([:dir_path]).each do |dir| if xml = find_xml(file_name, dir, [:context], opts) break # Stop loop end end # Lança uma excessão se não for encontrado o xml # Deve verificar se é nil pois o arquivo xml pode estar vazio if xml.nil? raise "Arquivo #{file_name}.xml.slim não encontrado nos diretórios #{get_xml_dirs([:dir_path])}" end xml end |
#response ⇒ Object
42 43 44 |
# File 'lib/br_nfe/base.rb', line 42 def response @response end |
#response_encoding ⇒ Object
138 139 140 |
# File 'lib/br_nfe/base.rb', line 138 def response_encoding "UTF-8" end |
#sign_xml(xml, sign_nodes = []) ⇒ Object
USE EXAMPLE
@xml = <?xml version="1.0" encoding="ISO-8859-1"?>
<EnviarLoteRpsEnvio xmlns="http://www.abrasf.org.br/ABRASF/arquivos/nfse.xsd">
<LoteRps id="L2">
...
<ListaRps>
<Rps>
<InfRps id="R2">
...
</>InfRps
</Rps>
<Rps>
<InfRps id="R3">
...
</>InfRps
</Rps>
</ListaRps>
</LoteRps>
</EnviarLoteRpsEnvio>
sign_nodes = [
{
node_path: “//nf:EnviarLoteRpsEnvio/nf:LoteRps/nf:ListaRps/nf:Rps/nf:InfRps”, node_namespaces: ‘www.abrasf.org.br/ABRASF/arquivos/nfse.xsd’, node_ids: [‘R2’,‘R3’]
},
{
node_path: "//nf:EnviarLoteRpsEnvio/nf:LoteRps",
node_namespaces: {nf: 'http://www.abrasf.org.br/ABRASF/arquivos/nfse.xsd'},
node_ids: ['L2']
},
]
Call Method: sign_xml(@xml, sign_nodes)
340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 |
# File 'lib/br_nfe/base.rb', line 340 def sign_xml(xml, sign_nodes=[]) return xml unless certificate signer = Signer.new(xml) signer.cert = certificate signer.private_key = certificate_key # Como o documento não é um envelope SOAP preciso setar o security_node e o security_token_id signer.security_node = signer.document.root signer.security_token_id = "" sign_nodes.each do || node_ids = [[:node_ids]].flatten signer.document.xpath([:node_path], [:node_namespaces]).each_with_index do |node, i| # digo quais tags devem ser assinadas signer.digest!(node, id: "#{node_ids[i]}", enveloped: true) end end # Assina o XML signer.sign!(security_token: false, issuer_serial: true) signer.to_xml end |
#signature_type ⇒ Object
Existem 2 tipos de assinatura da NFS-e
:default-
Assina o XML no momento em que está sendo montado. Funciona normalmente para a maiora das prefeituras. Primeiro assina cada RPS individualmente e adiciona a tag da assinatura e depois Assina o LOTE RPS com todas os RPSs assinados
:method_sign-
Assina o XML após a montagem do mesmo. Utiliza a gem ‘signer’ para assinar os nós do XML. Adiciona toda a assinatura no final do XML, diferente do que é descrito nas documentações. Porém em algumas cidades só consegui validar a assinatura utilizando esse método Estava dando o erro: E515 - Erro ao validar assinatura. - Remessa adulterada após a assinatura.
298 299 300 |
# File 'lib/br_nfe/base.rb', line 298 def signature_type :default end |
#signature_type?(type) ⇒ Boolean
301 302 303 |
# File 'lib/br_nfe/base.rb', line 301 def signature_type?(type) signature_type == type end |
#soap_namespaces ⇒ Object
125 126 127 128 129 130 131 132 |
# File 'lib/br_nfe/base.rb', line 125 def soap_namespaces { 'xmlns:soapenv' => 'http://schemas.xmlsoap.org/soap/envelope/', 'xmlns:ins0' => 'http://www.w3.org/2000/09/xmldsig#', 'xmlns:xsd' => 'http://www.w3.org/2001/XMLSchema', 'xmlns:xsi' => 'http://www.w3.org/2001/XMLSchema-instance' } end |
#soap_xml ⇒ Object
XML que irá na requisição SOAP
Tipo de retorno: _String XML_
154 155 156 |
# File 'lib/br_nfe/base.rb', line 154 def soap_xml @soap_xml ||= "#{tag_xml}#{render_xml('soap_env')}".html_safe end |
#tag_xml ⇒ Object
Tag XML que vai na requisição SOAP
Tipo de retorno: String
146 147 148 |
# File 'lib/br_nfe/base.rb', line 146 def tag_xml "<?xml version=\"1.0\" encoding=\"#{wsdl_encoding}\"?>" end |
#url_wsdl ⇒ Object
Deve conter o LINK do webservice a ser chamado TODO: Remover método quando reconfigurar a emissão das notas de serviço
60 61 62 |
# File 'lib/br_nfe/base.rb', line 60 def url_wsdl raise "Não implementado." end |
#wsdl_encoding ⇒ Object
134 135 136 |
# File 'lib/br_nfe/base.rb', line 134 def wsdl_encoding "UTF-8" end |
#xml_builder ⇒ Object
O xml_builder é o que contém o conteúdo de cada tipo de requisição e deve ser sobrescrito em cada classe implementada. Por exemplo: recepcao_lote_rps, consulta_lote_rps, cancelamento_nfs, etc..
75 76 77 |
# File 'lib/br_nfe/base.rb', line 75 def xml_builder raise "Não implementado." end |
#xml_current_dir_path ⇒ Object
Diretório personalizado para cada classe Podendo ser sobrescrito em cada herança
275 276 277 |
# File 'lib/br_nfe/base.rb', line 275 def xml_current_dir_path [] end |
#xml_default_dir_path ⇒ Object
Diretório padrão dos arquivos XML
281 282 283 |
# File 'lib/br_nfe/base.rb', line 281 def xml_default_dir_path "#{BrNfe.root}/lib/br_nfe/xml" end |
#xml_version ⇒ Object
Versão do XML utilizado Cada Cidade pode utilizar uma versão diferente do XML
Tipo de retorno: Symbol
163 164 165 |
# File 'lib/br_nfe/base.rb', line 163 def xml_version :v1 end |