package com.imprimelibros.erp.pedidos; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Service; import java.util.List; import java.util.Locale; import java.util.Map; @Service public class PedidoEstadoService { private static final Logger log = LoggerFactory.getLogger(PedidoEstadoService.class); private final PedidoLineaRepository pedidoLineaRepository; private final PedidoService pedidoService; public PedidoEstadoService(PedidoLineaRepository pedidoLineaRepository, PedidoService pedidoService) { this.pedidoLineaRepository = pedidoLineaRepository; this.pedidoService = pedidoService; } /** * Ejecuta cada noche a las 4:00 AM */ @Scheduled(cron = "0 0 4 * * *") public void actualizarEstadosPedidos() { List pedidosLineas = pedidoLineaRepository.findPedidosLineasParaActualizarEstado(); for (PedidoLinea linea : pedidosLineas) { try { Map resultado = pedidoService.actualizarEstado(linea.getId(), Locale.getDefault()); if (!Boolean.TRUE.equals(resultado.get("success"))) { log.error("Error al actualizar estado. pedidoLineaId={} message={}", linea.getId(), resultado.get("message")); } } catch (Exception ex) { log.error("Excepción actualizando estado. pedidoLineaId={}", linea.getId(), ex); } // rate limit / delay try { Thread.sleep(1000); } catch (InterruptedException e) { Thread.currentThread().interrupt(); log.error("Job interrumpido mientras dormía (rate limit)."); return; } } } }