Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/OpenAC.Net.NFSe.Nacional/Common/Model/DFe.cs
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ public class DFe
/// </summary>
[JsonPropertyName("TipoEvento")]
[JsonConverter(typeof(JsonStringEnumConverter<TipoEvento>))]
public TipoEvento TipoEvento { get; set; }
public TipoEvento? TipoEvento { get; set; }

/// <summary>
/// Conteúdo do arquivo XML, possivelmente compactado.
Expand Down
52 changes: 42 additions & 10 deletions src/OpenAC.Net.NFSe.Nacional/Webservice/NFSeWebserviceBase.cs
Original file line number Diff line number Diff line change
Expand Up @@ -184,11 +184,11 @@ protected virtual void ValidarSchema(SchemaNFSe schema, string xml, VersaoNFSe v
/// <param name="nomeArquivo">Nome do arquivo.</param>
/// <param name="documento">Documento do prestador.</param>
/// <param name="data">Data de emissão.</param>
protected virtual void GravarDpsEmDisco(string conteudoArquivo, string nomeArquivo, string? documento, DateTime data)
protected virtual void GravarDpsEmDisco(string conteudoArquivo, string nomeArquivo, string? documento, DateTime data, bool incrementarNome = false)
{
if (Configuracao.Arquivos.Salvar == false) return;

GravarArquivoEmDisco(TipoArquivo.Rps, conteudoArquivo, nomeArquivo, documento, data);
GravarArquivoEmDisco(TipoArquivo.Rps, conteudoArquivo, nomeArquivo, documento, data, incrementarNome);
}

/// <summary>
Expand All @@ -198,11 +198,11 @@ protected virtual void GravarDpsEmDisco(string conteudoArquivo, string nomeArqui
/// <param name="nomeArquivo">Nome do arquivo.</param>
/// <param name="documento">Documento do prestador.</param>
/// <param name="data">Data de emissão.</param>
protected virtual void GravarNFSeEmDisco(string conteudoArquivo, string nomeArquivo, string? documento, DateTime data)
protected virtual void GravarNFSeEmDisco(string conteudoArquivo, string nomeArquivo, string? documento, DateTime data, bool incrementarNome = false)
{
if (Configuracao.Arquivos.Salvar == false) return;

GravarArquivoEmDisco(TipoArquivo.NFSe, conteudoArquivo, nomeArquivo, documento, data);
GravarArquivoEmDisco(TipoArquivo.NFSe, conteudoArquivo, nomeArquivo, documento, data, incrementarNome);
}

/// <summary>
Expand All @@ -226,17 +226,49 @@ protected virtual void GravarArquivoEmDisco(string conteudoArquivo, string nomeA
/// <param name="nomeArquivo">Nome do arquivo.</param>
/// <param name="documento">Documento do prestador.</param>
/// <param name="data">Data de emissão (opcional).</param>
protected virtual void GravarArquivoEmDisco(TipoArquivo tipo, string conteudoArquivo, string nomeArquivo, string? documento, DateTime? data = null)
/// <param name="incrementarNome">
/// Indica se o nome do arquivo deve ser incrementado caso já exista,
/// adicionando um sufixo numérico (_1, _2, etc.) para evitar sobrescrita.
/// </param>
protected virtual void GravarArquivoEmDisco(TipoArquivo tipo, string conteudoArquivo, string nomeArquivo, string? documento, DateTime? data = null, bool incrementarNome = false)
{
nomeArquivo = tipo switch
var diretorio = tipo switch
{
TipoArquivo.Webservice => Path.Combine(Configuracao.Arquivos.GetPathEnvio(data ?? DateTime.Today, documento ?? string.Empty), nomeArquivo),
TipoArquivo.Rps => Path.Combine(Configuracao.Arquivos.GetPathDps(data ?? DateTime.Today, documento ?? string.Empty), nomeArquivo),
TipoArquivo.NFSe => Path.Combine(Configuracao.Arquivos.GetPathNFSe(data ?? DateTime.Today, documento ?? string.Empty), nomeArquivo),
TipoArquivo.Webservice => Path.Combine(Configuracao.Arquivos.GetPathEnvio(data ?? DateTime.Today, documento ?? string.Empty)),
TipoArquivo.Rps => Path.Combine(Configuracao.Arquivos.GetPathDps(data ?? DateTime.Today, documento ?? string.Empty)),
TipoArquivo.NFSe => Path.Combine(Configuracao.Arquivos.GetPathNFSe(data ?? DateTime.Today, documento ?? string.Empty)),
_ => throw new ArgumentOutOfRangeException(nameof(tipo), tipo, null)
};

File.WriteAllText(nomeArquivo, conteudoArquivo, Encoding.UTF8);
var caminhoFinal = !incrementarNome ? GerarPathUnico(diretorio, nomeArquivo) : Path.Combine(diretorio, nomeArquivo);

File.WriteAllText(caminhoFinal, conteudoArquivo, Encoding.UTF8);
}

/// <summary>
/// Verifica se o arquivo já existe antes de escrever, e incrementa um sufixo numérico caso exista.
/// </summary>
/// <param name="diretorio">Diretório onde o arquivo será salvo.</param>
/// <param name="nomeArquivo">Nome do arquivo.</param>
private static string GerarPathUnico(string diretorio, string nomeArquivo)
{
var caminho = Path.Combine(diretorio, nomeArquivo);

if (!File.Exists(caminho))
return caminho;

var semExtensao = Path.GetFileNameWithoutExtension(nomeArquivo);
var extensao = Path.GetExtension(nomeArquivo);
var contador = 1;

do
{
var novoNome = $"{semExtensao}_{contador++}{extensao}";
caminho = Path.Combine(diretorio, novoNome);
}
while (File.Exists(caminho));

return caminho;
}

#endregion Methods
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,17 +29,18 @@
// <summary></summary>
// ***********************************************************************

using System.Linq;
using System.Net;
using System.Net.Http;
using System.Net.Http.Json;
using System.Text.Json;
using System.Threading.Tasks;
using System.Xml.Linq;
using OpenAC.Net.Core.Logging;
using OpenAC.Net.DFe.Core.Common;
using OpenAC.Net.DFe.Core.Extensions;
using OpenAC.Net.NFSe.Nacional.Common;
using OpenAC.Net.NFSe.Nacional.Common.Model;
using OpenAC.Net.NFSe.Nacional.Common.Types;

namespace OpenAC.Net.NFSe.Nacional.Webservice.Nacional;

/// <summary>
Expand All @@ -54,7 +55,7 @@ public class NacionalWebservice : NFSeWebserviceBase
/// </summary>
/// <param name="configuracaoNFSe">Configuração da NFSe.</param>
/// <param name="serviceInfo">Informações do serviço</param>
public NacionalWebservice(ConfiguracaoNFSe configuracaoNFSe, NFSeServiceInfo serviceInfo) :
public NacionalWebservice(ConfiguracaoNFSe configuracaoNFSe, NFSeServiceInfo serviceInfo) :
base(configuracaoNFSe, serviceInfo)
{
}
Expand Down Expand Up @@ -192,8 +193,37 @@ public override async Task<NFSeResponse<RespostaEnvioEvento>> EnviarEventoAsync(

var documento = evento.Informacoes.CPFAutor ?? evento.Informacoes.CNPJAutor;

GravarDpsEmDisco(evento.Xml, $"{evento.Informacoes.ChNFSe}{evento.Informacoes.Evento}_evento.xml",
documento, evento.Informacoes.DhEvento.DateTime);
//var prefixoNomeArquivo = evento.Informacoes.ChNFSe;

//if (!Configuracao.Arquivos.PadronizarNomes)
//{
// try
// {
// var consulta = await ConsultaChaveAsync(evento.Informacoes.ChNFSe);
// var nfse = consulta.Resultado.Lote.FirstOrDefault(x => x.TipoDocumento == TipoDocumento.NFSE);

// if (!string.IsNullOrWhiteSpace(nfse?.ArquivoXml))
// {
// var numeroDoc = XDocument.Parse(nfse?.ArquivoXml)
// .Descendants()
// .FirstOrDefault(x => x.Name.LocalName == "nDPS")
// ?.Value.FillZeros();

// prefixoNomeArquivo = $"{numeroDoc}{evento.Informacoes.Evento}";
// }
// }
// catch (System.Exception)
// {

// }
//}

var prefixoNomeArquivoDps = Configuracao.Arquivos.PadronizarNomes
? evento.Informacoes.Id
: $"{evento.Informacoes.ChNFSe}{evento.Informacoes.Evento}";

GravarDpsEmDisco(evento.Xml, $"{prefixoNomeArquivoDps}_evento.xml",
documento, evento.Informacoes.DhEvento.DateTime, true);

var envio = new EventoEnvio
{
Expand All @@ -205,7 +235,7 @@ public override async Task<NFSeResponse<RespostaEnvioEvento>> EnviarEventoAsync(

this.Log().Debug($"Webservice: [Evento][Envio] - {strEnvio}");

GravarArquivoEmDisco(strEnvio, $"Evento-{evento.Informacoes.ChNFSe}{evento.Informacoes.Evento}-env.json",
GravarArquivoEmDisco(strEnvio, $"Evento-{prefixoNomeArquivoDps}-env.json",
documento);

var url = ServiceInfo[Configuracao.WebServices.Ambiente][TipoUrl.EnviarEvento];
Expand All @@ -215,7 +245,7 @@ public override async Task<NFSeResponse<RespostaEnvioEvento>> EnviarEventoAsync(

this.Log().Debug($"Webservice: [Evento][Resposta] - {strResponse}");

GravarArquivoEmDisco(strResponse, $"Evento-{evento.Informacoes.ChNFSe}{evento.Informacoes.Evento}-resp.json",
GravarArquivoEmDisco(strResponse, $"Evento-{prefixoNomeArquivoDps}-resp.json",
documento);

var jsonOptions = new JsonSerializerOptions
Expand All @@ -227,7 +257,17 @@ public override async Task<NFSeResponse<RespostaEnvioEvento>> EnviarEventoAsync(
httpResponse.IsSuccessStatusCode, jsonOptions);

if (retorno.Sucesso)
GravarNFSeEmDisco(retorno.Resultado.XmlEvento, $"{evento.Informacoes.ChNFSe}_evento.xml", documento, evento.Informacoes.DhEvento.DateTime);
{
var prefixoNomeArquivoEventoNfse = Configuracao.Arquivos.PadronizarNomes
? evento.Informacoes.ChNFSe
: $"{evento.Informacoes.ChNFSe}{evento.Informacoes.Evento}";

var nSeqEvento = XDocument.Parse(retorno.Resultado.XmlEvento)
.Descendants()
.FirstOrDefault(x => x.Name.LocalName == "nSeqEvento")?.Value ?? "00";

GravarNFSeEmDisco(retorno.Resultado.XmlEvento, $"{prefixoNomeArquivoEventoNfse}_evento_{nSeqEvento}.xml", documento, evento.Informacoes.DhEvento.DateTime, true);
}

return retorno;
}
Expand All @@ -249,7 +289,11 @@ public override async Task<NFSeResponse<RespostaEnvioDps>> EnviarAsync(Dps dps)

var documento = dps.Informacoes.Prestador.CPF ?? dps.Informacoes.Prestador.CNPJ;

GravarDpsEmDisco(dps.Xml, $"{dps.Informacoes.NumeroDps:000000}_dps.xml",
var prefixoNomeArquivoDps = Configuracao.Arquivos.PadronizarNomes
? dps.Informacoes.Id
: dps.Informacoes.NumeroDps.FillZeros();

GravarDpsEmDisco(dps.Xml, $"{prefixoNomeArquivoDps}_dps.xml",
documento, dps.Informacoes.DhEmissao.DateTime);

var envio = new DpsEnvio
Expand All @@ -262,7 +306,7 @@ public override async Task<NFSeResponse<RespostaEnvioDps>> EnviarAsync(Dps dps)

this.Log().Debug($"Webservice: [Enviar][Envio] - {strEnvio}");

GravarArquivoEmDisco(strEnvio, $"Enviar-{dps.Informacoes.NumeroDps:000000}-env.json", documento);
GravarArquivoEmDisco(strEnvio, $"Enviar-{prefixoNomeArquivoDps}-env.json", documento);

var url = ServiceInfo[Configuracao.WebServices.Ambiente][TipoUrl.Enviar];
var httpResponse = await SendAsync(content, HttpMethod.Post, $"{url}/nfse");
Expand All @@ -271,12 +315,18 @@ public override async Task<NFSeResponse<RespostaEnvioDps>> EnviarAsync(Dps dps)

this.Log().Debug($"Webservice: [Enviar][Resposta] - {strResponse}");

GravarArquivoEmDisco(strResponse, $"Enviar-{dps.Informacoes.NumeroDps:000000}-resp.json", documento);
GravarArquivoEmDisco(strResponse, $"Enviar-{prefixoNomeArquivoDps}-resp.json", documento);

var retorno = NFSeResponse<RespostaEnvioDps>.Create(dps.Xml, strEnvio, strResponse, httpResponse.IsSuccessStatusCode);

if (retorno.Sucesso)
GravarNFSeEmDisco(retorno.Resultado.XmlNFSe, $"{dps.Informacoes.NumeroDps:000000}_nfse.xml", documento, dps.Informacoes.DhEmissao.DateTime);
{
var prefixoNomeArquivoNfse = Configuracao.Arquivos.PadronizarNomes
? retorno?.Resultado?.ChaveAcesso
: dps.Informacoes.NumeroDps.FillZeros();

GravarNFSeEmDisco(retorno.Resultado.XmlNFSe, $"{prefixoNomeArquivoNfse}_nfse.xml", documento, dps.Informacoes.DhEmissao.DateTime);
}

return retorno;
}
Expand Down