Hola @pedrolab,
Gracias por compartir tu código. @rubenstore y @elenadeco99 han dado en el clavo. Efectivamente, la clase CartRule en PrestaShop 9 requiere que el vale tenga un código único y un rango de fechas de validez para que sea funcional y se active correctamente. Tu intento de enganchar actionValidateOrder es el camino correcto, pero el objeto CartRule necesita ser más completo.
Aquí te muestro cómo podrías ajustar tu código para generar el vale de forma completa, incluyendo un código único y fechas de validez:
// En tu módulo, dentro de la clase principal, por ejemplo, MyModule.php
public function hookActionValidateOrder(array $params): void
{
if (!isset($params['order']) || !($params['customer'] instanceof Customer)) {
return; // Asegurarse de que el cliente existe
}
$customer = $params['customer'];
$voucherCode = CartRule::generateCode(CartRule::CODE_LENGTH); // Genera un código único
$voucher = new CartRule();
$voucher->id_customer = $customer->id; // Asociar al cliente
Este snippet crea el vale correctamente. Ten en cuenta que para una solución más robusta y sin complicaciones de mantenimiento, especialmente en PrestaShop 9 con sus actualizaciones y compatibilidad con PHP 8.x, un módulo dedicado es siempre lo ideal. Un módulo como Recompensas - Códigos de cupón después de pedidos ya gestiona toda la lógica de generación, fechas, asignación al cliente y envío de emails de forma automática y configurable, evitando que tengas que lidiar con el código directamente en cada actualización del core o del tema.