Ejemplo n.º 1
0
        protected override void TratarRetornoConsultarLoteRps(RetornoWebservice retornoWebservice, NotaFiscalCollection notas)
        {
            // Analisa mensagem de retorno
            var xmlRet = XDocument.Parse(retornoWebservice.XmlRetorno);

            MensagemErro(retornoWebservice, xmlRet, "ConsultarLoteRpsResult");
            if (retornoWebservice.Erros.Any())
            {
                return;
            }

            var retornoLote = xmlRet.ElementAnyNs("ConsultarLoteRpsResult");
            var listaNfse   = retornoLote?.ElementAnyNs("ListaNfse");

            if (listaNfse == null)
            {
                retornoWebservice.Erros.Add(new Evento {
                    Codigo = "0", Descricao = "Lista de NFSe não encontrada! (ListaNfse)"
                });
                return;
            }

            retornoWebservice.Sucesso = true;

            foreach (var compNfse in listaNfse.ElementsAnyNs("CompNfse"))
            {
                var nfse        = compNfse.ElementAnyNs("Nfse").ElementAnyNs("InfNfse");
                var numeroNFSe  = nfse.ElementAnyNs("Numero")?.GetValue <string>() ?? string.Empty;
                var chaveNFSe   = nfse.ElementAnyNs("CodigoVerificacao")?.GetValue <string>() ?? string.Empty;
                var dataEmissao = nfse.ElementAnyNs("DataEmissao")?.GetValue <DateTime>() ?? DateTime.Now;
                var numeroRps   = nfse?.ElementAnyNs("IdentificacaoRps")?.ElementAnyNs("Numero")?.GetValue <string>() ?? string.Empty;
                GravarNFSeEmDisco(compNfse.AsString(true), $"NFSe-{numeroNFSe}-{chaveNFSe}-.xml", dataEmissao);

                var nota = notas.FirstOrDefault(x => x.IdentificacaoRps.Numero == numeroRps);
                if (nota == null)
                {
                    notas.Load(compNfse.ToString());
                }
                else
                {
                    nota.IdentificacaoNFSe.Numero      = numeroNFSe;
                    nota.IdentificacaoNFSe.Chave       = chaveNFSe;
                    nota.IdentificacaoNFSe.DataEmissao = dataEmissao;
                }
            }
        }
Ejemplo n.º 2
0
        private RetornoWebservice ConsultarRpsNfseSP(string numeroRPS, string serieRPS, string numeroNFSe, NotaFiscalCollection notas)
        {
            var retornoWebservice = new RetornoWebservice();

            if (string.IsNullOrWhiteSpace(numeroRPS) & string.IsNullOrWhiteSpace(numeroNFSe))
            {
                retornoWebservice.Erros.Add(new Evento {
                    Codigo = "0", Descricao = "Número do RPS/NFSe não informado para a consulta."
                });
                return(retornoWebservice);
            }

            var loteBuilder = new StringBuilder();

            loteBuilder.Append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
            loteBuilder.Append("<p1:PedidoConsultaNFe xmlns:p1=\"http://www.prefeitura.sp.gov.br/nfe\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">");
            loteBuilder.Append("<Cabecalho Versao=\"1\">");
            loteBuilder.Append($"<CPFCNPJRemetente><CNPJ>{Configuracoes.PrestadorPadrao.CpfCnpj.ZeroFill(14)}</CNPJ></CPFCNPJRemetente>");
            loteBuilder.Append("</Cabecalho>");
            loteBuilder.Append("<Detalhe>");
            if (!string.IsNullOrWhiteSpace(numeroRPS))
            {
                // RPS
                loteBuilder.Append("<ChaveRPS>");
                loteBuilder.Append($"<InscricaoPrestador>{Configuracoes.PrestadorPadrao.InscricaoMunicipal.ZeroFill(8)}</InscricaoPrestador>");
                loteBuilder.Append($"<SerieRPS>{serieRPS}</SerieRPS>");
                loteBuilder.Append($"<NumeroRPS>{numeroRPS}</NumeroRPS>");
                loteBuilder.Append("</ChaveRPS>");
            }
            else
            {
                // NFSe
                loteBuilder.Append("<ChaveNFe>");
                loteBuilder.Append($"<InscricaoPrestador>{Configuracoes.PrestadorPadrao.InscricaoMunicipal.ZeroFill(8)}</InscricaoPrestador>");
                loteBuilder.Append($"<NumeroNFe>{numeroNFSe}</NumeroNFe>");
                loteBuilder.Append("</ChaveNFe>");
            }
            loteBuilder.Append("</Detalhe>");
            loteBuilder.Append("</p1:PedidoConsultaNFe>");
            retornoWebservice.XmlEnvio = loteBuilder.ToString();

            if (Configuracoes.Geral.RetirarAcentos)
            {
                retornoWebservice.XmlEnvio = retornoWebservice.XmlEnvio.RemoveAccent();
            }

            retornoWebservice.XmlEnvio = XmlSigning.AssinarXml(retornoWebservice.XmlEnvio, "p1:PedidoConsultaNFe", "", Certificado);

            GravarArquivoEmDisco(retornoWebservice.XmlEnvio, $"ConNotaRps-{numeroRPS}-env.xml");

            // Verifica Schema
            ValidarSchema(retornoWebservice, "PedidoConsultaNFe_v01.xsd");
            if (retornoWebservice.Erros.Any())
            {
                return(retornoWebservice);
            }

            // Recebe mensagem de retorno
            try
            {
                using (var cliente = GetCliente(TipoUrl.ConsultaNFSeRps))
                {
                    retornoWebservice.XmlRetorno = cliente.ConsultaNFe(retornoWebservice.XmlEnvio);
                }
            }
            catch (Exception ex)
            {
                retornoWebservice.Erros.Add(new Evento {
                    Codigo = "0", Descricao = ex.Message
                });
                return(retornoWebservice);
            }
            GravarArquivoEmDisco(retornoWebservice.XmlRetorno, $"ConNotaRps-{numeroRPS}-ret.xml");

            // Analisa mensagem de retorno
            var xmlRet = XDocument.Parse(retornoWebservice.XmlRetorno);

            MensagemErro(retornoWebservice, xmlRet, "RetornoConsulta");
            if (retornoWebservice.Erros.Any())
            {
                return(retornoWebservice);
            }

            retornoWebservice.Sucesso = xmlRet.Root?.ElementAnyNs("Cabecalho")?.ElementAnyNs("Sucesso")?.GetValue <bool>() ?? false;

            foreach (var nfse in xmlRet.Root.ElementsAnyNs("NFe"))
            {
                notas.Load(nfse.ToString());
            }

            return(retornoWebservice);
        }
Ejemplo n.º 3
0
        public override RetornoWebservice ConsultarLoteRps(int lote, string protocolo, NotaFiscalCollection notas)
        {
            var retornoWebservice = new RetornoWebservice();

            var loteBuilder = new StringBuilder();

            loteBuilder.Append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
            loteBuilder.Append("<PedidoConsultaLote xmlns=\"http://www.prefeitura.sp.gov.br/nfe\" xmlns:xsi = \"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd = \"http://www.w3.org/2001/XMLSchema\">");
            loteBuilder.Append("<Cabecalho xmlns=\"\" Versao=\"1\">");
            loteBuilder.Append($"<CPFCNPJRemetente><CNPJ>{Configuracoes.PrestadorPadrao.CpfCnpj.ZeroFill(14)}</CNPJ></CPFCNPJRemetente>");
            loteBuilder.Append($"<NumeroLote>{lote}</NumeroLote>");
            loteBuilder.Append("</Cabecalho>");
            loteBuilder.Append("</PedidoConsultaLote>");
            retornoWebservice.XmlEnvio = loteBuilder.ToString();

            if (Configuracoes.Geral.RetirarAcentos)
            {
                retornoWebservice.XmlEnvio = retornoWebservice.XmlEnvio.RemoveAccent();
            }

            retornoWebservice.XmlEnvio = XmlSigning.AssinarXml(retornoWebservice.XmlEnvio, "PedidoConsultaLote", "", Certificado);

            GravarArquivoEmDisco(retornoWebservice.XmlEnvio, $"ConsultarSituacao-{DateTime.Now:yyyyMMddssfff}-{protocolo}-env.xml");

            // Verifica Schema
            ValidarSchema(retornoWebservice, "PedidoConsultaLote_v01.xsd");
            if (retornoWebservice.Erros.Any())
            {
                return(retornoWebservice);
            }

            // Recebe mensagem de retorno
            try
            {
                using (var cliente = GetCliente(TipoUrl.ConsultarSituacao))
                {
                    retornoWebservice.XmlRetorno      = cliente.ConsultaLote(retornoWebservice.XmlEnvio);
                    retornoWebservice.EnvelopeEnvio   = cliente.EnvelopeEnvio;
                    retornoWebservice.EnvelopeRetorno = cliente.EnvelopeRetorno;
                }
            }
            catch (Exception ex)
            {
                retornoWebservice.Erros.Add(new Evento {
                    Codigo = "0", Descricao = ex.Message
                });
                return(retornoWebservice);
            }

            GravarArquivoEmDisco(retornoWebservice.XmlRetorno, $"ConsultarSituacao-{DateTime.Now:yyyyMMddssfff}-{lote}-ret.xml");

            // Analisa mensagem de retorno
            var xmlRet = XDocument.Parse(retornoWebservice.XmlRetorno);

            MensagemErro(retornoWebservice, xmlRet, "RetornoConsulta");
            if (retornoWebservice.Erros.Any())
            {
                return(retornoWebservice);
            }

            retornoWebservice.Sucesso = xmlRet.Root?.ElementAnyNs("Cabecalho")?.ElementAnyNs("Sucesso")?.GetValue <bool>() ?? false;

            foreach (var nfse in xmlRet.Root.ElementsAnyNs("NFe"))
            {
                var chaveNFSe         = nfse.ElementAnyNs("ChaveNFe");
                var numeroNFSe        = chaveNFSe?.ElementAnyNs("NumeroNFe")?.GetValue <string>() ?? string.Empty;
                var codigoVerificacao = chaveNFSe?.ElementAnyNs("CodigoVerificacao")?.GetValue <string>() ?? string.Empty;

                var dataNFSe = nfse.ElementAnyNs("DataEmissaoNFe")?.GetValue <DateTime>() ?? DateTime.Now;

                var chaveRPS = nfse.ElementAnyNs("ChaveRPS");

                var numeroRps = chaveRPS?.ElementAnyNs("NumeroRPS")?.GetValue <string>() ?? string.Empty;

                GravarNFSeEmDisco(nfse.ToString(), $"NFSe-{numeroNFSe}-{codigoVerificacao}-.xml", dataNFSe);

                var nota = notas.FirstOrDefault(x => x.IdentificacaoRps.Numero == numeroRps);
                if (nota == null)
                {
                    notas.Load(nfse.ToString());
                }
                else
                {
                    nota.IdentificacaoNFSe.Numero = numeroNFSe;
                    nota.IdentificacaoNFSe.Chave  = codigoVerificacao;
                }
            }
            return(retornoWebservice);
        }
        public override RetornoWebservice ConsultarLoteRps(int lote, string protocolo, NotaFiscalCollection notas)
        {
            var retornoWebservice = new RetornoWebservice();

            var loteBuilder = new StringBuilder();

            loteBuilder.Append("<WS_ConsultaLoteRps.Execute xmlns:fiss=\"FISS-LEX\">");
            loteBuilder.Append("<fiss:Consultarloterpsenvio>");
            loteBuilder.Append("<Prestador>");
            loteBuilder.Append($"<Cnpj>{Configuracoes.PrestadorPadrao.CpfCnpj.ZeroFill(14)}</Cnpj>");
            loteBuilder.Append($"<InscricaoMunicipal>{Configuracoes.PrestadorPadrao.InscricaoMunicipal}</InscricaoMunicipal>");
            loteBuilder.Append("</Prestador>");
            loteBuilder.Append($"<Protocolo>{protocolo}</Protocolo>");
            loteBuilder.Append("</fiss:Consultarloterpsenvio>");
            loteBuilder.Append("</WS_ConsultaLoteRps.Execute>");
            retornoWebservice.XmlEnvio = loteBuilder.ToString();

            if (Configuracoes.Geral.RetirarAcentos)
            {
                retornoWebservice.XmlEnvio = retornoWebservice.XmlEnvio.RemoveAccent();
            }

            GravarArquivoEmDisco(retornoWebservice.XmlEnvio, $"ConsultarLote-{DateTime.Now:yyyyMMddssfff}-{protocolo}-env.xml");

            // Verifica Schema
            ValidarSchema(retornoWebservice, GetSchema(TipoUrl.ConsultarLoteRps));
            if (retornoWebservice.Erros.Any())
            {
                return(retornoWebservice);
            }

            // Recebe mensagem de retorno
            try
            {
                using (var cliente = GetClient(TipoUrl.ConsultarLoteRps))
                {
                    retornoWebservice.XmlRetorno = cliente.ConsultarLoteRps(GerarCabecalho(), retornoWebservice.XmlEnvio);
                }
            }
            catch (Exception ex)
            {
                retornoWebservice.Erros.Add(new Evento {
                    Codigo = "0", Descricao = ex.Message
                });
                return(retornoWebservice);
            }
            GravarArquivoEmDisco(retornoWebservice.XmlRetorno, $"ConsultarLote-{DateTime.Now:yyyyMMddssfff}-{lote}-ret.xml");

            // Analisa mensagem de retorno
            var xmlRet = XDocument.Parse(AjustarRetorno(retornoWebservice.XmlRetorno));

            MensagemErro(retornoWebservice, xmlRet, "WS_ConsultaLoteRps.ExecuteResponse", "Listamensagemretorno", "tcMensagemRetorno");
            if (retornoWebservice.Erros.Any())
            {
                return(retornoWebservice);
            }

            var rootElement = xmlRet.ElementAnyNs("WS_ConsultaLoteRps.ExecuteResponse").ElementAnyNs("Consultarloterpsresposta");
            var listaNfse   = rootElement?.ElementAnyNs("ListaNfse");

            if (listaNfse == null)
            {
                retornoWebservice.Erros.Add(new Evento {
                    Codigo = "0", Descricao = "Nenhuma NFSe retornada pelo webservice."
                });
                return(retornoWebservice);
            }

            retornoWebservice.Sucesso = true;
            foreach (var compNfse in listaNfse.ElementsAnyNs("CompNfse"))
            {
                var nfse       = compNfse.ElementAnyNs("Nfse").ElementAnyNs("InfNfse");
                var numeroNFSe = nfse.ElementAnyNs("Numero")?.GetValue <string>() ?? string.Empty;
                var chaveNFSe  = nfse.ElementAnyNs("CodigoVerificacao")?.GetValue <string>() ?? string.Empty;
                var dataNFSe   = nfse.ElementAnyNs("DataEmissao")?.GetValue <DateTime>() ?? DateTime.Now;
                var numeroRps  = nfse?.ElementAnyNs("IdentificacaoRps")?.ElementAnyNs("Numero")?.GetValue <string>() ?? string.Empty;
                GravarNFSeEmDisco(compNfse.AsString(true), $"NFSe-{numeroNFSe}-{chaveNFSe}-.xml", dataNFSe);

                var nota = notas.FirstOrDefault(x => x.IdentificacaoRps.Numero == numeroRps);
                if (nota == null)
                {
                    notas.Load(compNfse.ToString());
                }
                else
                {
                    nota.IdentificacaoNFSe.Numero = numeroNFSe;
                    nota.IdentificacaoNFSe.Chave  = chaveNFSe;
                }
            }
            return(retornoWebservice);
        }
Ejemplo n.º 5
0
        public override RetornoWebservice ConsultarLoteRps(int lote, string protocolo, NotaFiscalCollection notas)
        {
            var retornoWebservice = new RetornoWebservice();

            var loteBuilder = new StringBuilder();

            loteBuilder.Append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
            switch (Configuracoes.WebServices.Ambiente)
            {
            case DFeTipoAmbiente.Homologacao:
                loteBuilder.Append("<ConsultarLoteRpsEnvio xmlns=\"http://www.abrasf.org.br/nfse.xsd\" > ");
                loteBuilder.Append("<Prestador>");
                loteBuilder.Append($"<Cnpj>{Configuracoes.PrestadorPadrao.CpfCnpj.ZeroFill(14)}</Cnpj>");
                break;

            case DFeTipoAmbiente.Producao:
                loteBuilder.Append("<ConsultarLoteRpsEnvio xmlns=\"http://www.abrasf.org.br/ABRASF/arquivos/nfse.xsd\" > ");
                loteBuilder.Append("<Prestador>");
                loteBuilder.Append($"<CpfCnpj><Cnpj>{Configuracoes.PrestadorPadrao.CpfCnpj.ZeroFill(14)}</Cnpj></CpfCnpj>");
                break;
            }

            loteBuilder.Append($"<InscricaoMunicipal>{Configuracoes.PrestadorPadrao.InscricaoMunicipal}</InscricaoMunicipal>");
            loteBuilder.Append("</Prestador>");
            loteBuilder.Append($"<Protocolo>{protocolo}</Protocolo>");
            loteBuilder.Append("</ConsultarLoteRpsEnvio>");
            retornoWebservice.XmlEnvio = loteBuilder.ToString();

            if (Configuracoes.Geral.RetirarAcentos)
            {
                retornoWebservice.XmlEnvio = retornoWebservice.XmlEnvio.RemoveAccent();
            }

            //Versão 2.02 da Abrasaf não define a assinatura da consulta de lotes
            //retornoWebservice.XmlEnvio = XmlSigning.AssinarXml(retornoWebservice.XmlEnvio, "ConsultarLoteRpsEnvio", "", Certificado);

            GravarArquivoEmDisco(retornoWebservice.XmlEnvio, $"ConsultarLote-{DateTime.Now:yyyyMMddssfff}-{protocolo}-env.xml");

            // Verifica Schema
            ValidarSchema(retornoWebservice, "nfse_v202.xsd");
            if (retornoWebservice.Erros.Any())
            {
                return(retornoWebservice);
            }

            // Recebe mensagem de retorno
            try
            {
                using (var cliente = GetCliente(TipoUrl.ConsultarLoteRps))
                {
                    retornoWebservice.XmlRetorno = cliente.ConsultarLoteRps(GerarCabecalho(), retornoWebservice.XmlEnvio);
                }
            }
            catch (Exception ex)
            {
                retornoWebservice.Erros.Add(new Evento {
                    Codigo = "0", Descricao = ex.Message
                });
                return(retornoWebservice);
            }
            GravarArquivoEmDisco(retornoWebservice.XmlRetorno, $"ConsultarLote-{DateTime.Now:yyyyMMddssfff}-{lote}-ret.xml");

            // Analisa mensagem de retorno
            var xmlRet = XDocument.Parse(retornoWebservice.XmlRetorno);

            MensagemErro(retornoWebservice, xmlRet, "ConsultarLoteRpsResposta");
            if (retornoWebservice.Erros.Any())
            {
                return(retornoWebservice);
            }

            var retornoLote = xmlRet.ElementAnyNs("ConsultarLoteRpsResposta");
            var listaNfse   = retornoLote?.ElementAnyNs("ListaNfse");

            if (listaNfse == null)
            {
                retornoWebservice.Erros.Add(new Evento {
                    Codigo = "0", Descricao = "Lista de NFSe não encontrada! (ListaNfse)"
                });
                return(retornoWebservice);
            }

            retornoWebservice.Sucesso = true;

            foreach (var compNfse in listaNfse.ElementsAnyNs("CompNfse"))
            {
                var nfse       = compNfse.ElementAnyNs("Nfse").ElementAnyNs("InfNfse");
                var numeroNFSe = nfse.ElementAnyNs("Numero")?.GetValue <string>() ?? string.Empty;
                var chaveNFSe  = nfse.ElementAnyNs("CodigoVerificacao")?.GetValue <string>() ?? string.Empty;
                var dataNFSe   = nfse.ElementAnyNs("DataEmissao")?.GetValue <DateTime>() ?? DateTime.Now;
                var numeroRps  = nfse?.ElementAnyNs("IdentificacaoRps")?.ElementAnyNs("Numero")?.GetValue <string>() ?? string.Empty;
                GravarNFSeEmDisco(compNfse.ToString(), $"NFSe-{numeroNFSe}-{chaveNFSe}-.xml", dataNFSe);

                var nota = notas.FirstOrDefault(x => x.IdentificacaoRps.Numero == numeroRps);
                if (nota == null)
                {
                    notas.Load(compNfse.ToString());
                }
                else
                {
                    nota.IdentificacaoNFSe.Numero = numeroNFSe;
                    nota.IdentificacaoNFSe.Chave  = chaveNFSe;
                }
            }
            return(retornoWebservice);
        }
Ejemplo n.º 6
0
        public override RetornoWebservice EnviarSincrono(int lote, NotaFiscalCollection notas)
        {
            var retornoWebservice = new RetornoWebservice();

            if (lote == 0)
            {
                retornoWebservice.Erros.Add(new Evento {
                    Codigo = "0", Descricao = "Lote não informado."
                });
            }
            if (notas.Count == 0)
            {
                retornoWebservice.Erros.Add(new Evento {
                    Codigo = "0", Descricao = "Nenhuma RPS informada."
                });
            }
            if (notas.Count > 1)
            {
                retornoWebservice.Erros.Add(new Evento {
                    Codigo = "0", Descricao = "Apenas uma RPS pode ser enviada em modo Sincrono."
                });
            }
            if (retornoWebservice.Erros.Count > 0)
            {
                return(retornoWebservice);
            }

            var xmlLote = new StringBuilder();

            xmlLote.Append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
            xmlLote.Append("<GerarNfseEnvio xmlns=\"http://notacarioca.rio.gov.br/WSNacional/XSD/1/nfse_pcrj_v01.xsd\">");

            var xmlRps = WriteXmlRps(notas[0], false, false);

            XmlSigning.AssinarXml(xmlRps, "Rps", "InfRps", Certificado);
            GravarRpsEmDisco(xmlRps, $"Rps-{notas[0].IdentificacaoRps.DataEmissao:yyyyMMdd}-{notas[0].IdentificacaoRps.Numero}.xml", notas[0].IdentificacaoRps.DataEmissao);

            xmlLote.Append(xmlRps);
            xmlLote.Append("</GerarNfseEnvio>");
            retornoWebservice.XmlEnvio = xmlLote.ToString();

            if (Configuracoes.Geral.RetirarAcentos)
            {
                retornoWebservice.XmlEnvio = retornoWebservice.XmlEnvio.RemoveAccent();
            }

            GravarArquivoEmDisco(retornoWebservice.XmlEnvio, $"lote-sinc-{lote}-env.xml");

            // Verifica Schema
            ValidarSchema(retornoWebservice, GetSchema(TipoUrl.EnviarSincrono));
            if (retornoWebservice.Erros.Any())
            {
                return(retornoWebservice);
            }

            // Recebe mensagem de retorno
            try
            {
                using (var cliente = GetClient(TipoUrl.EnviarSincrono))
                {
                    retornoWebservice.XmlRetorno      = cliente.GerarNfse(GerarCabecalho(), retornoWebservice.XmlEnvio);
                    retornoWebservice.EnvelopeEnvio   = cliente.EnvelopeEnvio;
                    retornoWebservice.EnvelopeRetorno = cliente.EnvelopeRetorno;
                }
            }
            catch (Exception ex)
            {
                retornoWebservice.Erros.Add(new Evento {
                    Codigo = "0", Descricao = ex.Message
                });
                return(retornoWebservice);
            }
            GravarArquivoEmDisco(retornoWebservice.XmlRetorno, $"lote-sinc-{lote}-ret.xml");

            // Analisa mensagem de retorno
            var xmlRet = XDocument.Parse(retornoWebservice.XmlRetorno);

            MensagemErro(retornoWebservice, xmlRet, "GerarNfseResposta");
            if (retornoWebservice.Erros.Any())
            {
                return(retornoWebservice);
            }

            var compNfse   = xmlRet.ElementAnyNs("GerarNfseResposta")?.ElementAnyNs("CompNfse");
            var nfse       = compNfse.ElementAnyNs("Nfse").ElementAnyNs("InfNfse");
            var numeroNFSe = nfse.ElementAnyNs("Numero")?.GetValue <string>() ?? string.Empty;
            var chaveNFSe  = nfse.ElementAnyNs("CodigoVerificacao")?.GetValue <string>() ?? string.Empty;
            var dataNFSe   = nfse.ElementAnyNs("DataEmissao")?.GetValue <DateTime>() ?? DateTime.Now;
            var numeroRps  = nfse?.ElementAnyNs("IdentificacaoRps")?.ElementAnyNs("Numero")?.GetValue <string>() ?? string.Empty;

            GravarNFSeEmDisco(compNfse.AsString(true), $"NFSe-{numeroNFSe}-{chaveNFSe}-.xml", dataNFSe);

            var nota = notas.FirstOrDefault(x => x.IdentificacaoRps.Numero == numeroRps);

            if (nota == null)
            {
                notas.Load(compNfse.ToString());
            }
            else
            {
                nota.IdentificacaoNFSe.Numero = numeroNFSe;
                nota.IdentificacaoNFSe.Chave  = chaveNFSe;
            }

            retornoWebservice.Sucesso = true;
            return(retornoWebservice);
        }
        public override RetornoWebservice EnviarSincrono(int lote, NotaFiscalCollection notas)
        {
            var retornoWebservice = new RetornoWebservice();

            if (lote == 0)
            {
                retornoWebservice.Erros.Add(new Evento {
                    Codigo = "0", Descricao = "Lote não informado."
                });
            }
            if (notas.Count == 0)
            {
                retornoWebservice.Erros.Add(new Evento {
                    Codigo = "0", Descricao = "RPS não informado."
                });
            }
            if (notas.Count > 3)
            {
                retornoWebservice.Erros.Add(new Evento {
                    Codigo = "0", Descricao = "Apenas 3 RPS podem ser enviados em modo Sincrono."
                });
            }
            if (retornoWebservice.Erros.Count > 0)
            {
                return(retornoWebservice);
            }

            var xmlLoteRps = new StringBuilder();

            foreach (var nota in notas)
            {
                var xmlRps = GetXmlRps(nota, false, false);
                xmlLoteRps.Append(xmlRps);
                GravarRpsEmDisco(xmlRps, $"Rps-{nota.IdentificacaoRps.DataEmissao:yyyyMMdd}-{nota.IdentificacaoRps.Numero}.xml", nota.IdentificacaoRps.DataEmissao);
            }

            var xmlLote = new StringBuilder();

            xmlLote.Append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
            xmlLote.Append($"<GerarNfseEnvio {GetNamespace()}>");
            xmlLote.Append($"<LoteRps Id=\"L{lote}\">");
            xmlLote.Append($"<NumeroLote>{lote}</NumeroLote>");
            xmlLote.Append($"<Cnpj>{Configuracoes.PrestadorPadrao.CpfCnpj.ZeroFill(14)}</Cnpj>");
            xmlLote.Append($"<InscricaoMunicipal>{Configuracoes.PrestadorPadrao.InscricaoMunicipal}</InscricaoMunicipal>");
            xmlLote.Append($"<QuantidadeRps>{notas.Count}</QuantidadeRps>");
            xmlLote.Append("<ListaRps>");
            xmlLote.Append(xmlLoteRps);
            xmlLote.Append("</ListaRps>");
            xmlLote.Append("</LoteRps>");
            xmlLote.Append("</GerarNfseEnvio>");
            retornoWebservice.XmlEnvio = xmlLote.ToString();

            if (Configuracoes.Geral.RetirarAcentos)
            {
                retornoWebservice.XmlEnvio = retornoWebservice.XmlEnvio.RemoveAccent();
            }

            retornoWebservice.XmlEnvio = XmlSigning.AssinarXmlTodos(retornoWebservice.XmlEnvio, "Rps", "InfRps", Certificado);
            retornoWebservice.XmlEnvio = XmlSigning.AssinarXml(retornoWebservice.XmlEnvio, "GerarNfseEnvio", "LoteRps", Certificado);

            GravarArquivoEmDisco(retornoWebservice.XmlEnvio, $"lote-{lote}-env.xml");

            // Verifica Schema
            ValidarSchema(retornoWebservice, GetSchema(TipoUrl.EnviarSincrono));
            if (retornoWebservice.Erros.Any())
            {
                return(retornoWebservice);
            }

            // Recebe mensagem de retorno
            try
            {
                using (var cliente = GetClient(TipoUrl.EnviarSincrono))
                {
                    retornoWebservice.XmlRetorno = cliente.GerarNfse(GerarCabecalho(), retornoWebservice.XmlEnvio);
                }
            }
            catch (Exception ex)
            {
                retornoWebservice.Erros.Add(new Evento {
                    Codigo = "0", Descricao = ex.Message
                });
                return(retornoWebservice);
            }
            GravarArquivoEmDisco(retornoWebservice.XmlRetorno, $"lote-{lote}-ret.xml");

            // Analisa mensagem de retorno
            var xmlRet = XDocument.Parse(retornoWebservice.XmlRetorno);

            MensagemErro(retornoWebservice, xmlRet, "GerarNfseResposta");
            MensagemErro(retornoWebservice, xmlRet, "GerarNfseResposta", "ListaMensagemRetornoLote");
            if (retornoWebservice.Erros.Any())
            {
                return(retornoWebservice);
            }

            retornoWebservice.NumeroLote = xmlRet.Root?.ElementAnyNs("NumeroLote")?.GetValue <string>() ?? string.Empty;
            retornoWebservice.DataLote   = xmlRet.Root?.ElementAnyNs("DataRecebimento")?.GetValue <DateTime>() ?? DateTime.MinValue;
            retornoWebservice.Protocolo  = xmlRet.Root?.ElementAnyNs("Protocolo")?.GetValue <string>() ?? string.Empty;
            retornoWebservice.Sucesso    = !retornoWebservice.NumeroLote.IsEmpty();

            if (!retornoWebservice.Sucesso)
            {
                return(retornoWebservice);
            }

            var retornoLote = xmlRet.ElementAnyNs("GerarNfseResposta");
            var listaNfse   = retornoLote?.ElementAnyNs("ListaNfse");

            if (listaNfse == null)
            {
                retornoWebservice.Erros.Add(new Evento {
                    Codigo = "0", Descricao = "Lista de NFSe não encontrada! (ListaNfse)"
                });
                return(retornoWebservice);
            }

            retornoWebservice.Sucesso = true;

            foreach (var compNfse in listaNfse.ElementsAnyNs("CompNfse"))
            {
                var nfse       = compNfse.ElementAnyNs("Nfse").ElementAnyNs("InfNfse");
                var numeroNFSe = nfse.ElementAnyNs("Numero")?.GetValue <string>() ?? string.Empty;
                var chaveNFSe  = nfse.ElementAnyNs("CodigoVerificacao")?.GetValue <string>() ?? string.Empty;
                var dataNFSe   = nfse.ElementAnyNs("DataEmissao")?.GetValue <DateTime>() ?? DateTime.Now;
                var numeroRps  = nfse?.ElementAnyNs("IdentificacaoRps")?.ElementAnyNs("Numero")?.GetValue <string>() ?? string.Empty;
                GravarNFSeEmDisco(compNfse.AsString(true), $"NFSe-{numeroNFSe}-{chaveNFSe}-.xml", dataNFSe);

                var nota = notas.FirstOrDefault(x => x.IdentificacaoRps.Numero == numeroRps);
                if (nota == null)
                {
                    notas.Load(compNfse.ToString());
                }
                else
                {
                    nota.IdentificacaoNFSe.Numero = numeroNFSe;
                    nota.IdentificacaoNFSe.Chave  = chaveNFSe;
                }
            }

            return(retornoWebservice);
        }