From b9941369396f70f06a06fca8749eaadac6fa85c2 Mon Sep 17 00:00:00 2001
From: gRoussac
Date: Wed, 13 Mar 2013 14:31:26 +0100
Subject: [PATCH] [-] CORE : Preserve carrier reference integrity in cart rules
when updating a carrier
---
.../controllers/cart_rules/conditions.tpl | 4 ++--
classes/CartRule.php | 16 ++++++++++------
install-dev/upgrade/sql/1.5.4.0.sql | 2 ++
3 files changed, 14 insertions(+), 8 deletions(-)
diff --git a/admin-dev/themes/default/template/controllers/cart_rules/conditions.tpl b/admin-dev/themes/default/template/controllers/cart_rules/conditions.tpl
index 1fd8e4f7f..d029bceda 100644
--- a/admin-dev/themes/default/template/controllers/cart_rules/conditions.tpl
+++ b/admin-dev/themes/default/template/controllers/cart_rules/conditions.tpl
@@ -98,7 +98,7 @@
{l s='Unselected carriers'}
{l s='Selected carriers'}
getValue('
SELECT crc.id_cart_rule
FROM '._DB_PREFIX_.'cart_rule_carrier crc
+ INNER JOIN '._DB_PREFIX_.'carrier c ON (c.id_reference = crc.id_carrier AND c.deleted = 0)
WHERE crc.id_cart_rule = '.(int)$this->id.'
- AND crc.id_carrier = '.(int)$context->cart->id_carrier);
+ AND c.id_carrier = '.(int)$context->cart->id_carrier);
if (!$id_cart_rule)
return (!$display_error) ? false : Tools::displayError('You cannot use this voucher with this carrier');
}
@@ -762,10 +763,11 @@ class CartRuleCore extends ObjectModel
else
{
$data = Db::getInstance()->executeS('
- SELECT crc.id_cart_rule, crc.id_carrier
+ SELECT crc.id_cart_rule, c.id_carrier
FROM '._DB_PREFIX_.'cart_rule_carrier crc
+ INNER JOIN '._DB_PREFIX_.'carrier c ON (c.id_reference = crc.id_carrier AND c.deleted = 0)
WHERE crc.id_cart_rule = '.(int)$this->id.'
- AND crc.id_carrier = '.(int)$context->cart->id_carrier);
+ AND c.id_carrier = '.(int)$context->cart->id_carrier);
if ($data)
foreach ($data as $cart_rule)
@@ -1032,9 +1034,10 @@ class CartRuleCore extends ObjectModel
SELECT t.*'.($i18n ? ', tl.*' : '').', IF(crt.id_'.$type.' IS NULL, 0, 1) as selected
FROM `'._DB_PREFIX_.$type.'` t
'.($i18n ? 'LEFT JOIN `'._DB_PREFIX_.$type.'_lang` tl ON (t.id_'.$type.' = tl.id_'.$type.' AND tl.id_lang = '.(int)Context::getContext()->language->id.')' : '').'
- LEFT JOIN (SELECT id_'.$type.' FROM `'._DB_PREFIX_.'cart_rule_'.$type.'` WHERE id_cart_rule = '.(int)$this->id.') crt ON t.id_'.$type.' = crt.id_'.$type.'
+ LEFT JOIN (SELECT id_'.$type.' FROM `'._DB_PREFIX_.'cart_rule_'.$type.'` WHERE id_cart_rule = '.(int)$this->id.') crt ON t.id_'.($type == 'carrier' ? 'reference' : $type).' = crt.id_'.$type.'
WHERE 1 '.($active_only ? ' AND t.active = 1' : '').
- $shop_list.
+ $shop_list
+ .(in_array($type, array('carrier', 'shop')) ? ' AND t.deleted = 0' : '').
' ORDER BY name ASC',
false);
while ($row = Db::getInstance()->nextRow($resource))
@@ -1081,6 +1084,7 @@ class CartRuleCore extends ObjectModel
FROM '._DB_PREFIX_.'cart_rule cr
LEFT JOIN '._DB_PREFIX_.'cart_rule_shop crs ON cr.id_cart_rule = crs.id_cart_rule
LEFT JOIN '._DB_PREFIX_.'cart_rule_carrier crca ON cr.id_cart_rule = crca.id_cart_rule
+ '.($context->cart->id_carrier ? 'INNER JOIN '._DB_PREFIX_.'carrier c ON (c.id_reference = crca.id_carrier AND c.deleted = 0)' : '').'
LEFT JOIN '._DB_PREFIX_.'cart_rule_country crco ON cr.id_cart_rule = crco.id_cart_rule
WHERE cr.active = 1
AND cr.code = ""
@@ -1093,7 +1097,7 @@ class CartRuleCore extends ObjectModel
)
AND (
cr.carrier_restriction = 0
- '.($context->cart->id_carrier ? 'OR crca.id_carrier = '.(int)$context->cart->id_carrier : '').'
+ '.($context->cart->id_carrier ? 'OR c.id_carrier = '.(int)$context->cart->id_carrier : '').'
)
AND (
cr.shop_restriction = 0
diff --git a/install-dev/upgrade/sql/1.5.4.0.sql b/install-dev/upgrade/sql/1.5.4.0.sql
index 1473b0aae..150306eb7 100644
--- a/install-dev/upgrade/sql/1.5.4.0.sql
+++ b/install-dev/upgrade/sql/1.5.4.0.sql
@@ -46,3 +46,5 @@ ALTER TABLE `PREFIX_address` CHANGE `phone` `phone` varchar(32) default NULL;
ALTER TABLE `PREFIX_address` CHANGE `phone_mobile` `phone_mobile` varchar(32) default NULL;
/* PHP:update_genders_images(); */;
+
+UPDATE `PREFIX_cart_rule_carrier` crc INNER JOIN `PREFIX_carrier` c ON crc.`id_carrier` = c.`id_carrier` SET crc.`id_carrier` = c.`id_reference`;
\ No newline at end of file