diff --git a/core/lib/Thelia/Core/Template/Loop/Cart.php b/core/lib/Thelia/Core/Template/Loop/Cart.php index b2121757a..fdabe26c8 100755 --- a/core/lib/Thelia/Core/Template/Loop/Cart.php +++ b/core/lib/Thelia/Core/Template/Loop/Cart.php @@ -16,6 +16,7 @@ use Thelia\Core\Template\Element\LoopResultRow; use Thelia\Core\Template\Loop\Argument\Argument; use Thelia\Core\Template\Loop\Argument\ArgumentCollection; use Thelia\Model\CountryQuery; +use Thelia\TaxEngine\TaxEngine; use Thelia\Type; class Cart extends BaseLoop implements ArraySearchLoopInterface @@ -78,7 +79,7 @@ class Cart extends BaseLoop implements ArraySearchLoopInterface public function parseResults(LoopResult $loopResult) { - $taxCountry = CountryQuery::create()->findPk(64); // @TODO : make it magic; + $taxCountry = TaxEngine::getInstance($this->request->getSession())->getTaxCountry(); foreach($loopResult->getResultDataCollection() as $cartItem) { $product = $cartItem->getProduct(); diff --git a/core/lib/Thelia/Core/Template/Loop/Product.php b/core/lib/Thelia/Core/Template/Loop/Product.php index 09aff4479..031a37560 100755 --- a/core/lib/Thelia/Core/Template/Loop/Product.php +++ b/core/lib/Thelia/Core/Template/Loop/Product.php @@ -42,6 +42,7 @@ use Thelia\Model\Map\ProductPriceTableMap; use Thelia\Model\Map\ProductSaleElementsTableMap; use Thelia\Model\Map\ProductTableMap; use Thelia\Model\ProductQuery; +use Thelia\TaxEngine\TaxEngine; use Thelia\Type\TypeCollection; use Thelia\Type; @@ -464,7 +465,7 @@ class Product extends BaseI18nLoop implements PropelSearchLoopInterface, SearchL return $this->parseComplex($loopResult); } - $taxCountry = CountryQuery::create()->findPk(64); // @TODO : make it magic + $taxCountry = TaxEngine::getInstance($this->request->getSession())->getTaxCountry(); foreach ($loopResult->getResultDataCollection() as $product) { @@ -979,7 +980,7 @@ class Product extends BaseI18nLoop implements PropelSearchLoopInterface, SearchL { $loopResult = new LoopResult($results); - $taxCountry = CountryQuery::create()->findPk(64); // @TODO : make it magic + $taxCountry = TaxEngine::getInstance($this->request->getSession())->getTaxCountry(); foreach ($loopResult->getResultDataCollection() as $product) { diff --git a/core/lib/Thelia/Core/Template/Smarty/Plugins/DataAccessFunctions.php b/core/lib/Thelia/Core/Template/Smarty/Plugins/DataAccessFunctions.php index 8cea3c60d..0c38ed899 100755 --- a/core/lib/Thelia/Core/Template/Smarty/Plugins/DataAccessFunctions.php +++ b/core/lib/Thelia/Core/Template/Smarty/Plugins/DataAccessFunctions.php @@ -40,6 +40,7 @@ use Thelia\Model\OrderQuery; use Thelia\Model\Product; use Thelia\Model\ProductQuery; use Thelia\Model\Tools\ModelCriteriaTools; +use Thelia\TaxEngine\TaxEngine; use Thelia\Tools\DateTimeFormat; use Thelia\Cart\CartTrait; @@ -181,10 +182,10 @@ class DataAccessFunctions extends AbstractSmartyPlugin public function cartDataAccess($params, $smarty) { if (array_key_exists('currentCountry', self::$dataAccessCache)) { - $currentCountry = self::$dataAccessCache['currentCountry']; + $taxCountry = self::$dataAccessCache['currentCountry']; } else { - $currentCountry = CountryQuery::create()->findOneById(64); // @TODO : make it magic - self::$dataAccessCache['currentCountry'] = $currentCountry; + $taxCountry = TaxEngine::getInstance($this->request->getSession())->getTaxCountry(); + self::$dataAccessCache['currentCountry'] = $taxCountry; } $cart = $this->getCart($this->request); @@ -197,7 +198,7 @@ class DataAccessFunctions extends AbstractSmartyPlugin $result = $cart->getTotalAmount(); break; case "total_taxed_price": - $result = $cart->getTaxedAmount($currentCountry); + $result = $cart->getTaxedAmount($taxCountry); break; } diff --git a/core/lib/Thelia/TaxEngine/TaxEngine.php b/core/lib/Thelia/TaxEngine/TaxEngine.php index 8e5a5695a..547cac9bd 100755 --- a/core/lib/Thelia/TaxEngine/TaxEngine.php +++ b/core/lib/Thelia/TaxEngine/TaxEngine.php @@ -22,6 +22,10 @@ /*************************************************************************************/ namespace Thelia\TaxEngine; +use Symfony\Component\HttpFoundation\Session\Session; +use Thelia\Model\AddressQuery; +use Thelia\Model\CountryQuery; + /** * Class TaxEngine * @package Thelia\TaxEngine @@ -29,9 +33,28 @@ namespace Thelia\TaxEngine; */ class TaxEngine { - static public function getInstance() + protected static $instance = null; + + protected static $taxCountry = null; + + /** + * @var Session $session + */ + protected $session = null; + + static public function getInstance(Session $session) { - return new TaxEngine(); + if(null === self::$instance) { + self::$instance = new TaxEngine(); + } + + self::$instance->setSession($session); + return self::$instance; + } + + protected function setSession(Session $session) + { + $this->session = $session; } private function getTaxTypeDirectory() @@ -68,4 +91,36 @@ class TaxEngine return $typeList; } + + /** + * Find Tax Country Id + * First look for a picked delivery address country + * Then look at the current customer default address country + * Else look at the default website country + * + * @param bool $force result is static cached ; even if a below parameter change between 2 calls, we need to keep coherent results. but you can force it. + * @return null|TaxEngine + */ + public function getTaxCountry($force = false) + { + if(false === $force || null === self::$taxCountry) { + /* is there a logged in customer ? */ + if(null !== $customer = $this->session->getCustomerUser()) { + if (null !== $this->session->getOrder() + && null !== $this->session->getOrder()->chosenDeliveryAddress + && null !== $currentDeliveryAddress = AddressQuery::create()->findPk($this->session->getOrder()->chosenDeliveryAddress)) { + $taxCountry = $currentDeliveryAddress->getCountry(); + } else { + $customerDefaultAddress = $customer->getDefaultAddress(); + $taxCountry = $customerDefaultAddress->getCountry(); + } + } else { + $taxCountry = CountryQuery::create()->findOneByByDefault(1); + } + + self::$taxCountry = $taxCountry; + } + + return self::$taxCountry; + } }