Class: BrNfe::Product::Operation::Base

Inherits:
Base show all
Includes:
NfXmlValue
Defined in:
lib/br_nfe/product/operation/base.rb

Instance Attribute Summary collapse

Attributes inherited from Base

#certificate_pkcs12_password, #certificate_pkcs12_path, #certificate_pkcs12_value, #env, #ibge_code_of_issuer_city, #ibge_code_of_issuer_uf

Attributes inherited from ActiveModelBase

#reference

Instance Method Summary collapse

Methods included from NfXmlValue

#nf_xml_fixed_code, #nf_xml_value_CEP, #nf_xml_value_CEST, #nf_xml_value_CFOP, #nf_xml_value_CNAE, #nf_xml_value_CRT, #nf_xml_value_EAN, #nf_xml_value_EXTIPI, #nf_xml_value_IE, #nf_xml_value_IM, #nf_xml_value_ISSQN_incentivo_fiscal, #nf_xml_value_NCM, #nf_xml_value_NVE, #nf_xml_value_RNTC, #nf_xml_value_UF, #nf_xml_value_boolean, #nf_xml_value_chave_nfe, #nf_xml_value_cnpj, #nf_xml_value_codigo_enquadramento_IPI, #nf_xml_value_codigo_ibge_municipio, #nf_xml_value_codigo_nf, #nf_xml_value_codigo_pais, #nf_xml_value_consumidor_final, #nf_xml_value_cpf, #nf_xml_value_date, #nf_xml_value_date_time, #nf_xml_value_drawback, #nf_xml_value_email, #nf_xml_value_float, #nf_xml_value_fone, #nf_xml_value_id_estrangeiro, #nf_xml_value_id_local_destino, #nf_xml_value_indicador_IE, #nf_xml_value_indicador_sincrono, #nf_xml_value_inscricao_suframa, #nf_xml_value_monetary, #nf_xml_value_number, #nf_xml_value_number_fixed_size, #nf_xml_value_numero_recibo, #nf_xml_value_orgao_emissor, #nf_xml_value_percent, #nf_xml_value_peso, #nf_xml_value_placa, #nf_xml_value_quantidade, #nf_xml_value_text, #nf_xml_value_time, #nf_xml_value_tipo_ambiente

Methods inherited from Base

#certificate, #certificate=, #certificate_key, #certificate_key=, #certificate_pkcs12, #certificate_pkcs12=, #client_wsdl, #content_xml, #env_namespace, #env_test?, #find_xml, #get_xml_dirs, #id_attribute?, #message_namespaces, #method_wsdl, #namespace_for_signature, #namespace_for_tags, #namespace_identifier, #original_response, #render_xml, #response_encoding, #sign_xml, #signature_type, #signature_type?, #soap_namespaces, #soap_xml, #ssl_version, #tag_xml, #wsdl, #wsdl_encoding, #xml_builder, #xml_default_dir_path

Methods included from Association::HaveEmitente

#emitente, #emitente=

Methods inherited from ActiveModelBase

#assign_attributes, #initialize

Constructor Details

This class inherits a constructor from BrNfe::ActiveModelBase

Instance Attribute Details

#inicio_contingenciaObject

Data e hora do início da contingência



19
20
21
# File 'lib/br_nfe/product/operation/base.rb', line 19

def inicio_contingencia
  @inicio_contingencia
end

#motivo_contingenciaObject

Informações que devem ser informadas quando a operação for em contingência.



18
19
20
# File 'lib/br_nfe/product/operation/base.rb', line 18

def motivo_contingencia
  @motivo_contingencia
end

#original_xmlObject

String XML que será aplicado o resultado da resposta do serviço de acordo com a operação. Por exemplo, quando vai consultar o protocolo da emissão de uma nfe, deve ser passado por parâmetro o XML da NF-e para que seja possível obter o XML da nota fiscal junto com o protocolo de autorização. Também quando for cancelar uma nota fiscal deve passar o XML da nota para que seja adicionado o protocolo de confirmação de cancelamento junto a nota.

Required: No Type: String XML



35
36
37
# File 'lib/br_nfe/product/operation/base.rb', line 35

def original_xml
  @original_xml
end

#tipo_emissaoObject

Serve para saber se vai usar o módo de contingência, e se usar, serve para saber qual o tipo de contingência será utilizado. Options: [:normal, :svc]

Required: Yes Default: :normal



14
15
16
# File 'lib/br_nfe/product/operation/base.rb', line 14

def tipo_emissao
  @tipo_emissao
end

Instance Method Details

#certificado_obrigatorio?Boolean

Returns:

  • (Boolean)


47
48
49
# File 'lib/br_nfe/product/operation/base.rb', line 47

def certificado_obrigatorio?
	true
end

#codigo_tipo_emissao(nfe) ⇒ Object

Código do Tipo de Emissão da NF-e

✓ 1=Emissão normal (não em contingência);
✕ 2=Contingência FS-IA, com impressão do DANFE em formulário de segurança;
✕ 3=Contingência SCAN (Sistema de Contingência do Ambiente Nacional);
✕ 4=Contingência DPEC (Declaração Prévia da Emissão em Contingência);
✕ 5=Contingência FS-DA, com impressão do DANFE em formulário de segurança;
✓ 6=Contingência SVC-AN (SEFAZ Virtual de Contingência do AN);
✓ 7=Contingência SVC-RS (SEFAZ Virtual de Contingência do RS);
✓ 9=Contingência off-line da NFC-e (as demais opções de contingência são válidas 
    também para a NFC-e).
Para a NFC-e somente estão disponíveis e são válidas as opções de contingência 5 e 9.


203
204
205
206
207
208
209
210
211
212
213
214
215
# File 'lib/br_nfe/product/operation/base.rb', line 203

def codigo_tipo_emissao(nfe)
	return 9 if nfe.nfce?
	case tipo_emissao
	when :normal 
		1
	when :svc
		if gateway.is_a?(BrNfe::Product::Gateway::WebServiceSvcAN) # SVC-AN
			6
		else # SVC-RS
			7
		end
	end
end

#contingencia?Boolean

Método utilizado para saber se a operação será em contingência.

Tipo de retorno: Boolean

Returns:

  • (Boolean)


188
189
190
# File 'lib/br_nfe/product/operation/base.rb', line 188

def contingencia?
	tipo_emissao != :normal
end

#default_valuesObject



41
42
43
44
45
# File 'lib/br_nfe/product/operation/base.rb', line 41

def default_values
	{
		tipo_emissao:   :normal,
	}
end

#gatewayObject

O Gateway é responsável de identificar o Webservice de acordo com o Estado(UF). Irá identificar o webservice através do valor do método ‘ibge_code_of_issuer_uf`, na qual pode ser setado diretamente ou pego através do endereço do emissor. Para ver a lista de WebService por estado acesse: www.nfe.fazenda.gov.br/portal/webServices.aspx

Tipo de retorno: _Object (Gateway::Base ou derivados)_



63
64
65
66
67
68
69
70
# File 'lib/br_nfe/product/operation/base.rb', line 63

def gateway
	@gateway ||= case tipo_emissao
	when :normal
		get_gateway_by_normal_operation
	when :svc
		get_gateway_by_svc_operation					
	end
end

#gateway_xml_versionObject

Irá retornar a versão setada de acordo com o serviço e estado. Deve ser sobrescrito para cada serviço e irá pegar a versão do XML de acordo com o Estado e Serviço, conforme descrito em: www.nfe.fazenda.gov.br/portal/webServices.aspx

Tipo de retorno: Symbol



140
141
142
# File 'lib/br_nfe/product/operation/base.rb', line 140

def gateway_xml_version
	raise "O método #gateway_xml_version deve ser implementar em cada operação"
end

#get_gateway_by_normal_operationObject

Seta o WebService quando o tipo de emissão for normal para cada UF

Tipo de retorno: _Object (Gateway::Base ou derivados)_



93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
# File 'lib/br_nfe/product/operation/base.rb', line 93

def get_gateway_by_normal_operation				
	case ibge_code_of_issuer_uf
	when '13'
		BrNfe::Product::Gateway::WebServiceAM.new({env: env})
	when '29'
		BrNfe::Product::Gateway::WebServiceBA.new({env: env})
	when '23'
		BrNfe::Product::Gateway::WebServiceCE.new({env: env})
	when '52'
		BrNfe::Product::Gateway::WebServiceGO.new({env: env})
	when '31'
		BrNfe::Product::Gateway::WebServiceMG.new({env: env})
	when '50'
		BrNfe::Product::Gateway::WebServiceMS.new({env: env})
	when '51'
		BrNfe::Product::Gateway::WebServiceMT.new({env: env})
	when '26'
		BrNfe::Product::Gateway::WebServicePE.new({env: env})
	when '41'
		BrNfe::Product::Gateway::WebServicePR.new({env: env})
	when '43'
		BrNfe::Product::Gateway::WebServiceRS.new({env: env})
	when '35'
		BrNfe::Product::Gateway::WebServiceSP.new({env: env})
	when '21', '15', '22'
		BrNfe::Product::Gateway::WebServiceSVAN.new({env: env})
	else
		BrNfe::Product::Gateway::WebServiceSVRS.new({env: env})
	end
end

#get_gateway_by_svc_operationObject

WebServices utilizados para contingência em SVC (Servidor Virtual de Contingência) Existe 2 servidores de contingência para SVC: O ‘SVC-AN` e `SVC-RS` Cada estado(UF) é autorizado a emitir notas em contingência em apenas 1 dos servidores. Esse método é responsável em setar qual o WebService será utilizado para cada UF.

Tipo de retorno: _Object (::WebServiceSvcRS ou ::WebServiceSvcAN)_



79
80
81
82
83
84
85
86
87
# File 'lib/br_nfe/product/operation/base.rb', line 79

def get_gateway_by_svc_operation
	case ibge_code_of_issuer_uf
	#    'AM', 'BA', 'CE', 'GO', 'MA', 'MS', 'MT', 'PA', 'PE', 'PI', 'PR'
	when '13', '29', '23', '52', '21', '50', '51', '15', '26', '22', '41'
		BrNfe::Product::Gateway::WebServiceSvcRS.new({env: env})
	else # AC, AL, AP, DF, ES, MG, PB, RJ, RN, RO, RR, RS, SC, SE, SP, TO 
		BrNfe::Product::Gateway::WebServiceSvcAN.new({env: env})					
	end
end

#requestObject



217
218
219
220
221
222
223
224
225
# File 'lib/br_nfe/product/operation/base.rb', line 217

def request
	@savon_response = client_wsdl.call(method_wsdl, xml: soap_xml)
rescue Savon::SOAPFault => error
	return @response = response_class_builder.new.response_class.new(request_status: :soap_error,    request_message_error: error.message)
rescue Savon::HTTPError => error
	return @response = response_class_builder.new.response_class.new(request_status: :http_error,    request_message_error: error.message)
rescue Exception => error
	return @response = response_class_builder.new.response_class.new(request_status: :unknown_error, request_message_error: error.message)
end

#responseObject



227
228
229
# File 'lib/br_nfe/product/operation/base.rb', line 227

def response
	@response ||= get_response
end

#ssl_request?Boolean

Para as Notas fiscais de produto a autenticação via SSL é obrigatória

Returns:

  • (Boolean)


52
53
54
# File 'lib/br_nfe/product/operation/base.rb', line 52

def ssl_request?
	true
end

#url_xmlnsObject

Valor utilizado para inserir a url do xmlns nas tags nfeCabecMsg e nfeDadosMsg. Como a url pode variar de acordo com o tipo de serviço e UF, deve ser sobrescrita na subclass de cada serviço.

Tipo de retorno: String



130
131
132
# File 'lib/br_nfe/product/operation/base.rb', line 130

def url_xmlns
	raise "O método #url_xmlns deve ser implementar em cada operação"
end

#xml_current_dir_pathObject

Declaro que o método ‘render_xml` irá verificar os arquivos também presentes nos diretórios especificados. O diretório dos XMLs irá variar de acordo com a operação e a versão do XML utilizado. EX:

Se a versão do XML que a operação utiliza for a versão 2.0, então irá procurar o arquivo
XML primeiro no diretório da v2, caso não encontre vai procurar no diretório da v1.
Já se a versão do XML for a versão 3.1, irá procurar primeiro no diretório v3_10,
se não contrar irá procurar no diretório da v2_00, e se ainda assim não encontrar, vai procurar
no diretório v1_00.

Foi construido dessa forma pois algumas tags utilizadas na v3.10 são exatamente iguais da v2.0, e nesse caso não há a necessidade de duplicar o código.

Tipo de retorno: Array



173
174
175
176
177
178
179
180
181
182
# File 'lib/br_nfe/product/operation/base.rb', line 173

def xml_current_dir_path
	return @xml_current_dir_path if @xml_current_dir_path.present?
	paths = ["#{BrNfe.root}/lib/br_nfe/product/xml/v1_00"] # Sempre terá o path da v1_00
	paths << "#{BrNfe.root}/lib/br_nfe/product/xml/v1_10" if gateway_xml_version >= :v1_10
	paths << "#{BrNfe.root}/lib/br_nfe/product/xml/v2_00" if gateway_xml_version >= :v2_00
	paths << "#{BrNfe.root}/lib/br_nfe/product/xml/v2_01" if gateway_xml_version >= :v2_01
	paths << "#{BrNfe.root}/lib/br_nfe/product/xml/v3_10" if gateway_xml_version == :v3_10
	
	@xml_current_dir_path = paths.reverse+["#{BrNfe.root}/lib/br_nfe/product/xml"]+super
end

#xml_versionObject

Versão do XML utilizado na requisição. Como a versão do XML pode divergir para cada estado/servidor e serviço, é necessário passar a versão do XML na requisição para o servidor saber qual validação aplicar e como pegar os dados. Esse método tem o intuíto de pegar a versão setada no Gateway de cada UF e serviço e transformar em uma String aplicável no XML. Exemplo:

Se a versão do xml for :v3_10
Esse método irá transformar o valor em '3.10'

Tipo de retorno: String



156
157
158
# File 'lib/br_nfe/product/operation/base.rb', line 156

def xml_version
	"#{gateway_xml_version}".gsub('_','.').gsub(/[^\d\.]/,'')
end