/// <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; } }