diff --git a/classes/Carrier.php b/classes/Carrier.php index 9de4bd2203cdb..3bb1cac7cac8f 100644 --- a/classes/Carrier.php +++ b/classes/Carrier.php @@ -989,11 +989,23 @@ public function setTaxRulesGroup($id_tax_rules_group, $all_shops = false) */ public function getTaxesRate(Address $address) { - $tax_manager = TaxManagerFactory::getManager($address, $this->getIdTaxRulesGroup()); - $tax_calculator = $tax_manager->getTaxCalculator(); + $tax_calculator = $this->getTaxCalculator($address); return $tax_calculator->getTotalRate(); } + /** + * Returns the taxes calculator associated to the carrier + * + * @since 1.5 + * @param Address $address + * @return + */ + public function getTaxCalculator(Address $address) + { + $tax_manager = TaxManagerFactory::getManager($address, $this->getIdTaxRulesGroup()); + return $tax_manager->getTaxCalculator(); + } + /** * This tricky method generates a sql clause to check if ranged data are overloaded by multishop * diff --git a/classes/order/Order.php b/classes/order/Order.php index 10a2919f0fe7f..d9b3183698b28 100644 --- a/classes/order/Order.php +++ b/classes/order/Order.php @@ -1104,10 +1104,14 @@ public function setInvoice($use_existing_payment = false) $order_invoice->number = Configuration::get('PS_INVOICE_START_NUMBER'); // If invoice start number has been set, you clean the value of this configuration if ($order_invoice->number) - Configuration::updateValue('PS_INVOICE_START_NUMBER', false); + Configuration::updateValue('PS_INVOICE_START_NUMBER', false ); else $order_invoice->number = Order::getLastInvoiceNumber() + 1; + $invoice_address = new Address((int)$this->id_address_invoice); + $carrier = new Carrier((int)$this->id_carrier); + $tax_calculator = $carrier->getTaxCalculator($invoice_address); + $order_invoice->total_discount_tax_excl = $this->total_discounts_tax_excl; $order_invoice->total_discount_tax_incl = $this->total_discounts_tax_incl; $order_invoice->total_paid_tax_excl = $this->total_paid_tax_excl; @@ -1116,12 +1120,15 @@ public function setInvoice($use_existing_payment = false) $order_invoice->total_products_wt = $this->total_products_wt; $order_invoice->total_shipping_tax_excl = $this->total_shipping_tax_excl; $order_invoice->total_shipping_tax_incl = $this->total_shipping_tax_incl; + $order_invoice->shipping_tax_computation_method = $tax_calculator->computation_method; $order_invoice->total_wrapping_tax_excl = $this->total_wrapping_tax_excl; $order_invoice->total_wrapping_tax_incl = $this->total_wrapping_tax_incl; // Save Order invoice $order_invoice->add(); + $order_invoice->saveCarrierTaxCalculator($tax_calculator->getTaxesAmount($order_invoice->total_shipping_tax_excl)); + // Update order_carrier $id_order_carrier = Db::getInstance()->getValue(' SELECT `id_order_carrier` diff --git a/classes/order/OrderDetail.php b/classes/order/OrderDetail.php index 12f49466e5094..697e0686260b1 100644 --- a/classes/order/OrderDetail.php +++ b/classes/order/OrderDetail.php @@ -132,6 +132,9 @@ class OrderDetailCore extends ObjectModel /** @var float $tax_rate **/ public $tax_rate; + /** @var float $tax_computation_method **/ + public $tax_computation_method; + /** @var int Id warehouse */ public $id_warehouse; @@ -176,6 +179,7 @@ class OrderDetailCore extends ObjectModel 'product_weight' => array('type' => self::TYPE_FLOAT, 'validate' => 'isFloat'), 'tax_name' => array('type' => self::TYPE_STRING, 'validate' => 'isGenericName'), 'tax_rate' => array('type' => self::TYPE_FLOAT, 'validate' => 'isFloat'), + 'tax_computation_method' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId'), 'ecotax' => array('type' => self::TYPE_FLOAT, 'validate' => 'isFloat'), 'ecotax_tax_rate' => array('type' => self::TYPE_FLOAT, 'validate' => 'isFloat'), 'discount_quantity_applied' => array('type' => self::TYPE_INT, 'validate' => 'isInt'), @@ -403,13 +407,14 @@ protected function setProductTax(Order $order, $product) $tax_manager = TaxManagerFactory::getManager($this->vat_address, $id_tax_rules); $this->tax_calculator = $tax_manager->getTaxCalculator(); + $this->tax_computation_method = (int)$this->tax_calculator->computation_method; } $this->ecotax_tax_rate = 0; if (!empty($product['ecotax'])) $this->ecotax_tax_rate = Tax::getProductEcotaxRate($order->{Configuration::get('PS_TAX_ADDRESS_TYPE')}); - $this->tax_computation_method = (int)$this->tax_calculator->computation_method; + } /** diff --git a/classes/tax/TaxCalculator.php b/classes/tax/TaxCalculator.php index 09a46769c9b61..a1913efa54f57 100644 --- a/classes/tax/TaxCalculator.php +++ b/classes/tax/TaxCalculator.php @@ -132,7 +132,7 @@ public function getTaxesAmount($price_te) if ($this->computation_method == TaxCalculator::ONE_AFTER_ANOTHER_METHOD) { $taxes_amounts[$tax->id] = $price_te * (abs($tax->rate) / 100); - $price_te = $price_te + $taxes_amounts[$tax->rate]; + $price_te = $price_te + $taxes_amounts[$tax->id]; } else $taxes_amounts[$tax->id] = ($price_te * (abs($tax->rate) / 100)); diff --git a/controllers/admin/AdminOrdersController.php b/controllers/admin/AdminOrdersController.php index 263c4b9d0a329..9ec650b921c36 100755 --- a/controllers/admin/AdminOrdersController.php +++ b/controllers/admin/AdminOrdersController.php @@ -1617,6 +1617,10 @@ public function ajaxProcessAddProductOnOrder() else $order_invoice->number = Order::getLastInvoiceNumber() + 1; + $invoice_address = new Address((int)$order->id_address_invoice); + $carrier = new Carrier((int)$order->id_carrier); + $tax_calculator = $carrier->getTaxCalculator($invoice_address); + $order_invoice->total_paid_tax_excl = Tools::ps_round((float)$cart->getOrderTotal(false, $total_method), 2); $order_invoice->total_paid_tax_incl = Tools::ps_round((float)$cart->getOrderTotal($use_taxes, $total_method), 2); $order_invoice->total_products = (float)$cart->getOrderTotal(false, Cart::ONLY_PRODUCTS); @@ -1626,6 +1630,7 @@ public function ajaxProcessAddProductOnOrder() $order_invoice->total_wrapping_tax_excl = abs($cart->getOrderTotal(false, Cart::ONLY_WRAPPING)); $order_invoice->total_wrapping_tax_incl = abs($cart->getOrderTotal($use_taxes, Cart::ONLY_WRAPPING)); + $order_invoice->shipping_tax_computation_method = (int)$tax_calculator->computation_method; // Update current order field, only shipping because other field is updated later $order->total_shipping += $order_invoice->total_shipping_tax_incl; @@ -1637,6 +1642,8 @@ public function ajaxProcessAddProductOnOrder() $order->total_wrapping_tax_incl += abs($cart->getOrderTotal($use_taxes, Cart::ONLY_WRAPPING)); $order_invoice->add(); + $order_invoice->saveCarrierTaxCalculator($tax_calculator->getTaxesAmount($order_invoice->total_shipping_tax_excl)); + $order_carrier = new OrderCarrier(); $order_carrier->id_order = (int)$order->id; $order_carrier->id_carrier = (int)$order->id_carrier; diff --git a/install-dev/data/db_structure.sql b/install-dev/data/db_structure.sql index b835f5bbfc451..52059508d5737 100644 --- a/install-dev/data/db_structure.sql +++ b/install-dev/data/db_structure.sql @@ -1098,6 +1098,7 @@ CREATE TABLE `PREFIX_order_invoice` ( `total_products_wt` decimal(17,2) NOT NULL DEFAULT '0.00', `total_shipping_tax_excl` decimal(17,2) NOT NULL DEFAULT '0.00', `total_shipping_tax_incl` decimal(17,2) NOT NULL DEFAULT '0.00', + `shipping_tax_computation_method` int(10) unsigned NOT NULL, `total_wrapping_tax_excl` decimal(17,2) NOT NULL DEFAULT '0.00', `total_wrapping_tax_incl` decimal(17,2) NOT NULL DEFAULT '0.00', `note` text, @@ -1106,6 +1107,13 @@ CREATE TABLE `PREFIX_order_invoice` ( KEY `id_order` (`id_order`) ) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; +CREATE TABLE IF NOT EXISTS `PREFIX_order_invoice_tax` ( + `id_order_invoice` int(11) NOT NULL, + `type` varchar(15) NOT NULL, + `id_tax` int(11) NOT NULL, + `amount` decimal(10,6) NOT NULL DEFAULT '0.000000' +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + CREATE TABLE `PREFIX_order_detail` ( `id_order_detail` int(10) unsigned NOT NULL auto_increment, `id_order` int(10) unsigned NOT NULL, diff --git a/install-dev/upgrade/sql/1.5.0.14.sql b/install-dev/upgrade/sql/1.5.0.14.sql index 99b12f5170057..03f108742ebf9 100644 --- a/install-dev/upgrade/sql/1.5.0.14.sql +++ b/install-dev/upgrade/sql/1.5.0.14.sql @@ -11,3 +11,12 @@ INSERT INTO `PREFIX_hook_alias` (`name`, `alias`) VALUES ('displayMyAccountBlock UPDATE `PREFIX_image_type` SET height = 189, width = 520 WHERE name = 'large_scene'; +CREATE TABLE IF NOT EXISTS `PREFIX_order_invoice_tax` ( + `id_order_invoice` int(11) NOT NULL, + `type` varchar(15) NOT NULL, + `id_tax` int(11) NOT NULL, + `amount` decimal(10,6) NOT NULL DEFAULT '0.000000' +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +ALTER TABLE `PREFIX_order_invoice` +ADD `shipping_tax_computation_method` INT NOT NULL AFTER `total_shipping_tax_incl`; \ No newline at end of file diff --git a/pdf/invoice.tax-tab.tpl b/pdf/invoice.tax-tab.tpl index a808fc80da3af..eb1ef3613aa43 100755 --- a/pdf/invoice.tax-tab.tpl +++ b/pdf/invoice.tax-tab.tpl @@ -37,7 +37,9 @@