Cierto, @ruben_online65 tiene razón. @marcos94, el actionValidateOrder se ejecuta en un punto donde el pedido se está validando, pero el contexto del cliente y el pedido aún no están completamente persistidos o finalizados en la base de datos de la forma que necesitas para una operación de 'añadir grupo' fiable.
Para esto, un hook más adecuado sería actionObjectOrderAddAfter o actionOrderStatusUpdate. Este último es ideal porque se dispara cada vez que cambia el estado de un pedido, lo que te permite reaccionar una vez que el pedido está realmente 'pagado' o 'entregado', y el cliente ha 'comprado' el producto de forma definitiva.
Aquí te muestro cómo podrías hacerlo en un módulo personalizado, utilizando actionOrderStatusUpdate y asegurándote de guardar el objeto Customer:
public function hookActionOrderStatusUpdate($params)
{
$order = new Order((int)$params['id_order']);
$customer = new Customer((int)$order->id_customer);
foreach ($order->getProducts() as $product) {
if ((int)$product['product_id'] === 123) {
$groups = $customer->get\'Groups();
if (!in_array(4, $groups)) {
$customer->addGroups(array(4)); // Añadir ID del grupo
$customer->save(); // Es crucial guardar los cambios
Este código asume que estás en PrestaShop 8.0.0. Al usar new Order() y new Customer() te aseguras de trabajar con los objetos más actualizados de la base de datos. Además, el save() es fundamental. No obstante, si buscas una solución sin tener que tocar código directamente, que sea más fácil de mantener y actualizar, existen módulos específicos para esto. Te recomiendo que mires el módulo Asignar clientes a grupos por productos comprados que ofrece una configuración completa desde el Back Office.