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 6a8e19eb1..202199b30 100644 --- a/admin-dev/themes/default/template/controllers/cart_rules/conditions.tpl +++ b/admin-dev/themes/default/template/controllers/cart_rules/conditions.tpl @@ -179,4 +179,36 @@ {l s='Add'} {l s='Add a new rule group'} - \ No newline at end of file + +{if $shops.unselected|@count + $shops.selected|@count > 1} +
+ {l s='Shop selection'} +
+ + + + + +
+

{l s='Selected shops'}

+

+ + {l s='Remove'} >> + +
+

{l s='Unselected shops'}

+

+ + << {l s='Add'} + +
+
+{/if} \ No newline at end of file diff --git a/admin-dev/themes/default/template/controllers/cart_rules/form.js b/admin-dev/themes/default/template/controllers/cart_rules/form.js index 3dcdf450c..c369c16c0 100644 --- a/admin-dev/themes/default/template/controllers/cart_rules/form.js +++ b/admin-dev/themes/default/template/controllers/cart_rules/form.js @@ -28,6 +28,7 @@ function addProductRuleGroup() { product_rule_groups_counter += 1; product_rule_counters[product_rule_groups_counter] = 0; + $.get( 'ajax-tab.php', {controller:'AdminCartRules',token:currentToken,newProductRuleGroup:1,product_rule_group_id:product_rule_groups_counter}, @@ -93,7 +94,7 @@ function updateProductRuleShortDescription(item) $('#' + id2 + '_match').val(length); } -var restrictions = new Array('country', 'carrier', 'group', 'cart_rule'); +var restrictions = new Array('country', 'carrier', 'group', 'cart_rule', 'shop'); for (i in restrictions) { toggleCartRuleFilter($('#' + restrictions[i] + '_restriction')); diff --git a/classes/CartRule.php b/classes/CartRule.php index 47238b3db..a3ae005b0 100644 --- a/classes/CartRule.php +++ b/classes/CartRule.php @@ -47,6 +47,7 @@ class CartRuleCore extends ObjectModel public $group_restriction; public $cart_rule_restriction; public $product_restriction; + public $shop_restriction; public $free_shipping; public $reduction_percent; public $reduction_amount; @@ -84,6 +85,7 @@ class CartRuleCore extends ObjectModel 'group_restriction' => array('type' => self::TYPE_BOOL, 'validate' => 'isBool'), 'cart_rule_restriction' => array('type' => self::TYPE_BOOL, 'validate' => 'isBool'), 'product_restriction' => array('type' => self::TYPE_BOOL, 'validate' => 'isBool'), + 'shop_restriction' => array('type' => self::TYPE_BOOL, 'validate' => 'isBool'), 'free_shipping' => array('type' => self::TYPE_BOOL, 'validate' => 'isBool'), 'reduction_percent' => array('type' => self::TYPE_FLOAT, 'validate' => 'isFloat'), 'reduction_amount' => array('type' => self::TYPE_FLOAT, 'validate' => 'isFloat'), @@ -124,6 +126,7 @@ class CartRuleCore extends ObjectModel $r = Db::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.'cart_cart_rule` WHERE `id_cart_rule` = '.(int)$this->id); $r &= Db::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.'cart_rule_carrier` WHERE `id_cart_rule` = '.(int)$this->id); + $r &= Db::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.'cart_rule_shop` WHERE `id_cart_rule` = '.(int)$this->id); $r &= Db::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.'cart_rule_group` WHERE `id_cart_rule` = '.(int)$this->id); $r &= Db::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.'cart_rule_country` WHERE `id_cart_rule` = '.(int)$this->id); $r &= Db::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.'cart_rule_combination` WHERE `id_cart_rule_1` = '.(int)$this->id.' OR `id_cart_rule_2` = '.(int)$this->id); @@ -143,6 +146,9 @@ class CartRuleCore extends ObjectModel */ public static function copyConditions($id_cart_rule_source, $id_cart_rule_destination) { + Db::getInstance()->Execute(' + INSERT INTO `'._DB_PREFIX_.'cart_rule_shop` (`id_cart_rule`, `id_shop`) + (SELECT '.(int)$id_cart_rule_destination.', id_shop FROM `'._DB_PREFIX_.'cart_rule_shop` WHERE `id_cart_rule` = '.(int)$id_cart_rule_source.')'); Db::getInstance()->Execute(' INSERT INTO `'._DB_PREFIX_.'cart_rule_carrier` (`id_cart_rule`, `id_carrier`) (SELECT '.(int)$id_cart_rule_destination.', id_carrier FROM `'._DB_PREFIX_.'cart_rule_carrier` WHERE `id_cart_rule` = '.(int)$id_cart_rule_source.')'); @@ -409,6 +415,18 @@ class CartRuleCore extends ObjectModel return Tools::displayError('You cannot use this voucher with this carrier'); } + // Check if the cart rules appliy to the shop browsed by the customer + if ($this->shop_restriction && $context->shop->id && Shop::isFeatureActive()) + { + $id_cart_rule = (int)Db::getInstance()->getValue(' + SELECT crs.id_cart_rule + FROM '._DB_PREFIX_.'cart_rule_shop crs + WHERE crs.id_cart_rule = '.(int)$this->id.' + AND crs.id_shop = '.(int)$context->shop->id); + if (!$id_cart_rule) + return Tools::displayError('You cannot use this voucher'); + } + // Check if the products chosen by the customer are usable with the cart rule if ($this->product_restriction) { @@ -724,21 +742,21 @@ class CartRuleCore extends ObjectModel return $array; } - public function getAssociatedRestrictions($type, $active = 1) + public function getAssociatedRestrictions($type, $active_only, $i18n) { $array = array('selected' => array(), 'unselected' => array()); - if (!in_array($type, array('country', 'carrier', 'group', 'cart_rule'))) + if (!in_array($type, array('country', 'carrier', 'group', 'cart_rule', 'shop'))) return false; if (!Validate::isLoadedObject($this) OR $this->{$type.'_restriction'} == 0) { $array['selected'] = Db::getInstance()->ExecuteS(' - SELECT t.*, tl.*, 1 as selected + SELECT t.*'.($i18n ? ', tl.*' : '').', 1 as selected FROM `'._DB_PREFIX_.$type.'` t - LEFT JOIN `'._DB_PREFIX_.$type.'_lang` tl ON t.id_'.$type.' = tl.id_'.$type.' AND tl.id_lang = '.(int)Context::getContext()->language->id.' + '.($i18n ? 'LEFT JOIN `'._DB_PREFIX_.$type.'_lang` tl ON t.id_'.$type.' = tl.id_'.$type.' AND tl.id_lang = '.(int)Context::getContext()->language->id : '').' WHERE 1 - '.($active ? 'AND t.active = 1' : '').' + '.($active_only ? 'AND t.active = 1' : '').' '.($type == 'cart_rule' ? 'AND t.id_cart_rule != '.(int)$this->id : '').' ORDER BY name ASC'); } @@ -749,11 +767,11 @@ class CartRuleCore extends ObjectModel else { $resource = Db::getInstance()->query(' - SELECT t.*, tl.*, IF(crt.id_'.$type.' IS NULL, 0, 1) as selected + SELECT t.*'.($i18n ? ', tl.*' : '').', IF(crt.id_'.$type.' IS NULL, 0, 1) as selected FROM `'._DB_PREFIX_.$type.'` t - LEFT JOIN `'._DB_PREFIX_.$type.'_lang` tl ON t.id_'.$type.' = tl.id_'.$type.' AND tl.id_lang = '.(int)Context::getContext()->language->id.' + '.($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.' - '.($active ? 'WHERE t.active = 1' : '').' + '.($active_only ? 'WHERE t.active = 1' : '').' ORDER BY name ASC', false); while ($row = Db::getInstance()->nextRow($resource)) @@ -798,6 +816,7 @@ class CartRuleCore extends ObjectModel $result = Db::getInstance()->executeS(' SELECT cr.* 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 LEFT JOIN '._DB_PREFIX_.'cart_rule_country crco ON cr.id_cart_rule = crco.id_cart_rule WHERE cr.active = 1 @@ -814,6 +833,10 @@ class CartRuleCore extends ObjectModel cr.carrier_restriction = 0 '.($context->cart->id_carrier ? 'OR crca.id_carrier = '.(int)$context->cart->id_carrier : '').' ) + AND ( + cr.shop_restriction = 0 + '.((Shop::isFeatureActive() && $context->shop->id) ? 'OR crs.id_shop = '.(int)$context->shop->id : '').' + ) AND ( cr.group_restriction = 0 '.($context->customer->id ? 'OR 0 < ( diff --git a/controllers/admin/AdminCartRulesController.php b/controllers/admin/AdminCartRulesController.php index 7a71612b5..4d2f1d860 100644 --- a/controllers/admin/AdminCartRulesController.php +++ b/controllers/admin/AdminCartRulesController.php @@ -54,7 +54,7 @@ class AdminCartRulesControllerCore extends AdminController if (Tools::isSubmit('submitAddcart_rule') || Tools::isSubmit('submitAddcart_ruleAndStay')) { // These are checkboxes (which aren't sent through POST when they are not check), so they are forced to 0 - foreach (array('country', 'carrier', 'group', 'cart_rule', 'product') as $type) + foreach (array('country', 'carrier', 'group', 'cart_rule', 'product', 'shop') as $type) if (!Tools::getValue($type.'_restriction')) $_POST[$type.'_restriction'] = 0; @@ -76,7 +76,7 @@ class AdminCartRulesControllerCore extends AdminController { // All the associations are deleted for an update, then recreated when we call the "afterAdd" method $id_cart_rule = Tools::getValue('id_cart_rule'); - foreach (array('country', 'carrier', 'group', 'product_rule_group') as $type) + foreach (array('country', 'carrier', 'group', 'product_rule_group', 'shop') as $type) Db::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.'cart_rule_'.$type.'` WHERE `id_cart_rule` = '.(int)$id_cart_rule); Db::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.'cart_rule_product_rule` WHERE `id_product_rule_group` NOT IN (SELECT `id_product_rule_group` FROM `'._DB_PREFIX_.'cart_rule_product_rule_group`)'); Db::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.'cart_rule_product_rule_value` WHERE `id_product_rule` NOT IN (SELECT `id_product_rule` FROM `'._DB_PREFIX_.'cart_rule_product_rule`)'); @@ -89,7 +89,7 @@ class AdminCartRulesControllerCore extends AdminController protected function afterAdd($currentObject) { // Add restrictions for generic entities like country, carrier and group - foreach (array('country', 'carrier', 'group') as $type) + foreach (array('country', 'carrier', 'group', 'shop') as $type) if (Tools::getValue($type.'_restriction') && is_array($array = Tools::getValue($type.'_select')) && count($array)) { $values = array(); @@ -304,7 +304,7 @@ class AdminCartRulesControllerCore extends AdminController if (Tools::isSubmit('newProductRule')) die ($this->getProductRuleDisplay(Tools::getValue('product_rule_group_id'), Tools::getValue('product_rule_id'), Tools::getValue('product_rule_type'))); if (Tools::isSubmit('newProductRuleGroup') && $product_rule_group_id = Tools::getValue('product_rule_group_id')) - die ($this->getProductRuleGroupDisplay($product_rule_group_id, Tools::getValue('product_rule_group_'.$product_rule_group_id.'_quantity'))); + die ($this->getProductRuleGroupDisplay($product_rule_group_id, Tools::getValue('product_rule_group_'.$product_rule_group_id.'_quantity', 1))); if (Tools::isSubmit('customerFilter')) { @@ -386,10 +386,11 @@ class AdminCartRulesControllerCore extends AdminController 'defaultCurrency' => Configuration::get('PS_CURRENCY_DEFAULT'), 'defaultLanguage' => Configuration::get('PS_LANG_DEFAULT'), 'currencies' => Currency::getCurrencies(), - 'countries' => $current_object->getAssociatedRestrictions('country', 1), - 'carriers' => $current_object->getAssociatedRestrictions('carrier', 1), - 'groups' => $current_object->getAssociatedRestrictions('group', 0), - 'cart_rules' => $current_object->getAssociatedRestrictions('cart_rule', 1), + 'countries' => $current_object->getAssociatedRestrictions('country', true, true), + 'carriers' => $current_object->getAssociatedRestrictions('carrier', true, true), + 'groups' => $current_object->getAssociatedRestrictions('group', false, true), + 'shops' => $current_object->getAssociatedRestrictions('shop', false, false), + 'cart_rules' => $current_object->getAssociatedRestrictions('cart_rule', false, true), 'product_rule_groups' => $product_rule_groups, 'product_rule_groups_counter' => count($product_rule_groups), 'attribute_groups' => AttributeGroup::getAttributesGroups(Context::getContext()->language->id), @@ -413,5 +414,4 @@ class AdminCartRulesControllerCore extends AdminController $found = true; echo Tools::jsonEncode(array('found' => $found, 'vouchers' => $vouchers)); } - } \ No newline at end of file diff --git a/install-dev/data/db_structure.sql b/install-dev/data/db_structure.sql index bff76c332..38eadb684 100644 --- a/install-dev/data/db_structure.sql +++ b/install-dev/data/db_structure.sql @@ -216,6 +216,7 @@ CREATE TABLE `PREFIX_cart_rule` ( `group_restriction` tinyint(1) unsigned NOT NULL default 0, `cart_rule_restriction` tinyint(1) unsigned NOT NULL default 0, `product_restriction` tinyint(1) unsigned NOT NULL default 0, + `shop_restriction` tinyint(1) unsigned NOT NULL default 0, `free_shipping` tinyint(1) NOT NULL default 0, `reduction_percent` decimal(5,2) NOT NULL default 0, `reduction_amount` decimal(17,2) NOT NULL default 0, @@ -287,6 +288,12 @@ CREATE TABLE `PREFIX_cart_cart_rule` ( KEY (`id_cart_rule`) ) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; +CREATE TABLE `PREFIX_cart_rule_shop` ( + `id_cart_rule` int(10) unsigned NOT NULL, + `id_shop` int(10) unsigned NOT NULL, + PRIMARY KEY (`id_cart_rule`, `id_shop`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + CREATE TABLE `PREFIX_cart_product` ( `id_cart` int(10) unsigned NOT NULL, `id_product` int(10) unsigned NOT NULL, diff --git a/install-dev/upgrade/sql/1.5.0.5.sql b/install-dev/upgrade/sql/1.5.0.5.sql index 0b4cf1b2f..ed0da7fba 100644 --- a/install-dev/upgrade/sql/1.5.0.5.sql +++ b/install-dev/upgrade/sql/1.5.0.5.sql @@ -1 +1,9 @@ SET NAMES 'utf8'; + +ALTER TABLE `PREFIX_cart_rule` ADD `shop_restriction` tinyint(1) unsigned NOT NULL default 0 AFTER `product_restriction`; + +CREATE TABLE `PREFIX_cart_rule_shop` ( + `id_cart_rule` int(10) unsigned NOT NULL, + `id_shop` int(10) unsigned NOT NULL, + PRIMARY KEY (`id_cart_rule`, `id_shop`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8;