Hola @lorena_bcn,
@miriam_9651 tiene razón, hookActionValidateOrder es el punto de partida correcto. Tu fragmento de código identifica el producto digital y recupera una clave disponible, lo cual es excelente. El problema principal es la persistencia de esos cambios y el enlace bidireccional entre la clave y el detalle del pedido. Necesitas hacer dos actualizaciones a la base de datos para asegurar esto.
Primero, debes añadir una columna digital_key_code a la tabla ps_order_detail (o una tabla personalizada que enlace id_order_detail con la clave). Segundo, tu tabla digital_keys necesita campos para marcar la clave como usada y, preferiblemente, para registrar a qué id_order_detail se asignó. Así, puedes rastrear cada clave.
Aquí te muestro cómo podrías completar tu lógica dentro del hook:
public function hookActionValidateOrder($params)
{
$order = $params['order'];
foreach ($order->getProducts() as $orderProduct) {
if ($orderProduct['id_product'] == (int)Configuration::get('MYMODULE_DIGITAL_PRODUCT_ID')) {
$keyData = Db::getInstance()->getRow('SELECT id_key, key_code FROM `'._DB_PREFIX_.'digital_keys` WHERE is_used = 0 ORDER BY id_key ASC LIMIT 1');
if ($keyData) {
// 1. Asociar la clave al detalle del pedido (asumiendo columna 'digital_key_code' en ps_order_detail)
Db::getInstance()->update('order_detail', [
'digital_key_code' => pSQL($keyData['key_code'])
Este código asume que ya tienes la columna digital_key_code en ps_order_detail y is_used, id_order_detail_assigned en ps_digital_keys. Ten en cuenta que, aunque esto funciona, mantener esta lógica en un override o un módulo básico puede volverse complejo con el tiempo. Para una solución más mantenible y con interfaz de administración, muchos usuarios optan por un módulo especializado para automatizar vender cdkeys / licencias en la tienda, que ya gestiona todo el ciclo de vida de las claves, su stock y la entrega al cliente.