+ {if (sizeof($discounts) || $can_edit)}
+
{l s='Discount name'} |
{l s='Value'} |
+ {if $can_edit}{l s='Action'} | {/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}
+
+
+ {l s='Add a new discount'}
+ |
+
+
+ |
+
+ |
+
+ {/if}
{/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);
+ });
}