we are moving forward : no more "make it magic"

This commit is contained in:
Etienne Roudeix
2013-11-28 17:12:33 +01:00
parent 81fa5a291c
commit fcde523b73
4 changed files with 67 additions and 9 deletions

View File

@@ -16,6 +16,7 @@ use Thelia\Core\Template\Element\LoopResultRow;
use Thelia\Core\Template\Loop\Argument\Argument; use Thelia\Core\Template\Loop\Argument\Argument;
use Thelia\Core\Template\Loop\Argument\ArgumentCollection; use Thelia\Core\Template\Loop\Argument\ArgumentCollection;
use Thelia\Model\CountryQuery; use Thelia\Model\CountryQuery;
use Thelia\TaxEngine\TaxEngine;
use Thelia\Type; use Thelia\Type;
class Cart extends BaseLoop implements ArraySearchLoopInterface class Cart extends BaseLoop implements ArraySearchLoopInterface
@@ -78,7 +79,7 @@ class Cart extends BaseLoop implements ArraySearchLoopInterface
public function parseResults(LoopResult $loopResult) 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) { foreach($loopResult->getResultDataCollection() as $cartItem) {
$product = $cartItem->getProduct(); $product = $cartItem->getProduct();

View File

@@ -42,6 +42,7 @@ use Thelia\Model\Map\ProductPriceTableMap;
use Thelia\Model\Map\ProductSaleElementsTableMap; use Thelia\Model\Map\ProductSaleElementsTableMap;
use Thelia\Model\Map\ProductTableMap; use Thelia\Model\Map\ProductTableMap;
use Thelia\Model\ProductQuery; use Thelia\Model\ProductQuery;
use Thelia\TaxEngine\TaxEngine;
use Thelia\Type\TypeCollection; use Thelia\Type\TypeCollection;
use Thelia\Type; use Thelia\Type;
@@ -464,7 +465,7 @@ class Product extends BaseI18nLoop implements PropelSearchLoopInterface, SearchL
return $this->parseComplex($loopResult); 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) { foreach ($loopResult->getResultDataCollection() as $product) {
@@ -979,7 +980,7 @@ class Product extends BaseI18nLoop implements PropelSearchLoopInterface, SearchL
{ {
$loopResult = new LoopResult($results); $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) { foreach ($loopResult->getResultDataCollection() as $product) {

View File

@@ -40,6 +40,7 @@ use Thelia\Model\OrderQuery;
use Thelia\Model\Product; use Thelia\Model\Product;
use Thelia\Model\ProductQuery; use Thelia\Model\ProductQuery;
use Thelia\Model\Tools\ModelCriteriaTools; use Thelia\Model\Tools\ModelCriteriaTools;
use Thelia\TaxEngine\TaxEngine;
use Thelia\Tools\DateTimeFormat; use Thelia\Tools\DateTimeFormat;
use Thelia\Cart\CartTrait; use Thelia\Cart\CartTrait;
@@ -181,10 +182,10 @@ class DataAccessFunctions extends AbstractSmartyPlugin
public function cartDataAccess($params, $smarty) public function cartDataAccess($params, $smarty)
{ {
if (array_key_exists('currentCountry', self::$dataAccessCache)) { if (array_key_exists('currentCountry', self::$dataAccessCache)) {
$currentCountry = self::$dataAccessCache['currentCountry']; $taxCountry = self::$dataAccessCache['currentCountry'];
} else { } else {
$currentCountry = CountryQuery::create()->findOneById(64); // @TODO : make it magic $taxCountry = TaxEngine::getInstance($this->request->getSession())->getTaxCountry();
self::$dataAccessCache['currentCountry'] = $currentCountry; self::$dataAccessCache['currentCountry'] = $taxCountry;
} }
$cart = $this->getCart($this->request); $cart = $this->getCart($this->request);
@@ -197,7 +198,7 @@ class DataAccessFunctions extends AbstractSmartyPlugin
$result = $cart->getTotalAmount(); $result = $cart->getTotalAmount();
break; break;
case "total_taxed_price": case "total_taxed_price":
$result = $cart->getTaxedAmount($currentCountry); $result = $cart->getTaxedAmount($taxCountry);
break; break;
} }

View File

@@ -22,6 +22,10 @@
/*************************************************************************************/ /*************************************************************************************/
namespace Thelia\TaxEngine; namespace Thelia\TaxEngine;
use Symfony\Component\HttpFoundation\Session\Session;
use Thelia\Model\AddressQuery;
use Thelia\Model\CountryQuery;
/** /**
* Class TaxEngine * Class TaxEngine
* @package Thelia\TaxEngine * @package Thelia\TaxEngine
@@ -29,9 +33,28 @@ namespace Thelia\TaxEngine;
*/ */
class 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() private function getTaxTypeDirectory()
@@ -68,4 +91,36 @@ class TaxEngine
return $typeList; 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;
}
} }