ACTION FO+BO Desde 1.5

actionOrderStatusUpdate

~3 min de lectura

#Descripcion

Se ejecuta cuando el estado de un pedido cambia. Se dispara ANTES de que el nuevo estado sea efectivamente guardado en la base de datos. Es ideal para validar o interceptar cambios de estado, enviar notificaciones o sincronizar con ERPs externos. Se dispara tanto desde el back office como desde procesos automaticos.

📍
Disparado por
  • OrderHistory::changeIdOrderState()classes/order/OrderHistory.php

#Parametros

Nombre Tipo Requerido Descripcion
$newOrderStatus OrderState Si Nuevo estado del pedido que se va a asignar
$id_order int Si ID del pedido afectado
$order Order No Objeto Order del pedido (disponible desde PS 1.7.7)
Retorno
void Este hook no espera valor de retorno

#Ejemplo de codigo

mymodule.php
php
<?php
public function install()
{
    return parent::install()
        && $this->registerHook('actionOrderStatusUpdate');
}
mymodule.php
php
<?php
/**
 * Hook actionOrderStatusUpdate — cambio de estado del pedido
 */
public function hookActionOrderStatusUpdate(array $params)
{
    /** @var OrderState $newStatus */
    $newStatus = $params['newOrderStatus'];
    $idOrder = (int) $params['id_order'];

    // En PS >= 1.7.7 podemos usar el objeto Order directamente
    $order = isset($params['order']) ? $params['order'] : new Order($idOrder);

    // Ejemplo: Notificar al almacen cuando el pedido pasa a 'Preparacion en curso'
    if ((int) $newStatus->id === (int) Configuration::get('PS_OS_PREPARATION')) {
        $customer = new Customer($order->id_customer);
        $address = new Address($order->id_address_delivery);
        $products = $order->getProducts();

        $warehouseData = [
            'order_ref'   => $order->reference,
            'customer'    => $customer->firstname . ' ' . $customer->lastname,
            'address'     => $address->address1 . ', ' . $address->city,
            'postcode'    => $address->postcode,
            'products'    => array_map(function ($p) {
                return [
                    'reference' => $p['reference'],
                    'name'      => $p['product_name'],
                    'qty'       => $p['product_quantity'],
                ];
            }, $products),
        ];

        // Enviar a sistema de almacen
        Db::getInstance()->insert('mymodule_warehouse_queue', [
            'id_order' => $idOrder,
            'payload'  => pSQL(json_encode($warehouseData)),
            'status'   => 'pending',
            'date_add' => date('Y-m-d H:i:s'),
        ]);
    }

    // Ejemplo: Notificar por SMS cuando se envia
    if ($newStatus->shipped) {
        $carrier = new Carrier($order->id_carrier);
        $tracking = $order->shipping_number;
        // $this->sendSmsNotification($order, $tracking);
    }
}

#Notas y gotchas

  • ⚠️ Este hook se ejecuta ANTES de guardar el nuevo estado — el pedido aun tiene el estado anterior en BD.
  • ⚠️ El parametro `order` solo esta disponible desde PrestaShop 1.7.7. Para versiones anteriores, usa `new Order($params['id_order'])`.
  • ⚠️ Si necesitas actuar DESPUES de que el estado se haya guardado, usa `actionOrderStatusPostUpdate`.
  • ⚠️ Se dispara en cada cambio de estado, incluyendo los automaticos (pago aceptado, envio, etc.).
  • ⚠️ Evita cambiar el estado del pedido dentro de este hook — puede causar bucles infinitos.

#Relacionados

#Historial de versiones

Version PSCambio
1.5 Introducido con newOrderStatus e id_order
1.7.7 Añadido el parametro order (objeto Order)
8.0 Sin cambios. Compatible
Descargar en Markdown Pensado para pegar en ChatGPT, Claude u otra IA. Incluye solo el contenido de esta pagina.