Hola @rodrigohub16 y @maria96,
@maria96 tiene razón. Tu consulta actual en getCustomersWithPointsForReminder() está agregando puntos del historial, lo cual no es lo más preciso para el saldo actual y canjeable. La tabla ps_loyalty es la que almacena el balance de puntos activo de cada cliente. La lógica correcta para obtener los clientes con puntos de fidelidad disponibles debería ser así:
public function getCustomersWithActiveLoyaltyPoints()
{
$sql = 'SELECT c.id_customer, c.firstname, c.lastname, c.email, pl.points
FROM '._DB_PREFIX_.'customer c
INNER JOIN '._DB_PREFIX_.'ps_loyalty pl ON c.id_customer = pl.id_customer
WHERE pl.id_loyalty_state = 2 /* 2 = disponible */
AND pl.points > 0';
return Db::getInstance()->executeS($sql);
}
Este snippet te dará los clientes con puntos realmente disponibles. Sin embargo, para un sistema de recordatorio completo, como bien señala @maria96, necesitarías almacenar la fecha del último recordatorio enviado para cada cliente. Esto implicaría modificar la tabla ps_loyalty o crear una tabla separada, lo cual ya es un cambio de esquema de base de datos.
Las modificaciones directas en overrides, aunque funcionan, pueden ser frágiles con las actualizaciones de PrestaShop o PHP, especialmente si usas versiones antiguas (como PS 1.7.8.6 con PHP 7.1-7.4). Para una solución más robusta y fácil de mantener, te recomiendo utilizar un módulo preparado para recordatorio de puntos. Estos módulos ya gestionan la lógica de seguimiento, el envío de emails y son compatibles con futuras actualizaciones, evitando que tengas que lidiar con el código directamente.