diff --git a/admin-dev/themes/template/orders/_documents.tpl b/admin-dev/themes/template/orders/_documents.tpl index e2279b7cd..f1a2af478 100644 --- a/admin-dev/themes/template/orders/_documents.tpl +++ b/admin-dev/themes/template/orders/_documents.tpl @@ -43,8 +43,8 @@

- - +   + {l s='Cancel'}

diff --git a/admin-dev/themes/template/orders/view.tpl b/admin-dev/themes/template/orders/view.tpl index ce1d94e28..9c1cdf721 100755 --- a/admin-dev/themes/template/orders/view.tpl +++ b/admin-dev/themes/template/orders/view.tpl @@ -544,7 +544,7 @@
- +
@@ -576,12 +576,13 @@
- {if (sizeof($discounts))} -
+ {if (sizeof($discounts) || $can_edit)} +
{l s='Products'} {displayPrice price=$order->total_products_wt currency=$currency->id}
+ {if $can_edit}{/if} {foreach from=$discounts item=discount} @@ -592,8 +593,74 @@ {/if} {displayPrice price=$discount['value'] currency=$currency->id} + {if $can_edit} + + {/if} {/foreach} + {if $can_edit} + + + + + + + {/if}
{l s='Discounts'}{l s='Discount name'} {l s='Value'}{l s='Action'}
+ {l s='Delete voucher'} +
+ {l s='Add'} {l s='Add a new discount'} +
+
+ +
+ +
+ + +
+ +
+ +
+ +
+ {if ($currency->format % 2)} + + {/if} + + {if !($currency->format % 2)} + + {/if} + % + +
+
+ + +
+
+ +

+ {l s='If you select to create this discount for all invoices, one discount will be created per order invoice.'} +

+
+ +

+   + {l s='Cancel'} +

+
+
{/if} diff --git a/classes/PaymentModule.php b/classes/PaymentModule.php index d3163b89b..510053ef0 100644 --- a/classes/PaymentModule.php +++ b/classes/PaymentModule.php @@ -301,14 +301,17 @@ abstract class PaymentModuleCore extends Module foreach ($result as $cart_rule) { $cartRule = $cart_rule['obj']; - $value = $cartRule->getContextualValue(true); + $values = array( + 'tax_incl' => $cartRule->getContextualValue(true), + 'tax_excl' => $cartRule->getContextualValue(false) + ); // 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) + if ($values['tax_incl'] > $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->reduction_amount = $values['tax_incl'] - $order->total_products_wt; $voucher->id_customer = $order->id_customer; $voucher->quantity = 1; if ($voucher->add()) @@ -323,7 +326,7 @@ abstract class PaymentModuleCore extends Module } } - $order->addCartRule($cartRule->id, $cartRule->name, $value); + $order->addCartRule($cartRule->id, $cartRule->name, $values); if ($id_order_state != Configuration::get('PS_OS_ERROR') AND $id_order_state != Configuration::get('PS_OS_CANCELED')) { @@ -336,7 +339,7 @@ abstract class PaymentModuleCore extends Module $cartRulesList .= ' '.$this->l('Voucher name:').' '.$cartRule->name.' - '.($value != 0.00 ? '-' : '').Tools::displayPrice($value, $currency, false).' + '.($values['tax_incl'] != 0.00 ? '-' : '').Tools::displayPrice($values['tax_incl'], $currency, false).' '; } diff --git a/classes/order/Order.php b/classes/order/Order.php index d6ce6fc77..afd8a38f3 100644 --- a/classes/order/Order.php +++ b/classes/order/Order.php @@ -976,27 +976,35 @@ class OrderCore extends ObjectModel /** * @deprecated 1.5.0.1 * @see Order::addCartRule() - * @param $id_cart_rule - * @param $name - * @param $value + * @param int $id_cart_rule + * @param string $name + * @param float $value * @return bool */ public function addDiscount($id_cart_rule, $name, $value) { Tools::displayAsDeprecated(); - return Order::addCartRule($id_cart_rule, $name, $value); + return Order::addCartRule($id_cart_rule, $name, array('tax_incl' => $value, 'tax_excl' => '0.00')); } /** * @since 1.5.0.1 - * @param $id_cart_rule - * @param $name - * @param $value + * @param int $id_cart_rule + * @param string $name + * @param array $values + * @param int $id_order_invoice * @return bool */ - public function addCartRule($id_cart_rule, $name, $value) + public function addCartRule($id_cart_rule, $name, $values, $id_order_invoice = 0) { - return Db::getInstance()->AutoExecute(_DB_PREFIX_.'order_cart_rule', array('id_order' => (int)$this->id, 'id_cart_rule' => (int)$id_cart_rule, 'name' => pSQL($name), 'value' => (float)$value), 'INSERT'); + $order_cart_rule = new OrderCartRule(); + $order_cart_rule->id_order = $this->id; + $order_cart_rule->id_cart_rule = $id_cart_rule; + $order_cart_rule->id_order_invoice = $id_order_invoice; + $order_cart_rule->name = $name; + $order_cart_rule->value = $values['tax_incl']; + $order_cart_rule->value_tax_excl = $values['tax_excl']; + $order_cart_rule->add(); } public function getNumberOfDays() @@ -1083,6 +1091,13 @@ class OrderCore extends ObjectModel SET `id_order_invoice` = '.(int)$order_invoice->id.' WHERE `id_order` = '.(int)$order_invoice->id_order); + // Update order cart rule + Db::getInstance()->execute(' + UPDATE `'._DB_PREFIX_.'order_cart_rule` + SET `id_order_invoice` = '.(int)$order_invoice->id.' + WHERE `id_order` = '.(int)$order_invoice->id_order); + + // Keep it for backward compatibility, to remove on 1.6 version $this->invoice_date = $order_invoice->date_add; $this->invoice_number = $order_invoice->number; $this->update(); diff --git a/classes/order/OrderCartRule.php b/classes/order/OrderCartRule.php index b5e0cdbda..b1e1216c3 100644 --- a/classes/order/OrderCartRule.php +++ b/classes/order/OrderCartRule.php @@ -36,12 +36,18 @@ class OrderCartRuleCore extends ObjectModel /** @var integer */ public $id_cart_rule; + /** @var integer */ + public $id_order_invoice; + /** @var string */ public $name; - /** @var integer */ + /** @var float value (tax incl.) of voucher */ public $value; + /** @var float value (tax excl.) of voucher */ + public $value_tax_excl; + /** * @see ObjectModel::$definition */ @@ -49,10 +55,12 @@ class OrderCartRuleCore extends ObjectModel 'table' => 'order_cart_rule', 'primary' => 'id_order_cart_rule', 'fields' => array( - 'id_order' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId', 'required' => true), - 'name' => array('type' => self::TYPE_STRING, 'validate' => 'isGenericName', 'required' => true), - 'value' => array('type' => self::TYPE_INT, 'validate' => 'isInt', 'required' => true), - ), + 'id_order' => 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), + 'value_tax_excl' => array('type' => self::TYPE_FLOAT, 'validate' => 'isFloat', 'required' => true) + ) ); protected $webserviceParameters = array( diff --git a/controllers/admin/AdminOrdersController.php b/controllers/admin/AdminOrdersController.php index 812fd0dfa..9869feca6 100755 --- a/controllers/admin/AdminOrdersController.php +++ b/controllers/admin/AdminOrdersController.php @@ -734,6 +734,216 @@ class AdminOrdersControllerCore extends AdminController Tools::redirectAdmin(self::$currentIndex.'&id_order='.$order->id.'&vieworder&conf=4&token='.$this->token); } } + elseif (Tools::isSubmit('submitDeleteVoucher')) + { + if ($this->tabAccess['edit'] === '1') + { + $order_cart_rule = new OrderCartRule(Tools::getValue('id_order_cart_rule')); + $order = new Order(Tools::getValue('id_order')); + if (Validate::isLoadedObject($order_cart_rule) && Validate::isLoadedObject($order) && $order_cart_rule->id_order == $order->id) + { + if ($order_cart_rule->id_order_invoice) + { + $order_invoice = new OrderInvoice($order_cart_rule->id_order_invoice); + if (!ValidateCore::isLoadedObject($order_invoice)) + throw new PrestashopException('Can\'t load Order Invoice object'); + + // Update amounts of Order Invoice + $order_invoice->total_discount_tax_excl -= $order_cart_rule->value_tax_excl; + $order_invoice->total_discount_tax_incl -= $order_cart_rule->value; + + $order_invoice->total_paid_tax_excl += $order_cart_rule->value_tax_excl; + $order_invoice->total_paid_tax_incl += $order_cart_rule->value; + + // Update Order Invoice + $order_invoice->update(); + } + + // Update amounts of order + $order->total_discounts -= $order_cart_rule->value; + $order->total_discounts_tax_incl -= $order_cart_rule->value; + $order->total_discounts_tax_excl -= $order_cart_rule->value_tax_excl; + + $order->total_paid += $order_cart_rule->value; + $order->total_paid_tax_incl += $order_cart_rule->value; + $order->total_paid_tax_excl += $order_cart_rule->value_tax_excl; + + // Delete Order Cart Rule and update Order + $order_cart_rule->delete(); + $order->update(); + Tools::redirectAdmin(self::$currentIndex.'&id_order='.$order->id.'&vieworder&conf=4&token='.$this->token); + } + else + $this->_errors[] = Tools::displayError('Can\'t edit this Order Cart Rule'); + } + else + $this->_errors[] = Tools::displayError('You do not have permission to edit here.'); + } + elseif (Tools::getValue('submitNewVoucher')) + { + if ($this->tabAccess['edit'] === '1') + { + $order = new Order(Tools::getValue('id_order')); + if (!Validate::isLoadedObject($order)) + throw new PrestashopException('Can\'t load Order object'); + + // If the discount is for only one invoice + if (!Tools::isSubmit('discount_all_invoices')) + { + $order_invoice = new OrderInvoice(Tools::getValue('discount_invoice')); + if (!Validate::isLoadedObject($order_invoice)) + throw new PrestashopException('Can\'t load Order Invoice object'); + } + + $cart_rules = array(); + switch (Tools::getValue('discount_type')) + { + // Percent type + case 1: + if (Tools::getValue('discount_value') < 100) + { + if (isset($order_invoice)) + { + $cart_rules[$order_invoice->id]['value_tax_incl'] = Tools::ps_round($order_invoice->total_paid_tax_incl * Tools::getValue('discount_value') / 100, 2); + $cart_rules[$order_invoice->id]['value_tax_excl'] = Tools::ps_round($order_invoice->total_paid_tax_excl * Tools::getValue('discount_value') / 100, 2); + + // Update OrderInvoice + $order_invoice->total_discount_tax_incl += $cart_rules[$order_invoice->id]['value_tax_incl']; + $order_invoice->total_discount_tax_excl += $cart_rules[$order_invoice->id]['value_tax_excl']; + $order_invoice->total_paid_tax_incl -= $cart_rules[$order_invoice->id]['value_tax_incl']; + $order_invoice->total_paid_tax_excl -= $cart_rules[$order_invoice->id]['value_tax_excl']; + + $order_invoice->update(); + } + else + { + $order_invoices_collection = $order->getInvoicesCollection(); + foreach($order_invoices_collection as $order_invoice) + { + $cart_rules[$order_invoice->id]['value_tax_incl'] = Tools::ps_round($order_invoice->total_paid_tax_incl * Tools::getValue('discount_value') / 100, 2); + $cart_rules[$order_invoice->id]['value_tax_excl'] = Tools::ps_round($order_invoice->total_paid_tax_excl * Tools::getValue('discount_value') / 100, 2); + + // Update OrderInvoice + $order_invoice->total_discount_tax_incl += $cart_rules[$order_invoice->id]['value_tax_incl']; + $order_invoice->total_discount_tax_excl += $cart_rules[$order_invoice->id]['value_tax_excl']; + $order_invoice->total_paid_tax_incl -= $cart_rules[$order_invoice->id]['value_tax_incl']; + $order_invoice->total_paid_tax_excl -= $cart_rules[$order_invoice->id]['value_tax_excl']; + $order_invoice->update(); + } + } + } + else + $this->_errors[] = Tools::displayError('Discount value is invalid'); + break; + // Amount type + case 2: + if (isset($order_invoice)) + { + if (Tools::getValue('discount_value') > $order_invoice->total_paid_tax_incl) + $this->_errors[] = Tools::displayError('Discount value is superior than the order invoice total'); + else + { + $cart_rules[$order_invoice->id]['value_tax_incl'] = Tools::ps_round(Tools::getValue('discount_value'), 2); + $cart_rules[$order_invoice->id]['value_tax_excl'] = Tools::ps_round(Tools::getValue('discount_value') / (1 + ($order->getTaxesAverageUsed() / 100)), 2); + + // Update OrderInvoice + $order_invoice->total_discount_tax_incl += $cart_rules[$order_invoice->id]['value_tax_incl']; + $order_invoice->total_discount_tax_excl += $cart_rules[$order_invoice->id]['value_tax_excl']; + $order_invoice->total_paid_tax_incl -= $cart_rules[$order_invoice->id]['value_tax_incl']; + $order_invoice->total_paid_tax_excl -= $cart_rules[$order_invoice->id]['value_tax_excl']; + $order_invoice->update(); + } + } + else + { + $order_invoices_collection = $order->getInvoicesCollection(); + foreach($order_invoices_collection as $order_invoice) + { + if (Tools::getValue('discount_value') > $order_invoice->total_paid_tax_incl) + continue; + $cart_rules[$order_invoice->id]['value_tax_incl'] = Tools::ps_round(Tools::getValue('discount_value'), 2); + $cart_rules[$order_invoice->id]['value_tax_excl'] = Tools::ps_round(Tools::getValue('discount_value') / (1 + ($order->getTaxesAverageUsed() / 100)), 2); + + // Update OrderInvoice + $order_invoice->total_discount_tax_incl += $cart_rules[$order_invoice->id]['value_tax_incl']; + $order_invoice->total_discount_tax_excl += $cart_rules[$order_invoice->id]['value_tax_excl']; + $order_invoice->total_paid_tax_incl -= $cart_rules[$order_invoice->id]['value_tax_incl']; + $order_invoice->total_paid_tax_excl -= $cart_rules[$order_invoice->id]['value_tax_excl']; + $order_invoice->update(); + } + } + break; + // Free shipping type + case 3: + if (isset($order_invoice)) + { + if ($order_invoice->total_shipping_tax_incl > 0) + { + $cart_rules[$order_invoice->id]['value_tax_incl'] = $order_invoice->total_shipping_tax_incl; + $cart_rules[$order_invoice->id]['value_tax_excl'] = $order_invoice->total_shipping_tax_excl; + + // Update OrderInvoice + $order_invoice->total_discount_tax_incl += $cart_rules[$order_invoice->id]['value_tax_incl']; + $order_invoice->total_discount_tax_excl += $cart_rules[$order_invoice->id]['value_tax_excl']; + $order_invoice->total_paid_tax_incl -= $cart_rules[$order_invoice->id]['value_tax_incl']; + $order_invoice->total_paid_tax_excl -= $cart_rules[$order_invoice->id]['value_tax_excl']; + $order_invoice->update(); + } + } + else + { + $order_invoices_collection = $order->getInvoicesCollection(); + foreach($order_invoices_collection as $order_invoice) + { + if ($order_invoice->total_shipping_tax_incl <= 0) + continue; + $cart_rules[$order_invoice->id]['value_tax_incl'] = $order_invoice->total_shipping_tax_incl; + $cart_rules[$order_invoice->id]['value_tax_excl'] = $order_invoice->total_shipping_tax_excl; + + // Update OrderInvoice + $order_invoice->total_discount_tax_incl += $cart_rules[$order_invoice->id]['value_tax_incl']; + $order_invoice->total_discount_tax_excl += $cart_rules[$order_invoice->id]['value_tax_excl']; + $order_invoice->total_paid_tax_incl -= $cart_rules[$order_invoice->id]['value_tax_incl']; + $order_invoice->total_paid_tax_excl -= $cart_rules[$order_invoice->id]['value_tax_excl']; + $order_invoice->update(); + } + } + break; + default: + $this->_errors[] = Tools::displayError('Discount type is invalid'); + } + + $res = true; + foreach($cart_rules as $id_order_invoice => $cart_rule) + { + // Create OrderCartRule + $order_cart_rule = new OrderCartRule(); + $order_cart_rule->id_order = $order->id; + $order_cart_rule->id_order_invoice = $id_order_invoice; + $order_cart_rule->name = Tools::getValue('discount_name'); + $order_cart_rule->value = $cart_rule['value_tax_incl']; + $order_cart_rule->value_tax_excl = $cart_rule['value_tax_excl']; + $res &= $order_cart_rule->add(); + + $order->total_discounts += $order_cart_rule->value; + $order->total_discounts_tax_incl += $order_cart_rule->value; + $order->total_discounts_tax_excl += $order_cart_rule->value_tax_excl; + $order->total_paid -= $order_cart_rule->value; + $order->total_paid_tax_incl -= $order_cart_rule->value; + $order->total_paid_tax_excl -= $order_cart_rule->value_tax_excl; + } + + // Update Order + $res &= $order->update(); + + if ($res) + Tools::redirectAdmin(self::$currentIndex.'&id_order='.$order->id.'&vieworder&conf=4&token='.$this->token); + else + $this->_errors[] = Tools::displayError('An error occured on OrderCartRule creation'); + } + else + $this->_errors[] = Tools::displayError('You do not have permission to edit here.'); + } parent::postProcess(); } @@ -1050,7 +1260,11 @@ class AdminOrdersControllerCore extends AdminController // Add cart rule to cart and in order $cart->addCartRule($cart_rule->id); - $order->addCartRule($cart_rule->id, $cart_rule->name[Configuration::get('PS_LANG_DEFAULT')], $cart_rule->getContextualValue(true)); + $values = array( + 'tax_incl' => $cart_rule->getContextualValue(true), + 'tax_excl' => $cart_rule->getContextualValue(false) + ); + $order->addCartRule($cart_rule->id, $cart_rule->name[Configuration::get('PS_LANG_DEFAULT')], $values); } $order_invoice->id_order = $order->id; @@ -1332,16 +1546,6 @@ class AdminOrdersControllerCore extends AdminController if ($order_detail->id_order_invoice != 0) { $order_invoice = new OrderInvoice($order_detail->id_order_invoice); - - /* - TODO refresh total_discount - $order_invoice->total_discount_tax_excl -= ; - $order_invoice->total_discount_tax_incl -= ; - $order_invoice->total_shipping_tax_excl -= ; - $order_invoice->total_shipping_tax_incl -= ; - $order_invoice->total_wrapping_tax_excl -= ; - $order_invoice->total_wrapping_tax_incl -= ; - */ $order_invoice->total_paid_tax_excl -= $order_detail->total_price_tax_incl; $order_invoice->total_paid_tax_incl -= $order_detail->total_price_tax_excl; $order_invoice->total_products -= $order_detail->total_price_tax_incl; @@ -1350,19 +1554,6 @@ class AdminOrdersControllerCore extends AdminController } // Update Order - /* - * TODO - $order->total_discounts -= ; - $order->total_discounts_tax_incl -= ; - $order->total_discounts_tax_excl -= ; - $order->total_discounts_tax_excl -= ; - $order->total_shipping -= ; - $order->total_shipping_tax_incl -= ; - $order->total_shipping_tax_excl -= ; - $order->total_wrapping -= ; - $order->total_wrapping_tax_incl -= ; - $order->total_wrapping_tax_excl -= ; - */ $order->total_paid -= $order_detail->total_price_tax_incl; $order->total_paid_tax_incl -= $order_detail->total_price_tax_incl; $order->total_paid_tax_excl -= $order_detail->total_price_tax_excl; diff --git a/install-dev/sql/db.sql b/install-dev/sql/db.sql index ae1b1da2c..3f858156c 100644 --- a/install-dev/sql/db.sql +++ b/install-dev/sql/db.sql @@ -1133,8 +1133,10 @@ CREATE TABLE `PREFIX_order_cart_rule` ( `id_order_cart_rule` int(10) unsigned NOT NULL auto_increment, `id_order` int(10) unsigned NOT NULL, `id_cart_rule` int(10) unsigned NOT NULL, + `id_order_invoice` int(10) unsigned DEFAULT 0, `name` varchar(32) NOT NULL, `value` decimal(17,2) NOT NULL default '0.00', + `value_tax_excl` decimal(17,2) NOT NULL default '0.00', PRIMARY KEY (`id_order_cart_rule`), KEY `id_order` (`id_order`), KEY `id_cart_rule` (`id_cart_rule`) diff --git a/install-dev/sql/upgrade/1.5.0.2.sql b/install-dev/sql/upgrade/1.5.0.2.sql index 302cd4600..41fa76590 100644 --- a/install-dev/sql/upgrade/1.5.0.2.sql +++ b/install-dev/sql/upgrade/1.5.0.2.sql @@ -288,3 +288,5 @@ ALTER TABLE `PREFIX_product` ADD COLUMN `advanced_stock_management` tinyint(1) d DELETE FROM `PREFIX_configuration` WHERE `name` = 'PS_PDF_ENCODING'; DELETE FROM `PREFIX_configuration` WHERE `name` = 'PS_PDF_FONT'; +ALTER TABLE `PREFIX_order_cart_rule` ADD `value_tax_excl` DECIMAL(17, 2) NOT NULL DEFAULT '0.00'; +ALTER TABLE `PREFIX_order_cart_rule` ADD `id_order_invoice` INT NOT NULL DEFAULT '0' AFTER `id_cart_rule`; diff --git a/js/admin_order.js b/js/admin_order.js index 5eda3de25..2beae95b7 100644 --- a/js/admin_order.js +++ b/js/admin_order.js @@ -683,6 +683,51 @@ function init() return false; }); + + $('#add_voucher').click(function() { + $(this).parent().parent().hide(); + $('#voucher_form').parent().show(); + + return false; + }); + + $('#cancel_add_voucher').click(function() { + $('#voucher_form').parent().hide(); + $('#add_voucher').parent().parent().show(); + + return false; + }); + + $('#discount_type').change(function() { + // Percent type + if ($(this).val() == 1) + { + $('#discount_value_field').show(); + $('#discount_currency_sign').hide(); + $('#discount_value_help').hide(); + $('#discount_percent_symbol').show(); + } + // Amount type + else if ($(this).val() == 2) + { + $('#discount_value_field').show(); + $('#discount_percent_symbol').hide(); + $('#discount_value_help').show(); + $('#discount_currency_sign').show(); + } + // Free shipping + else if ($(this).val() == 3) + { + $('#discount_value_field').hide(); + } + }); + + $('#discount_all_invoices').change(function() { + if ($(this).is(':checked')) + $('select[name=discount_invoice]').attr('disabled', true); + else + $('select[name=discount_invoice]').attr('disabled', false); + }); }