Class: BrNfe::Service::Response::Build::Base

Inherits:
ActiveModelBase show all
Defined in:
lib/br_nfe/service/response/build/base.rb

Instance Attribute Summary collapse

Attributes inherited from ActiveModelBase

#reference

Instance Method Summary collapse

Methods inherited from ActiveModelBase

#assign_attributes, #initialize

Constructor Details

This class inherits a constructor from BrNfe::ActiveModelBase

Instance Attribute Details

#body_xml_pathObject

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_pathObject

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_pathObject

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_keyObject

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
  @message_code_key
end

#message_errors_pathObject

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
  @message_errors_path
end

#message_msg_keyObject

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
  @message_msg_key
end

#message_solution_keyObject

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
  @message_solution_key
end

#savon_responseObject

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_encodeObject

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_xmlObject

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_valuesObject



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_numberObject

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 get_message_for_hash(msg_hash)
	{
		code:     find_value_for_keys(msg_hash, message_code_key),
		message:  find_value_for_keys(msg_hash, message_msg_key),
		solution: find_value_for_keys(msg_hash, message_solution_key)
	}
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 get_message_for_path(msg_path)
	messages = []
	_messages = find_value_for_keys(savon_body, path_with_root(msg_path) )
	if _messages.is_a?(Hash)
		messages << get_message_for_hash(_messages)
	elsif _messages.is_a?(Array)
		_messages.map{|msg| messages << get_message_for_hash(msg) if msg.present? }
	elsif _messages.present?
		messages << _messages
	end
	messages.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

#responseObject

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_bodyObject

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