using Microsoft.Data.SqlClient; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Logging; using MotoresArgentinosV2.Core.Entities; using MotoresArgentinosV2.Core.Interfaces; using MotoresArgentinosV2.Infrastructure.Data; namespace MotoresArgentinosV2.Infrastructure.Services; /// /// Implementación del servicio para interactuar con datos legacy de operaciones /// Utiliza EldiaDbContext para acceder a tablas y ejecutar SPs de la DB 'eldia' (ex base de datos 'autos') /// public class OperacionesLegacyService : IOperacionesLegacyService { private readonly EldiaDbContext _context; private readonly ILogger _logger; public OperacionesLegacyService(EldiaDbContext context, ILogger logger) { _context = context; _logger = logger; } /// /// Ejecuta el SP sp_inserta_operaciones para registrar un pago /// public async Task InsertarOperacionAsync(Operacion operacion) { try { _logger.LogInformation("Ejecutando sp_inserta_operaciones para operación: {Noperacion}", operacion.Noperacion); // Preparar parámetros asegurando manejo de nulos var parameters = new[] { new SqlParameter("@fecha", operacion.Fecha ?? (object)DBNull.Value), new SqlParameter("@Motivo", operacion.Motivo ?? (object)DBNull.Value), new SqlParameter("@Moneda", operacion.Moneda ?? (object)DBNull.Value), new SqlParameter("@Direccionentrega", operacion.Direccionentrega ?? (object)DBNull.Value), new SqlParameter("@Validaciondomicilio", operacion.Validaciondomicilio ?? (object)DBNull.Value), new SqlParameter("@codigopedido", operacion.Codigopedido ?? (object)DBNull.Value), new SqlParameter("@nombreentrega", operacion.Nombreentrega ?? (object)DBNull.Value), new SqlParameter("@fechahora", operacion.Fechahora ?? (object)DBNull.Value), new SqlParameter("@telefonocomprador", operacion.Telefonocomprador ?? (object)DBNull.Value), new SqlParameter("@barrioentrega", operacion.Barrioentrega ?? (object)DBNull.Value), new SqlParameter("@codautorizacion", operacion.Codautorizacion ?? (object)DBNull.Value), new SqlParameter("@paisentrega", operacion.Paisentrega ?? (object)DBNull.Value), new SqlParameter("@cuotas", operacion.Cuotas ?? (object)DBNull.Value), new SqlParameter("@validafechanac", operacion.Validafechanac ?? (object)DBNull.Value), new SqlParameter("@validanrodoc", operacion.Validanrodoc ?? (object)DBNull.Value), new SqlParameter("@titular", operacion.Titular ?? (object)DBNull.Value), new SqlParameter("@pedido", operacion.Pedido ?? (object)DBNull.Value), new SqlParameter("@zipentrega", operacion.Zipentrega ?? (object)DBNull.Value), new SqlParameter("@monto", operacion.Monto ?? (object)DBNull.Value), new SqlParameter("@tarjeta", operacion.Tarjeta ?? (object)DBNull.Value), new SqlParameter("@fechaentrega", operacion.Fechaentrega ?? (object)DBNull.Value), new SqlParameter("@emailcomprador", operacion.Emailcomprador ?? (object)DBNull.Value), new SqlParameter("@validanropuerta", operacion.Validanropuerta ?? (object)DBNull.Value), new SqlParameter("@ciudadentrega", operacion.Ciudadentrega ?? (object)DBNull.Value), new SqlParameter("@validatipodoc", operacion.Validatipodoc ?? (object)DBNull.Value), new SqlParameter("@noperacion", operacion.Noperacion ?? (object)DBNull.Value), new SqlParameter("@estadoentrega", operacion.Estadoentrega ?? (object)DBNull.Value), new SqlParameter("@resultado", operacion.Resultado ?? (object)DBNull.Value), new SqlParameter("@mensajeentrega", operacion.Mensajeentrega ?? (object)DBNull.Value), new SqlParameter("@precio", operacion.Precioneto ?? 0) // El SP espera int }; await _context.Database.ExecuteSqlRawAsync( "EXEC dbo.sp_inserta_operaciones @fecha, @Motivo, @Moneda, @Direccionentrega, " + "@Validaciondomicilio, @codigopedido, @nombreentrega, @fechahora, @telefonocomprador, " + "@barrioentrega, @codautorizacion, @paisentrega, @cuotas, @validafechanac, @validanrodoc, " + "@titular, @pedido, @zipentrega, @monto, @tarjeta, @fechaentrega, @emailcomprador, " + "@validanropuerta, @ciudadentrega, @validatipodoc, @noperacion, @estadoentrega, " + "@resultado, @mensajeentrega, @precio", parameters); _logger.LogInformation("Operación registrada correctamente: {Noperacion}", operacion.Noperacion); return true; } catch (Exception ex) { _logger.LogError(ex, "Error al insertar operación: {Noperacion}", operacion.Noperacion); throw; } } public async Task> ObtenerOperacionesPorNumeroAsync(string noperacion) { return await _context.Operaciones .AsNoTracking() .Where(o => o.Noperacion == noperacion) .ToListAsync(); } public async Task> ObtenerOperacionesPorFechasAsync(DateTime fechaInicio, DateTime fechaFin) { return await _context.Operaciones .AsNoTracking() .Where(o => o.Fecha >= fechaInicio && o.Fecha <= fechaFin) .OrderByDescending(o => o.Fecha) .ToListAsync(); } public async Task> ObtenerMediosDePagoAsync() { return await _context.MediosDePago .AsNoTracking() .ToListAsync(); } }