Creacion del Txt de facturacion, enviar correo en caso de error

feature/TxtFacturacion_SendMailOnError_20240119
Felix Morales 8 months ago
parent 2d2819ba97
commit 377c6d01c5
  1. 1
      Contracts/Corresponsalias/Services/ICorresponsaliasTraficosService.cs
  2. 14
      Controllers/Corresponsalias/TraficosController.cs
  3. 69
      Controllers/FileManagerController.cs
  4. 66
      Services/Corresponsalias/Traficos/CorresponsaliasTraficosService.cs

@ -1,5 +1,6 @@
namespace CORRESPONSALBackend.Contracts.Corresponsalias.Services{
public interface ICorresponsaliasTraficosService{
public Task<List<string[]>> ReadTxtFacturasAlen(int fileId);
public Task<string> GetTxtFacturacionData(int idTrafico);
}
}

@ -10,6 +10,7 @@ using CORRESPONSALBackend.DTO.Reportes;
using CORRESPONSALBackend.Contracts.Corresponsalias.Services;
using CORRESPONSALBackend.Contracts.Catalogos;
using System.Globalization;
using CORRESPONSALBackend.Contracts;
namespace CORRESPONSALBackend.Controllers.Corresponsalias
{
@ -26,11 +27,15 @@ namespace CORRESPONSALBackend.Controllers.Corresponsalias
private readonly IProveedoresRepository _proveedoresRepository;
private readonly ICorresponsaliasFacturasRepository _facturasRepository;
private readonly ICorresponsaliasContenedoresRepository _contenedoresRepository;
private readonly IClientesRepository _clientesRepository;
private readonly ICatCentrosCostosRepository _centrosCostosRepository;
private readonly ITiposMercanciaRepository _tiposMercanciaRepository;
private readonly IConfiguration _config;
public TraficosController(ICorresponsaliasTraficosRepository Repo, ICorresponsaliasFacturasRepository RepoFacturas,
public TraficosController(ICorresponsaliasTraficosRepository Repo, ICorresponsaliasFacturasRepository RepoFacturas, IClientesRepository clientesRepository,
ICorresponsaliasContenedoresRepository RepoContenedores, IConfiguration config, ICorresponsaliasTraficosService traficosService,
IProveedoresRepository proveedoresRepository, ICorresponsaliasFacturasRepository facturasRepository, ICorresponsaliasContenedoresRepository contenedoresRepository)
IProveedoresRepository proveedoresRepository, ICorresponsaliasFacturasRepository facturasRepository, ICorresponsaliasContenedoresRepository contenedoresRepository,
ICatCentrosCostosRepository centrosCostosRepository, ITiposMercanciaRepository tiposMercanciaRepository)
{
_config = config;
_Repo = Repo;
@ -40,6 +45,9 @@ namespace CORRESPONSALBackend.Controllers.Corresponsalias
_proveedoresRepository = proveedoresRepository;
_facturasRepository = facturasRepository;
_contenedoresRepository = contenedoresRepository;
_clientesRepository = clientesRepository;
_centrosCostosRepository = centrosCostosRepository;
_tiposMercanciaRepository = tiposMercanciaRepository;
}
/// Corresponsales: Traficos
@ -221,4 +229,4 @@ namespace CORRESPONSALBackend.Controllers.Corresponsalias
}
}
}
}
}

@ -10,6 +10,9 @@ using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http.HttpResults;
using CORRESPONSALBackend.Contracts.Auth;
using CORRESPONSALBackend.Contracts.Corresponsalias;
using CORRESPONSALBackend.Contracts.Corresponsalias.Services;
using Newtonsoft.Json;
using System.Text;
namespace CORRESPONSALBackend.Controllers
{
@ -24,23 +27,20 @@ namespace CORRESPONSALBackend.Controllers
private readonly IFilePaths4ProcessRepository _RepoRelativePath;
private readonly IConfiguration _config;
private readonly IAuthService _authService;
private readonly ICorresponsaliasTraficosService _traficoService;
private readonly ICorresponsaliasTraficosRepository _traficosRepository;
private readonly string RootPathCorresponsales;
public FileManagerController(IFileManagerRepository Repo,
IFilePaths4ProcessRepository RepoRelativePath,
IConfiguration config,
IUsuariosRepository RepoUsuarios,
ICasaCuervoRepository RepoCasaCuervo,
IAuthService authService,
ICorresponsaliasTraficosRepository traficosRepository)
public FileManagerController(IFileManagerRepository Repo, IFilePaths4ProcessRepository RepoRelativePath, IConfiguration config, IUsuariosRepository RepoUsuarios,
ICasaCuervoRepository RepoCasaCuervo, IAuthService authService, ICorresponsaliasTraficosRepository traficosRepository, ICorresponsaliasTraficosService traficoService)
{
_config = config;
_Repo = Repo;
_RepoUsuarios = RepoUsuarios;
_RepoCasaCuervo = RepoCasaCuervo;
_RepoRelativePath = RepoRelativePath;
_traficoService = traficoService;
RootPathCorresponsales = _config.GetValue<string>("AllFiles");
_authService = authService;
_traficosRepository = traficosRepository;
@ -110,7 +110,7 @@ namespace CORRESPONSALBackend.Controllers
}
catch (Exception ex)
{
return Ok(ex.Message);
return BadRequest(ex.Message);
}
}
@ -374,5 +374,58 @@ namespace CORRESPONSALBackend.Controllers
}
return Ok();
}
[HttpGet("CreateFacturacionTxt")]
public async Task<IActionResult> CreateFacturacionTxt(string folioTrafico, int idTrafico, int idUsuario){
try {
var fileData = await _traficoService.GetTxtFacturacionData(idTrafico);
FilePaths4Process RelativePath = await _RepoRelativePath.getPaths4ProcessById(31);//Se obtiene la ruta de los archivos sin procesar para agregar el archivo del token.
string FileName = folioTrafico + "_" + DateTime.Now.ToString("yyyy_MM_dd_hh_mm_ss")+ ".txt";
string txtFacturacionPath = RootPathCorresponsales + RelativePath.Path + FileName;
if(System.IO.File.Exists(txtFacturacionPath)){
System.IO.File.Delete(txtFacturacionPath);
}
//Se crea el txt de faturacion. Por el momento se encuentra vacío
var fileStream = System.IO.File.Create(txtFacturacionPath);
fileStream.Close();
//Se "abre" el archivo y se escribe el contenido obtenido del servicio de los traficos
var writer = new StreamWriter(txtFacturacionPath);
await writer.WriteLineAsync(fileData);
//Se cierra el archivo
writer.Close();
//Comienza el proceso para guardar los datos del archivo en la base de datos.
FileManager dto = new FileManager(){
id = 0,
IdUsuario = idUsuario,
NombreArchivo = FileName,
Proceso = 31,
FechaRegistro = "",
Tags = idTrafico.ToString(),
Activo = 1,
Size = 1,
};
return Ok(await _Repo.FileManager(dto));
}catch(Exception ex){
var jsonContent = JsonConvert.SerializeObject(new {
To = "fmorales@gemcousa.com",
Subject = "Error al crear el txt de Facturación",
Text = "",
Html = @$"
<h3>El se detectó el siguiente error durante la creación del archivo texto del trafico {folioTrafico}</h3>
<br/>
<p>{ex.Message}</p>
"
});
HttpContent httpContent = new StringContent(jsonContent, Encoding.UTF8, "application/json");
using (var client = new HttpClient())
using (var formData = new MultipartFormDataContent())
{
var response = await client.PostAsync("https://pyapi.gemcousa.mx/SendEmail", httpContent);
}
return BadRequest(ex.Message);
}
}
}
}

@ -1,5 +1,10 @@
using System.Globalization;
using CORRESPONSALBackend.Contracts;
using CORRESPONSALBackend.Contracts.Catalogos;
using CORRESPONSALBackend.Contracts.Corresponsalias;
using CORRESPONSALBackend.Contracts.Corresponsalias.Services;
using CORRESPONSALBackend.Contracts.Utils;
using CORRESPONSALBackend.Models;
using CORRESPONSALBackend.Models.Utils;
namespace CORRESPONSALBackend.Services.Corresponsalias.Traficos{
@ -7,12 +12,29 @@ namespace CORRESPONSALBackend.Services.Corresponsalias.Traficos{
{
private readonly IFileManagerRepository _fileManagerRepo;
private readonly IFilePaths4ProcessRepository _RepoRelativePath;
private readonly ICorresponsaliasTraficosRepository _Repo;
private readonly IProveedoresRepository _proveedoresRepository;
private readonly ICorresponsaliasFacturasRepository _facturasRepository;
private readonly ICorresponsaliasContenedoresRepository _contenedoresRepository;
private readonly IClientesRepository _clientesRepository;
private readonly ICatCentrosCostosRepository _centrosCostosRepository;
private readonly ITiposMercanciaRepository _tiposMercanciaRepository;
private readonly IConfiguration _config;
private readonly string RootPathCorresponsales;
public CorresponsaliasTraficosService(IFileManagerRepository fileManagerRepo, IFilePaths4ProcessRepository RepoRelativePath, IConfiguration config){
public CorresponsaliasTraficosService(IFileManagerRepository fileManagerRepo, IFilePaths4ProcessRepository RepoRelativePath, IConfiguration config,
ICorresponsaliasTraficosRepository Repo, IClientesRepository clientesRepository,
IProveedoresRepository proveedoresRepository, ICorresponsaliasFacturasRepository facturasRepository, ICorresponsaliasContenedoresRepository contenedoresRepository,
ICatCentrosCostosRepository centrosCostosRepository, ITiposMercanciaRepository tiposMercanciaRepository){
_fileManagerRepo = fileManagerRepo;
_RepoRelativePath = RepoRelativePath;
_Repo = Repo;
_proveedoresRepository = proveedoresRepository;
_facturasRepository = facturasRepository;
_contenedoresRepository = contenedoresRepository;
_clientesRepository = clientesRepository;
_centrosCostosRepository = centrosCostosRepository;
_tiposMercanciaRepository = tiposMercanciaRepository;
_config = config;
RootPathCorresponsales = _config.GetValue<string>("AllFiles");
}
@ -39,5 +61,47 @@ namespace CORRESPONSALBackend.Services.Corresponsalias.Traficos{
return new List<string[]>();
}
}
public async Task<string> GetTxtFacturacionData(int idTrafico)
{
try{
var trafico = await _Repo.Get(idTrafico);
var tiposMercancia = await _tiposMercanciaRepository.GetAll();
var tipoMercancia = tiposMercancia.First(x => x.id == trafico.idTipoMercancia);
var facturas = await _facturasRepository.GetAll(idTrafico);
string NombreProveedor = "";
var proveedores = await _proveedoresRepository.GetAll(0);
var contenedores = await _contenedoresRepository.GetAll(idTrafico);
var clientes = await _clientesRepository.getAllClientes(0);
var cliente = clientes.First(x => x.sClave == trafico.IdCliente);
var centroCostos = await _centrosCostosRepository.Get(trafico.IdCliente);
int IdCteFacturacion = centroCostos.ClienteFacturacion;
var cteFacturacion = clientes.FirstOrDefault(x => x.sClave == IdCteFacturacion, new IClientes());
string fileData = $"\"{trafico.FolioGemco}\"|{(IdCteFacturacion == trafico.IdCliente || IdCteFacturacion == 0 ? trafico.IdCliente : IdCteFacturacion)}|{trafico.Patente}|{trafico.Pedimento}|{trafico.TipoCambio}|";
fileData += $"{DateTime.ParseExact(trafico.FechaPago, "MM/dd/yyyy hh:mm:ss",CultureInfo.InvariantCulture).ToString("yyyy-MM-dd")}|0|0|0|0|0|0|0.00|\"{trafico.Aduana}\"|\"{trafico.Clave}\"|{trafico.TipoOperacion}|";
fileData += $"\"C\"|{trafico.ValorFacturaDls}|{trafico.ValorFacturaDls! * trafico.TipoCambio!}|{trafico.ValorAduanaMN}|\"{(trafico.DescripcionMercancia.Length >= 100 ? trafico.DescripcionMercancia.Substring(0,100): trafico.DescripcionMercancia)}\"|";
fileData += $"{trafico.Kilos}|{trafico.Kilos! * 2.20462}|{trafico.CantidadFracciones}|\"{(trafico.SemaforoFiscal == 0 ? "R" : "V")}\"|";
if(facturas.Count() > 0){
var factura = facturas.First(x => x.IdTrafico == idTrafico);
NombreProveedor = proveedores.First(x => x.id == factura.Proveedor).Nombre;
NombreProveedor = NombreProveedor.Length >= 120 ? NombreProveedor.Substring(0,120) : NombreProveedor;
string[] foliosArray = facturas.Select(x => x.Factura).ToArray();
string folios = string.Join(",", foliosArray);
string [] pedidosArray = facturas.Where(x => x.Pedido != "").Select(x => x.Pedido).ToArray();
string pedidos = pedidosArray.Length > 0 ? string.Join(",", pedidosArray) : "";
fileData += $"{facturas.Count()}|\"{(folios.Length >= 25 ? folios.Substring(0,25) : folios)}\"|0|\"{NombreProveedor}\"|\"{(pedidos.Length >= 60 ? pedidos.Substring(0,60) : pedidos)}\"|";
}else{
fileData += $"0|\"\"|0|\"\"|\"\"|";
}
fileData += $"{trafico.Bultos}|0|0|{trafico.FechaDesaduanamiento.Substring(0,10)}|{contenedores.Count()}|0|\"\"|{trafico.FechaDesaduanamiento.Substring(0,10)}|{tipoMercancia.Clave}|0|0|\"\"|\"\"|\"\"|\"\"|/ /|F|F|F|F|0|0|F|0.00|F|0|\"\"|\"\"|";
fileData += $"{DateTime.ParseExact(trafico.FechaPago, "MM/dd/yyyy hh:mm:ss",CultureInfo.InvariantCulture).ToString("yyyy-MM-dd")}|\"\"|\"\"|0|\"{(IdCteFacturacion == trafico.IdCliente || IdCteFacturacion == 0 ? cliente!.sRazonSocial.Split("|")[0].Trim() : cteFacturacion!.sRazonSocial.Split("|")[0].Trim())}\"|";
fileData += $"{(IdCteFacturacion == trafico.IdCliente || IdCteFacturacion == 0 ? cliente!.sRFC : cteFacturacion.sRFC)}|\"\"|\"\"|\"\"|\"\"|\"\"|\"\"|\"\"|\"{NombreProveedor}\"|";
fileData += $"0|\"\"|\"\"|\"\"|\"\"|\"\"|\"\"|\"\"|\"\"|{trafico.ValorFacturaDls}|\"\"|\"\"|336|\"\"|/ / : :|{DateTime.Now.ToString("MM/dd/yyyy hh:mm:ss")}|{DateTime.Now.ToString("MM/dd/yyyy hh:mm:ss")}|";
fileData += $"0|\"\"|\"\"|\"\"|0|0|0|F|\"\"|0|\"\"|\"\"|0|0|0|0|\"\"|\"{centroCostos.CentroCostos.Trim()}\"";
return fileData;
}catch(Exception ex){
throw new Exception(ex.Message);
}
}
}
}
Loading…
Cancel
Save