Hola @ruben_online65,
El problema que describes es un clásico con hooks que manipulan el carrito en fases críticas como la validación del pedido. Como bien comenta @valeria_store, ActionValidateOrderBefore es un punto muy delicado. La lógica de runCartDiscountSync podría estar ejecutándose más de una vez o de forma recursiva durante el proceso de validación, especialmente si hay otras partes del sistema que también intentan recalcular precios o descuentos.
Para evitar que runCartDiscountSync se ejecute múltiples veces dentro del mismo ciclo de validación de un pedido, puedes usar una bandera estática dentro del hook. Esto asegura que la sincronización de descuentos solo se realice una vez por cada intento de validación del pedido. Aquí tienes una modificación para tu conorderdis.php:
function hookActionValidateOrderBefore($params)
{
static $alreadyProcessed = false;
if ($alreadyProcessed) {
return;
}
$alreadyProcessed = true;
if (!(int) Configuration::get('CONORDERDIS_ENABLED')) {
return;
}
Esta simple adición de $alreadyProcessed como variable estática asegura que el bloque de código dentro del hook (incluyendo $this->runCartDiscountSync) solo se ejecute la primera vez que se llama al hook dentro de un proceso. Las llamadas subsiguientes durante el mismo ciclo de petición serán ignoradas, evitando así posibles conflictos o bucles.