예제 #1
0
        private static string ConsultaSitNFCe(NotaFiscal nf)
        {
            #region Monta XML

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

            XmlElement consSitNFe = xmlConsSitNFe.CreateElement("consSitNFe");
            consSitNFe.SetAttribute("xmlns", "http://www.portalfiscal.inf.br/nfe");
            consSitNFe.SetAttribute("versao", ConfigNFe.VersaoConsulta);
            xmlConsSitNFe.AppendChild(consSitNFe);

            ManipulacaoXml.SetNode(xmlConsSitNFe, consSitNFe, "tpAmb", ((int)ConfigNFe.TipoAmbiente).ToString());
            ManipulacaoXml.SetNode(xmlConsSitNFe, consSitNFe, "xServ", "CONSULTAR");
            ManipulacaoXml.SetNode(xmlConsSitNFe, consSitNFe, "chNFe", nf.ChaveAcesso);

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

                // Envia o arquivo e recebe o retorno.
                xmlRetorno = EnviaXML.ObterXmlConsultaProtocoloNFCe(nf, xmlConsSitNFe);
            }
            catch (Exception ex)
            {
                LogNfDAO.Instance.NewLog(nf.IdNf, "Instaciar Webservice", 3, MensagemAlerta.FormatErrorMsg("Falha ao instanciar webservice.", 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;
            }

            if (xmlRetorno == null)
            {
                throw new Exception("Falha ao comunicar com webservice da SEFAZ.");
            }

            var codStatus = xmlRetorno?["cStat"]?.InnerXml;

            // Executa ações de acordo com o retorno dado
            NotaFiscalDAO.Instance.RetornoConsSitNFe(nf.IdNf, xmlRetorno);

            if (codStatus == "100" || codStatus == "150") // NFe Autorizada
            {
                return("NFe está autorizada para uso.");
            }
            else // NFe rejeitada
            {
                var msgErro = "Falha na consulta. ";

                if (codStatus == "215" || codStatus == "516" || codStatus == "517" || codStatus == "545")
                {
                    msgErro += "Mensagem de consulta inválida. ";
                }

                return($"{ msgErro }{ xmlRetorno?["cStat"]?.InnerXml } - { CustomizaMensagemRejeicao(nf.IdNf, xmlRetorno?["xMotivo"]?.InnerXml) }");
            }
        }
예제 #2
0
        /// <summary>
        /// Consulta o cadastro de contribuintes do ICMS da unidade federada.
        /// </summary>
        public static string ConsultaSitCadastroContribuinte(string uf, string cpfCnpj)
        {
            if (string.IsNullOrEmpty(uf) || string.IsNullOrEmpty(cpfCnpj))
            {
                return("Contribuinte não encontrado.");
            }

            #region Monta XML

            XmlDocument xmlConsCad = new XmlDocument();

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

            XmlElement consCad = xmlConsCad.CreateElement("ConsCad");
            consCad.SetAttribute("versao", ConfigNFe.VersaoConsCad);
            consCad.SetAttribute("xmlns", "http://www.portalfiscal.inf.br/nfe");
            xmlConsCad.AppendChild(consCad);

            XmlElement infCons = xmlConsCad.CreateElement("infCons");
            consCad.AppendChild(infCons);

            ManipulacaoXml.SetNode(xmlConsCad, infCons, "xServ", "CONS-CAD");
            ManipulacaoXml.SetNode(xmlConsCad, infCons, "UF", uf);

            cpfCnpj = Formatacoes.LimpaCpfCnpj(cpfCnpj);

            if (cpfCnpj.Length == 11)
            {
                ManipulacaoXml.SetNode(xmlConsCad, infCons, "CPF", cpfCnpj);
            }
            else
            {
                ManipulacaoXml.SetNode(xmlConsCad, infCons, "CNPJ", cpfCnpj);
            }

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

                // Envia o arquivo e recebe o retorno.
                xmlRetorno = EnviaXML.ObterXmlConsultaCadastroContribuinte(uf, xmlConsCad);
            }
            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;
            }

            if (xmlRetorno == null)
            {
                return("Falha ao comunicar com webservice da SEFAZ.");
            }

            XmlDocument xmlDocRetorno = new XmlDocument();
            xmlDocRetorno.ImportNode(xmlRetorno, true);

            XmlNamespaceManager nMgr = new XmlNamespaceManager(xmlDocRetorno.NameTable);
            nMgr.AddNamespace("nfe", "http://www.portalfiscal.inf.br/nfe");

            XmlNode infoCons  = xmlRetorno.SelectSingleNode("//nfe:infCons", nMgr);
            var     codStatus = infoCons?["cStat"]?.InnerText;

            var retorno = string.Empty;
            if (codStatus == "111" || codStatus == "112")
            {
                retorno += "Consulta Situação do Contribuinte no Sintegra\n\n";
                retorno += "Situação: ";

                if (infoCons["infCad"]["cSit"].InnerText == "1")
                {
                    retorno += "Habilitado.";
                }
                else
                {
                    retorno += "Não Habilitado.";
                }
            }
            else
            {
                retorno += "Falha na Consulta Situação do Contribuinte no Sintegra\n\n";
                retorno += "Código: " + codStatus + "\n";
                retorno += infoCons?["xMotivo"]?.InnerText;
            }

            ClienteDAO.Instance.AtualizaUltimaConsultaSintegra(cpfCnpj);

            return(retorno);
        }
예제 #3
0
        private static string ConsultaLoteNFe(NotaFiscal nf)
        {
            #region Monta XML de requisição de situação do lote

            if (string.IsNullOrEmpty(nf.NumRecibo))
            {
                throw new Exception("A NFe não foi emitida. Não há número de recibo.");
            }

            var strXml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
                         "<consReciNFe xmlns=\"http://www.portalfiscal.inf.br/nfe\" " +
                         "versao=\"" + ConfigNFe.VersaoRetAutorizacao + "\">" +
                         "<tpAmb>" + (int)ConfigNFe.TipoAmbiente + "</tpAmb>" +
                         "<nRec>" + nf.NumRecibo.PadLeft(15, '0') + "</nRec></consReciNFe>";

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

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

            #endregion

            var     status     = string.Empty;
            XmlNode xmlRetorno = null;
            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);
                };

                // Envia o arquivo e recebe o retorno
                xmlRetorno = EnviaXML.ObterXmlRetornoAutorizacaoNFe(nf, xmlRetRecep);
            }
            catch (Exception ex)
            {
                LogNfDAO.Instance.NewLog(nf.IdNf, "Instaciar Webservice", 3, MensagemAlerta.FormatErrorMsg("Falha ao instanciar webservice.", 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
            {
                status = xmlRetorno?["cStat"]?.InnerXml;
            }

            if (status == "104") // Lote processado
            {
                XmlNodeList protNFeList = ((XmlElement)xmlRetorno).GetElementsByTagName("protNFe");

                // Para cada protocolo de autorização de uso (inicialmente será só um, pois cada nota está sendo enviada em um lote distinto)
                foreach (XmlNode protNFeNode in protNFeList)
                {
                    NotaFiscalDAO.Instance.RetornoEmissaoNFe(protNFeNode?["infProt"]?["chNFe"]?.InnerXml, protNFeNode);

                    var statusNFe = protNFeNode?["infProt"]?["cStat"]?.InnerXml;

                    if (statusNFe == "100" || statusNFe == "150") // Autorizada para uso
                    {
                        return("NFe está autorizada para uso.");
                    }
                    else
                    {
                        return($"NFe rejeitada. Motivo: { protNFeNode?["infProt"]?["xMotivo"]?.InnerXml }");
                    }
                }

                return("Lote processado");
            }
            else if (status == "105") // Lote em processamento
            {
                NotaFiscalDAO.Instance.AlteraSituacao(nf.IdNf, NotaFiscal.SituacaoEnum.ProcessoEmissao);

                return("Esta NFe ainda está sendo processada pela SEFAZ, aguarde para realizar uma nova consulta.");
            }
            else if (status == "106") // Lote não encontrado
            {
                NotaFiscalDAO.Instance.AlteraSituacao(nf.IdNf, NotaFiscal.SituacaoEnum.FalhaEmitir);

                LogNfDAO.Instance.NewLog(nf.IdNf, "Consulta", 106, "Falha na emissão da NFe. Não foi encontrado o lote de envio.");

                return("Falha na consulta. Não foi encontrado o lote de envio.");
            }
            else // Lote rejeitado
            {
                NotaFiscalDAO.Instance.AlteraSituacao(nf.IdNf, NotaFiscal.SituacaoEnum.FalhaEmitir);

                LogNfDAO.Instance.NewLog(nf.IdNf, "Consulta", (xmlRetorno?["cStat"]?.InnerXml?.StrParaInt()).GetValueOrDefault(), xmlRetorno?["xMotivo"]?.InnerXml);

                var msgErro = "Falha na consulta. ";

                if (status == "215" || status == "516" || status == "517" || status == "545")
                {
                    msgErro += "Mensagem de consulta inválida. ";
                }
                else if (status == "225" || status == "565" || status == "567" || status == "568")
                {
                    msgErro += "Lote da NFe é inválido. ";
                }

                return($"{ msgErro }{ xmlRetorno?["cStat"]?.InnerXml } - { CustomizaMensagemRejeicao(nf.IdNf, xmlRetorno?["xMotivo"]?.InnerXml) }");
            }
        }