/// <summary>
/// Metodo responsável por invocar o serviço do WebService do SEFAZ
/// </summary>
/// <param name="wsProxy">Objeto da classe construida do WSDL</param>
/// <param name="servicoWS">Objeto da classe de envio do XML</param>
/// <param name="metodo">Método da classe de envio do XML que faz o envio</param>
/// <param name="cabecMsg">Objeto da classe de cabecalho do serviço</param>
/// <param name="servicoNFe">Objeto do Serviço de envio da NFE do UniNFe</param>
/// <param name="finalArqEnvio">string do final do arquivo a ser enviado. Sem a extensão ".xml"</param>
/// <param name="finalArqRetorno">string do final do arquivo a ser gravado com o conteúdo do retorno. Sem a extensão ".xml"</param>
/// <remarks>
/// Autor: Wandrey Mundin Ferreira
/// Data: 17/03/2010
/// </remarks>
public void Invocar(WebServiceProxy wsProxy,
object servicoWS,
string metodo,
object cabecMsg,
object servicoNFe,
string finalArqEnvio,
string finalArqRetorno)
{
int emp = Empresas.FindEmpresaByThread();
XmlDocument docXML = new XmlDocument();
// Definir o tipo de serviço da NFe
Type typeServicoNFe = servicoNFe.GetType();
Servicos servico = (Servicos)wsProxy.GetProp(servicoNFe, NFe.Components.NFeStrConstants.Servico);
// Resgatar o nome do arquivo XML a ser enviado para o webservice
string XmlNfeDadosMsg = (string)(typeServicoNFe.InvokeMember("NomeArquivoXML", System.Reflection.BindingFlags.GetProperty, null, servicoNFe, null));
// Exclui o Arquivo de Erro
Functions.DeletarArquivo(Empresas.Configuracoes[emp].PastaXmlRetorno + "\\" + Functions.ExtrairNomeArq(XmlNfeDadosMsg, finalArqEnvio + ".xml") + finalArqRetorno + ".err");
// Validar o Arquivo XML
ValidarXML validar = new ValidarXML(XmlNfeDadosMsg, Empresas.Configuracoes[emp].UnidadeFederativaCodigo);
string cResultadoValidacao = validar.ValidarArqXML(XmlNfeDadosMsg);
if (cResultadoValidacao != "")
{
throw new Exception(cResultadoValidacao);
}
// Montar o XML de Lote de envio de Notas fiscais
docXML.Load(XmlNfeDadosMsg);
// Definir Proxy
if (ConfiguracaoApp.Proxy)
{
wsProxy.SetProp(servicoWS, "Proxy", Proxy.DefinirProxy(ConfiguracaoApp.ProxyServidor, ConfiguracaoApp.ProxyUsuario, ConfiguracaoApp.ProxySenha, ConfiguracaoApp.ProxyPorta, ConfiguracaoApp.DetectarConfiguracaoProxyAuto));
}
// Limpa a variável de retorno
XmlNode XmlRetorno = null;
string strRetorno = string.Empty;
//Vou mudar o timeout para evitar que demore a resposta e o uninfe aborte antes de recebe-la. Wandrey 17/09/2009
//Isso talvez evite de não conseguir o número do recibo se o serviço do SEFAZ estiver lento.
wsProxy.SetProp(servicoWS, "Timeout", 60000);
//Verificar antes se tem conexão com a internet, se não tiver já gera uma exceção no padrão já esperado pelo ERP
if (ConfiguracaoApp.ChecarConexaoInternet)
if (!Functions.IsConnectedToInternet())
{
//Registrar o erro da validação para o sistema ERP
throw new ExceptionSemInternet(ErroPadrao.FalhaInternet, "\r\nArquivo: " + XmlNfeDadosMsg);
}
//Atribuir conteúdo para uma propriedade da classe NfeStatusServico2
switch (servico)
{
case Servicos.MDFePedidoConsultaSituacao:
case Servicos.MDFePedidoSituacaoLote:
case Servicos.MDFeEnviarLote:
case Servicos.MDFeConsultaStatusServico:
case Servicos.MDFeRecepcaoEvento:
case Servicos.MDFeConsultaNaoEncerrado:
wsProxy.SetProp(servicoWS, "mdfeCabecMsgValue", cabecMsg);
break;
case Servicos.CTeInutilizarNumeros:
case Servicos.CTePedidoConsultaSituacao:
case Servicos.CTePedidoSituacaoLote:
case Servicos.CTeEnviarLote:
case Servicos.CTeRecepcaoEvento:
case Servicos.CTeConsultaStatusServico:
if (wsProxy.GetProp(cabecMsg, NFe.Components.TpcnResources.cUF.ToString()).ToString() == "50") //Mato Grosso do Sul fugiu o padrão nacional
{
try
{
wsProxy.SetProp(servicoWS, "cteCabecMsg", cabecMsg);
}
catch //Se der erro é pq não está no ambiente normal então tem que ser o nome padrão pois Mato Grosso do Sul fugiu o padrão nacional.
{
wsProxy.SetProp(servicoWS, "cteCabecMsgValue", cabecMsg);
}
}
else
{
wsProxy.SetProp(servicoWS, "cteCabecMsgValue", cabecMsg);
}
break;
case Servicos.DFeEnviar:
break;
case Servicos.LMCAutorizacao:
break;
default:
wsProxy.SetProp(servicoWS, "nfeCabecMsgValue", cabecMsg);
break;
}
// Envio da NFe Compactada - Renan
if (servico == Servicos.NFeEnviarLoteZip2)
{
XmlNfeDadosMsg = XmlNfeDadosMsg + ".gz";
FileInfo XMLNfeZip = new FileInfo(XmlNfeDadosMsg);
string encodedData = StreamExtensions.ToBase64(XMLNfeZip);
XmlRetorno = wsProxy.InvokeXML(servicoWS, metodo, new object[] { encodedData });
}
else
XmlRetorno = wsProxy.InvokeXML(servicoWS, metodo, new object[] { docXML });
if (XmlRetorno == null)
throw new Exception("Erro de envio da solicitação do serviço: " + servico.ToString());
typeServicoNFe.InvokeMember("vStrXmlRetorno", System.Reflection.BindingFlags.SetProperty, null, servicoNFe, new object[] { XmlRetorno.OuterXml });
// Registra o retorno de acordo com o status obtido
if (finalArqEnvio != string.Empty && finalArqRetorno != string.Empty)
{
typeServicoNFe.InvokeMember("XmlRetorno", System.Reflection.BindingFlags.InvokeMethod, null, servicoNFe, new Object[] { finalArqEnvio + ".xml", finalArqRetorno + ".xml" });
}
}