From 01cd9ce3dd01cef437786d9de0d9c757568d7bd4 Mon Sep 17 00:00:00 2001 From: rGaillard Date: Tue, 9 Oct 2012 12:58:08 +0000 Subject: [PATCH] [-] BO: Fix ecotax product backoffice management && rounding issue git-svn-id: http://dev.prestashop.com/svn/v1/branches/1.5.x@17804 b9a71923-0436-4b27-9f14-aed3839534dd --- .../template/controllers/products/prices.tpl | 7 +- classes/Cart.php | 64 +++++++++++-------- classes/order/OrderInvoice.php | 14 ++-- controllers/admin/AdminProductsController.php | 5 +- js/price.js | 9 +-- pdf/invoice.tax-tab.tpl | 2 +- 6 files changed, 62 insertions(+), 39 deletions(-) diff --git a/admin-dev/themes/default/template/controllers/products/prices.tpl b/admin-dev/themes/default/template/controllers/products/prices.tpl index bc5a05869..e2d58c4f4 100644 --- a/admin-dev/themes/default/template/controllers/products/prices.tpl +++ b/admin-dev/themes/default/template/controllers/products/prices.tpl @@ -27,6 +27,7 @@ {/if} diff --git a/classes/Cart.php b/classes/Cart.php index 8db94ff11..303ea6455 100644 --- a/classes/Cart.php +++ b/classes/Cart.php @@ -1415,32 +1415,46 @@ class CartCore extends ObjectModel } else { - $price = Product::getPriceStatic( - (int)$product['id_product'], - true, - (int)$product['id_product_attribute'], - 2, - null, - false, - true, - $product['cart_quantity'], - false, - ((int)$this->id_customer ? (int)$this->id_customer : null), - (int)$this->id, - ((int)$address_id ? (int)$address_id : null), - $null, - true, - true, - $virtual_context - ); + if ($with_taxes) + $price = Product::getPriceStatic( + (int)$product['id_product'], + true, + (int)$product['id_product_attribute'], + 2, + null, + false, + true, + $product['cart_quantity'], + false, + ((int)$this->id_customer ? (int)$this->id_customer : null), + (int)$this->id, + ((int)$address_id ? (int)$address_id : null), + $null, + true, + true, + $virtual_context + ); + else + $price = Product::getPriceStatic( + (int)$product['id_product'], + false, + (int)$product['id_product_attribute'], + 2, + null, + false, + true, + $product['cart_quantity'], + false, + ((int)$this->id_customer ? (int)$this->id_customer : null), + (int)$this->id, + ((int)$address_id ? (int)$address_id : null), + $null, + true, + true, + $virtual_context + ); - $total_price = Tools::ps_round($price, 2) * (int)$product['cart_quantity']; - - if (!$with_taxes) - { - $product_tax_rate = (float)Tax::getProductTaxRate((int)$product['id_product'], (int)$address_id, $virtual_context); - $total_price = Tools::ps_round($total_price / (1 + ($product_tax_rate / 100)), 2); - } + $total_price = Tools::ps_round($price * (int)$product['cart_quantity'], 2); } $order_total += $total_price; } diff --git a/classes/order/OrderInvoice.php b/classes/order/OrderInvoice.php index d8bb629e2..57d2adfd5 100644 --- a/classes/order/OrderInvoice.php +++ b/classes/order/OrderInvoice.php @@ -302,7 +302,7 @@ class OrderInvoiceCore extends ObjectModel { // sum by order details in order to retrieve real taxes rate $taxes_infos = Db::getInstance()->executeS(' - SELECT odt.`id_order_detail`, t.`rate` AS `name`, SUM(od.`total_price_tax_excl`) AS total_price_tax_excl, SUM(t.`rate`) AS rate, SUM(`total_amount`) AS `total_amount`, od.`ecotax`, od.`ecotax_tax_rate` + SELECT odt.`id_order_detail`, t.`rate` AS `name`, SUM(od.`total_price_tax_excl`) AS total_price_tax_excl, SUM(t.`rate`) AS rate, SUM(`total_amount`) AS `total_amount`, od.`ecotax`, od.`ecotax_tax_rate`, od.`product_quantity` FROM `'._DB_PREFIX_.'order_detail_tax` odt LEFT JOIN `'._DB_PREFIX_.'tax` t ON (t.`id_tax` = odt.`id_tax`) LEFT JOIN `'._DB_PREFIX_.'order_detail` od ON (od.`id_order_detail` = odt.`id_order_detail`) @@ -324,9 +324,9 @@ class OrderInvoiceCore extends ObjectModel $ratio = $tax_infos['total_price_tax_excl'] / $this->total_products; $order_reduction_amount = $this->total_discount_tax_excl * $ratio; - $tmp_tax_infos[$tax_infos['rate']]['total_amount'] += ($tax_infos['total_amount'] - Tools::ps_round($tax_infos['ecotax'] * $tax_infos['ecotax_tax_rate'] / 100, 2)); + $tmp_tax_infos[$tax_infos['rate']]['total_amount'] += ($tax_infos['total_amount'] - Tools::ps_round($tax_infos['ecotax'] * $tax_infos['product_quantity'] * $tax_infos['ecotax_tax_rate'] / 100, 2)); $tmp_tax_infos[$tax_infos['rate']]['name'] = $tax_infos['name']; - $tmp_tax_infos[$tax_infos['rate']]['total_price_tax_excl'] += ($tax_infos['total_price_tax_excl'] - $order_reduction_amount - $tax_infos['ecotax']); + $tmp_tax_infos[$tax_infos['rate']]['total_price_tax_excl'] += $tax_infos['total_price_tax_excl'] - $order_reduction_amount - Tools::ps_round($tax_infos['ecotax'] * $tax_infos['product_quantity'], 2); } } @@ -381,7 +381,7 @@ class OrderInvoiceCore extends ObjectModel public function getEcoTaxTaxesBreakdown() { $res = Db::getInstance()->executeS(' - SELECT `ecotax_tax_rate` as `rate`, SUM(`ecotax`) as `ecotax_tax_excl`, SUM(`ecotax`) as `ecotax_tax_incl` + SELECT `ecotax_tax_rate` as `rate`, SUM(`ecotax`) as `ecotax_tax_excl`, SUM(`ecotax`) as `ecotax_tax_incl`, `product_quantity` FROM `'._DB_PREFIX_.'order_detail` WHERE `id_order` = '.(int)$this->id_order.' AND `id_order_invoice` = '.(int)$this->id.' @@ -390,8 +390,10 @@ class OrderInvoiceCore extends ObjectModel if ($res) foreach ($res as &$row) - $row['ecotax_tax_incl'] = Tools::ps_round($row['ecotax_tax_excl'] + ($row['ecotax_tax_excl'] * $row['rate'] / 100), 2); - + { + $row['ecotax_tax_incl'] = Tools::ps_round(($row['ecotax_tax_excl'] * $row['product_quantity']) + ($row['ecotax_tax_excl'] * $row['product_quantity'] * $row['rate'] / 100), 2); + $row['ecotax_tax_excl'] = Tools::ps_round($row['ecotax_tax_excl'] * $row['product_quantity'], 2); + } return $res; } diff --git a/controllers/admin/AdminProductsController.php b/controllers/admin/AdminProductsController.php index 37d929d2b..b3e0facb4 100644 --- a/controllers/admin/AdminProductsController.php +++ b/controllers/admin/AdminProductsController.php @@ -2781,6 +2781,9 @@ class AdminProductsControllerCore extends AdminController $this->context->currency, $shops, $currencies, $countries, $groups) ); + $data->assign('ecotax_tax_excl', $obj->ecotax); + $this->_applyTaxToEcotax($obj); + $data->assign(array( 'shops' => $shops, 'admin_one_shop' => count($this->context->employee->getAssociatedShops()) == 1, @@ -3288,7 +3291,7 @@ class AdminProductsControllerCore extends AdminController $data->assign('currency', $currency); $this->object = $product; $this->display = 'edit'; - $this->_applyTaxToEcotax($product); + /* * Form for adding a virtual product like software, mp3, etc... diff --git a/js/price.js b/js/price.js index e398a8b5c..fc4b17482 100644 --- a/js/price.js +++ b/js/price.js @@ -35,12 +35,12 @@ function getTax() function getEcotaxTaxIncluded() { - return ($('#ecotax').length && $('#ecotax').val() != '') ? parseFloat($('#ecotax').val()) : 0; + return ps_round(ecotax_tax_excl * (1 + ecotaxTaxRate), 2); } function getEcotaxTaxExcluded() { - return getEcotaxTaxIncluded() / (1 + ecotaxTaxRate); + return ecotax_tax_excl; } function formatPrice(price) @@ -70,12 +70,13 @@ function calcPriceTI() document.getElementById('finalPriceWithoutTax').innerHTML = (isNaN(priceTE) == true || priceTE < 0) ? '' : (ps_round(priceTE, 2) + getEcotaxTaxExcluded()).toFixed(2); calcReduction(); - $('#priceTI').value = (parseFloat($('#priceTI').val()) + getEcotaxTaxIncluded()).toFixed(2); - $('#finalPrice').innerHTML = parseFloat($('#priceTI').val()).toFixed(2); + $('#priceTI').val((parseFloat($('#priceTI').val()) + getEcotaxTaxIncluded()).toFixed(2)); + $('#finalPrice').html(parseFloat($('#priceTI').val()).toFixed(2)); } function calcPriceTE() { + ecotax_tax_excl = $('#ecotax').val() / (1 + ecotaxTaxRate); var tax = getTax(); var priceTI = parseFloat(document.getElementById('priceTI').value.replace(/,/g, '.')); var newPrice = ps_round(priceTI - getEcotaxTaxIncluded(), 2) / ((tax / 100) + 1); diff --git a/pdf/invoice.tax-tab.tpl b/pdf/invoice.tax-tab.tpl index 9632d73c2..4cf26c89c 100755 --- a/pdf/invoice.tax-tab.tpl +++ b/pdf/invoice.tax-tab.tpl @@ -30,7 +30,7 @@ {if $tax_exempt} {l s='Exempt of VAT according section 259B of the General Tax Code.' pdf='true'} - {else if (count($shipping_tax_breakdown) + count($product_tax_breakdown) == 0)} + {else if (count($shipping_tax_breakdown) + count($product_tax_breakdown) + count($ecotax_tax_breakdown) + count($wrapping_tax_breakdown) == 0)} {l s='No tax' pdf='true'} {else}