* @copyright 2007-2011 PrestaShop SA * @version Release: $Revision$ * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) * International Registered Trademark & Property of PrestaShop SA */ /** * @since 1.5.0 * * TaxCaculator is responsible of the tax computation */ class TaxCalculatorCore { /** * COMBINE_METHOD sum taxes * eg: 100€ * (10% + 15%) */ const COMBINE_METHOD = 1; /** * ONE_AFTER_ANOTHER_METHOD apply taxes one after another * eg: (100€ * 10%) * 15% */ const ONE_AFTER_ANOTHER_METHOD = 2; /** * @var array $taxes_rate */ public $taxes_rate; /** * @var int $computation_method (COMBINE_METHOD | ONE_AFTER_ANOTHER_METHOD) */ public $computation_method; /** * @param array $taxes_rate * @param int $computation_method (COMBINE_METHOD | ONE_AFTER_ANOTHER_METHOD) */ public function __construct(array $taxes_rate, $computation_method = TaxCalculator::COMBINE_METHOD) { $this->taxes_rate = $taxes_rate; $this->computation_method = (int)$computation_method; } /** * Compute and add the taxes to the specified price * * @param price * @return price with taxes */ public function addTaxes($price) { $total_price = $price; if ($this->computation_method == TaxCalculator::ONE_AFTER_ANOTHER_METHOD) { foreach ($this->taxes_rate as $tax_rate) $total_price = $total_price * (1 + abs($tax_rate) / 100); } else { foreach ($this->taxes_rate as $tax_rate) { if ($tax_rate != 0) $total_price = $total_price + ($price * (abs($tax_rate) / 100)); } } return $total_price; } /** * Compute and remove the taxes to the specified price * * @param price * @return price without taxes */ public function removeTaxes($price) { $total_price = $price; if ($this->computation_method == TaxCalculator::ONE_AFTER_ANOTHER_METHOD) { foreach ($this->taxes_rate as $tax_rate) $total_price = $total_price / (1 + abs($tax_rate) / 100); } else { $taxes_rate = 0; foreach ($this->taxes_rate as $tax_rate) $taxes_rate += abs($tax_rate); $total_price = $total_price / (1 + (abs($taxes_rate) / 100)); } return $total_price; } /** * @return total taxes rate */ public function getTaxesRate() { $taxes_rate = 0; if ($this->computation_method == TaxCalculator::ONE_AFTER_ANOTHER_METHOD) { $taxes_rate = 1; foreach ($this->taxes_rate as $rate) $taxes_rate *= (1 + (abs($rate) / 100)); $taxes_rate = $taxes_rate - 1; $taxes_rate = $taxes_rate * 100; } else { foreach ($this->taxes_rate as $rate) $taxes_rate += abs($rate); } return $taxes_rate; } }