From 377c6d01c5406de0a81b03f6e192d4bf4cb97abf Mon Sep 17 00:00:00 2001 From: Felix Morales Date: Wed, 24 Jan 2024 16:13:30 -0600 Subject: [PATCH] Creacion del Txt de facturacion, enviar correo en caso de error --- .../ICorresponsaliasTraficosService.cs | 1 + .../Corresponsalias/TraficosController.cs | 14 +++- Controllers/FileManagerController.cs | 69 ++++++++++++++++--- .../CorresponsaliasTraficosService.cs | 66 +++++++++++++++++- 4 files changed, 138 insertions(+), 12 deletions(-) diff --git a/Contracts/Corresponsalias/Services/ICorresponsaliasTraficosService.cs b/Contracts/Corresponsalias/Services/ICorresponsaliasTraficosService.cs index a6be5fe..ca6c213 100644 --- a/Contracts/Corresponsalias/Services/ICorresponsaliasTraficosService.cs +++ b/Contracts/Corresponsalias/Services/ICorresponsaliasTraficosService.cs @@ -1,5 +1,6 @@ namespace CORRESPONSALBackend.Contracts.Corresponsalias.Services{ public interface ICorresponsaliasTraficosService{ public Task> ReadTxtFacturasAlen(int fileId); + public Task GetTxtFacturacionData(int idTrafico); } } diff --git a/Controllers/Corresponsalias/TraficosController.cs b/Controllers/Corresponsalias/TraficosController.cs index b1e52ff..c917133 100644 --- a/Controllers/Corresponsalias/TraficosController.cs +++ b/Controllers/Corresponsalias/TraficosController.cs @@ -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 } } } -} \ No newline at end of file +} diff --git a/Controllers/FileManagerController.cs b/Controllers/FileManagerController.cs index 940e0b1..b392a30 100644 --- a/Controllers/FileManagerController.cs +++ b/Controllers/FileManagerController.cs @@ -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("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 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 = @$" +

El se detectó el siguiente error durante la creación del archivo texto del trafico {folioTrafico}

+
+

{ex.Message}

+ " + }); + 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); + } + } } } \ No newline at end of file diff --git a/Services/Corresponsalias/Traficos/CorresponsaliasTraficosService.cs b/Services/Corresponsalias/Traficos/CorresponsaliasTraficosService.cs index 24689c2..36bab10 100644 --- a/Services/Corresponsalias/Traficos/CorresponsaliasTraficosService.cs +++ b/Services/Corresponsalias/Traficos/CorresponsaliasTraficosService.cs @@ -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("AllFiles"); } @@ -39,5 +61,47 @@ namespace CORRESPONSALBackend.Services.Corresponsalias.Traficos{ return new List(); } } + + public async Task 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); + } + } } } \ No newline at end of file