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