ACTION FO+BO Desde 1.5

actionUpdateQuantity

~3 min de lectura

#Descripcion

Se ejecuta cuando la cantidad de stock de un producto es actualizada. Se dispara tanto por ventas (reduccion automatica), como por edicion manual en el back office o por importaciones. Es el hook principal para implementar alertas de stock bajo, sincronizar inventario con almacenes o ERP, y controlar la disponibilidad de productos.

📍
Disparado por
  • StockAvailable::updateQuantity()classes/stock/StockAvailable.php

#Parametros

Nombre Tipo Requerido Descripcion
$id_product int Si ID del producto cuyo stock cambio
$id_product_attribute int Si ID de la combinacion (0 si es producto simple)
$quantity int Si Nueva cantidad de stock
$id_shop int Si ID de la tienda afectada
$operator string No Operacion realizada: 'up' o 'down' (no siempre disponible)
Retorno
void Este hook no espera valor de retorno

#Ejemplo de codigo

mymodule.php
php
<?php
public function install()
{
    return parent::install()
        && $this->registerHook('actionUpdateQuantity');
}
mymodule.php
php
<?php
/**
 * Hook actionUpdateQuantity — stock actualizado
 */
public function hookActionUpdateQuantity(array $params)
{
    $idProduct = (int) $params['id_product'];
    $idAttribute = (int) $params['id_product_attribute'];
    $quantity = (int) $params['quantity'];
    $idShop = (int) $params['id_shop'];

    // Ejemplo: Alerta de stock bajo
    $threshold = (int) Configuration::get('MYMODULE_LOW_STOCK_THRESHOLD');
    if ($threshold > 0 && $quantity <= $threshold && $quantity > 0) {
        $product = new Product($idProduct, false, Configuration::get('PS_LANG_DEFAULT'));
        $reference = $idAttribute
            ? $product->reference . '-' . Combination::getAttributeName($idAttribute)
            : $product->reference;

        Mail::send(
            (int) Configuration::get('PS_LANG_DEFAULT'),
            'low_stock_alert',
            sprintf('Stock bajo: %s (quedan %d)', $product->name, $quantity),
            [
                '{product_name}' => $product->name,
                '{reference}'    => $reference,
                '{quantity}'     => $quantity,
                '{threshold}'    => $threshold,
            ],
            Configuration::get('PS_SHOP_EMAIL'),
            null, null, null, null, null,
            _PS_MODULE_DIR_ . $this->name . '/mails/'
        );
    }

    // Ejemplo: Desactivar producto sin stock
    if ($quantity <= 0 && Configuration::get('MYMODULE_AUTO_DISABLE_OOS')) {
        // Verificar si TODAS las combinaciones estan sin stock
        $totalStock = StockAvailable::getQuantityAvailableByProduct($idProduct);
        if ($totalStock <= 0) {
            $product = new Product($idProduct);
            $product->active = 0;
            $product->update();
        }
    }
}

#Notas y gotchas

  • ⚠️ El parametro `quantity` es la cantidad ACTUAL (nueva), no la cantidad modificada.
  • ⚠️ El parametro `operator` no siempre esta disponible — no dependas de el.
  • ⚠️ Se dispara con mucha frecuencia durante los pedidos — evita operaciones pesadas.
  • ⚠️ Para tiendas multistock, verifica el `id_shop` antes de actuar.
  • ⚠️ En importaciones masivas, este hook se dispara para cada producto — considera usar un sistema de cola.

#Relacionados

#Historial de versiones

Version PSCambio
1.5 Introducido con Advanced Stock Management
1.7 Sin cambios significativos. Compatible
8.0 Sin cambios. Compatible
Descargar en Markdown Pensado para pegar en ChatGPT, Claude u otra IA. Incluye solo el contenido de esta pagina.