Keron83 Posted October 25, 2013 Share Posted October 25, 2013 Hi! I've got a question about tax and attributes (combinations). I have a product (Cola 1.5 liters) with the price: €1,83.This product has a combination that will add €0,25 to the price (deposit money). So you can buy the product for €2,08. Prestashop will calculate the tax based on the price: €2,08. What I want and need, is a tax calculation based on the base price €1,83. Where can I change this. (in which file) Thnx! Link to comment Share on other sites More sharing options...
matzmu Posted December 1, 2013 Share Posted December 1, 2013 I think there is no easy solution. IF i were you , a will add to databse boolean value (like "addtax") in customizastion table and then modify controller to calculate a tax for base price Link to comment Share on other sites More sharing options...
m3442a Posted December 5, 2013 Share Posted December 5, 2013 I have a similar problem: i need the combination price (price+add combination) on the product.tpl without tax. Prestashop only showing the combination price with tax! the normal price can showing with and without tax, but not the combination price: this shows only with tax, without show always the combination price "0". Link to comment Share on other sites More sharing options...
Keron83 Posted December 15, 2013 Author Share Posted December 15, 2013 Fixed it a couple of weeks ago..I tested it on Prestashop 1.5.5, so dont know if it works for other versions.Make a backup (classes/product.php) before you try this.I've added the attribute price rule AFTER tax is added to product price1) Go to: ./classes/Product.php2) Search for this code: (line 2653) // fetch price & attribute price $cache_id_2 = $id_product.'-'.$id_shop; if (!isset(self::$_pricesLevel2[$cache_id_2])) { $sql = new DbQuery(); $sql->select('product_shop.`price`, product_shop.`ecotax`'); $sql->from('product', 'p'); $sql->innerJoin('product_shop', 'product_shop', '(product_shop.id_product=p.id_product AND product_shop.id_shop = '.(int)$id_shop.')'); $sql->where('p.`id_product` = '.(int)$id_product); if (Combination::isFeatureActive()) { $sql->select('product_attribute_shop.id_product_attribute, product_attribute_shop.`price` AS attribute_price, product_attribute_shop.default_on'); $sql->leftJoin('product_attribute', 'pa', 'pa.`id_product` = p.`id_product`'); $sql->leftJoin('product_attribute_shop', 'product_attribute_shop', '(product_attribute_shop.id_product_attribute = pa.id_product_attribute AND product_attribute_shop.id_shop = '.(int)$id_shop.')'); } else $sql->select('0 as id_product_attribute'); $res = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS($sql); foreach ($res as $row) { $array_tmp = array( 'price' => $row['price'], 'ecotax' => $row['ecotax'], 'attribute_price' => (isset($row['attribute_price']) ? $row['attribute_price'] : null) ); self::$_pricesLevel2[$cache_id_2][(int)$row['id_product_attribute']] = $array_tmp; if (isset($row['default_on']) && $row['default_on'] == 1) self::$_pricesLevel2[$cache_id_2][0] = $array_tmp; } } if (!isset(self::$_pricesLevel2[$cache_id_2][(int)$id_product_attribute])) return; $result = self::$_pricesLevel2[$cache_id_2][(int)$id_product_attribute]; if (!$specific_price || $specific_price['price'] < 0) $price = (float)$result['price']; else $price = (float)$specific_price['price']; // convert only if the specific price is in the default currency (id_currency = 0) if (!$specific_price || !($specific_price['price'] >= 0 && $specific_price['id_currency'])) $price = Tools::convertPrice($price, $id_currency); /*// Attribute price if (is_array($result) && (!$specific_price || !$specific_price['id_product_attribute'] || $specific_price['price'] < 0)) { $attribute_price = Tools::convertPrice($result['attribute_price'] !== null ? (float)$result['attribute_price'] : 0, $id_currency); // If you want the default combination, please use NULL value instead if ($id_product_attribute !== false) $price += $attribute_price; }*/ // Tax $address->id_country = $id_country; $address->id_state = $id_state; $address->postcode = $zipcode; $tax_manager = TaxManagerFactory::getManager($address, Product::getIdTaxRulesGroupByIdProduct((int)$id_product, $context)); $product_tax_calculator = $tax_manager->getTaxCalculator(); // Add Tax if ($use_tax) $price = $product_tax_calculator->addTaxes($price); 3) Comment out this code: /*// Attribute price if (is_array($result) && (!$specific_price || !$specific_price['id_product_attribute'] || $specific_price['price'] < 0)) { $attribute_price = Tools::convertPrice($result['attribute_price'] !== null ? (float)$result['attribute_price'] : 0, $id_currency); // If you want the default combination, please use NULL value instead if ($id_product_attribute !== false) $price += $attribute_price; }*/ 4) Add the code that from step 3 after these lines (line:2719) // Add Tax if ($use_tax) $price = $product_tax_calculator->addTaxes($price); 5) So you get: // Add Tax if ($use_tax) $price = $product_tax_calculator->addTaxes($price); // NB! THE ATTRIBUTE PRICE MUST BE CALCULATED AFTER!!!!! TAXES WERE ADDED: // Attribute price if (is_array($result) && (!$specific_price || !$specific_price['id_product_attribute'] || $specific_price['price'] < 0)) { $attribute_price = Tools::convertPrice($result['attribute_price'] !== null ? (float)$result['attribute_price'] : 0, $id_currency); // If you want the default combination, please use NULL value instead if ($id_product_attribute !== false) $price += $attribute_price; } Hope it works. Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now