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; } } }
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); }
public override RetornoWebservice ConsultarLoteRps(int lote, string protocolo, NotaFiscalCollection notas) { var retornoWebservice = new RetornoWebservice(); var loteBuilder = new StringBuilder(); loteBuilder.Append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>"); loteBuilder.Append("<PedidoConsultaLote xmlns=\"http://www.prefeitura.sp.gov.br/nfe\" xmlns:xsi = \"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd = \"http://www.w3.org/2001/XMLSchema\">"); loteBuilder.Append("<Cabecalho xmlns=\"\" Versao=\"1\">"); loteBuilder.Append($"<CPFCNPJRemetente><CNPJ>{Configuracoes.PrestadorPadrao.CpfCnpj.ZeroFill(14)}</CNPJ></CPFCNPJRemetente>"); loteBuilder.Append($"<NumeroLote>{lote}</NumeroLote>"); loteBuilder.Append("</Cabecalho>"); loteBuilder.Append("</PedidoConsultaLote>"); retornoWebservice.XmlEnvio = loteBuilder.ToString(); if (Configuracoes.Geral.RetirarAcentos) { retornoWebservice.XmlEnvio = retornoWebservice.XmlEnvio.RemoveAccent(); } retornoWebservice.XmlEnvio = XmlSigning.AssinarXml(retornoWebservice.XmlEnvio, "PedidoConsultaLote", "", Certificado); GravarArquivoEmDisco(retornoWebservice.XmlEnvio, $"ConsultarSituacao-{DateTime.Now:yyyyMMddssfff}-{protocolo}-env.xml"); // Verifica Schema ValidarSchema(retornoWebservice, "PedidoConsultaLote_v01.xsd"); if (retornoWebservice.Erros.Any()) { return(retornoWebservice); } // Recebe mensagem de retorno try { using (var cliente = GetCliente(TipoUrl.ConsultarSituacao)) { retornoWebservice.XmlRetorno = cliente.ConsultaLote(retornoWebservice.XmlEnvio); retornoWebservice.EnvelopeEnvio = cliente.EnvelopeEnvio; retornoWebservice.EnvelopeRetorno = cliente.EnvelopeRetorno; } } catch (Exception ex) { retornoWebservice.Erros.Add(new Evento { Codigo = "0", Descricao = ex.Message }); return(retornoWebservice); } GravarArquivoEmDisco(retornoWebservice.XmlRetorno, $"ConsultarSituacao-{DateTime.Now:yyyyMMddssfff}-{lote}-ret.xml"); // Analisa mensagem de retorno var xmlRet = XDocument.Parse(retornoWebservice.XmlRetorno); MensagemErro(retornoWebservice, xmlRet, "RetornoConsulta"); if (retornoWebservice.Erros.Any()) { return(retornoWebservice); } retornoWebservice.Sucesso = xmlRet.Root?.ElementAnyNs("Cabecalho")?.ElementAnyNs("Sucesso")?.GetValue <bool>() ?? false; foreach (var nfse in xmlRet.Root.ElementsAnyNs("NFe")) { var chaveNFSe = nfse.ElementAnyNs("ChaveNFe"); var numeroNFSe = chaveNFSe?.ElementAnyNs("NumeroNFe")?.GetValue <string>() ?? string.Empty; var codigoVerificacao = chaveNFSe?.ElementAnyNs("CodigoVerificacao")?.GetValue <string>() ?? string.Empty; var dataNFSe = nfse.ElementAnyNs("DataEmissaoNFe")?.GetValue <DateTime>() ?? DateTime.Now; var chaveRPS = nfse.ElementAnyNs("ChaveRPS"); var numeroRps = chaveRPS?.ElementAnyNs("NumeroRPS")?.GetValue <string>() ?? string.Empty; GravarNFSeEmDisco(nfse.ToString(), $"NFSe-{numeroNFSe}-{codigoVerificacao}-.xml", dataNFSe); var nota = notas.FirstOrDefault(x => x.IdentificacaoRps.Numero == numeroRps); if (nota == null) { notas.Load(nfse.ToString()); } else { nota.IdentificacaoNFSe.Numero = numeroNFSe; nota.IdentificacaoNFSe.Chave = codigoVerificacao; } } return(retornoWebservice); }
public override RetornoWebservice ConsultarLoteRps(int lote, string protocolo, NotaFiscalCollection notas) { var retornoWebservice = new RetornoWebservice(); var loteBuilder = new StringBuilder(); loteBuilder.Append("<WS_ConsultaLoteRps.Execute xmlns:fiss=\"FISS-LEX\">"); loteBuilder.Append("<fiss:Consultarloterpsenvio>"); loteBuilder.Append("<Prestador>"); loteBuilder.Append($"<Cnpj>{Configuracoes.PrestadorPadrao.CpfCnpj.ZeroFill(14)}</Cnpj>"); loteBuilder.Append($"<InscricaoMunicipal>{Configuracoes.PrestadorPadrao.InscricaoMunicipal}</InscricaoMunicipal>"); loteBuilder.Append("</Prestador>"); loteBuilder.Append($"<Protocolo>{protocolo}</Protocolo>"); loteBuilder.Append("</fiss:Consultarloterpsenvio>"); loteBuilder.Append("</WS_ConsultaLoteRps.Execute>"); retornoWebservice.XmlEnvio = loteBuilder.ToString(); if (Configuracoes.Geral.RetirarAcentos) { retornoWebservice.XmlEnvio = retornoWebservice.XmlEnvio.RemoveAccent(); } GravarArquivoEmDisco(retornoWebservice.XmlEnvio, $"ConsultarLote-{DateTime.Now:yyyyMMddssfff}-{protocolo}-env.xml"); // Verifica Schema ValidarSchema(retornoWebservice, GetSchema(TipoUrl.ConsultarLoteRps)); if (retornoWebservice.Erros.Any()) { return(retornoWebservice); } // Recebe mensagem de retorno try { using (var cliente = GetClient(TipoUrl.ConsultarLoteRps)) { retornoWebservice.XmlRetorno = cliente.ConsultarLoteRps(GerarCabecalho(), retornoWebservice.XmlEnvio); } } catch (Exception ex) { retornoWebservice.Erros.Add(new Evento { Codigo = "0", Descricao = ex.Message }); return(retornoWebservice); } GravarArquivoEmDisco(retornoWebservice.XmlRetorno, $"ConsultarLote-{DateTime.Now:yyyyMMddssfff}-{lote}-ret.xml"); // Analisa mensagem de retorno var xmlRet = XDocument.Parse(AjustarRetorno(retornoWebservice.XmlRetorno)); MensagemErro(retornoWebservice, xmlRet, "WS_ConsultaLoteRps.ExecuteResponse", "Listamensagemretorno", "tcMensagemRetorno"); if (retornoWebservice.Erros.Any()) { return(retornoWebservice); } var rootElement = xmlRet.ElementAnyNs("WS_ConsultaLoteRps.ExecuteResponse").ElementAnyNs("Consultarloterpsresposta"); var listaNfse = rootElement?.ElementAnyNs("ListaNfse"); if (listaNfse == null) { retornoWebservice.Erros.Add(new Evento { Codigo = "0", Descricao = "Nenhuma NFSe retornada pelo webservice." }); return(retornoWebservice); } retornoWebservice.Sucesso = true; foreach (var compNfse in listaNfse.ElementsAnyNs("CompNfse")) { var nfse = compNfse.ElementAnyNs("Nfse").ElementAnyNs("InfNfse"); var numeroNFSe = nfse.ElementAnyNs("Numero")?.GetValue <string>() ?? string.Empty; var chaveNFSe = nfse.ElementAnyNs("CodigoVerificacao")?.GetValue <string>() ?? string.Empty; var dataNFSe = nfse.ElementAnyNs("DataEmissao")?.GetValue <DateTime>() ?? DateTime.Now; var numeroRps = nfse?.ElementAnyNs("IdentificacaoRps")?.ElementAnyNs("Numero")?.GetValue <string>() ?? string.Empty; GravarNFSeEmDisco(compNfse.AsString(true), $"NFSe-{numeroNFSe}-{chaveNFSe}-.xml", dataNFSe); var nota = notas.FirstOrDefault(x => x.IdentificacaoRps.Numero == numeroRps); if (nota == null) { notas.Load(compNfse.ToString()); } else { nota.IdentificacaoNFSe.Numero = numeroNFSe; nota.IdentificacaoNFSe.Chave = chaveNFSe; } } return(retornoWebservice); }
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 pedidoCancelamento = new StringBuilder(); pedidoCancelamento.Append("<Pedido>"); pedidoCancelamento.Append($"<InfPedidoCancelamento Id=\"N{numeroNFSe}\">"); pedidoCancelamento.Append("<IdentificacaoNfse>"); pedidoCancelamento.Append($"<Numero>{numeroNFSe}</Numero>"); pedidoCancelamento.Append($"<Cnpj>{Configuracoes.PrestadorPadrao.CpfCnpj.ZeroFill(14)}</Cnpj>"); pedidoCancelamento.Append($"<InscricaoMunicipal>{Configuracoes.PrestadorPadrao.InscricaoMunicipal}</InscricaoMunicipal>"); pedidoCancelamento.Append($"<CodigoMunicipio>{Configuracoes.PrestadorPadrao.Endereco.CodigoMunicipio}</CodigoMunicipio>"); pedidoCancelamento.Append("</IdentificacaoNfse>"); pedidoCancelamento.Append($"<CodigoCancelamento>{codigoCancelamento}</CodigoCancelamento>"); pedidoCancelamento.Append("</InfPedidoCancelamento>"); pedidoCancelamento.Append("</Pedido>"); retornoWebservice.XmlEnvio = pedidoCancelamento.ToString(); retornoWebservice.XmlEnvio = XmlSigning.AssinarXml(retornoWebservice.XmlEnvio, "Pedido", "InfPedidoCancelamento", Certificado); var loteBuilder = new StringBuilder(); loteBuilder.Append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>"); loteBuilder.Append("<CWS_CancelarNfse.Execute xmlns:fiss=\"FISS-LEX\">"); loteBuilder.Append("<fiss:Cancelarnfseenvio>"); loteBuilder.Append(AjustarEnvio(retornoWebservice.XmlEnvio)); loteBuilder.Append("</fiss:Cancelarnfseenvio>"); loteBuilder.Append("</CWS_CancelarNfse.Execute>"); retornoWebservice.XmlEnvio = loteBuilder.ToString(); 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); } } 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(AjustarRetorno(retornoWebservice.XmlRetorno)); var rootElement = xmlRet.ElementAnyNs("WS_CancelarNfse.ExecuteResponse").ElementAnyNs("Cancelarnfseresposta"); MensagemErro(retornoWebservice, rootElement, "CancelarNfseResposta"); if (retornoWebservice.Erros.Count > 0) { return(retornoWebservice); } var confirmacaoCancelamento = rootElement.ElementAnyNs("CancelarNfseResposta")?.ElementAnyNs("RetCancelamento")?.ElementAnyNs("NfseCancelamento")?.ElementAnyNs("Confirmacao"); if (confirmacaoCancelamento == null) { retornoWebservice.Erros.Add(new Evento { Codigo = "0", Descricao = "Confirmação do cancelamento não encontrada!" }); return(retornoWebservice); } retornoWebservice.DataLote = confirmacaoCancelamento.ElementAnyNs("DataHora")?.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 = confirmacaoCancelamento.ElementAnyNs("DataHora")?.GetValue <DateTime>() ?? DateTime.MinValue; nota.Cancelamento.MotivoCancelamento = motivo; 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\"?>"); switch (Configuracoes.WebServices.Ambiente) { case DFeTipoAmbiente.Homologacao: loteBuilder.Append("<ConsultarLoteRpsEnvio xmlns=\"http://www.abrasf.org.br/nfse.xsd\" > "); loteBuilder.Append("<Prestador>"); loteBuilder.Append($"<Cnpj>{Configuracoes.PrestadorPadrao.CpfCnpj.ZeroFill(14)}</Cnpj>"); break; case DFeTipoAmbiente.Producao: loteBuilder.Append("<ConsultarLoteRpsEnvio xmlns=\"http://www.abrasf.org.br/ABRASF/arquivos/nfse.xsd\" > "); loteBuilder.Append("<Prestador>"); loteBuilder.Append($"<CpfCnpj><Cnpj>{Configuracoes.PrestadorPadrao.CpfCnpj.ZeroFill(14)}</Cnpj></CpfCnpj>"); break; } loteBuilder.Append($"<InscricaoMunicipal>{Configuracoes.PrestadorPadrao.InscricaoMunicipal}</InscricaoMunicipal>"); loteBuilder.Append("</Prestador>"); loteBuilder.Append($"<Protocolo>{protocolo}</Protocolo>"); loteBuilder.Append("</ConsultarLoteRpsEnvio>"); retornoWebservice.XmlEnvio = loteBuilder.ToString(); if (Configuracoes.Geral.RetirarAcentos) { retornoWebservice.XmlEnvio = retornoWebservice.XmlEnvio.RemoveAccent(); } //Versão 2.02 da Abrasaf não define a assinatura da consulta de lotes //retornoWebservice.XmlEnvio = XmlSigning.AssinarXml(retornoWebservice.XmlEnvio, "ConsultarLoteRpsEnvio", "", Certificado); GravarArquivoEmDisco(retornoWebservice.XmlEnvio, $"ConsultarLote-{DateTime.Now:yyyyMMddssfff}-{protocolo}-env.xml"); // Verifica Schema ValidarSchema(retornoWebservice, "nfse_v202.xsd"); if (retornoWebservice.Erros.Any()) { return(retornoWebservice); } // Recebe mensagem de retorno try { using (var cliente = GetCliente(TipoUrl.ConsultarLoteRps)) { retornoWebservice.XmlRetorno = cliente.ConsultarLoteRps(GerarCabecalho(), retornoWebservice.XmlEnvio); } } catch (Exception ex) { retornoWebservice.Erros.Add(new Evento { Codigo = "0", Descricao = ex.Message }); return(retornoWebservice); } GravarArquivoEmDisco(retornoWebservice.XmlRetorno, $"ConsultarLote-{DateTime.Now:yyyyMMddssfff}-{lote}-ret.xml"); // Analisa mensagem de retorno var xmlRet = XDocument.Parse(retornoWebservice.XmlRetorno); MensagemErro(retornoWebservice, xmlRet, "ConsultarLoteRpsResposta"); if (retornoWebservice.Erros.Any()) { return(retornoWebservice); } var retornoLote = xmlRet.ElementAnyNs("ConsultarLoteRpsResposta"); var listaNfse = retornoLote?.ElementAnyNs("ListaNfse"); if (listaNfse == null) { retornoWebservice.Erros.Add(new Evento { Codigo = "0", Descricao = "Lista de NFSe não encontrada! (ListaNfse)" }); return(retornoWebservice); } retornoWebservice.Sucesso = true; foreach (var compNfse in listaNfse.ElementsAnyNs("CompNfse")) { var nfse = compNfse.ElementAnyNs("Nfse").ElementAnyNs("InfNfse"); var numeroNFSe = nfse.ElementAnyNs("Numero")?.GetValue <string>() ?? string.Empty; var chaveNFSe = nfse.ElementAnyNs("CodigoVerificacao")?.GetValue <string>() ?? string.Empty; var dataNFSe = nfse.ElementAnyNs("DataEmissao")?.GetValue <DateTime>() ?? DateTime.Now; var numeroRps = nfse?.ElementAnyNs("IdentificacaoRps")?.ElementAnyNs("Numero")?.GetValue <string>() ?? string.Empty; GravarNFSeEmDisco(compNfse.ToString(), $"NFSe-{numeroNFSe}-{chaveNFSe}-.xml", dataNFSe); var nota = notas.FirstOrDefault(x => x.IdentificacaoRps.Numero == numeroRps); if (nota == null) { notas.Load(compNfse.ToString()); } else { nota.IdentificacaoNFSe.Numero = numeroNFSe; nota.IdentificacaoNFSe.Chave = chaveNFSe; } } return(retornoWebservice); }
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 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 = "RPS não informado." }); } if (notas.Count > 3) { retornoWebservice.Erros.Add(new Evento { Codigo = "0", Descricao = "Apenas 3 RPS podem ser enviados em modo Sincrono." }); } if (retornoWebservice.Erros.Count > 0) { return(retornoWebservice); } var xmlLoteRps = new StringBuilder(); foreach (var nota in notas) { var xmlRps = GetXmlRps(nota, false, false); xmlLoteRps.Append(xmlRps); GravarRpsEmDisco(xmlRps, $"Rps-{nota.IdentificacaoRps.DataEmissao:yyyyMMdd}-{nota.IdentificacaoRps.Numero}.xml", nota.IdentificacaoRps.DataEmissao); } var xmlLote = new StringBuilder(); xmlLote.Append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>"); xmlLote.Append($"<GerarNfseEnvio {GetNamespace()}>"); xmlLote.Append($"<LoteRps Id=\"L{lote}\">"); xmlLote.Append($"<NumeroLote>{lote}</NumeroLote>"); xmlLote.Append($"<Cnpj>{Configuracoes.PrestadorPadrao.CpfCnpj.ZeroFill(14)}</Cnpj>"); xmlLote.Append($"<InscricaoMunicipal>{Configuracoes.PrestadorPadrao.InscricaoMunicipal}</InscricaoMunicipal>"); xmlLote.Append($"<QuantidadeRps>{notas.Count}</QuantidadeRps>"); xmlLote.Append("<ListaRps>"); xmlLote.Append(xmlLoteRps); xmlLote.Append("</ListaRps>"); xmlLote.Append("</LoteRps>"); xmlLote.Append("</GerarNfseEnvio>"); retornoWebservice.XmlEnvio = xmlLote.ToString(); if (Configuracoes.Geral.RetirarAcentos) { retornoWebservice.XmlEnvio = retornoWebservice.XmlEnvio.RemoveAccent(); } retornoWebservice.XmlEnvio = XmlSigning.AssinarXmlTodos(retornoWebservice.XmlEnvio, "Rps", "InfRps", Certificado); retornoWebservice.XmlEnvio = XmlSigning.AssinarXml(retornoWebservice.XmlEnvio, "GerarNfseEnvio", "LoteRps", Certificado); GravarArquivoEmDisco(retornoWebservice.XmlEnvio, $"lote-{lote}-env.xml"); // Verifica Schema ValidarSchema(retornoWebservice, GetSchema(TipoUrl.EnviarSincrono)); if (retornoWebservice.Erros.Any()) { return(retornoWebservice); } // Recebe mensagem de retorno try { using (var cliente = GetClient(TipoUrl.EnviarSincrono)) { retornoWebservice.XmlRetorno = cliente.GerarNfse(GerarCabecalho(), retornoWebservice.XmlEnvio); } } catch (Exception ex) { retornoWebservice.Erros.Add(new Evento { Codigo = "0", Descricao = ex.Message }); return(retornoWebservice); } GravarArquivoEmDisco(retornoWebservice.XmlRetorno, $"lote-{lote}-ret.xml"); // Analisa mensagem de retorno var xmlRet = XDocument.Parse(retornoWebservice.XmlRetorno); MensagemErro(retornoWebservice, xmlRet, "GerarNfseResposta"); MensagemErro(retornoWebservice, xmlRet, "GerarNfseResposta", "ListaMensagemRetornoLote"); if (retornoWebservice.Erros.Any()) { return(retornoWebservice); } retornoWebservice.NumeroLote = xmlRet.Root?.ElementAnyNs("NumeroLote")?.GetValue <string>() ?? string.Empty; retornoWebservice.DataLote = xmlRet.Root?.ElementAnyNs("DataRecebimento")?.GetValue <DateTime>() ?? DateTime.MinValue; retornoWebservice.Protocolo = xmlRet.Root?.ElementAnyNs("Protocolo")?.GetValue <string>() ?? string.Empty; retornoWebservice.Sucesso = !retornoWebservice.NumeroLote.IsEmpty(); if (!retornoWebservice.Sucesso) { return(retornoWebservice); } var retornoLote = xmlRet.ElementAnyNs("GerarNfseResposta"); var listaNfse = retornoLote?.ElementAnyNs("ListaNfse"); if (listaNfse == null) { retornoWebservice.Erros.Add(new Evento { Codigo = "0", Descricao = "Lista de NFSe não encontrada! (ListaNfse)" }); return(retornoWebservice); } retornoWebservice.Sucesso = true; foreach (var compNfse in listaNfse.ElementsAnyNs("CompNfse")) { var nfse = compNfse.ElementAnyNs("Nfse").ElementAnyNs("InfNfse"); var numeroNFSe = nfse.ElementAnyNs("Numero")?.GetValue <string>() ?? string.Empty; var chaveNFSe = nfse.ElementAnyNs("CodigoVerificacao")?.GetValue <string>() ?? string.Empty; var dataNFSe = nfse.ElementAnyNs("DataEmissao")?.GetValue <DateTime>() ?? DateTime.Now; var numeroRps = nfse?.ElementAnyNs("IdentificacaoRps")?.ElementAnyNs("Numero")?.GetValue <string>() ?? string.Empty; GravarNFSeEmDisco(compNfse.AsString(true), $"NFSe-{numeroNFSe}-{chaveNFSe}-.xml", dataNFSe); var nota = notas.FirstOrDefault(x => x.IdentificacaoRps.Numero == numeroRps); if (nota == null) { notas.Load(compNfse.ToString()); } else { nota.IdentificacaoNFSe.Numero = numeroNFSe; nota.IdentificacaoNFSe.Chave = chaveNFSe; } } return(retornoWebservice); }