public async Task <retDistDFeInt> ConsultarPorNSUAsync(string nsu, bool validarXmlConsulta = true)
        {
            logger.LogInformation($"Consultar documentos destinados por NSU {nsu}");
            if (string.IsNullOrEmpty(nsu))
            {
                throw new ArgumentNullException(nameof(nsu));
            }
            if (nsu.Length > 15)
            {
                throw new ArgumentOutOfRangeException(nameof(nsu));
            }

            nsu = nsu.PadLeft(15, '0');

            var distDFeInt = new distDFeInt
            {
                Versao  = "1.01",
                Cnpj    = Configuracao.Emitente.CNPJ,
                consNSU = new consNSU {
                    NSU = nsu
                },
                cUFAutor = ((int)Configuracao.UF).ToString(),
                TpAmb    = Configuracao.TipoAmbiente
            };

            var retorno = await PrepararTransmissao(distDFeInt, validarXmlConsulta);

            var retDistDFeInt = XmlUtils.XmlStringParaClasse <retDistDFeInt>(retorno);

            return(retDistDFeInt);
        }
        private async Task <string> PrepararTransmissao(distDFeInt distDFeInt, bool validarXmlConsulta = true)
        {
            var xml = XmlUtils.ClasseParaXmlString <distDFeInt>(distDFeInt);

            if (validarXmlConsulta)
            {
                Schemas.ValidarSchema(eTipoServico.NFeDistribuicaoDFe, xml, Configuracao);
            }

            var nomeArqEnv = $"{Configuracao.Emitente.CNPJ ?? Configuracao.Emitente.CPF}-{DateTime.Now.Ticks}-ped-DistDFeInt.xml";
            var arqEnv     = Path.Combine("Logs", nomeArqEnv);
            var stRet      = await storage.SaveAsync(arqEnv, xml);

            var envelope = SoapEnvelopeFabrica.FabricarEnvelope(eTipoServico.NFeDistribuicaoDFe, xml);

            var sefazUrl = FabricarUrl.ObterUrl(eTipoServico.NFeDistribuicaoDFe, Configuracao.TipoAmbiente, eModeloDocumento.NFe, eUF.AN);
            var retorno  = await Transmitir.TransmitirAsync(sefazUrl, envelope);

            var retornoLimpo = Soap.LimparEnvelope(retorno, "retDistDFeInt").OuterXml;

            var nomeArqRetorno = $"{Configuracao.Emitente.CNPJ ?? Configuracao.Emitente.CPF}-{DateTime.Now.Ticks}-retDistDFeInt.xml";
            var arqRet         = Path.Combine("Logs", nomeArqRetorno);
            await storage.SaveAsync(arqRet, retornoLimpo);

            return(retornoLimpo);
        }
示例#3
0
        static async Task Main(string[] args)
        {
            Console.WriteLine("Insira o caminho do certificado[sem aspas]:");
            var pathCertificado = Console.ReadLine();

            Console.WriteLine("Insira a senha do certificado:");
            var senha       = Console.ReadLine();
            var certificate = new X509Certificate2(pathCertificado, senha);

            INFeDistribuicaoDFe client = HttpsSoapClientFactory.NFeDistribuicaoDFe(certificate);

            var dfe = new distDFeInt
            {
                cUFAutor = "23",
                CNPJ     = certificate.FriendlyName.Split(':')[1],
                tpAmb    = "1",
                versao   = "1.01",
                distNSU  = new distNSU {
                    ultNSU = "0"
                }
            };

            try
            {
                var nfeDistDFeInteresseResponse = await client.NFeDistDFeInteresseAsync(XElement.Parse(dfe.ToXml()));

                Console.WriteLine(nfeDistDFeInteresseResponse.Body.NFeDistDFeInteresseResult.ToString());
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }
        private CTeDistDFeInteresse InicializaCTeDistDFeInteresse(string documento, string ultNSU, string nSU,
                                                                  out distDFeInt pedDistDFeInt, out XmlDocument dadosConsulta, ConfiguracaoServico configuracaoServico)
        {
            var versaoServico = configuracaoServico.VersaoLayout;

            #region Cria o objeto wdsl para consulta

            var ws = WsdlFactory.CriaWsdlCTeDistDFeInteresse(configuracaoServico);

            #endregion

            #region Cria o objeto distCTeInt

            pedDistDFeInt = new distDFeInt
            {
                versao   = "1.00",
                tpAmb    = configuracaoServico.tpAmb,
                cUFAutor = configuracaoServico.cUF
            };

            if (documento.Length == 11)
            {
                pedDistDFeInt.CPF = documento;
            }
            if (documento.Length > 11)
            {
                pedDistDFeInt.CNPJ = documento;
            }


            pedDistDFeInt.distNSU = new distNSU {
                ultNSU = ultNSU.PadLeft(15, '0')
            };

            if (!nSU.Equals("0"))
            {
                pedDistDFeInt.consNSU = new consNSU {
                    NSU = nSU.PadLeft(15, '0')
                };
                pedDistDFeInt.distNSU = null;
            }

            #endregion

            pedDistDFeInt.ValidaSchema(configuracaoServico);

            var xmlConsulta = pedDistDFeInt.ObterXmlString();

            dadosConsulta = new XmlDocument();
            dadosConsulta.LoadXml(xmlConsulta);

            string path = DateTime.Now.ParaDataHoraString() + "-ped-DistDFeInt.xml";

            SalvarArquivoXml(path, xmlConsulta, configuracaoServico);
            return(ws);
        }
示例#5
0
        public static void SalvarXmlEmDisco(this distDFeInt pedDistDFeInt, string arquivoSalvar)
        {
            var instanciaServico = ConfiguracaoServico.Instancia;

            if (instanciaServico.NaoSalvarXml())
            {
                return;
            }

            var arquivoXml = instanciaServico.DiretorioSalvarXml + arquivoSalvar;

            FuncoesXml.ClasseParaArquivoXml(pedDistDFeInt, arquivoXml);
        }
示例#6
0
        public static void ValidaSchema(this distDFeInt pedDistDFeInt)
        {
            var xmlValidacao = pedDistDFeInt.ObterXmlString();


            if (pedDistDFeInt.versao.Equals("1.00"))
            {
                Validador.Valida(xmlValidacao, "retDistDFeInt_v1.00.xsd");
            }
            else if (pedDistDFeInt.versao.Equals("1.10"))
            {
                Validador.Valida(xmlValidacao, "retDistDFeInt_v1.10.xsd");
            }
            else
            {
                throw new InvalidOperationException("Nos achamos um erro na hora de validar o schema, " +
                                                    "a versão está inválida, somente é permitido " +
                                                    "versão 1.00 é 1.10");
            }
        }
        public async Task <retDistDFeInt> ConsultarPorChaveAsync(ChaveFiscal chaveNFe, bool validarXmlConsulta = true)
        {
            var distDFeInt = new distDFeInt
            {
                Versao    = "1.01",
                Cnpj      = Configuracao.Emitente.CNPJ,
                consChNFe = new consChNFe
                {
                    ChNFe = chaveNFe.Chave
                },
                cUFAutor = ((int)Configuracao.UF).ToString(),
                TpAmb    = Configuracao.TipoAmbiente
            };

            var retorno = await PrepararTransmissao(distDFeInt, validarXmlConsulta);

            var retDistDFeInt = XmlUtils.XmlStringParaClasse <retDistDFeInt>(retorno);

            return(retDistDFeInt);
        }
        /// <summary>
        /// Serviço destinado à distribuição de informações resumidas e documentos fiscais eletrônicos de interesse de um ator, seja este pessoa física ou jurídica.
        /// </summary>
        /// <param name="ufAutor">Código da UF do Autor</param>
        /// <param name="documento">CNPJ/CPF do interessado no DF-e</param>
        /// <param name="ultNSU">Último NSU recebido pelo Interessado</param>
        /// <param name="nSU">Número Sequencial Único</param>
        /// <returns>Retorna um objeto da classe RetornoNfeDistDFeInt com os documentos de interesse do CNPJ/CPF pesquisado</returns>
        public RetornoNfeDistDFeInt NfeDistDFeInteresse(string ufAutor, string documento, string ultNSU, string nSU = "0")
        {
            var versaoServico = ServicoNFe.NFeDistribuicaoDFe.VersaoServicoParaString(_cFgServico.VersaoNFeDistribuicaoDFe);

            #region Cria o objeto wdsl para consulta

            var ws = CriarServico(ServicoNFe.NFeDistribuicaoDFe);

            ws.nfeCabecMsg = new nfeCabecMsg
            {
                cUF         = _cFgServico.cUF,
                versaoDados = versaoServico
            };

            #endregion

            #region Cria o objeto distDFeInt

            var pedDistDFeInt = new distDFeInt
            {
                versao   = versaoServico,
                tpAmb    = _cFgServico.tpAmb,
                cUFAutor = _cFgServico.cUF,
                distNSU  = new distNSU {
                    ultNSU = ultNSU.PadLeft(15, '0')
                }
            };

            if (documento.Length == 11)
            {
                pedDistDFeInt.CPF = documento;
            }
            if (documento.Length > 11)
            {
                pedDistDFeInt.CNPJ = documento;
            }
            if (!nSU.Equals("0"))
            {
                pedDistDFeInt.consNSU = new consNSU {
                    NSU = nSU.PadLeft(15, '0')
                }
            }
            ;

            #endregion

            #region Valida, Envia os dados e obtém a resposta

            var xmlConsulta = pedDistDFeInt.ObterXmlString();
            Validador.Valida(ServicoNFe.NFeDistribuicaoDFe, _cFgServico.VersaoNFeDistribuicaoDFe, xmlConsulta);
            var dadosConsulta = new XmlDocument();
            dadosConsulta.LoadXml(xmlConsulta);

            SalvarArquivoXml(DateTime.Now.ToString("yyyyMMddHHmmss") + "-ped-DistDFeInt.xml", xmlConsulta);

            var retorno          = ws.Execute(dadosConsulta);
            var retornoXmlString = retorno.OuterXml;
            var retConsulta      = new retDistDFeInt().CarregarDeXmlString(retornoXmlString);

            SalvarArquivoXml(DateTime.Now.ToString("yyyyMMddHHmmss") + "-distDFeInt.xml", retornoXmlString);

            #region Obtém um retDistDFeInt de cada evento e salva em arquivo
            if (retConsulta.loteDistDFeInt != null)
            {
                for (int i = 0; i < retConsulta.loteDistDFeInt.Length; i++)
                {
                    string conteudo = Compressao.Unzip(retConsulta.loteDistDFeInt[i].XmlNfe);
                    string chNFe    = string.Empty;

                    if (conteudo.StartsWith("<retNFe"))
                    {
                        var retConteudo = FuncoesXml.XmlStringParaClasse <Classes.Servicos.DistribuicaoDFe.Schemas.resNFe>(conteudo);
                        chNFe = retConteudo.chNFe;
                    }
                    else if (conteudo.StartsWith("<procEventoNFe"))
                    {
                        var procEventoNFeConteudo = FuncoesXml.XmlStringParaClasse <Classes.Servicos.DistribuicaoDFe.Schemas.procEventoNFe>(conteudo);
                        chNFe = procEventoNFeConteudo.retEvento.infEvento.chNFe;
                    }

                    string[] schema = retConsulta.loteDistDFeInt[i].schema.Split('_');
                    SalvarArquivoXml(chNFe + "_" + schema[0] + ".xml", conteudo);
                }
            }
            #endregion

            return(new RetornoNfeDistDFeInt(pedDistDFeInt.ObterXmlString(), retConsulta.ObterXmlString(), retornoXmlString, retConsulta));

            #endregion
        }
示例#9
0
 /// <summary>
 /// Recebe um objeto ExtdistDFeInt e devolve a string no formato XML
 /// </summary>
 /// <param name="pedDistDFeInt">Objeto do Tipo distDFeInt</param>
 /// <returns>string com XML no do objeto distDFeInt</returns>
 public static string ObterXmlString(this distDFeInt pedDistDFeInt)
 {
     return(FuncoesXml.ClasseParaXmlString(pedDistDFeInt));
 }
示例#10
0
        /// <summary>
        /// Serviço destinado à distribuição de informações resumidas e documentos fiscais eletrônicos de interesse de um ator, seja este pessoa física ou jurídica.
        /// </summary>
        /// <param name="ufAutor">Código da UF do Autor</param>
        /// <param name="documento">CNPJ/CPF do interessado no DF-e</param>
        /// <param name="ultNSU">Último NSU recebido pelo Interessado</param>
        /// <param name="nSU">Número Sequencial Único</param>
        /// <returns>Retorna um objeto da classe CTeDistDFeInteresse com os documentos de interesse do CNPJ/CPF pesquisado</returns>
        public RetornoCteDistDFeInt CTeDistDFeInteresse(string ufAutor, string documento, string ultNSU = "0", string nSU = "0")
        {
            var versaoServico = ConfiguracaoServico.Instancia.VersaoLayout;

            #region Cria o objeto wdsl para consulta

            var ws = WsdlFactory.CriaWsdlCTeDistDFeInteresse();

            #endregion

            #region Cria o objeto distCTeInt

            var pedDistDFeInt = new distDFeInt
            {
                versao   = "1.00",
                tpAmb    = ConfiguracaoServico.Instancia.tpAmb,
                cUFAutor = ConfiguracaoServico.Instancia.cUF
            };

            if (documento.Length == 11)
            {
                pedDistDFeInt.CPF = documento;
            }
            if (documento.Length > 11)
            {
                pedDistDFeInt.CNPJ = documento;
            }


            pedDistDFeInt.distNSU = new distNSU {
                ultNSU = ultNSU.PadLeft(15, '0')
            };

            if (!nSU.Equals("0"))
            {
                pedDistDFeInt.consNSU = new consNSU {
                    NSU = nSU.PadLeft(15, '0')
                };
                pedDistDFeInt.distNSU = null;
            }

            #endregion

            #region Valida, Envia os dados e obtém a resposta


            pedDistDFeInt.ValidaSchema();

            var xmlConsulta = pedDistDFeInt.ObterXmlString();

            var dadosConsulta = new XmlDocument();
            dadosConsulta.LoadXml(xmlConsulta);

            string path = DateTime.Now.ParaDataHoraString() + "-ped-DistDFeInt.xml";

            SalvarArquivoXml(path, xmlConsulta);

            XmlNode retorno = ws.Execute(dadosConsulta);

            var retornoXmlString = retorno.OuterXml;

            var retConsulta = new retDistDFeInt().CarregarDeXmlString(retornoXmlString);

            SalvarArquivoXml(DateTime.Now.ParaDataHoraString() + "-distDFeInt.xml", retornoXmlString);

            #region Obtém um retDistDFeInt de cada evento e salva em arquivo

            if (retConsulta.loteDistDFeInt != null)
            {
                for (int i = 0; i < retConsulta.loteDistDFeInt.Length; i++)
                {
                    string conteudo = Compressao.Unzip(retConsulta.loteDistDFeInt[i].XmlNfe);
                    string chCTe    = string.Empty;

                    if (conteudo.StartsWith("<cteProc"))
                    {
                        var retConteudo = FuncoesXml.XmlStringParaClasse <CTe.Classes.cteProc>(conteudo);
                        chCTe = retConteudo.protCTe.infProt.chCTe;
                    }
                    else if (conteudo.StartsWith("<procEventoCTe"))
                    {
                        var procEventoNFeConteudo = FuncoesXml.XmlStringParaClasse <Classes.Servicos.DistribuicaoDFe.Schemas.procEventoCTe>(conteudo);
                        chCTe = procEventoNFeConteudo.eventoCTe.infEvento.chCTe;
                    }

                    string[] schema = retConsulta.loteDistDFeInt[i].schema.Split('_');
                    if (chCTe == string.Empty)
                    {
                        chCTe = DateTime.Now.ParaDataHoraString() + "_SEMCHAVE";
                    }

                    SalvarArquivoXml(chCTe + "-" + schema[0] + ".xml", conteudo);
                }
            }

            #endregion

            return(new RetornoCteDistDFeInt(pedDistDFeInt.ObterXmlString(), retConsulta.ObterXmlString(), retornoXmlString, retConsulta));

            #endregion
        }