Tras perder un día en tratar de averigüar dónde estaba el bug por el que no se aplicaban los descuentos específicos por categoría en Prestashop, llegué hasta esta parte del codigo en el archivo classes/SpecificPrice.php:
$query = ‘
SELECT *, ‘.SpecificPrice::_getScoreQuery($id_product, $id_shop, $id_currency, $id_country, $id_group, $id_customer).’
FROM `’._DB_PREFIX_.’specific_price`
WHERE
`id_shop` ‘.self::formatIntInQuery(0, $id_shop).’ AND
`id_currency` ‘.self::formatIntInQuery(0, $id_currency).’ AND
`id_country` ‘.self::formatIntInQuery(0, $id_country).’ AND
`id_group` ‘.self::formatIntInQuery(0, $id_group).’ ‘.$query_extra.’
AND IF(`from_quantity` > 1, `from_quantity`, 0) <= ';
Esta sentencia, por algún oscuro motivo de sus geniales creadores daba error cuando tienes más de dos reglas:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SELECT *, ( IF (`id_group` = 1, 2, 0) + IF (`id_country` = 6, 4, 0) + IF (`id_' at line 1
tas mucho investigar alguien había tenido el mismo problema ( https://www.prestashop.com/forums/topic/467748-solved-specific-price-error-after-update-from-1609-to-1611/page-2 ) y la solución era modificar esa sentencia sql y añadir una línea previa:
$now = date('Y-m-d H:i:00');
$query = '
SELECT *, '.SpecificPrice::_getScoreQuery($id_product, $id_shop, $id_currency, $id_country, $id_group, $id_customer).'
FROM `'._DB_PREFIX_.'specific_price` USE INDEX (id_product_2)
WHERE `id_product` IN (0, '.(int)$id_product.')
AND `id_product_attribute` IN (0, '.(int)$id_product_attribute.')
AND `id_shop` IN (0, '.(int)$id_shop.')
AND `id_currency` IN (0, '.(int)$id_currency.')
AND `id_country` IN (0, '.(int)$id_country.')
AND `id_group` IN (0, '.(int)$id_group.')
AND `id_customer` IN (0, '.(int)$id_customer.')
AND
(
(`from` = \'0000-00-00 00:00:00\' OR \''.$now.'\' >= `from`)
AND
(`to` = \’0000-00-00 00:00:00\’ OR \”.$now.’\’ <= `to`)
)
AND id_cart IN (0, '.(int)$id_cart.')
AND IF(`from_quantity` > 1, `from_quantity`, 0) <= ';
Una pena que este tipo de cosas haga tan poco fiable Prestashop.