예제 #1
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;
            }
        }