コード例 #1
0
        /// <summary>
        /// Monta e retorna um Xml do lote para envio com o MDF-e a ser enviada
        /// </summary>
        /// <param name="xmlMDFe"></param>
        /// <returns></returns>
        private static XmlDocument CriaLote(XmlDocument xmlMDFe, int idManifestoEletronico)
        {
            XmlDocument xmlLote         = new XmlDocument();
            XmlNode     declarationNode = xmlLote.CreateXmlDeclaration("1.0", "UTF-8", null);

            xmlLote.AppendChild(declarationNode);

            string enviMDFeString = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
                                    "<enviMDFe xmlns=\"http://www.portalfiscal.inf.br/mdfe\" versao=\"" + ConfigMDFe.VersaoEnvioMDFe + "\">" +
                                    "<idLote>" + ManifestoEletronicoDAO.Instance.ObterNovoNumLote(idManifestoEletronico).ToString("000000000000000") + "</idLote>";

            // Insere o XML da MDFe no lote
            int nPosI = xmlMDFe.InnerXml.IndexOf("<MDFe");
            int nPosF = xmlMDFe.InnerXml.Length - nPosI;

            enviMDFeString += xmlMDFe.InnerXml.Substring(nPosI, nPosF) + "</enviMDFe>";

            XmlDocument xmlRetorno = new XmlDocument();

            xmlRetorno.LoadXml(enviMDFeString);

            #region Valida XML

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

            #endregion

            return(xmlRetorno);
        }
コード例 #2
0
ファイル: ConsultaSituacao.cs プロジェクト: ertprs/Estudo
        /// <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));
            }
        }