diff --git a/classes/CartRule.php b/classes/CartRule.php index e2ff28bb3..002b7a820 100644 --- a/classes/CartRule.php +++ b/classes/CartRule.php @@ -159,6 +159,27 @@ class CartRuleCore extends ObjectModel 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`)'); } + public static function copyConditions($id_cart_rule_source, $id_cart_rule_destination) + { + 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.')'); + Db::getInstance()->Execute(' + INSERT INTO `'._DB_PREFIX_.'cart_rule_group` (`id_cart_rule`, `id_group`) + (SELECT '.(int)$id_cart_rule_destination.', id_group FROM `'._DB_PREFIX_.'cart_rule_group` WHERE `id_cart_rule` = '.(int)$id_cart_rule_source.')'); + Db::getInstance()->Execute(' + INSERT INTO `'._DB_PREFIX_.'cart_rule_country` (`id_cart_rule`, `id_country`) + (SELECT '.(int)$id_cart_rule_destination.', id_country FROM `'._DB_PREFIX_.'cart_rule_country` WHERE `id_cart_rule` = '.(int)$id_cart_rule_source.')'); + Db::getInstance()->Execute(' + INSERT INTO `'._DB_PREFIX_.'cart_rule_cart_rule` (`id_cart_rule_1`, `id_cart_rule_2`) + (SELECT '.(int)$id_cart_rule_destination.', IF(id_cart_rule_1 != '.(int)$id_cart_rule_source.', id_cart_rule_1, id_cart_rule_2) FROM `'._DB_PREFIX_.'cart_rule_cart_rule` + WHERE `id_cart_rule_1` = '.(int)$id_cart_rule_source.' OR `id_cart_rule_2` = '.(int)$id_cart_rule_source.')'); + + // Todo : should be changed soon, be must be copied too + // 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_value` WHERE `id_product_rule` NOT IN (SELECT `id_product_rule` FROM `'._DB_PREFIX_.'cart_rule_product_rule`)'); + } + public static function getIdByCode($code) { if (!Validate::isDiscountName($code)) diff --git a/classes/PaymentModule.php b/classes/PaymentModule.php index f03bd056e..c32efd325 100644 --- a/classes/PaymentModule.php +++ b/classes/PaymentModule.php @@ -300,29 +300,29 @@ abstract class PaymentModuleCore extends Module $result = $cart->getCartRules(); $cartRules = ObjectModel::hydrateCollection('CartRule', $result, (int)$order->id_lang); // @todo How to menage cart rules, with multiple shipping? - foreach ($cartRules AS $cartRule) + foreach ($cartRules as $cartRule) { $value = $cartRule->getContextualValue(true); - // Todo: repair shrunk - // if ($shrunk AND ($total_discount_value + $value) > ($order->total_products_wt + $order->total_shipping + $order->total_wrapping)) - // { - // $amount_to_add = ($order->total_products_wt + $order->total_shipping + $order->total_wrapping) - $total_discount_value; - // if ($cartRule->id_discount_type == Discount::AMOUNT AND $cartRule->behavior_not_exhausted == 2) - // { - // $voucher = new Discount(); - // foreach ($cartRule AS $key => $discountValue) - // $voucher->$key = $discountValue; - // $voucher->name = 'VSRK'.(int)$order->id_customer.'O'.(int)$order->id; - // $voucher->value = (float)$value - $amount_to_add; - // $voucher->add(); - // $params['{voucher_amount}'] = Tools::displayPrice($voucher->value, $currency, false); - // $params['{voucher_num}'] = $voucher->name; - // $params['{firstname}'] = $customer->firstname; - // $params['{lastname}'] = $customer->lastname; - // $params['{id_order}'] = $order->id; - // @Mail::Send((int)$order->id_lang, 'voucher', Mail::l('New voucher regarding your order #').$order->id, $params, $customer->email, $customer->firstname.' '.$customer->lastname); - // } - // } + // Todo : has not been tested because order processing wasn't functionnal + if ($value > $order->total_products_wt && $cartRule->partial_use == 1 && $cartRule->reduction_amount > 0) + { + $voucher = clone $cartRule; + unset($voucher->id); + $voucher->code = empty($voucher->code) ? substr(md5($order->id.'-'.$order->id_customer.'-'.$cartRule->id), 0, 16) : $voucher->code.'-2'; + $voucher->reduction_amount = $value - $order->total_products_wt; + $voucher->id_customer = $order->id_customer; + $voucher->quantity = 1; + if ($voucher->add()) + { + CartRule::copyConditions($cartRule->id, $voucher->id); + $params['{voucher_amount}'] = Tools::displayPrice($voucher->reduction_amount, $currency, false); + $params['{voucher_num}'] = $voucher->code; + $params['{firstname}'] = $customer->firstname; + $params['{lastname}'] = $customer->lastname; + $params['{id_order}'] = $order->id; + Mail::Send((int)$order->id_lang, 'voucher', Mail::l('New voucher regarding your order #').$order->id, $params, $customer->email, $customer->firstname.' '.$customer->lastname); + } + } $order->addCartRule($cartRule->id, $cartRule->name, $value); if ($id_order_state != Configuration::get('PS_OS_ERROR') AND $id_order_state != Configuration::get('PS_OS_CANCELED'))