/// <summary>
        /// Valida o XML de acordo com o schema.
        /// </summary>
        /// <param name="xml">A mensagem XML que deve ser verificada.</param>
        /// <param name="schema">O schema que será usado na verificação.</param>
        /// <returns>Se estiver tudo OK retorna null, caso contrário as mensagens de alertas e erros.</returns>
        protected RetornoWebservice ValidarSchema(string xml, string schema)
        {
            schema = Path.Combine(Config.Geral.PathSchemas, Name, schema);
            string[] errosSchema;
            string[] alertasSchema;
            if (XmlSchemaValidation.ValidarXml(xml, schema, out errosSchema, out alertasSchema))
            {
                return(null);
            }

            var retLote = new RetornoWebservice
            {
                Assincrono = true,
                XmlEnvio   = xml
            };

            foreach (var erro in errosSchema.Select(descricao => new Evento {
                Codigo = "0", Descricao = descricao
            }))
            {
                retLote.Erros.Add(erro);
            }

            foreach (var alerta in alertasSchema.Select(descricao => new Evento {
                Codigo = "0", Descricao = descricao
            }))
            {
                retLote.Alertas.Add(alerta);
            }

            return(retLote);
        }
Пример #2
0
        protected override void MensagemErro(RetornoWebservice retornoWs, XContainer xmlRet, string xmlTag)
        {
            var mensagens = xmlRet?.ElementAnyNs(xmlTag);

            mensagens = mensagens?.ElementAnyNs("ListaMensagemRetorno") ?? mensagens?.ElementAnyNs("ListaMensagemRetornoLote");
            if (mensagens == null)
            {
                return;
            }

            foreach (var mensagem in mensagens.ElementsAnyNs("MensagemRetorno"))
            {
                var codigoRetorno = mensagem?.ElementAnyNs("Codigo")?.GetValue <string>();

                if (!string.IsNullOrEmpty(codigoRetorno) && codigoRetorno == "L000") //Emitido com Sucesso
                {
                    return;
                }

                var evento = new Evento
                {
                    Codigo    = mensagem?.ElementAnyNs("Codigo")?.GetValue <string>() ?? string.Empty,
                    Descricao = mensagem?.ElementAnyNs("Mensagem")?.GetValue <string>() ?? string.Empty,
                    Correcao  = mensagem?.ElementAnyNs("Correcao")?.GetValue <string>() ?? string.Empty
                };

                retornoWs.Erros.Add(evento);
            }
        }
Пример #3
0
        public override RetornoWebservice ConsultarLoteRps(int lote, string protocolo, NotaFiscalCollection notas)
        {
            var retornoWebservice = new RetornoWebservice();

            var loteBuilder = new StringBuilder();

            loteBuilder.Append($"<ConsultarLoteRpsEnvio xmlns=\"http://www.issnetonline.com.br/webserviceabrasf/vsd/servico_consultar_lote_rps_envio.xsd\">");
            loteBuilder.Append("<Prestador>");
            loteBuilder.Append($"<CpfCnpj><Cnpj>{Configuracoes.PrestadorPadrao.CpfCnpj.ZeroFill(14)}</Cnpj></CpfCnpj>");
            loteBuilder.Append($"<InscricaoMunicipal>{Configuracoes.PrestadorPadrao.InscricaoMunicipal}</InscricaoMunicipal>");
            loteBuilder.Append("</Prestador>");
            loteBuilder.Append($"<Protocolo>{protocolo}</Protocolo>");
            loteBuilder.Append("</ConsultarLoteRpsEnvio>");
            retornoWebservice.XmlEnvio = loteBuilder.ToString();

            XNamespace tc      = "http://www.issnetonline.com.br/webserviceabrasf/vsd/tipos_complexos.xsd";
            var        element = XElement.Parse(retornoWebservice.XmlEnvio);

            element.AddAttribute(new XAttribute(XNamespace.Xmlns + "tc", "http://www.issnetonline.com.br/webserviceabrasf/vsd/tipos_complexos.xsd"));
            ApplyNamespace(element, tc, "ConsultarLoteRpsEnvio", "Prestador", "Protocolo");

            retornoWebservice.XmlEnvio = "<?xml version=\"1.0\" encoding=\"utf-8\"?>" + element.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);
                    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, $"ConsultarLote-{DateTime.Now:yyyyMMddssfff}-{lote}-ret.xml");
            TratarRetornoConsultarLoteRps(retornoWebservice, notas);
            return(retornoWebservice);
        }
Пример #4
0
        public override RetornoWebservice ConsultaNFSe(DateTime?inicio, DateTime?fim, string numeroNFSe, int pagina, string cnpjTomador,
                                                       string imTomador, string nomeInter, string cnpjInter, string imInter, string serie, NotaFiscalCollection notas)
        {
            if (!string.IsNullOrWhiteSpace(numeroNFSe))
            {
                // Se informou o número da NFSe, utiliza o método que retorna apenas a NFSe desejada.
                return(ConsultarRpsNfseSP("", "", numeroNFSe, notas));
            }

            var retornoWebservice = new RetornoWebservice();

            retornoWebservice.Erros.Add(new Evento {
                Codigo = "0", Descricao = "Falta implementar, no nosso componente, a Consulta de Lista da NFe Recebidas/Emitidas."
            });
            return(retornoWebservice);
        }
Пример #5
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;
                }
            }
        }
Пример #6
0
        private static void MensagemErro2(RetornoWebservice retornoWs, XContainer xmlRet)
        {
            if (xmlRet.ElementAnyNs("Info").ElementAnyNs("Sucesso").GetValue <bool>())
            {
                return;
            }

            var mensagem = xmlRet.ElementAnyNs("Info").ElementAnyNs("Message");

            var evento = new Evento
            {
                Codigo    = mensagem?.ElementAnyNs("Id")?.GetValue <string>() ?? string.Empty,
                Descricao = mensagem?.ElementAnyNs("Description")?.GetValue <string>() ?? string.Empty,
                Correcao  = mensagem?.ElementAnyNs("Description")?.GetValue <string>() ?? string.Empty
            };

            retornoWs.Erros.Add(evento);
        }
Пример #7
0
        private static void MensagemErro(RetornoWebservice retornoWs, XContainer xmlRet, string xmlTag)
        {
            var mensagens = xmlRet?.ElementAnyNs(xmlTag);

            mensagens = mensagens?.ElementAnyNs("Messages");
            if (mensagens == null)
            {
                return;
            }

            foreach (var mensagem in mensagens.ElementsAnyNs("Message"))
            {
                retornoWs.Erros.Add(new Evento
                {
                    Codigo    = mensagem?.ElementAnyNs("Id")?.GetValue <string>() ?? string.Empty,
                    Descricao = mensagem?.ElementAnyNs("Description")?.GetValue <string>() ?? string.Empty,
                    Correcao  = mensagem?.ElementAnyNs("Description")?.GetValue <string>() ?? string.Empty
                });
            }
        }
Пример #8
0
        private static void MensagemErro(RetornoWebservice retornoWs, XContainer xmlRet, string xmlTag, string elementName = "listaErros", string messageElement = "erro")
        {
            var listaErros = xmlRet?.ElementAnyNs(xmlTag)?.ElementAnyNs(elementName);

            if (listaErros == null)
            {
                return;
            }

            foreach (var erro in listaErros.ElementsAnyNs(messageElement))
            {
                var evento = new Evento
                {
                    Codigo    = erro?.ElementAnyNs("cdMensagem")?.GetValue <string>() ?? string.Empty,
                    Descricao = erro?.ElementAnyNs("dsMensagem")?.GetValue <string>() ?? string.Empty,
                };

                retornoWs.Erros.Add(evento);
            }
        }
Пример #9
0
        private static void MensagemErro(RetornoWebservice retornoWs, XContainer xmlRet, string xmlTag)
        {
            var mensagens = xmlRet?.ElementAnyNs(xmlTag);

            if (mensagens == null)
            {
                return;
            }

            foreach (var mensagem in mensagens.ElementsAnyNs("Alerta"))
            {
                var evento = new Evento
                {
                    Codigo    = mensagem?.ElementAnyNs("Codigo")?.GetValue <string>() ?? string.Empty,
                    Descricao = mensagem?.ElementAnyNs("Descricao")?.GetValue <string>() ?? string.Empty
                };
                var chave = mensagens?.ElementAnyNs("ChaveRPSNFe");
                if (chave != null)
                {
                    evento.IdentificacaoNfse.Chave = chave.ElementAnyNs("ChaveNFe")?.GetValue <string>() ?? string.Empty;
                    evento.IdentificacaoRps.Numero = chave.ElementAnyNs("ChaveRPS")?.GetValue <string>() ?? string.Empty;
                }
                retornoWs.Alertas.Add(evento);
            }

            foreach (var mensagem in mensagens.ElementsAnyNs("Erro"))
            {
                var evento = new Evento
                {
                    Codigo    = mensagem?.ElementAnyNs("Codigo")?.GetValue <string>() ?? string.Empty,
                    Descricao = mensagem?.ElementAnyNs("Descricao")?.GetValue <string>() ?? string.Empty
                };
                var chave = mensagens?.ElementAnyNs("ChaveRPSNFe");
                if (chave != null)
                {
                    evento.IdentificacaoNfse.Chave = chave.ElementAnyNs("ChaveNFe")?.GetValue <string>() ?? string.Empty;
                    evento.IdentificacaoRps.Numero = chave.ElementAnyNs("ChaveRPS")?.GetValue <string>() ?? string.Empty;
                }
                retornoWs.Erros.Add(evento);
            }
        }
Пример #10
0
        /// <summary>
        /// Valida o XML de acordo com o schema.
        /// </summary>
        /// <param name="retorno"></param>
        /// <param name="schema">O schema que será usado na verificação.</param>
        /// <returns>Se estiver tudo OK retorna null, caso contrário as mensagens de alertas e erros.</returns>
        protected void ValidarSchema(RetornoWebservice retorno, string schema)
        {
            schema = Path.Combine(Configuracoes.Arquivos.PathSchemas, Name, schema);
            if (XmlSchemaValidation.ValidarXml(retorno.XmlEnvio, schema, out var errosSchema, out var alertasSchema))
            {
                return;
            }

            foreach (var erro in errosSchema.Select(descricao => new Evento {
                Codigo = "0", Descricao = descricao
            }))
            {
                retorno.Erros.Add(erro);
            }

            foreach (var alerta in alertasSchema.Select(descricao => new Evento {
                Codigo = "0", Descricao = descricao
            }))
            {
                retorno.Alertas.Add(alerta);
            }
        }
Пример #11
0
        public override RetornoWebservice Enviar(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 (retornoWebservice.Erros.Count > 0)
            {
                return(retornoWebservice);
            }

            var xmlRPS = new StringBuilder();

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

            xmlRPS.Replace("<RPS>", "<RPS xmlns=\"\">");

            var loteBuilder = new StringBuilder();

            loteBuilder.Append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
            loteBuilder.Append("<PedidoEnvioLoteRPS 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($"<transacao>true</transacao>");
            loteBuilder.Append($"<dtInicio>{notas.Min(x => x.IdentificacaoRps.DataEmissao):yyyy-MM-dd}</dtInicio>");
            loteBuilder.Append($"<dtFim>{notas.Max(x => x.IdentificacaoRps.DataEmissao):yyyy-MM-dd}</dtFim>");
            loteBuilder.Append($"<QtdRPS>{notas.Count}</QtdRPS>");
            loteBuilder.Append(string.Format(CultureInfo.InvariantCulture, "<ValorTotalServicos>{0:0.00}</ValorTotalServicos>", notas.Sum(x => x.Servico.Valores.ValorServicos)));
            loteBuilder.Append(string.Format(CultureInfo.InvariantCulture, "<ValorTotalDeducoes>{0:0.00}</ValorTotalDeducoes>", notas.Sum(x => x.Servico.Valores.ValorDeducoes)));
            loteBuilder.Append("</Cabecalho>");
            loteBuilder.Append(xmlRPS);
            loteBuilder.Append("</PedidoEnvioLoteRPS>");
            retornoWebservice.XmlEnvio = loteBuilder.ToString();

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

            retornoWebservice.XmlEnvio = XmlSigning.AssinarXml(retornoWebservice.XmlEnvio, "PedidoEnvioLoteRPS", "", Certificado);
            GravarArquivoEmDisco(retornoWebservice.XmlEnvio, $"lote-{lote}-env.xml");

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

            // Recebe mensagem de retorno
            try
            {
                using (var cliente = GetCliente(TipoUrl.Enviar))
                {
                    retornoWebservice.XmlRetorno = Configuracoes.WebServices.Ambiente == DFeTipoAmbiente.Homologacao
                        ? cliente.TesteEnvioLoteRPS(retornoWebservice.XmlEnvio)
                        : cliente.EnvioLoteRPS(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-{lote}-ret.xml");

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

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

            retornoWebservice.Sucesso    = xmlRet.Root?.ElementAnyNs("Cabecalho")?.ElementAnyNs("Sucesso")?.GetValue <bool>() ?? false;
            retornoWebservice.NumeroLote = xmlRet.Root?.ElementAnyNs("Cabecalho")?.ElementAnyNs("InformacoesLote")?.ElementAnyNs("NumeroLote")?.GetValue <string>() ?? string.Empty;
            retornoWebservice.DataLote   = xmlRet.Root?.ElementAnyNs("Cabecalho")?.ElementAnyNs("InformacoesLote")?.ElementAnyNs("DataEnvioLote")?.GetValue <DateTime>() ?? DateTime.MinValue;

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

            foreach (NotaFiscal nota in notas)
            {
                nota.NumeroLote = retornoWebservice.NumeroLote;
            }

            return(retornoWebservice);
        }
Пример #12
0
        public override RetornoWebservice Enviar(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 (retornoWebservice.Erros.Any())
            {
                return(retornoWebservice);
            }

            var xmlLoteRps = new StringBuilder();

            foreach (var nota in notas)
            {
                var xmlRps = WriteXmlRps(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($"<EnviarLoteRpsEnvio {GetNamespace()}>");
            xmlLote.Append($"<LoteRps Id=\"L{lote}\" xmlns=\"\">");
            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("</EnviarLoteRpsEnvio>");
            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, "EnviarLoteRpsEnvio", "LoteRps", Certificado);

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

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

            // Recebe mensagem de retorno
            try
            {
                using (var cliente = GetClient(TipoUrl.Enviar))
                {
                    retornoWebservice.XmlRetorno      = cliente.RecepcionarLoteRps(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-{lote}-ret.xml");

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

            MensagemErro(retornoWebservice, xmlRoot, "EnviarLoteRpsResposta");
            if (retornoWebservice.Erros.Any())
            {
                return(retornoWebservice);
            }

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

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

            // ReSharper disable once SuggestVarOrType_SimpleTypes
            foreach (NotaFiscal nota in notas)
            {
                nota.NumeroLote = retornoWebservice.NumeroLote;
            }

            return(retornoWebservice);
        }
Пример #13
0
        public override RetornoWebservice ConsultaNFSe(DateTime?inicio, DateTime?fim, string numeroNfse, int pagina, string cnpjTomador,
                                                       string imTomador, string nomeInter, string cnpjInter, string imInter, string serie, NotaFiscalCollection notas)
        {
            var retornoWebservice = new RetornoWebservice();

            var loteBuilder = new StringBuilder();

            loteBuilder.Append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
            loteBuilder.Append($"<ConsultarNfseEnvio {GetNamespace()}>");
            loteBuilder.Append("<Prestador xmlns=\"\">");
            loteBuilder.Append($"<Cnpj>{Configuracoes.PrestadorPadrao.CpfCnpj.ZeroFill(14)}</Cnpj>");
            loteBuilder.Append($"<InscricaoMunicipal>{Configuracoes.PrestadorPadrao.InscricaoMunicipal}</InscricaoMunicipal>");
            loteBuilder.Append("</Prestador>");

            if (!numeroNfse.IsEmpty())
            {
                loteBuilder.Append($"<NumeroNfse xmlns=\"\">{numeroNfse}</NumeroNfse>");
            }

            if (inicio.HasValue && fim.HasValue)
            {
                loteBuilder.Append("<PeriodoEmissao xmlns=\"\">");
                loteBuilder.Append($"<DataInicial>{inicio:yyyy-MM-dd}</DataInicial>");
                loteBuilder.Append($"<DataFinal>{fim:yyyy-MM-dd}</DataFinal>");
                loteBuilder.Append("</PeriodoEmissao>");
            }

            if (!cnpjTomador.IsEmpty() || !imTomador.IsEmpty())
            {
                loteBuilder.Append("<Tomador xmlns=\"\">");
                loteBuilder.Append("<CpfCnpj>");
                loteBuilder.Append(cnpjTomador.IsCNPJ()
                    ? $"<Cnpj>{cnpjTomador.ZeroFill(14)}</Cnpj>"
                    : $"<Cpf>{cnpjTomador.ZeroFill(11)}</Cpf>");
                loteBuilder.Append("</CpfCnpj>");
                if (!imTomador.IsEmpty())
                {
                    loteBuilder.Append($"<InscricaoMunicipal>{imTomador}</InscricaoMunicipal>");
                }
                loteBuilder.Append("</Tomador>");
            }

            if (!nomeInter.IsEmpty() && !cnpjInter.IsEmpty())
            {
                loteBuilder.Append("<IntermediarioServico xmlns=\"\">");
                loteBuilder.Append($"<RazaoSocial>{nomeInter}</RazaoSocial>");
                loteBuilder.Append(cnpjInter.IsCNPJ()
                    ? $"<Cnpj>{cnpjInter.ZeroFill(14)}</Cnpj>"
                    : $"<Cpf>{cnpjInter.ZeroFill(11)}</Cpf>");
                loteBuilder.Append("</CpfCnpj>");
                if (!imInter.IsEmpty())
                {
                    loteBuilder.Append($"<InscricaoMunicipal>{imInter}</InscricaoMunicipal>");
                }
                loteBuilder.Append("</IntermediarioServico>");
            }

            loteBuilder.Append("</ConsultarNfseEnvio>");
            retornoWebservice.XmlEnvio = loteBuilder.ToString();

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

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

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

            // Recebe mensagem de retorno
            try
            {
                using (var cliente = GetClient(TipoUrl.ConsultaNFSe))
                {
                    retornoWebservice.XmlRetorno      = cliente.ConsultarNFSe(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, $"ConNota-{DateTime.Now:yyyyMMddssfff}-{numeroNfse}-ret.xml");

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

            MensagemErro(retornoWebservice, xmlRet.Root, "ConsultarNfseResposta");

            if (retornoWebservice.Erros.Any())
            {
                return(retornoWebservice);
            }

            var retornoLote = xmlRet.Root.ElementAnyNs("ConsultarNfseResposta");
            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);
            }

            foreach (var compNfse in listaNfse.ElementsAnyNs("CompNfse"))
            {
                // Carrega a nota fiscal na coleção de Notas Fiscais
                var nota = LoadXml(compNfse.AsString());
                notas.Add(nota);
            }

            retornoWebservice.Sucesso = true;

            return(retornoWebservice);
        }
Пример #14
0
        public override RetornoWebservice ConsultaNFSeRps(string numero, string serie, TipoRps tipo, NotaFiscalCollection notas)
        {
            var retornoWebservice = new RetornoWebservice();

            if (numero.IsEmpty())
            {
                retornoWebservice.Erros.Add(new Evento {
                    Codigo = "0", Descricao = "Número da NFSe não informado para a consulta."
                });
                return(retornoWebservice);
            }

            var loteBuilder = new StringBuilder();

            loteBuilder.Append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
            loteBuilder.Append($"<ConsultarNfsePorRpsEnvio {GetNamespace()}>");
            loteBuilder.Append("<IdentificacaoRps xmlns=\"\">");
            loteBuilder.Append($"<Numero>{numero}</Numero>");
            loteBuilder.Append($"<Serie>{serie}</Serie>");
            loteBuilder.Append($"<Tipo>{(int)tipo + 1}</Tipo>");
            loteBuilder.Append("</IdentificacaoRps>");
            loteBuilder.Append("<Prestador xmlns=\"\">");
            loteBuilder.Append($"<Cnpj>{Configuracoes.PrestadorPadrao.CpfCnpj.ZeroFill(14)}</Cnpj>");
            loteBuilder.Append($"<InscricaoMunicipal>{Configuracoes.PrestadorPadrao.InscricaoMunicipal}</InscricaoMunicipal>");
            loteBuilder.Append("</Prestador>");
            loteBuilder.Append("</ConsultarNfsePorRpsEnvio>");
            retornoWebservice.XmlEnvio = loteBuilder.ToString();

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

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

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

            // Recebe mensagem de retorno
            try
            {
                using (var cliente = GetClient(TipoUrl.ConsultaNFSeRps))
                {
                    retornoWebservice.XmlRetorno      = cliente.ConsultarNFSePorRps(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, $"ConNotaRps-{numero}-ret.xml");

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

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

            var compNfse = xmlRet.Root.ElementAnyNs("ConsultarNfseRpsResposta")?.ElementAnyNs("CompNfse");

            if (compNfse == null)
            {
                retornoWebservice.Erros.Add(new Evento {
                    Codigo = "0", Descricao = "Nota Fiscal não encontrada! (CompNfse)"
                });
                return(retornoWebservice);
            }

            // Carrega a nota fiscal na coleção de Notas Fiscais
            var nota = LoadXml(compNfse.AsString());

            notas.Add(nota);

            retornoWebservice.Sucesso = true;
            return(retornoWebservice);
        }
Пример #15
0
        public override RetornoWebservice ConsultarLoteRps(int lote, string protocolo, NotaFiscalCollection notas)
        {
            var retornoWebservice = new RetornoWebservice();

            retornoWebservice.XmlEnvio = new StringBuilder()
                                         .Append($"<es:esConsultarLoteRpsEnvio xmlns:es=\"http://www.equiplano.com.br/esnfs\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://www.equiplano.com.br/enfs esConsultarLoteRpsEnvio_v01.xsd\">")
                                         .Append("<prestador>")
                                         .Append($"<cnpj>{ Configuracoes.PrestadorPadrao.CpfCnpj }</cnpj>")
                                         .Append($"<idEntidade>{ Municipio.IdEntidade }</idEntidade>")
                                         .Append("</prestador>")
                                         .Append($"<nrLoteRps>{ lote }</nrLoteRps>")
                                         .Append("</es:esConsultarLoteRpsEnvio>")
                                         .ToString();

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

            retornoWebservice.XmlEnvio = XmlSigning.AssinarXml(retornoWebservice.XmlEnvio, "es:esConsultarLoteRpsEnvio", "", Certificado);

            retornoWebservice.XmlEnvio = new StringBuilder()
                                         .Append("<esConsultarLoteNfse xmlns=\"http://services.enfsws.es\">")
                                         .Append("<nrVersaoXml>1</nrVersaoXml>")
                                         .Append("<xml>")
                                         .AppendEnvio(retornoWebservice.XmlEnvio)
                                         .Append("</xml>")
                                         .Append("</esConsultarLoteNfse>")
                                         .ToString();

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

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

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

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

            retornoWebservice.XmlRetorno = retornoWebservice.XmlRetorno
                                           .Replace("<ns:esConsultarLoteRpsResponse xmlns:ns=\"http://services.enfsws.es\">", "")
                                           .Replace("<ns:return>", "")
                                           .Replace("</ns:return>", "")
                                           .Replace("</ns:esConsultarLoteRpsResponse>", "");

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

            MensagemErro(retornoWebservice, rootElement, "mensagemRetorno");
            if (retornoWebservice.Erros.Count > 0)
            {
                return(retornoWebservice);
            }

            var elementRoot = xmlRet.ElementAnyNs("esConsultarLoteRpsResposta");

            var listaNfse = elementRoot.ElementAnyNs("listaNfse");

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

            foreach (var nfse in listaNfse.ElementsAnyNs("nfse"))
            {
                var nota = new NotaFiscal();
                nota.IdentificacaoNFSe.Chave       = nfse?.ElementAnyNs("cdAutenticacao")?.GetValue <string>() ?? string.Empty;
                nota.IdentificacaoNFSe.Numero      = nfse?.ElementAnyNs("nrNfse")?.GetValue <string>() ?? string.Empty;
                nota.IdentificacaoRps.Numero       = nfse?.ElementAnyNs("nrRps")?.GetValue <string>() ?? string.Empty;
                nota.IdentificacaoNFSe.DataEmissao = nfse.ElementAnyNs("dtEmissaoNfs")?.GetValue <DateTime>() ?? DateTime.MinValue;

                notas.Add(nota);
            }

            retornoWebservice.Sucesso = true;
            return(retornoWebservice);
        }
Пример #16
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);
        }
Пример #17
0
        public override RetornoWebservice CancelaNFSe(string codigoCancelamento, string numeroNFSe, string motivo, NotaFiscalCollection notas)
        {
            var retornoWebservice = new RetornoWebservice();

            if (string.IsNullOrWhiteSpace(numeroNFSe))
            {
                retornoWebservice.Erros.Add(new Evento {
                    Codigo = "0", Descricao = "Número da NFSe não informado para cancelamento."
                });
                return(retornoWebservice);
            }

            // Hash Cancelamento
            var hash = Configuracoes.PrestadorPadrao.InscricaoMunicipal.ZeroFill(8) + numeroNFSe.ZeroFill(12);

            var hashAssinado = "";
            var rsa          = (RSACryptoServiceProvider)Certificado.PrivateKey;
            var hashBytes    = Encoding.ASCII.GetBytes(hash);

            byte[] signData = rsa.SignData(hashBytes, new SHA1CryptoServiceProvider());
            hashAssinado = Convert.ToBase64String(signData);

            var loteBuilder = new StringBuilder();

            loteBuilder.Append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
            loteBuilder.Append("<PedidoCancelamentoNFe xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns=\"http://www.prefeitura.sp.gov.br/nfe\">");
            loteBuilder.Append("<Cabecalho xmlns=\"\" Versao=\"1\">");
            loteBuilder.Append($"<CPFCNPJRemetente><CNPJ>{Configuracoes.PrestadorPadrao.CpfCnpj.ZeroFill(14)}</CNPJ></CPFCNPJRemetente>");
            loteBuilder.Append($"<transacao>true</transacao>");
            loteBuilder.Append("</Cabecalho>");
            loteBuilder.Append("<Detalhe xmlns=\"\">");
            loteBuilder.Append("<ChaveNFe>");
            loteBuilder.Append($"<InscricaoPrestador>{Configuracoes.PrestadorPadrao.InscricaoMunicipal.ZeroFill(8)}</InscricaoPrestador>");
            loteBuilder.Append($"<NumeroNFe>{numeroNFSe}</NumeroNFe>");
            loteBuilder.Append("</ChaveNFe>");
            loteBuilder.Append($"<AssinaturaCancelamento>{hashAssinado}</AssinaturaCancelamento>");
            loteBuilder.Append("</Detalhe>");
            loteBuilder.Append("</PedidoCancelamentoNFe>");
            retornoWebservice.XmlEnvio = loteBuilder.ToString();

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

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

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

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

            // Recebe mensagem de retorno
            try
            {
                using (var cliente = GetCliente(TipoUrl.CancelaNFSe))
                {
                    retornoWebservice.XmlRetorno      = cliente.CancelamentoNFe(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, $"CanNFSe-{numeroNFSe}-ret.xml");

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

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

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

            // Se a nota fiscal cancelada existir na coleção de Notas Fiscais, atualiza seu status:
            var nota = notas.FirstOrDefault(x => x.IdentificacaoNFSe.Numero.Trim() == numeroNFSe);

            if (nota != null)
            {
                nota.Situacao = SituacaoNFSeRps.Cancelado;
                nota.Cancelamento.Pedido.CodigoCancelamento = codigoCancelamento;
                nota.Cancelamento.MotivoCancelamento        = motivo;
                // No caso de São Paulo, não retorna o XML da NotaFiscal Cancelada.
                // Por este motivo, não grava o arquivo NFSe-{nota.IdentificacaoNFSe.Chave}-{nota.IdentificacaoNFSe.Numero}.xml
            }

            return(retornoWebservice);
        }
Пример #18
0
        /// <inheritdoc />
        public override RetornoWebservice Enviar(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 (retornoWebservice.Erros.Count > 0)
            {
                return(retornoWebservice);
            }

            var xmlLoteRps = new StringBuilder();

            foreach (var nota in notas)
            {
                var xmlRps = WriteXmlRps(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($"<EnviarLoteRpsEnvio {GetNamespace()}>");
            xmlLote.Append($"<LoteRps Id=\"L{lote}\" versao=\"1.00\">");
            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("</EnviarLoteRpsEnvio>");
            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, "EnviarLoteRpsEnvio", "LoteRps", Certificado);

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

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

            // Recebe mensagem de retorno
            try
            {
                using (var cliente = GetClient(TipoUrl.Enviar))
                {
                    retornoWebservice.XmlRetorno      = cliente.RecepcionarLoteRps(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-{lote}-ret.xml");
            TratarRetornoEnviar(retornoWebservice, notas);
            return(retornoWebservice);
        }
Пример #19
0
        public override RetornoWebservice ConsultaNFSeRps(string numero, string serie, TipoRps tipo, NotaFiscalCollection notas)
        {
            var retornoWebservice = new RetornoWebservice();

            if (numero.IsEmpty())
            {
                retornoWebservice.Erros.Add(new Evento {
                    Codigo = "0", Descricao = "Número da NFSe não informado para a consulta."
                });
                return(retornoWebservice);
            }

            var loteBuilder = new StringBuilder();

            loteBuilder.Append($"<ConsultarNfseRpsEnvio xmlns=\"http://www.issnetonline.com.br/webserviceabrasf/vsd/servico_consultar_nfse_rps_envio.xsd\">");
            loteBuilder.Append("<IdentificacaoRps>");
            loteBuilder.Append($"<Numero>{numero}</Numero>");
            loteBuilder.Append($"<Serie>{serie}</Serie>");
            loteBuilder.Append($"<Tipo>{(int)tipo + 1}</Tipo>");
            loteBuilder.Append("</IdentificacaoRps>");
            loteBuilder.Append("<Prestador>");
            loteBuilder.Append($"<CpfCnpj><Cnpj>{Configuracoes.PrestadorPadrao.CpfCnpj.ZeroFill(14)}</Cnpj></CpfCnpj>");
            loteBuilder.Append($"<InscricaoMunicipal>{Configuracoes.PrestadorPadrao.InscricaoMunicipal}</InscricaoMunicipal>");
            loteBuilder.Append("</Prestador>");
            loteBuilder.Append("</ConsultarNfseRpsEnvio>");
            retornoWebservice.XmlEnvio = loteBuilder.ToString();

            XNamespace tc      = "http://www.issnetonline.com.br/webserviceabrasf/vsd/tipos_complexos.xsd";
            var        element = XElement.Parse(retornoWebservice.XmlEnvio);

            element.AddAttribute(new XAttribute(XNamespace.Xmlns + "tc", "http://www.issnetonline.com.br/webserviceabrasf/vsd/tipos_complexos.xsd"));
            ApplyNamespace(element, tc, "ConsultarNfseRpsEnvio", "IdentificacaoRps", "Prestador");

            retornoWebservice.XmlEnvio = "<?xml version=\"1.0\" encoding=\"utf-8\"?>" + element.ToString();

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

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

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

            // Recebe mensagem de retorno
            try
            {
                using (var cliente = GetClient(TipoUrl.ConsultaNFSeRps))
                {
                    retornoWebservice.XmlRetorno      = cliente.ConsultarNFSePorRps(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, $"ConNotaRps-{numero}-ret.xml");
            TratarRetornoConsultaNFSeRps(retornoWebservice, notas);
            return(retornoWebservice);
        }
Пример #20
0
        public override RetornoWebservice Enviar(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 (retornoWebservice.Erros.Count > 0)
            {
                return(retornoWebservice);
            }

            var xmlListaRps = new StringBuilder();

            xmlListaRps.Append("<listaRps>");
            foreach (var nota in notas)
            {
                var xmlRps = WriteXmlRps(nota, false, false);
                xmlListaRps.Append(xmlRps);
                GravarRpsEmDisco(xmlRps, $"Rps-{nota.IdentificacaoRps.DataEmissao:yyyyMMdd}-{nota.IdentificacaoRps.Numero}.xml", nota.IdentificacaoRps.DataEmissao);
            }
            xmlListaRps.Append("</listaRps>");

            var optanteSimplesNacional = notas.First().RegimeEspecialTributacao == RegimeEspecialTributacao.SimplesNacional ? "1" : "2";

            retornoWebservice.XmlEnvio = new StringBuilder()
                                         .Append("<es:enviarLoteRpsEnvio xmlns:es=\"http://www.equiplano.com.br/esnfs\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://www.equiplano.com.br/enfs esRecepcionarLoteRpsEnvio_01.xsd\">")
                                         .Append($"<lote>")
                                         .Append($"<nrLote>{ lote }</nrLote>")
                                         .Append($"<qtRps>{ notas.Count }</qtRps>")
                                         .Append($"<nrVersaoXml>1</nrVersaoXml>")
                                         .Append("<prestador>")
                                         .Append($"<nrCnpj>{ Configuracoes.PrestadorPadrao.CpfCnpj }</nrCnpj>")
                                         .Append($"<nrInscricaoMunicipal>{ Configuracoes.PrestadorPadrao.InscricaoMunicipal }</nrInscricaoMunicipal>")
                                         .Append($"<isOptanteSimplesNacional>{ optanteSimplesNacional }</isOptanteSimplesNacional>")
                                         .Append($"<idEntidade>{ Municipio.IdEntidade }</idEntidade>")
                                         .Append("</prestador>")
                                         .Append(xmlListaRps.ToString())
                                         .Append("</lote>")
                                         .Append("</es:enviarLoteRpsEnvio>")
                                         .ToString();

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

            retornoWebservice.XmlEnvio = XmlSigning.AssinarXml(retornoWebservice.XmlEnvio, "es:enviarLoteRpsEnvio", "", Certificado);

            retornoWebservice.XmlEnvio = new StringBuilder()
                                         .Append("<esRecepcionarLoteRps xmlns=\"http://services.enfsws.es\">")
                                         .Append("<nrVersaoXml>1</nrVersaoXml>")
                                         .Append("<xml>")
                                         .AppendEnvio(retornoWebservice.XmlEnvio)
                                         .Append("</xml>")
                                         .Append("</esRecepcionarLoteRps>")
                                         .ToString();

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

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

            // Recebe mensagem de retorno
            try
            {
                using (var cliente = GetClient(TipoUrl.Enviar))
                {
                    retornoWebservice.XmlRetorno = cliente.RecepcionarLoteRps(null, retornoWebservice.XmlEnvio);
                    retornoWebservice.XmlRetorno = retornoWebservice.XmlRetorno.AjustarString();
                }
            }
            catch (Exception ex)
            {
                retornoWebservice.Erros.Add(new Evento {
                    Codigo = "0", Descricao = ex.Message
                });
                return(retornoWebservice);
            }

            GravarArquivoEmDisco(retornoWebservice.XmlRetorno, $"lote-{lote}-ret.xml");

            retornoWebservice.XmlRetorno = retornoWebservice.XmlRetorno
                                           .Replace("<ns:esRecepcionarLoteRpsResponse xmlns:ns=\"http://services.enfsws.es\">", "")
                                           .Replace("<ns:return>", "")
                                           .Replace("</ns:return>", "")
                                           .Replace("</ns:esRecepcionarLoteRpsResponse>", "");

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

            var rootElement = xmlRet.ElementAnyNs("esEnviarLoteRpsResposta");

            MensagemErro(retornoWebservice, rootElement, "mensagemRetorno");
            if (retornoWebservice.Erros.Count > 0)
            {
                return(retornoWebservice);
            }

            var protocoloElement = rootElement?.ElementAnyNs("protocolo");

            retornoWebservice.NumeroLote = protocoloElement?.ElementAnyNs("nrLote")?.GetValue <string>() ?? string.Empty;
            retornoWebservice.DataLote   = protocoloElement?.ElementAnyNs("dtRecebimento")?.GetValue <DateTime>() ?? DateTime.MinValue;
            retornoWebservice.Protocolo  = protocoloElement?.ElementAnyNs("nrProtocolo")?.GetValue <string>() ?? string.Empty;
            retornoWebservice.Sucesso    = !retornoWebservice.NumeroLote.IsEmpty();

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

            foreach (var nota in notas)
            {
                nota.NumeroLote = retornoWebservice.NumeroLote;
            }

            return(retornoWebservice);
        }
Пример #21
0
        public override RetornoWebservice CancelaNFSe(string codigoCancelamento, string numeroNFSe, string motivo, NotaFiscalCollection notas)
        {
            var retornoWebservice = new RetornoWebservice();

            if (numeroNFSe.IsEmpty())
            {
                retornoWebservice.Erros.Add(new Evento {
                    Codigo = "0", Descricao = "Número da NFSe não informado para cancelamento."
                });
                return(retornoWebservice);
            }

            retornoWebservice.XmlEnvio = new StringBuilder()
                                         .Append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>")
                                         .Append("<es:esCancelarNfseEnvio xmlns:es=\"http://www.equiplano.com.br/esnfs\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://www.equiplano.com.br/enfs esCancelarNfseEnvio_v01.xsd\">")
                                         .Append("<prestador>")
                                         .Append($"<cnpj>{ Configuracoes.PrestadorPadrao.CpfCnpj }</cnpj>")
                                         .Append($"<idEntidade>{ Municipio.IdEntidade }</idEntidade>")
                                         .Append("</prestador>")
                                         .Append($"<nrNfse>{ numeroNFSe }</nrNfse>")
                                         .Append($"<dsMotivoCancelamento>{ motivo }</dsMotivoCancelamento>")
                                         .Append("</es:esCancelarNfseEnvio>")
                                         .ToString();

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

            retornoWebservice.XmlEnvio = XmlSigning.AssinarXml(retornoWebservice.XmlEnvio, "es:esCancelarNfseEnvio", "", Certificado);

            retornoWebservice.XmlEnvio = new StringBuilder()
                                         .Append("<esCancelarNfse xmlns=\"http://services.enfsws.es\">")
                                         .Append("<nrVersaoXml>1</nrVersaoXml>")
                                         .Append("<xml>")
                                         .AppendEnvio(retornoWebservice.XmlEnvio)
                                         .Append("</xml>")
                                         .Append("</esCancelarNfse>")
                                         .ToString();

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

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

            // Recebe mensagem de retorno
            try
            {
                using (var cliente = GetClient(TipoUrl.CancelaNFSe))
                {
                    retornoWebservice.XmlRetorno = cliente.CancelarNFSe(null, retornoWebservice.XmlEnvio);
                    retornoWebservice.XmlRetorno = retornoWebservice.XmlRetorno.AjustarString();
                }
            }
            catch (Exception ex)
            {
                retornoWebservice.Erros.Add(new Evento {
                    Codigo = "0", Descricao = ex.Message
                });
                return(retornoWebservice);
            }

            GravarArquivoEmDisco(retornoWebservice.XmlRetorno, $"CanNFSe-{numeroNFSe}-ret.xml");

            retornoWebservice.XmlRetorno = retornoWebservice.XmlRetorno
                                           .Replace("<ns:esCancelarNfseResponse xmlns:ns=\"http://services.enfsws.es\">", "")
                                           .Replace("<ns:return>", "")
                                           .Replace("</ns:return>", "")
                                           .Replace("</ns:esCancelarNfseResponse>", "");

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

            var rootElement = xmlRet.ElementAnyNs("esCancelarNfseResposta");

            MensagemErro(retornoWebservice, rootElement, "mensagemRetorno");
            if (retornoWebservice.Erros.Count > 0)
            {
                return(retornoWebservice);
            }

            var sucesso = rootElement.ElementAnyNs("sucesso");

            if (sucesso == null)
            {
                retornoWebservice.Erros.Add(new Evento {
                    Codigo = "0", Descricao = "Confirmação do cancelamento não encontrada!"
                });
                return(retornoWebservice);
            }

            retornoWebservice.DataLote = rootElement.ElementAnyNs("dtCancelamento")?.GetValue <DateTime>() ?? DateTime.MinValue;
            retornoWebservice.Sucesso  = retornoWebservice.DataLote != DateTime.MinValue;

            // Se a nota fiscal cancelada existir na coleção de Notas Fiscais, atualiza seu status:
            var nota = notas.FirstOrDefault(x => x.IdentificacaoNFSe.Numero.Trim() == numeroNFSe);

            if (nota == null)
            {
                return(retornoWebservice);
            }

            nota.Situacao = SituacaoNFSeRps.Cancelado;
            nota.Cancelamento.Pedido.CodigoCancelamento = codigoCancelamento;
            nota.Cancelamento.DataHora           = rootElement.ElementAnyNs("dtCancelamento")?.GetValue <DateTime>() ?? DateTime.MinValue;
            nota.Cancelamento.MotivoCancelamento = motivo;

            return(retornoWebservice);
        }
Пример #22
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);
        }
Пример #23
0
        public override RetornoWebservice ConsultaNFSe(DateTime?inicio, DateTime?fim, string numeroNfse, int pagina, string cnpjPrestador, string imPrestador, string nomeInter, string cnpjInter, string imInter, string serie, NotaFiscalCollection notas)
        {
            var retornoWebservice = new RetornoWebservice();
            var xml = new StringBuilder()
                      .Append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>")
                      .Append("<es:esConsultarNfseEnvio xmlns:es=\"http://www.equiplano.com.br/esnfs\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://www.equiplano.com.br/enfs esConsultarNfsePorRpsEnvio_v01.xsd\">")
                      .Append("<prestador>")
                      .Append($"<cnpj>{ Configuracoes.PrestadorPadrao.CpfCnpj }</cnpj>")
                      .Append($"<idEntidade>{ Municipio.IdEntidade }</idEntidade>")
                      .Append("</prestador>");

            if (!numeroNfse.IsEmpty())
            {
                xml = xml.Append($"<nrNfse>{ numeroNfse }</nrNfse>");
            }
            else
            {
                if (inicio == null || fim == null)
                {
                    retornoWebservice.Erros.Add(new Evento {
                        Codigo = "0", Descricao = "Data de início ou fim não informada para a consulta."
                    });
                    return(retornoWebservice);
                }

                xml = xml
                      .Append("<periodoEmissao>")
                      .Append($"<dtInicial>{inicio.Value:yyyy'-'MM'-'dd'T'HH':'mm':'ss}</dtInicial>")
                      .Append($"<dtFinal>{fim.Value:yyyy'-'MM'-'dd'T'HH':'mm':'ss}</dtFinal>")
                      .Append("</periodoEmissao>");
            }
            xml = xml.Append("</es:esConsultarNfseEnvio>");

            retornoWebservice.XmlEnvio = xml.ToString();;

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

            var xmlAssinado = XmlSigning.AssinarXml(retornoWebservice.XmlEnvio, "es:esConsultarNfseEnvio", "", Certificado);

            retornoWebservice.XmlEnvio = new StringBuilder()
                                         .Append("<esConsultarNfse xmlns=\"http://services.enfsws.es\">")
                                         .Append("<nrVersaoXml>1</nrVersaoXml>")
                                         .Append("<xml>")
                                         .AppendEnvio(xmlAssinado)
                                         .Append("</xml>")
                                         .Append("</esConsultarNfse>")
                                         .ToString();

            GravarArquivoEmDisco(retornoWebservice.XmlEnvio, $"ConNota-env.xml");

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

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

            retornoWebservice.XmlRetorno = retornoWebservice.XmlRetorno
                                           .Replace("<ns:esConsultarNfseResponse xmlns:ns=\"http://services.enfsws.es\">", "")
                                           .Replace("<ns:return>", "")
                                           .Replace("</ns:return>", "")
                                           .Replace("</ns:esConsultarNfseResponse>", "");

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

            MensagemErro(retornoWebservice, xmlRet.ElementAnyNs("esConsultarNfseResposta"), "mensagemRetorno");
            if (retornoWebservice.Erros.Count > 0)
            {
                return(retornoWebservice);
            }

            var elementRoot = xmlRet.ElementAnyNs("esConsultarNfseResposta");

            var listaNfse = elementRoot.ElementAnyNs("listaNfse");

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

            foreach (var nfse in listaNfse.ElementsAnyNs("nfse"))
            {
                var nota = new NotaFiscal();
                nota.IdentificacaoNFSe.Chave       = nfse?.ElementAnyNs("cdAutenticacao")?.GetValue <string>() ?? string.Empty;
                nota.IdentificacaoNFSe.Numero      = nfse?.ElementAnyNs("nrNfse")?.GetValue <string>() ?? string.Empty;
                nota.IdentificacaoRps.Numero       = nfse?.ElementAnyNs("nrRps")?.GetValue <string>() ?? string.Empty;
                nota.IdentificacaoNFSe.DataEmissao = nfse.ElementAnyNs("dtEmissaoNfs")?.GetValue <DateTime>() ?? DateTime.MinValue;
                nota.Situacao = SituacaoNFSeRps.Normal;

                var infoCancelamento = nfse.ElementAnyNs("cancelamento");
                if (infoCancelamento != null)
                {
                    nota.Cancelamento.DataHora           = infoCancelamento.ElementAnyNs("dtCancelamento")?.GetValue <DateTime>() ?? DateTime.MinValue;
                    nota.Cancelamento.MotivoCancelamento = infoCancelamento?.ElementAnyNs("dsCancelamento")?.GetValue <string>() ?? string.Empty;
                    nota.Situacao = SituacaoNFSeRps.Cancelado;
                }

                notas.Add(nota);
            }

            retornoWebservice.Sucesso = true;
            return(retornoWebservice);
        }
Пример #24
0
        public override RetornoWebservice ConsultarSituacao(int lote, string protocolo)
        {
            var retornoWebservice = new RetornoWebservice();

            var loteBuilder = new StringBuilder();

            loteBuilder.Append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
            loteBuilder.Append("<PedidoInformacoesLote 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($"<InscricaoPrestador>{Configuracoes.PrestadorPadrao.InscricaoMunicipal.ZeroFill(8)}</InscricaoPrestador>");
            loteBuilder.Append("</Cabecalho>");
            loteBuilder.Append("</PedidoInformacoesLote>");
            retornoWebservice.XmlEnvio = loteBuilder.ToString();

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

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

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

            // Recebe mensagem de retorno
            try
            {
                using (var cliente = GetCliente(TipoUrl.ConsultarLoteRps))
                {
                    retornoWebservice.XmlRetorno      = cliente.ConsultaInformacoesLote(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, $"ConsultarLote-{DateTime.Now:yyyyMMddssfff}-{lote}-ret.xml");

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

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

            retornoWebservice.Sucesso    = xmlRet.Root?.ElementAnyNs("Cabecalho")?.ElementAnyNs("Sucesso")?.GetValue <bool>() ?? false;
            retornoWebservice.NumeroLote = xmlRet.Root?.ElementAnyNs("Cabecalho")?.ElementAnyNs("InformacoesLote")?.ElementAnyNs("NumeroLote")?.GetValue <string>() ?? string.Empty;
            return(retornoWebservice);
        }
Пример #25
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);
        }
Пример #26
0
        public override RetornoWebservice CancelaNFSe(string codigoCancelamento, string numeroNFSe, string motivo, NotaFiscalCollection notas)
        {
            var retornoWebservice = new RetornoWebservice();

            if (numeroNFSe.IsEmpty() || codigoCancelamento.IsEmpty())
            {
                retornoWebservice.Erros.Add(new Evento {
                    Codigo = "0", Descricao = "Número da NFSe/Codigo de cancelamento não informado para cancelamento."
                });
                return(retornoWebservice);
            }

            var loteBuilder = new StringBuilder();

            loteBuilder.Append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
            loteBuilder.Append($"<CancelarNfseEnvio {GetNamespace()}>");
            loteBuilder.Append("<Pedido xmlns=\"\">");
            loteBuilder.Append($"<InfPedidoCancelamento Id=\"N{numeroNFSe}\">");
            loteBuilder.Append("<IdentificacaoNfse>");
            loteBuilder.Append($"<Numero>{numeroNFSe}</Numero>");
            loteBuilder.Append($"<Cnpj>{Configuracoes.PrestadorPadrao.CpfCnpj.ZeroFill(14)}</Cnpj>");
            loteBuilder.Append($"<InscricaoMunicipal>{Configuracoes.PrestadorPadrao.InscricaoMunicipal}</InscricaoMunicipal>");
            loteBuilder.Append($"<CodigoMunicipio>{Configuracoes.PrestadorPadrao.Endereco.CodigoMunicipio}</CodigoMunicipio>");
            loteBuilder.Append("</IdentificacaoNfse>");
            loteBuilder.Append($"<CodigoCancelamento>{codigoCancelamento}</CodigoCancelamento>");
            loteBuilder.Append("</InfPedidoCancelamento>");
            loteBuilder.Append("</Pedido>");
            loteBuilder.Append("</CancelarNfseEnvio>");
            retornoWebservice.XmlEnvio = loteBuilder.ToString();

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

            retornoWebservice.XmlEnvio = XmlSigning.AssinarXml(retornoWebservice.XmlEnvio, "Pedido", "InfPedidoCancelamento", Certificado);
            GravarArquivoEmDisco(retornoWebservice.XmlEnvio, $"CanNFSe-{numeroNFSe}-env.xml");

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

            // Recebe mensagem de retorno
            try
            {
                using (var cliente = GetClient(TipoUrl.CancelaNFSe))
                {
                    retornoWebservice.XmlRetorno      = cliente.CancelarNFSe(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, $"CanNFSe-{numeroNFSe}-ret.xml");

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

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

            var confirmacaoCancelamento = xmlRet.Root.ElementAnyNs("CancelarNfseReposta");

            retornoWebservice.DataLote = confirmacaoCancelamento.ElementAnyNs("DataHora")?.GetValue <DateTime>() ?? DateTime.MinValue;
            retornoWebservice.Sucesso  = confirmacaoCancelamento.ElementAnyNs("Sucesso")?.GetValue <bool>() ?? false;

            // Se a nota fiscal cancelada existir na coleção de Notas Fiscais, atualiza seu status:
            var nota = notas.FirstOrDefault(x => x.IdentificacaoNFSe.Numero.Trim() == numeroNFSe);

            if (nota == null)
            {
                return(retornoWebservice);
            }

            nota.Situacao = SituacaoNFSeRps.Cancelado;
            nota.Cancelamento.Pedido.CodigoCancelamento = codigoCancelamento;
            nota.Cancelamento.DataHora           = confirmacaoCancelamento.ElementAnyNs("DataHora")?.GetValue <DateTime>() ?? DateTime.MinValue;
            nota.Cancelamento.MotivoCancelamento = motivo;

            return(retornoWebservice);
        }
Пример #27
0
        public override RetornoWebservice CancelaNFSe(string codigoCancelamento, string numeroNFSe, string motivo, NotaFiscalCollection notas)
        {
            var retornoWebservice = new RetornoWebservice();

            if (numeroNFSe.IsEmpty() || codigoCancelamento.IsEmpty())
            {
                retornoWebservice.Erros.Add(new Evento {
                    Codigo = "0", Descricao = "Número da NFSe/Codigo de cancelamento não informado para cancelamento."
                });
                return(retornoWebservice);
            }

            var loteBuilder = new StringBuilder();

            loteBuilder.Append($"<pl:CancelarNfseEnvio xmlns:pl=\"http://www.issnetonline.com.br/webserviceabrasf/vsd/servico_cancelar_nfse_envio.xsd\">");
            loteBuilder.Append("<Pedido>");
            loteBuilder.Append($"<InfPedidoCancelamento>");
            loteBuilder.Append("<IdentificacaoNfse>");
            loteBuilder.Append($"<Numero>{numeroNFSe}</Numero>");
            loteBuilder.Append($"<Cnpj>{Configuracoes.PrestadorPadrao.CpfCnpj.ZeroFill(14)}</Cnpj>");
            loteBuilder.Append($"<InscricaoMunicipal>{Configuracoes.PrestadorPadrao.InscricaoMunicipal}</InscricaoMunicipal>");
            loteBuilder.Append($"<CodigoMunicipio>{Configuracoes.PrestadorPadrao.Endereco.CodigoMunicipio}</CodigoMunicipio>");
            loteBuilder.Append("</IdentificacaoNfse>");
            loteBuilder.Append($"<CodigoCancelamento>{codigoCancelamento}</CodigoCancelamento>");

            if (!string.IsNullOrEmpty(motivo))
            {
                loteBuilder.Append($"<MotivoCancelamentoNfse>{motivo}</MotivoCancelamentoNfse>");
            }

            loteBuilder.Append("</InfPedidoCancelamento>");
            loteBuilder.Append("</Pedido>");
            loteBuilder.Append("</pl:CancelarNfseEnvio>");
            retornoWebservice.XmlEnvio = loteBuilder.ToString();

            XNamespace tc      = "http://www.issnetonline.com.br/webserviceabrasf/vsd/tipos_complexos.xsd";
            var        element = XElement.Parse(retornoWebservice.XmlEnvio);

            element.AddAttribute(new XAttribute(XNamespace.Xmlns + "tc", "http://www.issnetonline.com.br/webserviceabrasf/vsd/tipos_complexos.xsd"));
            ApplyNamespace(element, tc, "CancelarNfseEnvio", "Pedido");

            retornoWebservice.XmlEnvio = element.ToString();

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

            retornoWebservice.XmlEnvio = XmlSigning.AssinarXml(retornoWebservice.XmlEnvio, "Pedido", "", Certificado);
            GravarArquivoEmDisco(retornoWebservice.XmlEnvio, $"CanNFSe-{numeroNFSe}-env.xml");

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

            // Recebe mensagem de retorno
            try
            {
                using (var cliente = GetClient(TipoUrl.CancelaNFSe))
                {
                    retornoWebservice.XmlRetorno      = cliente.CancelarNFSe(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, $"CanNFSe-{numeroNFSe}-ret.xml");
            TratarRetornoCancelaNFSe(retornoWebservice, notas);
            return(retornoWebservice);
        }
Пример #28
0
        public override RetornoWebservice ConsultarSituacao(int lote, string protocolo)
        {
            var retornoWebservice = new RetornoWebservice();

            // Monta mensagem de envio
            var loteBuilder = new StringBuilder();

            loteBuilder.Append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
            loteBuilder.Append($"<ConsultarSituacaoLoteRpsEnvio {GetNamespace()}>");
            loteBuilder.Append("<Prestador xmlns=\"\">");
            loteBuilder.Append($"<Cnpj>{Configuracoes.PrestadorPadrao.CpfCnpj.ZeroFill(14)}</Cnpj>");
            loteBuilder.Append($"<InscricaoMunicipal>{Configuracoes.PrestadorPadrao.InscricaoMunicipal}</InscricaoMunicipal>");
            loteBuilder.Append("</Prestador>");
            loteBuilder.Append($"<Protocolo xmlns=\"\">{protocolo}</Protocolo>");
            loteBuilder.Append("</ConsultarSituacaoLoteRpsEnvio>");
            retornoWebservice.XmlEnvio = loteBuilder.ToString();

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

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

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

            // Recebe mensagem de retorno
            try
            {
                using (var cliente = GetClient(TipoUrl.ConsultarSituacao))
                {
                    retornoWebservice.XmlRetorno      = cliente.ConsultarSituacaoLoteRps(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, $"ConsultarSituacao-{DateTime.Now:yyyyMMddssfff}-{lote}-ret.xml");

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

            MensagemErro(retornoWebservice, xmlRet.Root, "ConsultarSituacaoLoteRpsResposta");

            retornoWebservice.NumeroLote = xmlRet.Root?.ElementAnyNs("ConsultarSituacaoLoteRpsResposta")?.ElementAnyNs("NumeroLote")?.GetValue <string>() ?? string.Empty;
            retornoWebservice.Situacao   = xmlRet.Root?.ElementAnyNs("ConsultarSituacaoLoteRpsResposta")?.ElementAnyNs("Situacao")?.GetValue <string>() ?? string.Empty;
            retornoWebservice.Sucesso    = !retornoWebservice.Erros.Any();
            return(retornoWebservice);
        }
Пример #29
0
        public override RetornoWebservice ConsultarLoteRps(int lote, string protocolo, NotaFiscalCollection notas)
        {
            var retornoWebservice = new RetornoWebservice();

            var loteBuilder = new StringBuilder();

            loteBuilder.Append($"<ConsultarLoteRpsEnvio {GetNamespace()}>");
            loteBuilder.Append("<Prestador xmlns=\"\">");
            loteBuilder.Append($"<Cnpj>{Configuracoes.PrestadorPadrao.CpfCnpj.ZeroFill(14)}</Cnpj>");
            loteBuilder.Append($"<InscricaoMunicipal>{Configuracoes.PrestadorPadrao.InscricaoMunicipal}</InscricaoMunicipal>");
            loteBuilder.Append("</Prestador>");
            loteBuilder.Append($"<Protocolo xmlns=\"\">{protocolo}</Protocolo>");
            loteBuilder.Append("</ConsultarLoteRpsEnvio>");
            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);
                    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, $"ConsultarLote-{DateTime.Now:yyyyMMddssfff}-{lote}-ret.xml");

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

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

            var retornoLote = xmlRet.Root.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.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);
        }
Пример #30
0
        public override RetornoWebservice ConsultarSituacao(int lote, string protocolo)
        {
            var retornoWebservice = new RetornoWebservice();

            retornoWebservice.XmlEnvio = new StringBuilder()
                                         .Append($"<es:esConsultarSituacaoLoteRpsEnvio xmlns:es=\"http://www.equiplano.com.br/esnfs\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://www.equiplano.com.br/enfs esConsultarLoteRpsEnvio_v01.xsd\">")
                                         .Append("<prestador>")
                                         .Append($"<cnpj>{ Configuracoes.PrestadorPadrao.CpfCnpj }</cnpj>")
                                         .Append($"<idEntidade>{ Municipio.IdEntidade }</idEntidade>")
                                         .Append("</prestador>")
                                         .Append($"<nrLoteRps>{ lote }</nrLoteRps>")
                                         .Append("</es:esConsultarSituacaoLoteRpsEnvio>")
                                         .ToString();

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

            var xmlAssinado = XmlSigning.AssinarXml(retornoWebservice.XmlEnvio, "es:esConsultarSituacaoLoteRpsEnvio", "", Certificado);

            retornoWebservice.XmlEnvio = new StringBuilder()
                                         .Append("<esConsultarSituacaoLoteRps xmlns=\"http://services.enfsws.es\">")
                                         .Append("<nrVersaoXml>1</nrVersaoXml>")
                                         .Append("<xml>")
                                         .AppendEnvio(xmlAssinado)
                                         .Append("</xml>")
                                         .Append("</esConsultarSituacaoLoteRps>")
                                         .ToString();

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

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

            // Recebe mensagem de retorno
            try
            {
                using (var cliente = GetClient(TipoUrl.ConsultarSituacao))
                {
                    retornoWebservice.XmlRetorno = cliente.ConsultarSituacaoLoteRps(null, retornoWebservice.XmlEnvio);
                    retornoWebservice.XmlRetorno = retornoWebservice.XmlRetorno.AjustarString();
                }
            }
            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");

            retornoWebservice.XmlRetorno = retornoWebservice.XmlRetorno
                                           .Replace("<ns:esConsultarSituacaoLoteRpsResponse xmlns:ns=\"http://services.enfsws.es\">", "")
                                           .Replace("<ns:return>", "")
                                           .Replace("</ns:return>", "")
                                           .Replace("</ns:esConsultarSituacaoLoteRpsResponse>", "");

            var xmlRet      = XDocument.Parse(retornoWebservice.XmlRetorno);
            var rootElement = xmlRet.ElementAnyNs("esConsultarSituacaoLoteRpsResposta");

            MensagemErro(retornoWebservice, rootElement, "mensagemRetorno");

            retornoWebservice.NumeroLote = rootElement?.ElementAnyNs("nrLoteRps")?.GetValue <string>() ?? string.Empty;
            retornoWebservice.Situacao   = rootElement?.ElementAnyNs("stLote")?.GetValue <string>() ?? "0";
            retornoWebservice.Sucesso    = !retornoWebservice.Erros.Any();
            return(retornoWebservice);
        }