feature, creacion de endpoint para consultar archivos de facturacion pendientes de procesar

feature/Reporte_Relacion_Facturas_Alen
Felix Morales 1 year ago
parent 513837c087
commit c84187270b
  1. 3
      Contracts/Utils/IFileManagerRepository.cs
  2. 2
      Controllers/AuthController.cs
  3. 48
      Controllers/FileManagerController.cs
  4. 25
      Repository/Utils/FileManagerRepository.cs

@ -10,6 +10,7 @@ namespace CORRESPONSALBackend.Contracts.Utils
public Task<FileManager> getFileById(long id); public Task<FileManager> getFileById(long id);
public Task deleteFileByProcess(long id, int Proceso); public Task deleteFileByProcess(long id, int Proceso);
public Task<FileManager> UpdateFileNameById(long id, string newFileName); public Task<FileManager> UpdateFileNameById(long id, string newFileName);
public Task<IEnumerable<FileManager>> GetFilesByProcessId(int process);
public Task<FileManager> UpdateFileProcessById(long fileId, int process);
} }
} }

@ -61,7 +61,7 @@ namespace CORRESPONSALBackend.Controllers
_config["Jwt:Issuer"], _config["Jwt:Issuer"],
_config["Jwt:Audience"], _config["Jwt:Audience"],
claims, claims,
expires: DateTime.UtcNow.AddHours(Int32.Parse(_config["Jwt:ExpirationHours"])), expires: _userData.Usuario.Contains("Agente") ? DateTime.UtcNow.AddHours(168) : DateTime.UtcNow.AddHours(Int32.Parse(_config["Jwt:ExpirationHours"])),
//expires: DateTime.UtcNow.AddMinutes(5), //expires: DateTime.UtcNow.AddMinutes(5),
signingCredentials: signIn); signingCredentials: signIn);

@ -236,5 +236,53 @@ namespace CORRESPONSALBackend.Controllers
} }
return new OkObjectResult(new { respuesta = "Se elimino el registro" }); return new OkObjectResult(new { respuesta = "Se elimino el registro" });
} }
[HttpGet("UnprocessedTextFiles")]
public async Task<IActionResult> GetUnprocessedTextFilesZip(){
try{
var unprocessedFiles = await _Repo.GetFilesByProcessId(31);//Se obtiene el listado de archivos que no se han procesado
if(unprocessedFiles.Count() > 0){
FilePaths4Process unprocessedFilesRelativePath = await _RepoRelativePath.getPaths4ProcessById(31);//Se obtiene la ruta relativa de los archivos sin procesar
FilePaths4Process processedFilesRelativePath = await _RepoRelativePath.getPaths4ProcessById(35);//Se obtiene la ruta relativa de los archivos procesados
var unprocessedFilesPath = RootPathCorresponsales + unprocessedFilesRelativePath.Path;//Se genera la ruta completa de los archivos sin procesar
var processedFilesPath = RootPathCorresponsales + processedFilesRelativePath.Path;//Se genera la ruta completa de los archivos procesados
string zipName = $"ZippedFilesToProcess_{DateTime.Now:yyyyMMddHHmmss}.zip"; //Se crea el nombre del zip
System.IO.Compression.ZipFile.CreateFromDirectory(unprocessedFilesPath, processedFilesPath+zipName);//Se comprime el folder de los archivos sin procesar.
if(System.IO.File.Exists(processedFilesPath + zipName))//Se valida que se haya creado el archivo zip
{
byte[] zipBytes = System.IO.File.ReadAllBytes(processedFilesPath + zipName);
MemoryStream zipStream = new MemoryStream(zipBytes);//Se obtiene el contenido del zip
if(zipStream.Length > 0)//Se valida que el zip pese mas de 0 bytes
{
foreach(var unprocessedFile in unprocessedFiles)//se recorren los archivos que no han sido procesados
{
if(System.IO.File.Exists(unprocessedFilesPath+unprocessedFile.NombreArchivo))//Se valida si el archivo actual existe
{
byte[] txtBytes = System.IO.File.ReadAllBytes(unprocessedFilesPath + unprocessedFile.NombreArchivo);
MemoryStream txtStream = new MemoryStream(txtBytes);//Se obtiene el contenido del archivo actual que no ha sido procesado
using(var processedFileStream = System.IO.File.Create(processedFilesPath + unprocessedFile.NombreArchivo))//Se crea un nuevo archivo en la ruta de los procesados con el nombre del archivo sin procesar
{
await txtStream.CopyToAsync(processedFileStream);//Se copia el contenido del archivo sin procesar al nuevo archivo en la ruta de los procesados.
System.IO.File.Delete(unprocessedFilesPath + unprocessedFile.NombreArchivo);//Se borra el archivo en la ruta de los no procesados.
await _Repo.UpdateFileProcessById(unprocessedFile.id, 32);//Se actualiza el proceso en el log al archivo actual.
}
}//Deberia borrar el registro de la BD del archivo que no existe?
}
System.IO.File.Delete(processedFilesPath + zipName);//Se borra el archivo zip.
return File(zipStream, "application/zip", zipName);//Se envia como respuesta el contenido del archivo zip.
}else{
System.IO.File.Delete(processedFilesPath + zipName);//Se borra el archivo zip.
throw new Exception("Ocurrio un error al comprimir los archivos de texto. Intentelo de nuevo.");
}
}else{
throw new Exception("Ocurrio un error al comprimir los archivos de texto. Intentelo de nuevo.");
}
}else{
return new OkObjectResult( new {respuesta = "Sin archivos por procesar pro el momento"});
}
}catch(Exception ex){
return new BadRequestObjectResult(new {respuesta = ex.Message});
}
}
} }
} }

@ -97,5 +97,30 @@ namespace CORRESPONSALBackend.Repository.Utils
commandType: CommandType.StoredProcedure); commandType: CommandType.StoredProcedure);
return entrada.FirstOrDefault(); return entrada.FirstOrDefault();
} }
public async Task<IEnumerable<FileManager>> GetFilesByProcessId(int process)
{
string query = "[Utils.FileManager.GetFilesByProcessId]";
using var connection = _context.CreateConnection();
var entrada = await connection.QueryAsync<FileManager>(query, new
{
@process = process
},
commandType: CommandType.StoredProcedure);
return entrada.ToList();
}
public async Task<FileManager> UpdateFileProcessById(long fileId, int process)
{
string query = "[Utils.FileManager.UpdateProcessById]";
using var connection = _context.CreateConnection();
var entrada = await connection.QueryAsync<FileManager>(query, new
{
@id = fileId,
@process = process
},
commandType: CommandType.StoredProcedure);
return entrada.FirstOrDefault();
}
} }
} }
Loading…
Cancel
Save