/// <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); }
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); } }
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); }
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); }
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; } } }
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); }
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 }); } }
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); } }
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); } }
/// <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); } }
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); }
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); }
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); }
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); }
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); }
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); }
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); }
/// <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); }
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); }
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); }
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); }
public override RetornoWebservice EnviarSincrono(int lote, NotaFiscalCollection notas) { var retornoWebservice = new RetornoWebservice(); if (lote == 0) { retornoWebservice.Erros.Add(new Evento { Codigo = "0", Descricao = "Lote não informado." }); } if (notas.Count == 0) { retornoWebservice.Erros.Add(new Evento { Codigo = "0", Descricao = "Nenhuma RPS informada." }); } if (notas.Count > 1) { retornoWebservice.Erros.Add(new Evento { Codigo = "0", Descricao = "Apenas uma RPS pode ser enviada em modo Sincrono." }); } if (retornoWebservice.Erros.Count > 0) { return(retornoWebservice); } var xmlLote = new StringBuilder(); xmlLote.Append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>"); xmlLote.Append("<GerarNfseEnvio xmlns=\"http://notacarioca.rio.gov.br/WSNacional/XSD/1/nfse_pcrj_v01.xsd\">"); var xmlRps = WriteXmlRps(notas[0], false, false); XmlSigning.AssinarXml(xmlRps, "Rps", "InfRps", Certificado); GravarRpsEmDisco(xmlRps, $"Rps-{notas[0].IdentificacaoRps.DataEmissao:yyyyMMdd}-{notas[0].IdentificacaoRps.Numero}.xml", notas[0].IdentificacaoRps.DataEmissao); xmlLote.Append(xmlRps); xmlLote.Append("</GerarNfseEnvio>"); retornoWebservice.XmlEnvio = xmlLote.ToString(); if (Configuracoes.Geral.RetirarAcentos) { retornoWebservice.XmlEnvio = retornoWebservice.XmlEnvio.RemoveAccent(); } GravarArquivoEmDisco(retornoWebservice.XmlEnvio, $"lote-sinc-{lote}-env.xml"); // Verifica Schema ValidarSchema(retornoWebservice, GetSchema(TipoUrl.EnviarSincrono)); if (retornoWebservice.Erros.Any()) { return(retornoWebservice); } // Recebe mensagem de retorno try { using (var cliente = GetClient(TipoUrl.EnviarSincrono)) { retornoWebservice.XmlRetorno = cliente.GerarNfse(GerarCabecalho(), retornoWebservice.XmlEnvio); retornoWebservice.EnvelopeEnvio = cliente.EnvelopeEnvio; retornoWebservice.EnvelopeRetorno = cliente.EnvelopeRetorno; } } catch (Exception ex) { retornoWebservice.Erros.Add(new Evento { Codigo = "0", Descricao = ex.Message }); return(retornoWebservice); } GravarArquivoEmDisco(retornoWebservice.XmlRetorno, $"lote-sinc-{lote}-ret.xml"); // Analisa mensagem de retorno var xmlRet = XDocument.Parse(retornoWebservice.XmlRetorno); MensagemErro(retornoWebservice, xmlRet, "GerarNfseResposta"); if (retornoWebservice.Erros.Any()) { return(retornoWebservice); } var compNfse = xmlRet.ElementAnyNs("GerarNfseResposta")?.ElementAnyNs("CompNfse"); var nfse = compNfse.ElementAnyNs("Nfse").ElementAnyNs("InfNfse"); var numeroNFSe = nfse.ElementAnyNs("Numero")?.GetValue <string>() ?? string.Empty; var chaveNFSe = nfse.ElementAnyNs("CodigoVerificacao")?.GetValue <string>() ?? string.Empty; var dataNFSe = nfse.ElementAnyNs("DataEmissao")?.GetValue <DateTime>() ?? DateTime.Now; var numeroRps = nfse?.ElementAnyNs("IdentificacaoRps")?.ElementAnyNs("Numero")?.GetValue <string>() ?? string.Empty; GravarNFSeEmDisco(compNfse.AsString(true), $"NFSe-{numeroNFSe}-{chaveNFSe}-.xml", dataNFSe); var nota = notas.FirstOrDefault(x => x.IdentificacaoRps.Numero == numeroRps); if (nota == null) { notas.Load(compNfse.ToString()); } else { nota.IdentificacaoNFSe.Numero = numeroNFSe; nota.IdentificacaoNFSe.Chave = chaveNFSe; } retornoWebservice.Sucesso = true; return(retornoWebservice); }
public override RetornoWebservice 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); }
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); }
public override RetornoWebservice ConsultarLoteRps(int lote, string protocolo, NotaFiscalCollection notas) { var retornoWebservice = new RetornoWebservice(); var loteBuilder = new StringBuilder(); loteBuilder.Append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>"); loteBuilder.Append("<PedidoConsultaLote xmlns=\"http://www.prefeitura.sp.gov.br/nfe\" xmlns:xsi = \"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd = \"http://www.w3.org/2001/XMLSchema\">"); loteBuilder.Append("<Cabecalho xmlns=\"\" Versao=\"1\">"); loteBuilder.Append($"<CPFCNPJRemetente><CNPJ>{Configuracoes.PrestadorPadrao.CpfCnpj.ZeroFill(14)}</CNPJ></CPFCNPJRemetente>"); loteBuilder.Append($"<NumeroLote>{lote}</NumeroLote>"); loteBuilder.Append("</Cabecalho>"); loteBuilder.Append("</PedidoConsultaLote>"); retornoWebservice.XmlEnvio = loteBuilder.ToString(); if (Configuracoes.Geral.RetirarAcentos) { retornoWebservice.XmlEnvio = retornoWebservice.XmlEnvio.RemoveAccent(); } retornoWebservice.XmlEnvio = XmlSigning.AssinarXml(retornoWebservice.XmlEnvio, "PedidoConsultaLote", "", Certificado); GravarArquivoEmDisco(retornoWebservice.XmlEnvio, $"ConsultarSituacao-{DateTime.Now:yyyyMMddssfff}-{protocolo}-env.xml"); // Verifica Schema ValidarSchema(retornoWebservice, "PedidoConsultaLote_v01.xsd"); if (retornoWebservice.Erros.Any()) { return(retornoWebservice); } // Recebe mensagem de retorno try { using (var cliente = GetCliente(TipoUrl.ConsultarSituacao)) { retornoWebservice.XmlRetorno = cliente.ConsultaLote(retornoWebservice.XmlEnvio); retornoWebservice.EnvelopeEnvio = cliente.EnvelopeEnvio; retornoWebservice.EnvelopeRetorno = cliente.EnvelopeRetorno; } } catch (Exception ex) { retornoWebservice.Erros.Add(new Evento { Codigo = "0", Descricao = ex.Message }); return(retornoWebservice); } GravarArquivoEmDisco(retornoWebservice.XmlRetorno, $"ConsultarSituacao-{DateTime.Now:yyyyMMddssfff}-{lote}-ret.xml"); // Analisa mensagem de retorno var xmlRet = XDocument.Parse(retornoWebservice.XmlRetorno); MensagemErro(retornoWebservice, xmlRet, "RetornoConsulta"); if (retornoWebservice.Erros.Any()) { return(retornoWebservice); } retornoWebservice.Sucesso = xmlRet.Root?.ElementAnyNs("Cabecalho")?.ElementAnyNs("Sucesso")?.GetValue <bool>() ?? false; foreach (var nfse in xmlRet.Root.ElementsAnyNs("NFe")) { var chaveNFSe = nfse.ElementAnyNs("ChaveNFe"); var numeroNFSe = chaveNFSe?.ElementAnyNs("NumeroNFe")?.GetValue <string>() ?? string.Empty; var codigoVerificacao = chaveNFSe?.ElementAnyNs("CodigoVerificacao")?.GetValue <string>() ?? string.Empty; var dataNFSe = nfse.ElementAnyNs("DataEmissaoNFe")?.GetValue <DateTime>() ?? DateTime.Now; var chaveRPS = nfse.ElementAnyNs("ChaveRPS"); var numeroRps = chaveRPS?.ElementAnyNs("NumeroRPS")?.GetValue <string>() ?? string.Empty; GravarNFSeEmDisco(nfse.ToString(), $"NFSe-{numeroNFSe}-{codigoVerificacao}-.xml", dataNFSe); var nota = notas.FirstOrDefault(x => x.IdentificacaoRps.Numero == numeroRps); if (nota == null) { notas.Load(nfse.ToString()); } else { nota.IdentificacaoNFSe.Numero = numeroNFSe; nota.IdentificacaoNFSe.Chave = codigoVerificacao; } } return(retornoWebservice); }
public override RetornoWebservice 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); }
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); }
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); }
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); }
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); }