Gracias por exponer tu problema, @fernando_lab. Es un escenario común y la clase CartRule de PrestaShop, aunque potente, requiere que se definan un buen número de propiedades para que una regla de carrito sea válida y funcional. El error en tu implementación radica en que no estás seteando todas las propiedades obligatorias y algunas otras que, aunque no estrictamente obligatorias, son cruciales para el comportamiento del cupón (como las fechas de validez o el valor mínimo de compra).
Aquí te muestro cómo podrías crear una CartRule de forma más completa en tu hook actionValidateOrder, asumiendo que ya tienes el id_customer del referidor y el id_customer del referido:
public function hookActionValidateOrder($params)
{
if (!isset($params['order']) || !isset($params['order']->id_customer)) {
return false;
}
$customer = new Customer($params['order']->id_customer); // Cliente que ha realizado la compra (el referido)
$referrerId = (int)Context::getContext()->cookie->referrer_id; // ID del referidor
if ($referrerId > 0 && $customer->id && $customer->id != $referrerId) {
$referrerCustomer = new Customer($referrerId);
if (!Validate::isLoadedObject($referrerCustomer)) {
Este código ya cubre los campos básicos y multilingües, y asigna el cupón directamente al cliente referidor. Sin embargo, manejar estas lógicas de referidos manualmente a través de overrides o módulos personalizados puede ser tedioso y propenso a errores, además de requerir mantenimiento constante. Para una solución más sólida y que no se rompa con las actualizaciones del core, te recomiendo buscar un módulo dedicado. Para este tipo de funcionalidad, una automatización de cupón para amigo puede ahorrarte mucho tiempo y garantizar la estabilidad.