Hola @rubenstore, @ivan24 y @samueldeco.
Tenéis toda la razón, el enfoque de override de Order.php es muy delicado y no es escalable para un sistema de recompensas. Como menciona @ivan24, el hook actionOrderStatusPostUpdate es el lugar correcto para enganchar esta lógica, ya que se dispara después de que el estado del pedido ha sido actualizado y puedes acceder a los detalles finales del pedido.
Aquí os dejo un ejemplo de cómo podrías empezar a manejar la creación del cupón dentro de un módulo personalizado, utilizando el hook correctamente. Esto va en el fichero principal de tu módulo (/modules/tu_modulo_recompensas/tu_modulo_recompensas.php):
public function hookActionOrderStatusPostUpdate($params)
{
$order = new Order((int)$params['id_order']);
$new_order_status = $params['newOrderStatus'];
if (Validate::isLoadedObject($order) && $new_order_status->id == Configuration::get('PS_OS_PAYMENT')) {
$customer = new Customer((int)$order->id_customer);
if (Validate::isLoadedObject($customer)) {
$cart_rule = new CartRule();
$cart_rule->name[Configuration::get('PS_LANG_DEFAULT')] = 'CUPON_RECOMPENSA_' . date('YmdHis');
$cart_rule->id_customer = (int)$customer->id; // Asociar al cliente
Este código crea la regla de carrito y la asocia al cliente. Sin embargo, como bien señala @samueldeco, la complejidad real viene después: gestionar las condiciones del cupón (mínimo de compra, categorías aplicables), asegurarse de que el cupón se envía por correo electrónico con una plantilla adecuada, y manejar posibles errores o reintentos.
Para una solución robusta y que no tengas que mantener manualmente con cada actualización o cambio de PHP, te recomiendo usar un módulo dedicado. Los módulos están diseñados para integrarse sin tocar el core y ofrecen una interfaz para gestionar estas reglas fácilmente. Por ejemplo, el módulo Recompensas - Códigos de cupón después de pedidos de MyPresta.eu está diseñado específicamente para esta funcionalidad, permitiendo configurar reglas, plantillas de email y condiciones directamente desde el Back Office, sin una sola línea de código por tu parte. Te ahorrará muchos dolores de cabeza.