diff --git a/src/Mercados.Infrastructure/DataFetchers/MercadoAgroFetcher.cs b/src/Mercados.Infrastructure/DataFetchers/MercadoAgroFetcher.cs index 5a4a54d..08d870d 100644 --- a/src/Mercados.Infrastructure/DataFetchers/MercadoAgroFetcher.cs +++ b/src/Mercados.Infrastructure/DataFetchers/MercadoAgroFetcher.cs @@ -42,29 +42,50 @@ namespace Mercados.Infrastructure.DataFetchers } var hoy = DateOnly.FromDateTime(DateTime.UtcNow); - // 1. Obtenemos los últimos datos guardados para el día de HOY. var cotizacionesViejas = await _cotizacionRepository.ObtenerTandaPorFechaAsync(hoy); - // 2. Comparamos si hay alguna diferencia real. - // Creamos un HashSet de los registros viejos para una comparación ultra rápida. - var viejasSet = new HashSet(cotizacionesViejas.Select(c => $"{c.Categoria}|{c.Especificaciones}|{c.Maximo}|{c.Minimo}|{c.Cabezas}")); - var nuevasList = cotizacionesNuevas.Select(c => $"{c.Categoria}|{c.Especificaciones}|{c.Maximo}|{c.Minimo}|{c.Cabezas}").ToList(); - - bool hayCambios = cotizacionesViejas.Count() != nuevasList.Count || nuevasList.Any(n => !viejasSet.Contains(n)); - - if (!hayCambios) + // Si el número de registros es diferente, sabemos que hay cambios. + if (cotizacionesViejas.Count() != cotizacionesNuevas.Count) { - _logger.LogInformation("No se encontraron cambios en los datos de {SourceName}. No se requiere actualización.", SourceName); - return (true, "Datos sin cambios."); + _logger.LogInformation("El número de registros de {SourceName} ha cambiado. Actualizando...", SourceName); + } + else + { + // Si el número de registros es el mismo, comparamos el contenido. + // Convertimos los nuevos a un diccionario para una búsqueda rápida por clave. + var nuevasDict = cotizacionesNuevas.ToDictionary(c => $"{c.Categoria}|{c.Especificaciones}"); + + bool hayCambios = false; + foreach (var cotizacionVieja in cotizacionesViejas) + { + var clave = $"{cotizacionVieja.Categoria}|{cotizacionVieja.Especificaciones}"; + + // Buscamos si el registro viejo existe en los nuevos y comparamos los valores. + if (!nuevasDict.TryGetValue(clave, out var cotizacionNueva) || + cotizacionVieja.Maximo != cotizacionNueva.Maximo || + cotizacionVieja.Minimo != cotizacionNueva.Minimo || + cotizacionVieja.Cabezas != cotizacionNueva.Cabezas || + cotizacionVieja.KilosTotales != cotizacionNueva.KilosTotales) + { + hayCambios = true; + _logger.LogInformation("Se detectó un cambio en la categoría: {Categoria}", clave); + break; // Encontramos un cambio, no necesitamos seguir buscando. + } + } + + if (!hayCambios) + { + _logger.LogInformation("No se encontraron cambios en los datos de {SourceName}. No se requiere actualización.", SourceName); + return (true, "Datos sin cambios."); + } } - // 3. Si hay cambios, reemplazamos la tanda completa del día. - _logger.LogInformation("Se detectaron cambios en los datos de {SourceName}. Actualizando base de datos...", SourceName); + _logger.LogInformation("Se detectaron cambios en los datos de {SourceName}. Reemplazando la tanda del día...", SourceName); await _cotizacionRepository.ReemplazarTandaDelDiaAsync(hoy, cotizacionesNuevas); await UpdateSourceInfoAsync(); - _logger.LogInformation("Fetch para {SourceName} completado exitosamente. Se actualizaron {Count} registros.", SourceName, cotizacionesNuevas.Count); + _logger.LogInformation("Fetch para {SourceName} completado. Se actualizaron {Count} registros.", SourceName, cotizacionesNuevas.Count); return (true, $"Proceso completado. Se actualizaron {cotizacionesNuevas.Count} registros."); } catch (Exception ex)