Hola @alvaroshop99 y @rodrigohub16,
@rodrigohub16 ha dado en el clavo. La clase CartRule requiere muchos más parámetros de los que has puesto inicialmente para que se cree correctamente. Es un objeto muy complejo. Además, la asignación de nombres multilenguaje (name) también debe ser correcta, aunque con un solo idioma como has hecho no debería ser el problema principal.
Aquí tienes un snippet corregido que incluye los campos mínimos necesarios para que tu CartRule se añada correctamente. Lo he adaptado para PrestaShop 1.7.7.3, que es la versión que intuyo que usas, @alvaroshop99, dado el contexto.
public function newsletterRegistration($email, $active = 1)
{
// ... (código existente del módulo para guardar la suscripción)
$cartRule = new CartRule();
$languages = Language::getLanguages(false);
foreach ($languages as $lang) {
$cartRule->name[$lang['id_lang']] = 'Bienvenida Newsletter';
}
$cartRule->description = 'Descuento por suscripción al boletín';
$cartRule->quantity = 1; // Solo se puede usar una vez
Como ves, la clave está en inicializar todos esos valores. Ahora, un detalle importante: modificar directamente el core de los módulos o hacer overrides manuales es una solución temporal y frágil. Cada actualización de PrestaShop o del propio módulo ps_emailsubscription puede sobrescribir tus cambios o causar incompatibilidades.
Para una solución robusta y de bajo mantenimiento en una tienda en producción, te recomendaría usar un módulo dedicado. Por ejemplo, en MyPresta.eu tenemos el módulo Cupón único para la suscripción al boletín que hace exactamente esto de forma gestionada, sin necesidad de tocar código y es compatible con futuras actualizaciones. Es una inversión que te ahorra muchos dolores de cabeza a largo plazo.