Class: BrNfe::Service::Response::Build::Base
- Inherits:
-
ActiveModelBase
- Object
- ActiveModelBase
- BrNfe::Service::Response::Build::Base
- Defined in:
- lib/br_nfe/service/response/build/base.rb
Direct Known Subclasses
Cancelamento, ConsultaSituacaoLoteRps, InvoiceBuild, RecepcaoLoteRps
Instance Attribute Summary collapse
-
#body_xml_path ⇒ Object
3: Alguns Webservices trazem dentro do body da resposta SOAp outro XML com as informações necessárias.
-
#keys_root_path ⇒ Object
2: Um array com o caminho inicial padrão da requisição de retorno.
-
#lot_number_path ⇒ Object
Caminho para encontrar.
-
#message_code_key ⇒ Object
chave que representa o codigo do erro.
-
#message_errors_path ⇒ Object
local para encontrar as mensagens de erro.
-
#message_msg_key ⇒ Object
chave que representa a mensagem do erro.
-
#message_solution_key ⇒ Object
chave que representa a solução do erro.
-
#savon_response ⇒ Object
1: A resposta da requisição soap.
-
#xml_encode ⇒ Object
4: Codificação original do XML de resposta para que seja convertido para UTF-8.
Attributes inherited from ActiveModelBase
Instance Method Summary collapse
-
#body_converted_to_xml ⇒ Object
Converte o body da requisição em XML (String) Isso é necessário quando dentro do body vem a resposta com outro XML.
- #default_values ⇒ Object
-
#find_value_for_keys(hash, keys) ⇒ Object
Método utilizado para encontrar valores em um Hash passando o caminho do valor em um array onde contém as chaves ordenadas.
-
#get_lot_number ⇒ Object
Método utilizado para pegar o número do lote RPS.
-
#get_message_for_hash(msg_hash) ⇒ Object
Método utilizado para quando encontrar uam mensagem que seja um HAsh, onde nesse caso a mensagem terá um codigo de erro, uma mensagem, e uma mensagem de solução.
-
#get_message_for_path(msg_path) ⇒ Object
Método que retorna as mensagens de retorno da requisição Quando procurar a mensagem a mesma pode retornar em 3 formatos: Hash: Onde encontrou apenas 1 mensagem com Codigo, Mensagem e Solução Array: Onde encontrou mais de uma mensagem com Codigo, Mensagem e Solução String: Onde encontrou uma unica mensagem de texto.
-
#path_with_root(path) ⇒ Object
Quando para encontrar o valor de uma determinada chave é necessaŕio percorer o hash de retorno dês do inicio do mesmo.
-
#response ⇒ Object
FIM DA DEFINIÇÃO DOS CAMINHOS ############################.
-
#savon_body ⇒ Object
Retorna o valor encontrado no body da resposta Savon em formato de hash.
Methods inherited from ActiveModelBase
#assign_attributes, #initialize
Constructor Details
This class inherits a constructor from BrNfe::ActiveModelBase
Instance Attribute Details
#body_xml_path ⇒ Object
3: Alguns Webservices trazem dentro do body da resposta SOAp outro XML com as informações necessárias. Quando isso aocntece é preciso converter esse XML para um HASH para que possamos encontrar os valores necessários.
17 18 19 |
# File 'lib/br_nfe/service/response/build/base.rb', line 17 def body_xml_path @body_xml_path end |
#keys_root_path ⇒ Object
2: Um array com o caminho inicial padrão da requisição de retorno
11 12 13 |
# File 'lib/br_nfe/service/response/build/base.rb', line 11 def keys_root_path @keys_root_path end |
#lot_number_path ⇒ Object
Caminho para encontrar
26 27 28 |
# File 'lib/br_nfe/service/response/build/base.rb', line 26 def lot_number_path @lot_number_path end |
#message_code_key ⇒ Object
chave que representa o codigo do erro
28 29 30 |
# File 'lib/br_nfe/service/response/build/base.rb', line 28 def @message_code_key end |
#message_errors_path ⇒ Object
local para encontrar as mensagens de erro
27 28 29 |
# File 'lib/br_nfe/service/response/build/base.rb', line 27 def @message_errors_path end |
#message_msg_key ⇒ Object
chave que representa a mensagem do erro
29 30 31 |
# File 'lib/br_nfe/service/response/build/base.rb', line 29 def @message_msg_key end |
#message_solution_key ⇒ Object
chave que representa a solução do erro
30 31 32 |
# File 'lib/br_nfe/service/response/build/base.rb', line 30 def @message_solution_key end |
#savon_response ⇒ Object
1: A resposta da requisição soap
8 9 10 |
# File 'lib/br_nfe/service/response/build/base.rb', line 8 def savon_response @savon_response end |
#xml_encode ⇒ Object
4: Codificação original do XML de resposta para que seja convertido
para UTF-8
21 22 23 |
# File 'lib/br_nfe/service/response/build/base.rb', line 21 def xml_encode @xml_encode end |
Instance Method Details
#body_converted_to_xml ⇒ Object
Converte o body da requisição em XML (String) Isso é necessário quando dentro do body vem a resposta com outro XML
Tipo de retorno: String
67 68 69 |
# File 'lib/br_nfe/service/response/build/base.rb', line 67 def body_converted_to_xml @body_converted_to_xml ||= canonicalize("#{find_value_for_keys(savon_response.try(:body), body_xml_path)}".encode(xml_encode).force_encoding('UTF-8')) end |
#default_values ⇒ Object
32 33 34 35 36 37 38 |
# File 'lib/br_nfe/service/response/build/base.rb', line 32 def default_values super.merge({ message_code_key: :codigo, message_msg_key: :mensagem, message_solution_key: :correcao, }) end |
#find_value_for_keys(hash, keys) ⇒ Object
Método utilizado para encontrar valores em um Hash passando o caminho do valor em um array onde contém as chaves ordenadas. Recebe 2 parêmntros: 1º um o hash onde contém o valor a ser encontrado 2º um array com as chaves em sequencia formando o caminho para encontrar o valor.
A funcionalidade desse método funciona parecido com o ‘.dig` da classe Hash do Ruby 2.3.0. A diferença é que no caso de exmeplo a seguir não apresenta uma excessão par ao usuário hash = {v2: ’valor string’} hash.dig(:v1, :v2, :v3) <- Dá erro find_value_for_keys(hash, [:v1, :v2, :v3] <- Retorna nil e não da erro
Tipo de retorno: Anything
87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 |
# File 'lib/br_nfe/service/response/build/base.rb', line 87 def find_value_for_keys(hash, keys) return if keys.blank? keys = [keys] unless keys.is_a?(Array) result = hash keys.each do |key| if result.is_a?(Hash) result = result[key] else result = nil break end end result end |
#get_lot_number ⇒ Object
Método utilizado para pegar o número do lote RPS
Tipo de retorno: String
157 158 159 |
# File 'lib/br_nfe/service/response/build/base.rb', line 157 def get_lot_number find_value_for_keys(savon_body, path_with_root(lot_number_path)) end |
#get_message_for_hash(msg_hash) ⇒ Object
Método utilizado para quando encontrar uam mensagem que seja um HAsh, onde nesse caso a mensagem terá um codigo de erro, uma mensagem, e uma mensagem de solução
Tipo de retorno: hash
144 145 146 147 148 149 150 |
# File 'lib/br_nfe/service/response/build/base.rb', line 144 def (msg_hash) { code: find_value_for_keys(msg_hash, ), message: find_value_for_keys(msg_hash, ), solution: find_value_for_keys(msg_hash, ) } end |
#get_message_for_path(msg_path) ⇒ Object
Método que retorna as mensagens de retorno da requisição Quando procurar a mensagem a mesma pode retornar em 3 formatos: Hash: Onde encontrou apenas 1 mensagem com Codigo, Mensagem e Solução Array: Onde encontrou mais de uma mensagem com Codigo, Mensagem e Solução String: Onde encontrou uma unica mensagem de texto
Tipo de retorno: Array
125 126 127 128 129 130 131 132 133 134 135 136 |
# File 'lib/br_nfe/service/response/build/base.rb', line 125 def (msg_path) = [] = find_value_for_keys(savon_body, path_with_root(msg_path) ) if .is_a?(Hash) << () elsif .is_a?(Array) .map{|msg| << (msg) if msg.present? } elsif .present? << end .uniq end |
#path_with_root(path) ⇒ Object
Quando para encontrar o valor de uma determinada chave é necessaŕio percorer o hash de retorno dês do inicio do mesmo. Como a mensagem tem uma chave ‘root’ padrão e pode ser diferente para cada orgaao emissor, é setado uma valor na variavel keys_root_path para que não seja necessário ficar setando a mesma chave em todos os métodos utilizados para encontrar determinado valor
Tipo de retorno: Array
112 113 114 115 |
# File 'lib/br_nfe/service/response/build/base.rb', line 112 def path_with_root(path) return if path.blank? keys_root_path + [path].flatten end |
#response ⇒ Object
FIM DA DEFINIÇÃO DOS CAMINHOS ############################
42 43 44 |
# File 'lib/br_nfe/service/response/build/base.rb', line 42 def response raise "O método #response deve ser implementado na classe #{self.class}" end |
#savon_body ⇒ Object
Retorna o valor encontrado no body da resposta Savon em formato de hash
Tipo de retorno: Hash
51 52 53 54 55 56 57 58 59 60 |
# File 'lib/br_nfe/service/response/build/base.rb', line 51 def savon_body return @savon_body if @savon_body.present? if body_xml_path.present? @savon_body = Nori.new.parse( body_converted_to_xml ).deep_transform_keys!{|k| k.to_s.underscore.to_sym} else @savon_body = savon_response.try(:body) || {} end end |