Пример #1
0
        /// <summary>
        /// Consulta situação do Lote de MDFe (método acionado pelo usuário)
        /// </summary>
        /// <param name="idManifestoEletronico"></param>
        /// <returns></returns>
        public static string ConsultaSitLoteMDFe(int idManifestoEletronico)
        {
            var mdfe      = ManifestoEletronicoDAO.Instance.ObterManifestoEletronicoPeloId(idManifestoEletronico);
            var protocolo = ProtocoloMDFeDAO.Instance.GetElement(idManifestoEletronico, (int)ProtocoloMDFe.TipoProtocoloEnum.Autorizacao);

            #region Monta XML de requisição de situação do lote

            if (protocolo == null || string.IsNullOrEmpty(protocolo.NumRecibo))
            {
                throw new Exception("O MDFe não foi emitido. Não há número de recibo.");
            }

            string strXml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
                            "<consReciMDFe xmlns=\"http://www.portalfiscal.inf.br/mdfe\" " +
                            "versao=\"" + ConfigMDFe.VersaoRecepcao + "\">" +
                            "<tpAmb>" + (int)ConfigMDFe.TipoAmbiente + "</tpAmb>" +
                            "<nRec>" + protocolo.NumRecibo.PadLeft(15, '0') + "</nRec></consReciMDFe>";

            XmlDocument xmlRetRecep = new XmlDocument();
            xmlRetRecep.LoadXml(strXml);

            #endregion

            #region Valida XML

            try
            {
                ValidaXML.Validar(xmlRetRecep, ValidaXML.TipoArquivoXml.ConsultaRecibo);
            }
            catch (Exception ex)
            {
                throw ex;
            }

            #endregion

            // Guarda o status do lote
            var cStat   = 0;
            var xMotivo = string.Empty;

            XmlNode xmlRetorno = null;

            // Salva o callback padrão do WebService
            System.Net.Security.RemoteCertificateValidationCallback callback = System.Net.ServicePointManager.ServerCertificateValidationCallback;

            try
            {
                // Altera o callback de validação do WebService
                System.Net.ServicePointManager.ServerCertificateValidationCallback = delegate(object sender, System.Security.Cryptography.X509Certificates.X509Certificate cert, System.Security.Cryptography.X509Certificates.X509Chain chain, System.Net.Security.SslPolicyErrors error)
                {
                    // Verifica se a data do certificado é válida
                    DateTime beginDate   = DateTime.Parse(cert.GetEffectiveDateString());
                    DateTime endDate     = DateTime.Parse(cert.GetExpirationDateString());
                    bool     isDateValid = (DateTime.Now >= beginDate) && (DateTime.Now <= endDate);

                    // Retorna o resultado da função
                    return(isDateValid);
                };

                #region Envia o arquivo e recebe o retorno

                if (mdfe.TipoEmissao == Glass.Data.Model.TipoEmissao.Normal)
                {
                    if (ConfigMDFe.TipoAmbiente == ConfigMDFe.TipoAmbienteMDFe.Producao)
                    {
                        xmlRetorno = GetWebService.PSVRSMDFeRetornoRecepcao(mdfe, null).mdfeRetRecepcao(xmlRetRecep);
                    }
                    // TipoAmbienteMDFe.Homologacao
                    else
                    {
                        xmlRetorno = GetWebService.HSVRSMDFeRetornoRecepcao(mdfe, null).mdfeRetRecepcao(xmlRetRecep);
                    }
                }
                // TipoEmissao.Contingencia
                else
                {
                    if (ConfigMDFe.TipoAmbiente == ConfigMDFe.TipoAmbienteMDFe.Producao)
                    {
                        xmlRetorno = GetWebService.PSVRSMDFeRetornoRecepcao(mdfe, null).mdfeRetRecepcao(xmlRetRecep);
                    }
                    // TipoAmbienteMDFe.Homologacao
                    else
                    {
                        xmlRetorno = GetWebService.HSVRSMDFeRetornoRecepcao(mdfe, null).mdfeRetRecepcao(xmlRetRecep);
                    }
                }

                #endregion
            }
            catch (Exception ex)
            {
                throw new Exception(Glass.MensagemAlerta.FormatErrorMsg("Falha ao chamar WebService.", ex));
            }
            finally
            {
                // Restaura o callback padrão para o WebService
                System.Net.ServicePointManager.ServerCertificateValidationCallback = callback;
            }

            // Se o lote já tiver sido processado, sai do loop
            if (xmlRetorno != null) // Lote processado
            {
                cStat   = Conversoes.StrParaInt(xmlRetorno["cStat"].InnerXml);
                xMotivo = xmlRetorno["xMotivo"].InnerXml;
            }

            // Verifica o status do lote
            if (cStat == 104) // Lote processado
            {
                XmlNodeList protMDFeList = ((XmlElement)xmlRetorno).GetElementsByTagName("protMDFe");

                // Para cada protocolo de autorização de uso (inicialmente será só um, pois cada nota está sendo enviada em um lote distinto)
                foreach (XmlNode protMDFeNode in protMDFeList)
                {
                    return(ManifestoEletronicoDAO.Instance.RetornoEmissaoMDFe(idManifestoEletronico, protMDFeNode));
                }

                return("Lote processado");
            }
            else if (cStat == 105) // Lote em processamento
            {
                if (mdfe.Situacao != SituacaoEnum.ContingenciaOffline)
                {
                    ManifestoEletronicoDAO.Instance.AlteraSituacao(idManifestoEletronico, SituacaoEnum.ProcessoEmissao);
                }

                return("Este MDFe ainda está sendo processado pela SEFAZ, aguarde para realizar uma nova consulta.");
            }
            else if (cStat == 106) // Lote não encontrado
            {
                if (mdfe.Situacao != SituacaoEnum.ContingenciaOffline)
                {
                    ManifestoEletronicoDAO.Instance.AlteraSituacao(idManifestoEletronico, SituacaoEnum.FalhaEmitir);
                }

                LogMDFeDAO.Instance.NewLog(idManifestoEletronico, "Consulta", cStat, "Falha na emissão do MDFe. " + xMotivo);

                return("Falha na consulta. Não foi encontrado o lote de envio.");
            }
            else // Lote rejeitado
            {
                if (mdfe.Situacao != SituacaoEnum.ContingenciaOffline)
                {
                    ManifestoEletronicoDAO.Instance.AlteraSituacao(idManifestoEletronico, SituacaoEnum.FalhaEmitir);
                }

                LogMDFeDAO.Instance.NewLog(idManifestoEletronico, "Consulta", cStat, xMotivo);

                string msgErro = "Falha na consulta. ";

                if (cStat == 215 || cStat == 243 || cStat == 630)
                {
                    msgErro += "Mensagem de consulta inválida. ";
                }

                return(msgErro + cStat + " - " + CustomizaMensagemRejeicao(idManifestoEletronico, xMotivo));
            }
        }
Пример #2
0
        /// <summary>
        /// Consulta situação do MDFe
        /// </summary>
        /// <param name="idManifestoEletronico"></param>
        public static string ConsultaSitMDFe(int idManifestoEletronico)
        {
            // Busca dados do Manifesto Eletronico
            var mdfe = ManifestoEletronicoDAO.Instance.ObterManifestoEletronicoPeloId(idManifestoEletronico);

            #region Monta XML

            XmlDocument xmlConsSitMDFe  = new XmlDocument();
            XmlNode     declarationNode = xmlConsSitMDFe.CreateXmlDeclaration("1.0", "UTF-8", null);
            xmlConsSitMDFe.AppendChild(declarationNode);

            XmlElement consSitMDFe = xmlConsSitMDFe.CreateElement("consSitMDFe");
            consSitMDFe.SetAttribute("xmlns", "http://www.portalfiscal.inf.br/mdfe");
            consSitMDFe.SetAttribute("versao", ConfigMDFe.VersaoConsulta);
            xmlConsSitMDFe.AppendChild(consSitMDFe);

            ManipulacaoXml.SetNode(xmlConsSitMDFe, consSitMDFe, "tpAmb", ((int)ConfigMDFe.TipoAmbiente).ToString());
            ManipulacaoXml.SetNode(xmlConsSitMDFe, consSitMDFe, "xServ", "CONSULTAR");
            ManipulacaoXml.SetNode(xmlConsSitMDFe, consSitMDFe, "chMDFe", mdfe.ChaveAcesso);

            #endregion

            #region Valida XML

            //try
            //{
            //    ValidaXML.Validar(xmlConsSitMDFe, ValidaXML.TipoArquivoXml.ConsultaSituacaoMDFe);
            //}
            //catch (Exception ex)
            //{
            //    throw new Exception("XML inconsistente." + ex.Message);
            //}

            #endregion

            // Salva o callback padrão do WebService
            System.Net.Security.RemoteCertificateValidationCallback callback = System.Net.ServicePointManager.ServerCertificateValidationCallback;

            XmlNode xmlRetorno = null;

            try
            {
                // Altera o callback de validação do WebService
                System.Net.ServicePointManager.ServerCertificateValidationCallback = delegate(object sender, System.Security.Cryptography.X509Certificates.X509Certificate cert, System.Security.Cryptography.X509Certificates.X509Chain chain, System.Net.Security.SslPolicyErrors error)
                {
                    // Verifica se a data do certificado é válida
                    DateTime beginDate   = DateTime.Parse(cert.GetEffectiveDateString());
                    DateTime endDate     = DateTime.Parse(cert.GetExpirationDateString());
                    bool     isDateValid = (DateTime.Now >= beginDate) && (DateTime.Now <= endDate);

                    // Retorna o resultado da função
                    return(isDateValid);
                };

                #region Envia o arquivo e recebe o retorno

                if (mdfe.TipoEmissao == Glass.Data.Model.TipoEmissao.Normal)
                {
                    if (ConfigMDFe.TipoAmbiente == ConfigMDFe.TipoAmbienteMDFe.Producao)
                    {
                        xmlRetorno = GetWebService.PSVRSMDFeConsulta(mdfe, null).mdfeConsultaMDF(xmlConsSitMDFe);
                    }
                    // TipoAmbienteMDFe.Homologacao
                    else
                    {
                        xmlRetorno = GetWebService.HSVRSMDFeConsulta(mdfe, null).mdfeConsultaMDF(xmlConsSitMDFe);
                    }
                }
                // TipoEmissao.Contingencia
                else
                {
                    if (ConfigMDFe.TipoAmbiente == ConfigMDFe.TipoAmbienteMDFe.Producao)
                    {
                        xmlRetorno = GetWebService.PSVRSMDFeConsulta(mdfe, null).mdfeConsultaMDF(xmlConsSitMDFe);
                    }
                    // TipoAmbienteMDFe.Homologacao
                    else
                    {
                        xmlRetorno = GetWebService.HSVRSMDFeConsulta(mdfe, null).mdfeConsultaMDF(xmlConsSitMDFe);
                    }
                }

                #endregion
            }
            catch (Exception ex)
            {
                throw new Exception(Glass.MensagemAlerta.FormatErrorMsg("Falha ao chamar WebService.", ex));
            }
            finally
            {
                // Restaura o callback padrão para o WebService
                System.Net.ServicePointManager.ServerCertificateValidationCallback = callback;
            }

            // Executa ações de acordo com o retorno
            return(ManifestoEletronicoDAO.Instance.RetornoConsSitMDFe(idManifestoEletronico, xmlRetorno));
        }
Пример #3
0
        /// <summary>
        /// Envia pedido de consulta não encerrados para SEFAZ
        /// </summary>
        /// <param name="idLoja"></param>
        /// <returns></returns>
        public static string EnviaConsultaNaoEncerrados(uint idLoja)
        {
            try
            {
                var tipoEmissao = Configuracoes.FiscalConfig.ManifestoEletronico.ContingenciaMDFe == Helper.DataSources.TipoContingenciaMDFe.NaoUtilizar ? TipoEmissao.Normal :
                                  TipoEmissao.Contingencia;

                var lojaEmitente = LojaDAO.Instance.GetElement(idLoja);

                // Busca XML de encerramento
                XmlDocument xmlConsMDFeNaoEnc = ManifestoEletronicoDAO.Instance.GerarXmlMDFeConsultaNaoEncerrados(lojaEmitente);

                #region Envia XML

                // Salva o callback padrão do WebService
                System.Net.Security.RemoteCertificateValidationCallback callback = System.Net.ServicePointManager.ServerCertificateValidationCallback;

                // Instancia xml de retorno
                XmlNode xmlRetorno = null;

                // Realiza 3 tentativas de envio, se não funcionar, gera mensagem de erro
                for (int i = 0; i < 3; i++)
                {
                    try
                    {
                        // Altera o callback de validação do WebService
                        System.Net.ServicePointManager.ServerCertificateValidationCallback = delegate(object sender, System.Security.Cryptography.X509Certificates.X509Certificate cert, System.Security.Cryptography.X509Certificates.X509Chain chain, System.Net.Security.SslPolicyErrors error)
                        {
                            // Verifica se a data do certificado é válida
                            DateTime beginDate   = DateTime.Parse(cert.GetEffectiveDateString());
                            DateTime endDate     = DateTime.Parse(cert.GetExpirationDateString());
                            bool     isDateValid = (DateTime.Now >= beginDate) && (DateTime.Now <= endDate);

                            // Retorna o resultado da função
                            return(isDateValid);
                        };

                        #region Envia o arquivo e recebe o retorno

                        if (tipoEmissao == TipoEmissao.Normal)
                        {
                            if (ConfigMDFe.TipoAmbiente == ConfigMDFe.TipoAmbienteMDFe.Producao)
                            {
                                xmlRetorno = GetWebService.PSVRSMDFeConsultaNaoEncerrado(lojaEmitente, null).mdfeConsNaoEnc(xmlConsMDFeNaoEnc);
                            }
                            // TipoAmbienteMDFe.Homologacao
                            else
                            {
                                xmlRetorno = GetWebService.HSVRSMDFeConsultaNaoEncerrado(lojaEmitente, null).mdfeConsNaoEnc(xmlConsMDFeNaoEnc);
                            }
                        }
                        // TipoEmissao.Contingencia
                        else
                        {
                            if (ConfigMDFe.TipoAmbiente == ConfigMDFe.TipoAmbienteMDFe.Producao)
                            {
                                xmlRetorno = GetWebService.PSVRSMDFeConsultaNaoEncerrado(lojaEmitente, null).mdfeConsNaoEnc(xmlConsMDFeNaoEnc);
                            }
                            // TipoAmbienteMDFe.Homologacao
                            else
                            {
                                xmlRetorno = GetWebService.HSVRSMDFeConsultaNaoEncerrado(lojaEmitente, null).mdfeConsNaoEnc(xmlConsMDFeNaoEnc);
                            }
                        }
                        #endregion

                        break;
                    }
                    catch (Exception ex)
                    {
                        if (i == 2)
                        {
                            throw new Exception(ex.Message);
                        }
                    }
                    finally
                    {
                        // Restaura o callback padrão para o WebService
                        System.Net.ServicePointManager.ServerCertificateValidationCallback = callback;
                    }
                }

                #endregion

                #region Lê Xml de retorno do consulta não encerrados

                return(ManifestoEletronicoDAO.Instance.RetornoConsultaNaoEncerrados(xmlRetorno));

                #endregion
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
Пример #4
0
        /// <summary>
        /// Envia a MDFe para a SEFAZ via Webservice
        /// </summary>
        /// <param name="xmlMDFe"></param>
        /// <param name="idManifestoEletronico"></param>
        public static string EnviaMDFe(XmlDocument xmlMDFe, int idManifestoEletronico)
        {
            try
            {
                // Monta o lote
                XmlDocument xmlLote = CriaLote(xmlMDFe, idManifestoEletronico);

                // Busca dados do Manifesto Eletronico
                var mdfe = ManifestoEletronicoDAO.Instance.ObterManifestoEletronicoPeloId(idManifestoEletronico);

                #region Envia XML

                // Instancia xml de retorno
                XmlNode xmlRetorno = null;

                // Salva o callback padrão do WebService
                System.Net.Security.RemoteCertificateValidationCallback callback = System.Net.ServicePointManager.ServerCertificateValidationCallback;

                // Realiza 3 tentativas de envio, se não funcionar, gera mensagem de erro
                for (int i = 0; i < 3; i++)
                {
                    try
                    {
                        // Altera o callback de validação do WebService
                        System.Net.ServicePointManager.ServerCertificateValidationCallback = delegate(object sender, System.Security.Cryptography.X509Certificates.X509Certificate cert, System.Security.Cryptography.X509Certificates.X509Chain chain, System.Net.Security.SslPolicyErrors error)
                        {
                            // Verifica se a data do certificado é válida
                            DateTime beginDate   = DateTime.Parse(cert.GetEffectiveDateString());
                            DateTime endDate     = DateTime.Parse(cert.GetExpirationDateString());
                            bool     isDateValid = (DateTime.Now >= beginDate) && (DateTime.Now <= endDate);

                            // Retorna o resultado da função
                            return(isDateValid);
                        };

                        #region Envia o arquivo e recebe o retorno

                        if (mdfe.TipoEmissao == Glass.Data.Model.TipoEmissao.Normal)
                        {
                            if (ConfigMDFe.TipoAmbiente == ConfigMDFe.TipoAmbienteMDFe.Producao)
                            {
                                xmlRetorno = GetWebService.PSVRSMDFeRecepcao(mdfe, null).mdfeRecepcaoLote(xmlLote);
                            }
                            // TipoAmbienteMDFe.Homologacao
                            else
                            {
                                xmlRetorno = GetWebService.HSVRSMDFeRecepcao(mdfe, null).mdfeRecepcaoLote(xmlLote);
                            }
                        }
                        // TipoEmissao.Contingencia
                        else
                        {
                            if (ConfigMDFe.TipoAmbiente == ConfigMDFe.TipoAmbienteMDFe.Producao)
                            {
                                xmlRetorno = GetWebService.PSVRSMDFeRecepcao(mdfe, null).mdfeRecepcaoLote(xmlLote);
                            }
                            // TipoAmbienteMDFe.Homologacao
                            else
                            {
                                xmlRetorno = GetWebService.HSVRSMDFeRecepcao(mdfe, null).mdfeRecepcaoLote(xmlLote);
                            }
                        }

                        #endregion

                        break;
                    }
                    catch (Exception ex)
                    {
                        if (i == 3)
                        {
                            LogMDFeDAO.Instance.NewLog(idManifestoEletronico, "Emissão", 1, "Falha ao enviar lote. " + ex.Message);
                            if (mdfe.Situacao != SituacaoEnum.ContingenciaOffline)
                            {
                                ManifestoEletronicoDAO.Instance.AlteraSituacao(idManifestoEletronico, Glass.Data.Model.SituacaoEnum.FalhaEmitir);
                            }
                            return("Falha ao enviar lote. " + ex.Message);
                        }
                    }
                    finally
                    {
                        // Restaura o callback padrão para o WebService
                        System.Net.ServicePointManager.ServerCertificateValidationCallback = callback;
                    }
                }

                #endregion

                #region Lê Xml de retorno do envio do lote

                // Verifica se o Xml de Retorno é válido
                if (xmlRetorno == null)
                {
                    LogMDFeDAO.Instance.NewLog(idManifestoEletronico, "Emissão", 2, "Falha ao enviar lote. Retorno de envio do lote inválido.");

                    if (mdfe.Situacao != SituacaoEnum.ContingenciaOffline)
                    {
                        ManifestoEletronicoDAO.Instance.AlteraSituacao(idManifestoEletronico, Glass.Data.Model.SituacaoEnum.FalhaEmitir);
                    }

                    return("Falha ao enviar lote. Retorno de envio do lote inválido.");
                }

                // Lê Xml de retorno do envio do lote
                var cStat   = Conversoes.StrParaInt(xmlRetorno["cStat"].InnerXml);
                var xMotivo = xmlRetorno["xMotivo"].InnerXml;

                if (cStat == 103) // Lote recebido com sucesso
                {
                    LogMDFeDAO.Instance.NewLog(idManifestoEletronico, "Emissão", cStat, xMotivo);

                    // Pega o número do recibo do lote
                    string numReciboLote = xmlRetorno["infRec"]["nRec"].InnerXml;

                    // Salva no MDFe o número do recibo do lote
                    ManifestoEletronicoDAO.Instance.SalvaReciboProtocoloAutorizacao(idManifestoEletronico, numReciboLote);
                    return(xMotivo);
                }
                else if (cStat > 200) // Lote foi rejeitado pela SEFAZ
                {
                    LogMDFeDAO.Instance.NewLog(idManifestoEletronico, "Emissão", cStat, xMotivo);

                    if (mdfe.Situacao != SituacaoEnum.ContingenciaOffline)
                    {
                        ManifestoEletronicoDAO.Instance.AlteraSituacao(idManifestoEletronico, Glass.Data.Model.SituacaoEnum.FalhaEmitir);
                    }

                    return(xMotivo);
                }
                else
                {
                    LogMDFeDAO.Instance.NewLog(idManifestoEletronico, "Emissão", cStat, xMotivo);
                    return(xMotivo);
                }

                #endregion
            }
            catch (Exception ex)
            {
                LogMDFeDAO.Instance.NewLog(idManifestoEletronico, "Emissão", 1, MensagemAlerta.FormatErrorMsg("Falha ao enviar lote.", ex));

                return(MensagemAlerta.FormatErrorMsg("Falha ao enviar lote.", ex));
            }
        }
Пример #5
0
        /// <summary>
        /// Envia pedido de encerramento do MDFe para SEFAZ
        /// </summary>
        /// <param name="idManifestoEletronico"></param>
        /// <returns></returns>
        public static string EnviaEncerramento(int idManifestoEletronico)
        {
            ManifestoEletronico mdfe = null;

            try
            {
                // Busca dados do MDFe
                mdfe = ManifestoEletronicoDAO.Instance.ObterManifestoEletronicoPeloId(idManifestoEletronico);

                // Busca XML de encerramento
                XmlDocument xmlEncerramento = ManifestoEletronicoDAO.Instance.GerarXmlMDFeEncerramento(mdfe);

                #region Envia XML

                // Salva o callback padrão do WebService
                System.Net.Security.RemoteCertificateValidationCallback callback = System.Net.ServicePointManager.ServerCertificateValidationCallback;

                // Instancia xml de retorno
                XmlNode xmlRetorno = null;

                // Realiza 3 tentativas de envio, se não funcionar, gera mensagem de erro
                for (int i = 0; i < 3; i++)
                {
                    try
                    {
                        // Altera o callback de validação do WebService
                        System.Net.ServicePointManager.ServerCertificateValidationCallback = delegate(object sender, System.Security.Cryptography.X509Certificates.X509Certificate cert, System.Security.Cryptography.X509Certificates.X509Chain chain, System.Net.Security.SslPolicyErrors error)
                        {
                            // Verifica se a data do certificado é válida
                            DateTime beginDate   = DateTime.Parse(cert.GetEffectiveDateString());
                            DateTime endDate     = DateTime.Parse(cert.GetExpirationDateString());
                            bool     isDateValid = (DateTime.Now >= beginDate) && (DateTime.Now <= endDate);

                            // Retorna o resultado da função
                            return(isDateValid);
                        };

                        #region Envia o arquivo e recebe o retorno

                        if (mdfe.TipoEmissao == TipoEmissao.Normal)
                        {
                            if (ConfigMDFe.TipoAmbiente == ConfigMDFe.TipoAmbienteMDFe.Producao)
                            {
                                xmlRetorno = GetWebService.PSVRSMDFeRecepcaoEvento(mdfe, null).mdfeRecepcaoEvento(xmlEncerramento);
                            }
                            // TipoAmbienteMDFe.Homologacao
                            else
                            {
                                xmlRetorno = GetWebService.HSVRSMDFeRecepcaoEvento(mdfe, null).mdfeRecepcaoEvento(xmlEncerramento);
                            }
                        }
                        // TipoEmissao.Contingencia
                        else
                        {
                            if (ConfigMDFe.TipoAmbiente == ConfigMDFe.TipoAmbienteMDFe.Producao)
                            {
                                xmlRetorno = GetWebService.PSVRSMDFeRecepcaoEvento(mdfe, null).mdfeRecepcaoEvento(xmlEncerramento);
                            }
                            // TipoAmbienteMDFe.Homologacao
                            else
                            {
                                xmlRetorno = GetWebService.HSVRSMDFeRecepcaoEvento(mdfe, null).mdfeRecepcaoEvento(xmlEncerramento);
                            }
                        }
                        #endregion

                        break;
                    }
                    catch (Exception ex)
                    {
                        if (i == 2)
                        {
                            LogMDFeDAO.Instance.NewLog(idManifestoEletronico, "Encerramento", 1, "Falha ao encerrar MDFe. " + ex.Message);

                            ManifestoEletronicoDAO.Instance.AlteraSituacao(idManifestoEletronico, SituacaoEnum.FalhaEncerrar);

                            throw new Exception(ex.Message);
                        }
                    }
                    finally
                    {
                        // Restaura o callback padrão para o WebService
                        System.Net.ServicePointManager.ServerCertificateValidationCallback = callback;
                    }
                }

                #endregion

                #region Lê Xml de retorno do envio do encerramento

                // Realiza procedimentos de encerramento de MDFe
                return(ManifestoEletronicoDAO.Instance.RetornoEventoMDFe(idManifestoEletronico, xmlRetorno, "110112"));

                #endregion
            }
            catch (Exception ex)
            {
                LogMDFeDAO.Instance.NewLog(idManifestoEletronico, "Encerramento", 1, "Falha ao encerrar MDFe. " + ex.Message);

                if (mdfe.Situacao != SituacaoEnum.Encerrado)
                {
                    ManifestoEletronicoDAO.Instance.AlteraSituacao(idManifestoEletronico, SituacaoEnum.FalhaEncerrar);
                }

                throw ex;
            }
        }