diff --git a/admin-dev/themes/default/template/controllers/cart_rules/actions.tpl b/admin-dev/themes/default/template/controllers/cart_rules/actions.tpl index b716bd1e1..9b56d434b 100644 --- a/admin-dev/themes/default/template/controllers/cart_rules/actions.tpl +++ b/admin-dev/themes/default/template/controllers/cart_rules/actions.tpl @@ -1,28 +1,3 @@ -{* -* 2007-2011 PrestaShop -* -* NOTICE OF LICENSE -* -* This source file is subject to the Academic Free License (AFL 3.0) -* that is bundled with this package in the file LICENSE.txt. -* It is also available through the world-wide-web at this URL: -* http://opensource.org/licenses/afl-3.0.php -* If you did not receive a copy of the license and are unable to -* obtain it through the world-wide-web, please send an email -* to license@prestashop.com so we can send you a copy immediately. -* -* DISCLAIMER -* -* Do not edit or add to this file if you wish to upgrade PrestaShop to newer -* versions in the future. If you wish to customize PrestaShop for your -* needs please refer to http://www.prestashop.com for more information. -* -* @author PrestaShop SA -* @copyright 2007-2011 PrestaShop SA -* @version Release: $Revision: 8971 $ -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*}
   @@ -40,7 +15,7 @@    getFieldValue($currentObject, 'reduction_amount')|intval}checked="checked"{/if} /> - +    getFieldValue($currentObject, 'reduction_amount')|intval && !$currentTab->getFieldValue($currentObject, 'reduction_percent')|intval}checked="checked"{/if} /> @@ -53,7 +28,7 @@
- +
-
+ \ No newline at end of file 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 5455cf5f6..cfa3cbec2 100644 --- a/admin-dev/themes/default/template/controllers/cart_rules/conditions.tpl +++ b/admin-dev/themes/default/template/controllers/cart_rules/conditions.tpl @@ -1,28 +1,3 @@ -{* -* 2007-2011 PrestaShop -* -* NOTICE OF LICENSE -* -* This source file is subject to the Academic Free License (AFL 3.0) -* that is bundled with this package in the file LICENSE.txt. -* It is also available through the world-wide-web at this URL: -* http://opensource.org/licenses/afl-3.0.php -* If you did not receive a copy of the license and are unable to -* obtain it through the world-wide-web, please send an email -* to license@prestashop.com so we can send you a copy immediately. -* -* DISCLAIMER -* -* Do not edit or add to this file if you wish to upgrade PrestaShop to newer -* versions in the future. If you wish to customize PrestaShop for your -* needs please refer to http://www.prestashop.com for more information. -* -* @author PrestaShop SA -* @copyright 2007-2011 PrestaShop SA -* @version Release: $Revision: 8971 $ -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*}
@@ -58,10 +33,12 @@
+

{l s='The cart rule will be applied to the X first customers only.'}

+

{l s='A customer will only be able to use the cart rule X time(s).'}

{if $countries.unselected|@count + $countries.selected|@count > 1}
@@ -192,22 +169,14 @@
{/if}
- {l s='Product selection'} -
- {l s='Add a filter on'} - - - {l s='Add'} {l s='Add'} - -
- - {foreach from=$product_rules item='product_rule'} - {$product_rule} +{l s='Product selection'} +
+
+ {foreach from=$product_rule_groups item='product_rule_group'} + {$product_rule_group} {/foreach}
-
+ + {l s='Add'} {l s='Add a new rule group'} + + \ 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 new file mode 100644 index 000000000..3dcdf450c --- /dev/null +++ b/admin-dev/themes/default/template/controllers/cart_rules/form.js @@ -0,0 +1,349 @@ +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Open Software License (OSL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/osl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +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}, + function(content) { + if (content != "") + $('#product_rule_group_table').append(content); + } + ); +} + +function removeProductRuleGroup(id) +{ + $('#product_rule_group_' + id + '_tr').remove(); +} + +function addProductRule(product_rule_group_id) +{ + product_rule_counters[product_rule_group_id] += 1; + if ($('#product_rule_type_' + product_rule_group_id).val() != 0) + $.get( + 'ajax-tab.php', + {controller:'AdminCartRules',token:currentToken,newProductRule:1,product_rule_type:$('#product_rule_type_' + product_rule_group_id).val(),product_rule_group_id:product_rule_group_id,product_rule_id:product_rule_counters[product_rule_group_id]}, + function(content) { + if (content != "") + $('#product_rule_table_' + product_rule_group_id).append(content); + } + ); +} + +function removeProductRule(product_rule_group_id, product_rule_id) +{ + $('#product_rule_' + product_rule_group_id + '_' + product_rule_id + '_tr').remove(); +} + +function toggleCartRuleFilter(id) +{ + if ($(id).attr('checked')) + $('#' + $(id).attr('id') + '_div').show(400); + else + $('#' + $(id).attr('id') + '_div').hide(200); +} + +function removeCartRuleOption(item) +{ + var id = $(item).attr('id').replace('_remove', ''); + $('#' + id + '_2 option:selected').remove().appendTo('#' + id + '_1'); +} + +function addCartRuleOption(item) +{ + var id = $(item).attr('id').replace('_add', ''); + $('#' + id + '_1 option:selected').remove().appendTo('#' + id + '_2'); +} + +function updateProductRuleShortDescription(item) +{ + var id1 = $(item).attr('id').replace('_add', '').replace('_remove', ''); + var id2 = id1.replace('_select', ''); + var length = $('#' + id1 + '_2 option').length; + if (length == 1) + $('#' + id2 + '_match').val($('#' + id1 + '_2 option').first().text().trim()); + else + $('#' + id2 + '_match').val(length); +} + +var restrictions = new Array('country', 'carrier', 'group', 'cart_rule'); +for (i in restrictions) +{ + toggleCartRuleFilter($('#' + restrictions[i] + '_restriction')); + $('#' + restrictions[i] + '_restriction').click(function() {toggleCartRuleFilter(this);}); + $('#' + restrictions[i] + '_select_remove').click(function() {removeCartRuleOption(this);}); + $('#' + restrictions[i] + '_select_add').click(function() {addCartRuleOption(this);}); +} +toggleCartRuleFilter($('#product_restriction')); +$('#product_restriction').click(function() {toggleCartRuleFilter(this);}); + +function toggleApplyDiscount(percent, amount, apply_to) +{ + if (percent) + { + $('#apply_discount_percent_div').show(400); + if ($('#apply_discount_to_product').attr('checked')) + toggleApplyDiscountTo(); + $('#apply_discount_to_cheapest').removeAttr('disabled'); + $('#apply_discount_to_cheapest').removeAttr('checked'); + } + else + { + $('#apply_discount_percent_div').hide(200); + $('#reduction_percent').val('0'); + $('#apply_discount_to_cheapest').attr('disabled', 'disabled'); + } + + if (amount) + { + $('#apply_discount_amount_div').show(400); + if ($('#apply_discount_to_product').attr('checked')) + toggleApplyDiscountTo(); + $('#apply_discount_to_cheapest').attr('disabled', 'disabled'); + $('#apply_discount_to_cheapest').removeAttr('checked'); + } + else + { + $('#apply_discount_amount_div').hide(200); + $('#reduction_amount').val('0'); + $('#apply_discount_to_cheapest').removeAttr('disabled'); + } + + if (apply_to) + $('#apply_discount_to_div').show(400); + else + { + toggleApplyDiscountTo(); + $('#apply_discount_to_div').hide(200); + } +} + +function toggleApplyDiscountTo() +{ + if ($('#apply_discount_to_product').attr('checked')) + $('#apply_discount_to_product_div').show(400); + else + { + $('#apply_discount_to_product_div').hide(200); + $('#reductionProductFilter').val(''); + if ($('#apply_discount_to_order').attr('checked')) + $('#reduction_product').val('0'); + if ($('#apply_discount_to_cheapest').attr('checked')) + $('#reduction_product').val('-1'); + if ($('#apply_discount_to_selection').attr('checked')) + $('#reduction_product').val('-2'); + } +} + +function toggleGiftProduct() +{ + if ($('#free_gift_on').attr('checked')) + $('#free_gift_div').show(400); + else + { + $('#gift_product').val('0'); + $('#giftProductFilter').val(''); + $('#free_gift_div').hide(200); + } +} + +$('#apply_discount_percent').click(function() {toggleApplyDiscount(true, false, true);}); +if ($('#apply_discount_percent').attr('checked')) + toggleApplyDiscount(true, false, true); + +$('#apply_discount_amount').click(function() {toggleApplyDiscount(false, true, true);}); +if ($('#apply_discount_amount').attr('checked')) + toggleApplyDiscount(false, true, true); + +$('#apply_discount_off').click(function() {toggleApplyDiscount(false, false, false);}); +if ($('#apply_discount_off').attr('checked')) + toggleApplyDiscount(false, false, false); + +$('#apply_discount_to_order').click(function() {toggleApplyDiscountTo();}); +if ($('#apply_discount_to_order').attr('checked')) + toggleApplyDiscountTo(); + +$('#apply_discount_to_product').click(function() {toggleApplyDiscountTo();}); +if ($('#apply_discount_to_product').attr('checked')) + toggleApplyDiscountTo(); + +$('#apply_discount_to_cheapest').click(function() {toggleApplyDiscountTo();}); +if ($('#apply_discount_to_cheapest').attr('checked')) + toggleApplyDiscountTo(); + +$('#apply_discount_to_selection').click(function() {toggleApplyDiscountTo();}); +if ($('#apply_discount_to_selection').attr('checked')) + toggleApplyDiscountTo(); + +$('#free_gift_on').click(function() {toggleGiftProduct();}); +$('#free_gift_off').click(function() {toggleGiftProduct();}); +toggleGiftProduct(); + +// Main form submit +$('#cart_rule_form').submit(function() { + if ($('#customerFilter').val() == '') + $('#id_customer').val('0'); + + for (i in restrictions) + { + if ($('#' + restrictions[i] + '_select_1 option').length == 0) + $('#' + restrictions[i] + '_restriction').removeAttr('checked'); + else + { + $('#' + restrictions[i] + '_select_2 option').each(function(i) { + $(this).attr('selected', 'selected'); + }); + } + } + + $('.product_rule_toselect option').each(function(i) { + $(this).attr('selected', 'selected'); + }); +}); + +$('#giftProductFilter') + .autocomplete( + 'ajax-tab.php', { + minChars: 2, + max: 50, + width: 500, + selectFirst: false, + scroll: false, + dataType: 'json', + formatItem: function(data, i, max, value, term) { + return value; + }, + parse: function(data) { + var mytab = new Array(); + for (var i = 0; i < data.length; i++) + mytab[mytab.length] = { data: data[i], value: (data[i].reference + ' ' + data[i].name).trim() }; + return mytab; + }, + extraParams: { + controller: 'AdminCartRules', + token: currentToken, + giftProductFilter: 1 + } + } + ) + .result(function(event, data, formatted) { + $('#gift_product').val(data.id_product); + $('#giftProductFilter').val((data.reference + ' ' + data.name).trim()); + }); + +$('#reductionProductFilter') + .autocomplete( + 'ajax-tab.php', { + minChars: 2, + max: 50, + width: 500, + selectFirst: false, + scroll: false, + dataType: 'json', + formatItem: function(data, i, max, value, term) { + return value; + }, + parse: function(data) { + var mytab = new Array(); + for (var i = 0; i < data.length; i++) + mytab[mytab.length] = { data: data[i], value: (data[i].reference + ' ' + data[i].name).trim() }; + return mytab; + }, + extraParams: { + controller: 'AdminCartRules', + token: currentToken, + reductionProductFilter: 1 + } + } + ) + .result(function(event, data, formatted) { + $('#reduction_product').val(data.id_product); + $('#reductionProductFilter').val((data.reference + ' ' + data.name).trim()); + }); + +$('#customerFilter') + .autocomplete( + 'ajax-tab.php', { + minChars: 2, + max: 50, + width: 500, + selectFirst: false, + scroll: false, + dataType: 'json', + formatItem: function(data, i, max, value, term) { + return value; + }, + parse: function(data) { + var mytab = new Array(); + for (var i = 0; i < data.length; i++) + mytab[mytab.length] = { data: data[i], value: data[i].cname + ' (' + data[i].email + ')' }; + return mytab; + }, + extraParams: { + controller: 'AdminCartRules', + token: currentToken, + customerFilter: 1 + } + } + ) + .result(function(event, data, formatted) { + $('#id_customer').val(data.id_customer); + $('#customerFilter').val(data.cname + ' (' + data.email + ')'); + }); + +function displayCartRuleTab(tab) +{ + $('.cart_rule_tab').hide(); + $('.tab-page').removeClass('selected'); + $('#cart_rule_' + tab).show(); + $('#cart_rule_link_' + tab).addClass('selected'); + $('#currentFormTab').val(tab); +} + +$('.cart_rule_tab').hide(); +$('.tab-page').removeClass('selected'); +$('#cart_rule_' + currentFormTab).show(); +$('#cart_rule_link_' + currentFormTab).addClass('selected'); + +var date = new Date(); +var hours = date.getHours(); +if (hours < 10) + hours = "0" + hours; +var mins = date.getMinutes(); +if (mins < 10) + mins = "0" + mins; +var secs = date.getSeconds(); +if (secs < 10) + secs = "0" + secs; +$('.datepicker').datepicker({ + prevText: '', + nextText: '', + dateFormat: 'yy-mm-dd ' + hours + ':' + mins + ':' + secs +}); \ No newline at end of file diff --git a/admin-dev/themes/default/template/controllers/cart_rules/form.tpl b/admin-dev/themes/default/template/controllers/cart_rules/form.tpl index a3c964092..bbf8f2429 100644 --- a/admin-dev/themes/default/template/controllers/cart_rules/form.tpl +++ b/admin-dev/themes/default/template/controllers/cart_rules/form.tpl @@ -1,28 +1,3 @@ -{* -* 2007-2011 PrestaShop -* -* NOTICE OF LICENSE -* -* This source file is subject to the Academic Free License (AFL 3.0) -* that is bundled with this package in the file LICENSE.txt. -* It is also available through the world-wide-web at this URL: -* http://opensource.org/licenses/afl-3.0.php -* If you did not receive a copy of the license and are unable to -* obtain it through the world-wide-web, please send an email -* to license@prestashop.com so we can send you a copy immediately. -* -* DISCLAIMER -* -* Do not edit or add to this file if you wish to upgrade PrestaShop to newer -* versions in the future. If you wish to customize PrestaShop for your -* needs please refer to http://www.prestashop.com for more information. -* -* @author PrestaShop SA -* @copyright 2007-2011 PrestaShop SA -* @version Release: $Revision: 8971 $ -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*} {if $show_toolbar}
@@ -79,10 +54,11 @@
- - + \ No newline at end of file diff --git a/admin-dev/themes/default/template/controllers/cart_rules/informations.tpl b/admin-dev/themes/default/template/controllers/cart_rules/informations.tpl index 13cf2f998..43e47d90e 100644 --- a/admin-dev/themes/default/template/controllers/cart_rules/informations.tpl +++ b/admin-dev/themes/default/template/controllers/cart_rules/informations.tpl @@ -1,28 +1,3 @@ -{* -* 2007-2011 PrestaShop -* -* NOTICE OF LICENSE -* -* This source file is subject to the Academic Free License (AFL 3.0) -* that is bundled with this package in the file LICENSE.txt. -* It is also available through the world-wide-web at this URL: -* http://opensource.org/licenses/afl-3.0.php -* If you did not receive a copy of the license and are unable to -* obtain it through the world-wide-web, please send an email -* to license@prestashop.com so we can send you a copy immediately. -* -* DISCLAIMER -* -* Do not edit or add to this file if you wish to upgrade PrestaShop to newer -* versions in the future. If you wish to customize PrestaShop for your -* needs please refer to http://www.prestashop.com for more information. -* -* @author PrestaShop SA -* @copyright 2007-2011 PrestaShop SA -* @version Release: $Revision: 8971 $ -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*} -
@@ -31,7 +6,7 @@
{foreach from=$languages item=language}
- +
{/foreach}
@@ -40,8 +15,8 @@
- -

{l s='Optional, the rule will automatically be applied if you leave this field blank.'}

+ {l s='(Click to generate random code)'} +

{l s='Caution! The rule will automatically be applied if you leave this field blank.'}

@@ -79,4 +54,4 @@
+ \ No newline at end of file diff --git a/admin-dev/themes/default/template/controllers/cart_rules/product_rule.tpl b/admin-dev/themes/default/template/controllers/cart_rules/product_rule.tpl index 56f9c981e..e00f5f9c3 100644 --- a/admin-dev/themes/default/template/controllers/cart_rules/product_rule.tpl +++ b/admin-dev/themes/default/template/controllers/cart_rules/product_rule.tpl @@ -1,54 +1,26 @@ -{* -* 2007-2011 PrestaShop -* -* NOTICE OF LICENSE -* -* This source file is subject to the Academic Free License (AFL 3.0) -* that is bundled with this package in the file LICENSE.txt. -* It is also available through the world-wide-web at this URL: -* http://opensource.org/licenses/afl-3.0.php -* If you did not receive a copy of the license and are unable to -* obtain it through the world-wide-web, please send an email -* to license@prestashop.com so we can send you a copy immediately. -* -* DISCLAIMER -* -* Do not edit or add to this file if you wish to upgrade PrestaShop to newer -* versions in the future. If you wish to customize PrestaShop for your -* needs please refer to http://www.prestashop.com for more information. -* -* @author PrestaShop SA -* @copyright 2007-2011 PrestaShop SA -* @version Release: $Revision: 8971 $ -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*} - + - + {l s='Remove'} - - - [{$product_rule_type}] {l s='The cart must contain at least'} - - - + + + [{$product_rule_type}] - {l s='product(s) matching'} + {l s='The product(s) are matching on of these'} - + - + {l s='Choose'} {l s='Choose'}
-
+
{$product_rule_choose_content}
@@ -56,6 +28,7 @@ + $('#product_rule_{$product_rule_group_id}_{$product_rule_id}_choose_content').parent().hide(); + $("#product_rule_{$product_rule_group_id}_{$product_rule_id}_choose_link").fancybox(); + $(document).ready(function() { updateProductRuleShortDescription($('#product_rule_select_{$product_rule_group_id}_{$product_rule_id}_add')); }); + \ No newline at end of file diff --git a/admin-dev/themes/default/template/controllers/cart_rules/product_rule_group.tpl b/admin-dev/themes/default/template/controllers/cart_rules/product_rule_group.tpl new file mode 100644 index 000000000..29f4c35d1 --- /dev/null +++ b/admin-dev/themes/default/template/controllers/cart_rules/product_rule_group.tpl @@ -0,0 +1,36 @@ + + + + {l s='Remove'} + + + + + {l s='The cart must contain at least'} + + {l s='product(s) matching the following rules:'} +
+ + {l s='Add'} + {l s='Add a rule concerning'} + + + + + + + {if isset($product_rules) && $product_rules|@count} + {foreach from=$product_rules item='product_rule'} + {$product_rule} + {/foreach} + {/if} +
+ + \ No newline at end of file diff --git a/admin-dev/themes/default/template/controllers/cart_rules/product_rule_itemlist.tpl b/admin-dev/themes/default/template/controllers/cart_rules/product_rule_itemlist.tpl index 9d4aa1722..5f2825158 100644 --- a/admin-dev/themes/default/template/controllers/cart_rules/product_rule_itemlist.tpl +++ b/admin-dev/themes/default/template/controllers/cart_rules/product_rule_itemlist.tpl @@ -1,49 +1,24 @@ -{* -* 2007-2011 PrestaShop -* -* NOTICE OF LICENSE -* -* This source file is subject to the Academic Free License (AFL 3.0) -* that is bundled with this package in the file LICENSE.txt. -* It is also available through the world-wide-web at this URL: -* http://opensource.org/licenses/afl-3.0.php -* If you did not receive a copy of the license and are unable to -* obtain it through the world-wide-web, please send an email -* to license@prestashop.com so we can send you a copy immediately. -* -* DISCLAIMER -* -* Do not edit or add to this file if you wish to upgrade PrestaShop to newer -* versions in the future. If you wish to customize PrestaShop for your -* needs please refer to http://www.prestashop.com for more information. -* -* @author PrestaShop SA -* @copyright 2007-2011 PrestaShop SA -* @version Release: $Revision: 8971 $ -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*} @@ -51,7 +26,7 @@

{l s='Selected'}

- {foreach from=$product_rule_itemlist.selected item='item'} {/foreach}

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

{l s='Unselected'}

- {foreach from=$product_rule_itemlist.unselected item='item'} {/foreach}

- + << {l s='Add'}
+ $('#product_rule_select_{$product_rule_group_id}_{$product_rule_id}_remove').click(function() { removeCartRuleOption(this); updateProductRuleShortDescription(this); }); + $('#product_rule_select_{$product_rule_group_id}_{$product_rule_id}_add').click(function() { addCartRuleOption(this); updateProductRuleShortDescription(this); }); + $(document).ready(function() { updateProductRuleShortDescription($('#product_rule_select_{$product_rule_group_id}_{$product_rule_id}_add')); }); + \ No newline at end of file diff --git a/classes/CartRule.php b/classes/CartRule.php index e7019687a..c65968823 100644 --- a/classes/CartRule.php +++ b/classes/CartRule.php @@ -118,7 +118,8 @@ class CartRuleCore extends ObjectModel Db::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.'cart_rule_group` WHERE `id_cart_rule` = '.(int)$this->id); Db::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.'cart_rule_country` WHERE `id_cart_rule` = '.(int)$this->id); 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); - Db::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.'cart_rule_product_rule` WHERE `id_cart_rule` = '.(int)$this->id); + Db::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.'cart_rule_product_rule_group` WHERE `id_cart_rule` = '.(int)$this->id); + 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`)'); } @@ -214,7 +215,26 @@ class CartRuleCore extends ObjectModel return $return; } - public function getProductRules() + public function getProductRuleGroups() + { + if (!Validate::isLoadedObject($this) || $this->product_restriction == 0) + return array(); + + $productRuleGroups = array(); + $results = Db::getInstance()->ExecuteS(' + SELECT * + FROM '._DB_PREFIX_.'cart_rule_product_rule_group prg + WHERE prg.id_cart_rule = '.(int)$this->id, false); + foreach ($results as $row) + { + if (!isset($productRuleGroups[$row['id_product_rule_group']])) + $productRuleGroups[$row['id_product_rule_group']] = array('id_product_rule_group' => $row['id_product_rule_group'], 'quantity' => $row['quantity']); + $productRuleGroups[$row['id_product_rule_group']]['product_rules'] = $this->getProductRules($row['id_product_rule_group']); + } + return $productRuleGroups; + } + + public function getProductRules($id_product_rule_group) { if (!Validate::isLoadedObject($this) || $this->product_restriction == 0) return array(); @@ -224,11 +244,11 @@ class CartRuleCore extends ObjectModel SELECT * FROM '._DB_PREFIX_.'cart_rule_product_rule pr LEFT JOIN '._DB_PREFIX_.'cart_rule_product_rule_value prv ON pr.id_product_rule = prv.id_product_rule - WHERE pr.id_cart_rule = '.(int)$this->id, false); + WHERE pr.id_product_rule_group = '.(int)$id_product_rule_group); foreach ($results as $row) { if (!isset($productRules[$row['id_product_rule']])) - $productRules[$row['id_product_rule']] = array('quantity' => $row['quantity'], 'type' => $row['type'], 'values' => array()); + $productRules[$row['id_product_rule']] = array('type' => $row['type'], 'values' => array()); $productRules[$row['id_product_rule']]['values'][] = $row['id_item']; } return $productRules; @@ -328,50 +348,117 @@ class CartRuleCore extends ObjectModel // Check if the products chosen by the customer are usable with the cart rule if ($this->product_restriction) { - $productRules = $this->getProductRules(); - foreach ($productRules as $productRule) + $productRuleGroups = $this->getProductRuleGroups(); + foreach ($productRuleGroups as $id_product_rule_group => $productRuleGroup) { - switch ($productRule['type']) + $productRules = $this->getProductRules($id_product_rule_group); + foreach ($productRules as $productRule) { - case 'attributes': - $cartAttributes = Db::getInstance()->ExecuteS(' - SELECT cp.quantity, pac.`id_attribute` - FROM `'._DB_PREFIX_.'cart_product` cp - LEFT JOIN `'._DB_PREFIX_.'product_attribute_combination` pac ON cp.id_product_attribute = pac.id_product_attribute - WHERE cp.`id_cart` = '.(int)$context->cart->id.' - AND cp.id_product_attribute > 0'); - $matchingProducts = 0; - foreach ($cartAttributes as $cartAttribute) - if (in_array($cartAttribute['id_attribute'], $productRule['values'])) - $matchingProducts += $cartAttribute['quantity']; - if ($matchingProducts < $productRule['quantity']) - return Tools::displayError('You cannot use this voucher with these products'); - break; - case 'products': - $cartProducts = Db::getInstance()->ExecuteS(' - SELECT cp.quantity, cp.`id_product` - FROM `'._DB_PREFIX_.'cart_product` cp - WHERE cp.`id_cart` = '.(int)$context->cart->id); - $matchingProducts = 0; - foreach ($cartProducts as $cartProduct) - if (in_array($cartProduct['id_product'], $productRule['values'])) - $matchingProducts += $cartProduct['quantity']; - if ($matchingProducts < $productRule['quantity']) - return Tools::displayError('You cannot use this voucher with these products'); - break; - case 'categories': - $cartCategories = Db::getInstance()->ExecuteS(' - SELECT cp.quantity, catp.`id_category` - FROM `'._DB_PREFIX_.'cart_product` cp - LEFT JOIN `'._DB_PREFIX_.'category_product` catp ON cp.id_product = catp.id_product - WHERE cp.`id_cart` = '.(int)$context->cart->id); - $matchingProducts = 0; - foreach ($cartCategories as $cartCategory) - if (in_array($cartCategory['id_category'], $productRule['values'])) - $matchingProducts += $cartCategory['quantity']; - if ($matchingProducts < $productRule['quantity']) - return Tools::displayError('You cannot use this voucher with these products'); - break; + $eligibleProductsList = array(); + foreach ($context->cart->getProducts() as $product) + $eligibleProductsList[] = (int)$product['id_product']; + + switch ($productRule['type']) + { + case 'attributes': + $cartAttributes = Db::getInstance()->ExecuteS(' + SELECT cp.quantity, cp.`id_product`, pac.`id_attribute` + FROM `'._DB_PREFIX_.'cart_product` cp + LEFT JOIN `'._DB_PREFIX_.'product_attribute_combination` pac ON cp.id_product_attribute = pac.id_product_attribute + WHERE cp.`id_cart` = '.(int)$context->cart->id.' + AND cp.`id_product` IN ('.implode($eligibleProductsList, ',').') + AND cp.id_product_attribute > 0'); + $countMatchingProducts = 0; + $matchingProductsList = array(); + foreach ($cartAttributes as $cartAttribute) + if (in_array($cartAttribute['id_attribute'], $productRule['values'])) + { + $countMatchingProducts += $cartAttribute['quantity']; + $matchingProductsList[] = $cartAttribute['id_product']; + } + if ($countMatchingProducts < $productRuleGroup['quantity']) + return Tools::displayError('You cannot use this voucher with these products'); + $eligibleProductsList = array_intersect($eligibleProductsList, $matchingProductsList); + break; + case 'products': + $cartProducts = Db::getInstance()->ExecuteS(' + SELECT cp.quantity, cp.`id_product` + FROM `'._DB_PREFIX_.'cart_product` cp + WHERE cp.`id_cart` = '.(int)$context->cart->id.' + AND cp.`id_product` IN ('.implode($eligibleProductsList, ',').')'); + $countMatchingProducts = 0; + $matchingProductsList = array(); + foreach ($cartProducts as $cartProduct) + if (in_array($cartProduct['id_product'], $productRule['values'])) + { + $countMatchingProducts += $cartProduct['quantity']; + $matchingProductsList[] = $cartProduct['id_product']; + } + if ($countMatchingProducts < $productRuleGroup['quantity']) + return Tools::displayError('You cannot use this voucher with these products'); + $eligibleProductsList = array_intersect($eligibleProductsList, $matchingProductsList); + break; + case 'categories': + $cartCategories = Db::getInstance()->ExecuteS(' + SELECT cp.quantity, cp.`id_product`, catp.`id_category` + FROM `'._DB_PREFIX_.'cart_product` cp + LEFT JOIN `'._DB_PREFIX_.'category_product` catp ON cp.id_product = catp.id_product + WHERE cp.`id_cart` = '.(int)$context->cart->id.' + AND cp.`id_product` IN ('.implode($eligibleProductsList, ',').')'); + $countMatchingProducts = 0; + $matchingProductsList = array(); + foreach ($cartCategories as $cartCategory) + if (in_array($cartCategory['id_category'], $productRule['values'])) + { + $countMatchingProducts += $cartCategory['quantity']; + $matchingProductsList[] = $cartCategory['id_product']; + } + if ($countMatchingProducts < $productRuleGroup['quantity']) + return Tools::displayError('You cannot use this voucher with these products'); + $eligibleProductsList = array_intersect($eligibleProductsList, $matchingProductsList); + break; + case 'manufacturers': + $cartManufacturers = Db::getInstance()->ExecuteS(' + SELECT cp.quantity, cp.`id_product`, p.`id_manufacturer` + FROM `'._DB_PREFIX_.'cart_product` cp + LEFT JOIN `'._DB_PREFIX_.'product` p ON cp.id_product = p.id_product + WHERE cp.`id_cart` = '.(int)$context->cart->id.' + AND cp.`id_product` IN ('.implode($eligibleProductsList, ',').')'); + $countMatchingProducts = 0; + $matchingProductsList = array(); + foreach ($cartManufacturers as $cartManufacturer) + if (in_array($cartManufacturer['id_manufacturer'], $productRule['values'])) + { + $countMatchingProducts += $cartManufacturer['quantity']; + $matchingProductsList[] = $cartManufacturer['id_product']; + } + if ($countMatchingProducts < $productRuleGroup['quantity']) + return Tools::displayError('You cannot use this voucher with these products'); + $eligibleProductsList = array_intersect($eligibleProductsList, $matchingProductsList); + break; + case 'suppliers': + $cartSuppliers = Db::getInstance()->ExecuteS(' + SELECT cp.quantity, cp.`id_product`, p.`id_supplier` + FROM `'._DB_PREFIX_.'cart_product` cp + LEFT JOIN `'._DB_PREFIX_.'product` p ON cp.id_product = p.id_product + WHERE cp.`id_cart` = '.(int)$context->cart->id.' + AND cp.`id_product` IN ('.implode($eligibleProductsList, ',').')'); + $countMatchingProducts = 0; + $matchingProductsList = array(); + foreach ($cartSuppliers as $cartSupplier) + if (in_array($cartSupplier['id_supplier'], $productRule['values'])) + { + $countMatchingProducts += $cartSupplier['quantity']; + $matchingProductsList[] = $cartSupplier['id_product']; + } + if ($countMatchingProducts < $productRuleGroup['quantity']) + return Tools::displayError('You cannot use this voucher with these products'); + $eligibleProductsList = array_intersect($eligibleProductsList, $matchingProductsList); + break; + } + + if (!count($eligibleProductsList)) + return Tools::displayError('You cannot use this voucher with these products'); } } } @@ -461,11 +548,11 @@ class CartRuleCore extends ObjectModel $price = ($useTax ? $product['price_wt'] : $product['price']); if ($price > 0 && ($minPrice === false || $minPrice > $price)) $minPrice = $price; - $reductionValue += $minPrice * $this->reduction_percent / 100; } + $reductionValue += $minPrice * $this->reduction_percent / 100; } - // Discount (�) + // Discount (¤) if ($this->reduction_amount) { $reduction_amount = $this->reduction_amount; diff --git a/classes/PaymentModule.php b/classes/PaymentModule.php index 50bac6d47..59ae27978 100644 --- a/classes/PaymentModule.php +++ b/classes/PaymentModule.php @@ -330,7 +330,7 @@ abstract class PaymentModuleCore extends Module if ($id_order_state != Configuration::get('PS_OS_ERROR') && $id_order_state != Configuration::get('PS_OS_CANCELED')) { - // Create a new instance of Cart Rule without id_lang, in order to update it quantity + // Create a new instance of Cart Rule without id_lang, in order to update its quantity $cart_rule_to_update = new CartRule($cart_rule_obj->id); $cart_rule_to_update->quantity = $cart_rule_to_update->quantity - 1; $cart_rule_to_update->update(); diff --git a/classes/order/OrderCartRule.php b/classes/order/OrderCartRule.php index b1e1216c3..188d39b69 100644 --- a/classes/order/OrderCartRule.php +++ b/classes/order/OrderCartRule.php @@ -56,6 +56,7 @@ class OrderCartRuleCore extends ObjectModel 'primary' => 'id_order_cart_rule', 'fields' => array( 'id_order' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId', 'required' => true), + 'id_cart_rule' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId', 'required' => true), 'id_order_invoice' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId'), 'name' => array('type' => self::TYPE_STRING, 'validate' => 'isGenericName', 'required' => true), 'value' => array('type' => self::TYPE_FLOAT, 'validate' => 'isFloat', 'required' => true), diff --git a/controllers/admin/AdminCartRulesController.php b/controllers/admin/AdminCartRulesController.php index b8f16eab8..273eb8421 100644 --- a/controllers/admin/AdminCartRulesController.php +++ b/controllers/admin/AdminCartRulesController.php @@ -76,8 +76,9 @@ 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') as $type) + foreach (array('country', 'carrier', 'group', 'product_rule_group') 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`)'); Db::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.'cart_rule_combination` WHERE `id_cart_rule_1` = '.(int)$id_cart_rule.' OR `id_cart_rule_2` = '.(int)$id_cart_rule); @@ -105,18 +106,26 @@ class AdminCartRulesControllerCore extends AdminController Db::getInstance()->Execute('INSERT INTO `'._DB_PREFIX_.'cart_rule_combination` (`id_cart_rule_1`, `id_cart_rule_2`) VALUES '.implode(',', $values)); } // Add product rule restrictions - if (Tools::getValue('product_restriction') && is_array($array = Tools::getValue('product_rule')) && count($array)) + if (Tools::getValue('product_restriction') && is_array($ruleGroupArray = Tools::getValue('product_rule_group')) && count($ruleGroupArray)) { - foreach ($array as $id) + foreach ($ruleGroupArray as $ruleGroupId) { - Db::getInstance()->Execute('INSERT INTO `'._DB_PREFIX_.'cart_rule_product_rule` (`id_cart_rule`, `quantity`, `type`) - VALUES ('.(int)$currentObject->id.', '.(int)Tools::getValue('product_rule_'.$id.'_quantity').', "'.pSQL(Tools::getValue('product_rule_'.$id.'_type')).'")'); - $id_product_rule = Db::getInstance()->Insert_ID(); - - $values = array(); - foreach (Tools::getValue('product_rule_select_'.$id) as $id) - $values[] = '('.(int)$id_product_rule.','.(int)$id.')'; - Db::getInstance()->Execute('INSERT INTO `'._DB_PREFIX_.'cart_rule_product_rule_value` (`id_product_rule`, `id_item`) VALUES '.implode(',', $values)); + Db::getInstance()->Execute('INSERT INTO `'._DB_PREFIX_.'cart_rule_product_rule_group` (`id_cart_rule`, `quantity`) + VALUES ('.(int)$currentObject->id.', '.(int)Tools::getValue('product_rule_group_'.$ruleGroupId.'_quantity').')'); + $id_product_rule_group = Db::getInstance()->Insert_ID(); + + if (is_array($ruleArray = Tools::getValue('product_rule_'.$ruleGroupId)) && count($ruleArray)) + foreach ($ruleArray as $ruleId) + { + Db::getInstance()->Execute('INSERT INTO `'._DB_PREFIX_.'cart_rule_product_rule` (`id_product_rule_group`, `type`) + VALUES ('.(int)$id_product_rule_group.', "'.pSQL(Tools::getValue('product_rule_'.$ruleGroupId.'_'.$ruleId.'_type')).'")'); + $id_product_rule = Db::getInstance()->Insert_ID(); + + $values = array(); + foreach (Tools::getValue('product_rule_select_'.$ruleGroupId.'_'.$ruleId) as $id) + $values[] = '('.(int)$id_product_rule.','.(int)$id.')'; + Db::getInstance()->Execute('INSERT INTO `'._DB_PREFIX_.'cart_rule_product_rule_value` (`id_product_rule`, `id_item`) VALUES '.implode(',', $values)); + } } } @@ -152,13 +161,67 @@ class AdminCartRulesControllerCore extends AdminController } } - public function getProductRuleDisplay($product_rule_id, $product_rule_type, $product_rule_quantity = 1, $selected = array()) + /* Retrieve the cart rule product rule groups in the POST data if available, and in the database if there is none */ + public function getProductRuleGroupsDisplay($cartRule) + { + $productRuleGroupsArray = array(); + if (Tools::getValue('product_restriction') && is_array($array = Tools::getValue('product_rule_group')) && count($array)) + { + $i = 1; + foreach ($array as $ruleGroupId) + { + $productRulesArray = array(); + if (is_array($array = Tools::getValue('product_rule_'.$ruleGroupId)) && count($array)) + { + foreach ($array as $ruleId) + { + $productRulesArray[] = $this->getProductRuleDisplay( + $ruleGroupId, + $ruleId, + Tools::getValue('product_rule_'.$ruleGroupId.'_'.$ruleId.'_type'), + Tools::getValue('product_rule_select_'.$ruleGroupId.'_'.$ruleId) + ); + } + } + + $productRuleGroupsArray[] = $this->getProductRuleGroupDisplay( + $i++, + (int)Tools::getValue('product_rule_group_'.$ruleGroupId.'_quantity'), + $productRulesArray + ); + } + } + else + { + $i = 1; + foreach ($cartRule->getProductRuleGroups() as $productRuleGroup) + { + $j = 1; + $productRulesDisplay = array(); + foreach ($productRuleGroup['product_rules'] as $id_product_rule => $productRule) + $productRulesDisplay[] = $this->getProductRuleDisplay($i, $j++, $productRule['type'], $productRule['values']); + $productRuleGroupsArray[] = $this->getProductRuleGroupDisplay($i++, $productRuleGroup['quantity'], $productRulesDisplay); + } + } + return $productRuleGroupsArray; + } + + /* Return the form for a single cart rule group either with or without product_rules set up */ + public function getProductRuleGroupDisplay($product_rule_group_id, $product_rule_group_quantity = 1, $product_rules = null) + { + Context::getContext()->smarty->assign('product_rule_group_id', $product_rule_group_id); + Context::getContext()->smarty->assign('product_rule_group_quantity', $product_rule_group_quantity); + Context::getContext()->smarty->assign('product_rules', $product_rules); + return Context::getContext()->smarty->fetch('controllers/cart_rules/product_rule_group.tpl'); + } + + public function getProductRuleDisplay($product_rule_group_id, $product_rule_id, $product_rule_type, $selected = array()) { Context::getContext()->smarty->assign( array( + 'product_rule_group_id' => (int)$product_rule_group_id, 'product_rule_id' => (int)$product_rule_id, 'product_rule_type' => $product_rule_type, - 'product_rule_quantity' => (int)$product_rule_quantity ) ); @@ -193,6 +256,30 @@ class AdminCartRulesControllerCore extends AdminController $choose_content = $this->createTemplate('product_rule_itemlist.tpl')->fetch(); Context::getContext()->smarty->assign('product_rule_choose_content', $choose_content); break; + case 'manufacturers': + $products = array('selected' => array(), 'unselected' => array()); + $results = Db::getInstance()->ExecuteS(' + SELECT name, id_manufacturer as id + FROM '._DB_PREFIX_.'manufacturer + ORDER BY name'); + foreach ($results as $row) + $products[in_array($row['id'], $selected) ? 'selected' : 'unselected'][] = $row; + Context::getContext()->smarty->assign('product_rule_itemlist', $products); + $choose_content = Context::getContext()->smarty->fetch('cart_rules/product_rule_itemlist.tpl'); + Context::getContext()->smarty->assign('product_rule_choose_content', $choose_content); + break; + case 'suppliers': + $products = array('selected' => array(), 'unselected' => array()); + $results = Db::getInstance()->ExecuteS(' + SELECT name, id_supplier as id + FROM '._DB_PREFIX_.'supplier + ORDER BY name'); + foreach ($results as $row) + $products[in_array($row['id'], $selected) ? 'selected' : 'unselected'][] = $row; + Context::getContext()->smarty->assign('product_rule_itemlist', $products); + $choose_content = Context::getContext()->smarty->fetch('cart_rules/product_rule_itemlist.tpl'); + Context::getContext()->smarty->assign('product_rule_choose_content', $choose_content); + break; case 'categories': // Todo: Consider optimization $categories = array('selected' => array(), 'unselected' => array()); @@ -207,8 +294,6 @@ class AdminCartRulesControllerCore extends AdminController $choose_content = $this->createTemplate('product_rule_itemlist.tpl')->fetch(); Context::getContext()->smarty->assign('product_rule_choose_content', $choose_content); break; - default: - die; } return $this->createTemplate('product_rule.tpl')->fetch(); @@ -217,7 +302,9 @@ class AdminCartRulesControllerCore extends AdminController public function ajaxProcess() { if (Tools::isSubmit('newProductRule')) - die ($this->getProductRuleDisplay(Tools::getValue('product_rule_id'), Tools::getValue('product_rule_type'))); + 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'))); if (Tools::isSubmit('customerFilter')) { @@ -244,30 +331,6 @@ class AdminCartRulesControllerCore extends AdminController } } - public function getProductRulesDisplay($cartRule) - { - $i = 1; - $productRulesArray = array(); - if (Tools::getValue('product_restriction') && is_array($array = Tools::getValue('product_rule')) && count($array)) - { - foreach ($array as $id) - { - $productRulesArray[] = $this->getProductRuleDisplay( - $i++, - Tools::getValue('product_rule_'.$id.'_type'), - (int)Tools::getValue('product_rule_'.$id.'_quantity'), - Tools::getValue('product_rule_select_'.$id) - ); - } - } - else - { - foreach ($cartRule->getProductRules() as $productRule) - $productRulesArray[] = $this->getProductRuleDisplay($i++, $productRule['type'], $productRule['quantity'], $productRule['values']); - } - return $productRulesArray; - } - public function renderForm() { $back = Tools::safeOutput(Tools::getValue('back', '')); @@ -306,7 +369,7 @@ class AdminCartRulesControllerCore extends AdminController Validate::isLoadedObject($product)) $reduction_product_filter = trim($product->reference.' '.$product->name); - $product_rules = $this->getProductRulesDisplay($current_object); + $product_rule_groups = $this->getProductRuleGroupsDisplay($current_object); Context::getContext()->smarty->assign( array( @@ -316,7 +379,7 @@ class AdminCartRulesControllerCore extends AdminController 'title' => $this->l('Payment : Cart Rules '), 'languages' => Language::getLanguages(), 'defaultDateFrom' => date('Y-m-d H:00:00'), - 'defaultDateTo' => date('Y-m-d H:00:00', strtotime('+1 year')), + 'defaultDateTo' => date('Y-m-d H:00:00', strtotime('+1 month')), 'customerFilter' => $customer_filter, 'giftProductFilter' => $gift_product_filter, 'reductionProductFilter' => $reduction_product_filter, @@ -327,8 +390,8 @@ class AdminCartRulesControllerCore extends AdminController 'carriers' => $current_object->getAssociatedRestrictions('carrier', 1), 'groups' => $current_object->getAssociatedRestrictions('group', 0), 'cart_rules' => $current_object->getAssociatedRestrictions('cart_rule', 1), - 'product_rules' => $product_rules, - 'product_rules_counter' => count($product_rules), + 'product_rule_groups' => $product_rule_groups, + 'product_rule_groups_counter' => count($product_rule_groups), 'attribute_groups' => AttributeGroup::getAttributesGroups(Context::getContext()->language->id), 'currentIndex' => self::$currentIndex, 'currentToken' => $this->token, diff --git a/install-new/data/db_structure.sql b/install-new/data/db_structure.sql index 26ff7d71d..e46b34f64 100644 --- a/install-new/data/db_structure.sql +++ b/install-new/data/db_structure.sql @@ -259,11 +259,29 @@ CREATE TABLE `PREFIX_cart_rule_combination` ( PRIMARY KEY (`id_cart_rule_1`, `id_cart_rule_2`) ); -CREATE TABLE `PREFIX_cart_rule_product_rule` ( - `id_product_rule` int(10) unsigned NOT NULL auto_increment, +CREATE TABLE `PREFIX_cart_rule_manufacturer` ( + `id_cart_rule` int(10) unsigned NOT NULL, + `id_manufacturer` int(10) unsigned NOT NULL, + PRIMARY KEY (`id_cart_rule`, `id_manufacturer`) +); + +CREATE TABLE `PREFIX_cart_rule_supplier` ( + `id_cart_rule` int(10) unsigned NOT NULL, + `id_supplier` int(10) unsigned NOT NULL, + PRIMARY KEY (`id_cart_rule`, `id_supplier`) +); + +CREATE TABLE `PREFIX_cart_rule_product_rule_group` ( + `id_product_rule_group` int(10) unsigned NOT NULL auto_increment, `id_cart_rule` int(10) unsigned NOT NULL, `quantity` int(10) unsigned NOT NULL default 1, - `type` ENUM('products', 'categories', 'attributes') NOT NULL, + PRIMARY KEY (`id_product_rule_group`) +); + +CREATE TABLE `PREFIX_cart_rule_product_rule` ( + `id_product_rule` int(10) unsigned NOT NULL auto_increment, + `id_product_rule_group` int(10) unsigned NOT NULL, + `type` ENUM('products', 'categories', 'attributes', 'manufacturers', 'suppliers') NOT NULL, PRIMARY KEY (`id_product_rule`) ); diff --git a/install-new/upgrade/sql/1.5.0.4.sql b/install-new/upgrade/sql/1.5.0.4.sql index ec11cab56..ea52dd569 100644 --- a/install-new/upgrade/sql/1.5.0.4.sql +++ b/install-new/upgrade/sql/1.5.0.4.sql @@ -29,4 +29,31 @@ CREATE TABLE `PREFIX_category_shop` ( /* PHP:generate_root_category_for_multishop(); */; -/* PHP:update_mailalerts_add_column_idshop(); */; \ No newline at end of file +/* PHP:update_mailalerts_add_column_idshop(); */; + + +CREATE TABLE `PREFIX_cart_rule_manufacturer` ( + `id_cart_rule` int(10) unsigned NOT NULL, + `id_manufacturer` int(10) unsigned NOT NULL, + PRIMARY KEY (`id_cart_rule`, `id_manufacturer`) +); + +CREATE TABLE `PREFIX_cart_rule_supplier` ( + `id_cart_rule` int(10) unsigned NOT NULL, + `id_supplier` int(10) unsigned NOT NULL, + PRIMARY KEY (`id_cart_rule`, `id_supplier`) +); + +CREATE TABLE `PREFIX_cart_rule_product_rule_group` ( + `id_product_rule_group` int(10) unsigned NOT NULL auto_increment, + `id_cart_rule` int(10) unsigned NOT NULL, + `quantity` int(10) unsigned NOT NULL default 1, + PRIMARY KEY (`id_product_rule_group`) +); + +INSERT INTO `PREFIX_cart_rule_product_rule_group` (`id_product_rule_group`, `id_cart_rule`, `quantity`) ( + SELECT `id_cart_rule`, `id_cart_rule`, `quantity` FROM `PREFIX_cart_rule_product_rule` +); + +ALTER TABLE `PREFIX_cart_rule_product_rule` CHANGE `id_cart_rule` `id_product_rule_group` int(10) unsigned NOT NULL; +ALTER TABLE `PREFIX_cart_rule_product_rule` CHANGE `type` ENUM('products', 'categories', 'attributes', 'manufacturers', 'suppliers') NOT NULL;