diff --git a/core/lib/Thelia/Config/Resources/config.xml b/core/lib/Thelia/Config/Resources/config.xml index 706c2f84d..71ecede6e 100755 --- a/core/lib/Thelia/Config/Resources/config.xml +++ b/core/lib/Thelia/Config/Resources/config.xml @@ -45,7 +45,9 @@ + + diff --git a/core/lib/Thelia/Core/Template/Loop/Tax.php b/core/lib/Thelia/Core/Template/Loop/Tax.php new file mode 100644 index 000000000..1ddf18824 --- /dev/null +++ b/core/lib/Thelia/Core/Template/Loop/Tax.php @@ -0,0 +1,167 @@ +. */ +/* */ +/*************************************************************************************/ + +namespace Thelia\Core\Template\Loop; + +use Propel\Runtime\ActiveQuery\Criteria; +use Thelia\Core\Template\Element\BaseI18nLoop; +use Thelia\Core\Template\Element\LoopResult; +use Thelia\Core\Template\Element\LoopResultRow; + +use Thelia\Core\Template\Loop\Argument\ArgumentCollection; +use Thelia\Core\Template\Loop\Argument\Argument; + +use Thelia\Model\Base\TaxRuleCountryQuery; +use Thelia\Type\TypeCollection; +use Thelia\Type; +use Thelia\Model\TaxQuery; + +/** + * + * Tax loop + * + * + * Class Tax + * @package Thelia\Core\Template\Loop + * @author Etienne Roudeix + */ +class Tax extends BaseI18nLoop +{ + public $timestampable = true; + + /** + * @return ArgumentCollection + */ + protected function getArgDefinitions() + { + return new ArgumentCollection( + Argument::createIntListTypeArgument('id'), + Argument::createIntListTypeArgument('exclude'), + Argument::createIntListTypeArgument('tax_rule'), + Argument::createIntListTypeArgument('exclude_tax_rule'), + Argument::createIntTypeArgument('country'), + new Argument( + 'order', + new TypeCollection( + new Type\EnumListType(array('id', 'id_reverse', 'alpha', 'alpha_reverse')) + ), + 'alpha' + ) + ); + } + + /** + * @param $pagination + * + * @return \Thelia\Core\Template\Element\LoopResult + */ + public function exec(&$pagination) + { + $search = TaxQuery::create(); + + /* manage translations */ + $locale = $this->configureI18nProcessing($search, array('TITLE', 'DESCRIPTION')); + + $id = $this->getId(); + + if (null !== $id) { + $search->filterById($id, Criteria::IN); + } + + $exclude = $this->getExclude(); + + if (null !== $exclude) { + $search->filterById($exclude, Criteria::NOT_IN); + } + + $country = $this->getCountry(); + + $taxRule = $this->getTax_rule(); + if(null !== $taxRule && null !== $country) { + $search->filterByTaxRuleCountry( + TaxRuleCountryQuery::create() + ->filterByCountryId($country, Criteria::EQUAL) + ->filterByTaxRuleId($taxRule, Criteria::IN) + ->find(), + Criteria::IN + ); + } + + $excludeTaxRule = $this->getExclude_tax_rule(); + if(null !== $excludeTaxRule && null !== $country) { + $excludedTaxes = TaxRuleCountryQuery::create() + ->filterByCountryId($country, Criteria::EQUAL) + ->filterByTaxRuleId($excludeTaxRule, Criteria::IN) + ->find(); + /*DOES NOT WORK + * $search->filterByTaxRuleCountry( + $excludedTaxes, + Criteria::NOT_IN + );*/ + foreach($excludedTaxes as $excludedTax) { + $search->filterByTaxRuleCountry($excludedTax, Criteria::NOT_EQUAL); + } + } + + $orders = $this->getOrder(); + + foreach ($orders as $order) { + switch ($order) { + case "id": + $search->orderById(Criteria::ASC); + break; + case "id_reverse": + $search->orderById(Criteria::DESC); + break; + case "alpha": + $search->addAscendingOrderByColumn('i18n_TITLE'); + break; + case "alpha_reverse": + $search->addDescendingOrderByColumn('i18n_TITLE'); + break; + } + } + + /* perform search */ + $taxes = $this->search($search, $pagination); + + $loopResult = new LoopResult($taxes); + + foreach ($taxes as $tax) { + + $loopResultRow = new LoopResultRow($loopResult, $tax, $this->versionable, $this->timestampable, $this->countable); + + $loopResultRow + ->set("ID" , $tax->getId()) + ->set("IS_TRANSLATED" , $tax->getVirtualColumn('IS_TRANSLATED')) + ->set("LOCALE" , $locale) + ->set("TITLE" , $tax->getVirtualColumn('i18n_TITLE')) + ->set("DESCRIPTION" , $tax->getVirtualColumn('i18n_DESCRIPTION')) + ; + + $loopResult->addRow($loopResultRow); + } + + return $loopResult; + } +} diff --git a/core/lib/Thelia/Core/Template/Loop/TaxRuleCountry.php b/core/lib/Thelia/Core/Template/Loop/TaxRuleCountry.php new file mode 100644 index 000000000..57174759e --- /dev/null +++ b/core/lib/Thelia/Core/Template/Loop/TaxRuleCountry.php @@ -0,0 +1,160 @@ +. */ +/* */ +/*************************************************************************************/ + +namespace Thelia\Core\Template\Loop; + +use Propel\Runtime\ActiveQuery\Criteria; +use Propel\Runtime\ActiveQuery\Join; +use Thelia\Core\Template\Element\BaseI18nLoop; +use Thelia\Core\Template\Element\LoopResult; +use Thelia\Core\Template\Element\LoopResultRow; + +use Thelia\Core\Template\Loop\Argument\ArgumentCollection; +use Thelia\Core\Template\Loop\Argument\Argument; + +use Thelia\Model\Map\CountryTableMap; +use Thelia\Model\Map\TaxRuleCountryTableMap; +use Thelia\Model\Map\TaxTableMap; +use Thelia\Type\TypeCollection; +use Thelia\Type; +use Thelia\Model\TaxRuleCountryQuery; + +/** + * + * TaxRuleCountry loop + * + * + * Class TaxRuleCountry + * @package Thelia\Core\Template\Loop + * @author Etienne Roudeix + */ +class TaxRuleCountry extends BaseI18nLoop +{ + public $timestampable = true; + + /** + * @return ArgumentCollection + */ + protected function getArgDefinitions() + { + return new ArgumentCollection( + Argument::createIntTypeArgument('country'), + Argument::createIntListTypeArgument('taxes'), + Argument::createIntTypeArgument('tax_rule', null, true) + ); + } + + /** + * @param $pagination + * + * @return \Thelia\Core\Template\Element\LoopResult + */ + public function exec(&$pagination) + { + $search = TaxRuleCountryQuery::create(); + + $country = $this->getCountry(); + $taxes = $this->getTaxes(); + + if((null === $country && null === $taxes) || (null !== $country && null !== $taxes)) { + throw new \InvalidArgumentException('You must provide either `country` or `taxes` parameter in tax-rule-country loop'); + } + + if(null !== $country) { + $search->filterByCountryId($country); + + /* manage tax translation */ + $this->configureI18nProcessing( + $search, + array('TITLE', 'DESCRIPTION'), + TaxTableMap::TABLE_NAME, + 'TAX_ID' + ); + } + + if(null !== $taxes) { + $search->groupByCountryId(); + + $originalCountryJoin = new Join(); + $originalCountryJoin->addExplicitCondition(TaxRuleCountryTableMap::TABLE_NAME, 'TAX_RULE_ID', null, TaxRuleCountryTableMap::TABLE_NAME, 'TAX_RULE_ID', 'origin'); + $originalCountryJoin->addExplicitCondition(TaxRuleCountryTableMap::TABLE_NAME, 'TAX_ID', null, TaxRuleCountryTableMap::TABLE_NAME, 'TAX_ID', 'origin'); + $originalCountryJoin->addExplicitCondition(TaxRuleCountryTableMap::TABLE_NAME, 'POSITION', null, TaxRuleCountryTableMap::TABLE_NAME, 'POSITION', 'origin'); + $originalCountryJoin->addExplicitCondition(TaxRuleCountryTableMap::TABLE_NAME, 'COUNTRY_ID', null, TaxRuleCountryTableMap::TABLE_NAME, 'COUNTRY_ID', 'origin', Criteria::NOT_EQUAL); + $originalCountryJoin->setJoinType(Criteria::LEFT_JOIN); + + $search->addJoinObject($originalCountryJoin, 's_to_o'); + $search->where('`origin`.`COUNTRY_ID`' . Criteria::EQUAL . '?', 64, \PDO::PARAM_INT); + + $search->having('COUNT(*)=?', count($taxes), \PDO::PARAM_INT); + + /* manage tax translation */ + $this->configureI18nProcessing( + $search, + array('TITLE', 'CHAPO', 'DESCRIPTION', 'POSTSCRIPTUM'), + CountryTableMap::TABLE_NAME, + 'COUNTRY_ID' + ); + } + + $taxRule = $this->getTax_rule(); + $search->filterByTaxRuleId($taxRule); + + $search->orderByPosition(Criteria::ASC); + + /* perform search */ + $taxRuleCountries = $this->search($search, $pagination); + + $loopResult = new LoopResult($taxRuleCountries); + + foreach ($taxRuleCountries as $taxRuleCountry) { + + $loopResultRow = new LoopResultRow($loopResult, $taxRuleCountry, $this->versionable, $this->timestampable, $this->countable); + + if(null !== $country) { + $loopResultRow + ->set("TAX_RULE" , $taxRuleCountry->getTaxRuleId()) + ->set("COUNTRY" , $taxRuleCountry->getCountryId()) + ->set("TAX" , $taxRuleCountry->getTaxId()) + ->set("POSITION" , $taxRuleCountry->getPosition()) + ->set("TAX_TITLE" , $taxRuleCountry->getVirtualColumn(TaxTableMap::TABLE_NAME . '_i18n_TITLE')) + ->set("TAX_DESCRIPTION" , $taxRuleCountry->getVirtualColumn(TaxTableMap::TABLE_NAME . '_i18n_DESCRIPTION')) + ; + } + + if(null !== $taxes) { + $loopResultRow + ->set("TAX_RULE" , $taxRuleCountry->getTaxRuleId()) + ->set("COUNTRY" , $taxRuleCountry->getCountryId()) + ->set("COUNTRY_TITLE" , $taxRuleCountry->getVirtualColumn(CountryTableMap::TABLE_NAME . '_i18n_TITLE')) + ->set("COUNTRY_CHAPO" , $taxRuleCountry->getVirtualColumn(CountryTableMap::TABLE_NAME . '_i18n_CHAPO')) + ->set("COUNTRY_DESCRIPTION" , $taxRuleCountry->getVirtualColumn(CountryTableMap::TABLE_NAME . '_i18n_DESCRIPTION')) + ->set("COUNTRY_POSTSCRIPTUM" , $taxRuleCountry->getVirtualColumn(CountryTableMap::TABLE_NAME . '_i18n_POSTSCRIPTUM')) + ; + } + + $loopResult->addRow($loopResultRow); + } + + return $loopResult; + } +} diff --git a/install/insert.sql b/install/insert.sql index ec88c0866..8e6585a5b 100755 --- a/install/insert.sql +++ b/install/insert.sql @@ -1172,8 +1172,8 @@ INSERT INTO `tax_rule_i18n` (`id`, `locale`, `title`) INSERT INTO `tax_rule_country` (`tax_rule_id`, `country_id`, `tax_id`, `position`, `created_at`, `updated_at`) VALUES - (1, 64, 1, 2, NOW(), NOW()), - (2, 64, 2, 2, NOW(), NOW()); + (1, 64, 1, 1, NOW(), NOW()), + (2, 64, 2, 1, NOW(), NOW()); INSERT INTO `order_status`(`id`, `code`, `created_at`, `updated_at`) VALUES (1, 'not_paid', NOW(), NOW()), diff --git a/templates/admin/default/tax-rule-edit.html b/templates/admin/default/tax-rule-edit.html index a953ed19d..ac2537c96 100644 --- a/templates/admin/default/tax-rule-edit.html +++ b/templates/admin/default/tax-rule-edit.html @@ -7,7 +7,7 @@ {block name="main-content"} {assign oder_tab {$smarty.get.tab|default:"data"}} -{assign asked_country {$smarty.get.country|default:{country ask="default" attr="isoalpha3"}}} +{assign asked_country {$smarty.get.country|default:{country ask="default" attr="id"}}}
@@ -107,16 +107,21 @@

{intl l="Countries that have the same tax rule"} :

- Italy - England - Japan + + {loop type="tax-rule-country" name="same-country-list" tax_rule=$ID taxes="1,2,3"} + {$COUNTRY_TITLE} + {/loop} + + {elseloop rel="same-country-list"} + {intl l="NONE"} + {/elseloop}

@@ -124,16 +129,29 @@
-

Create a tax rule

+

{intl l="Manage the tax rule taxes appliance order"}

- + {assign lastPosition 0} + {loop type="tax-rule-country" name="existing-tax-list" tax_rule=$ID country=$asked_country} + {if $POSITION != $lastPosition} + {assign lastPosition $POSITION} + {if $LOOP_COUNT > 1} +
+ {/if}

{intl l="Add tax to this group"}

+ {/if} + +
{$TAX_TITLE} - {$POSITION}
+ + {if $LOOP_COUNT == $LOOP_TOTAL}
+ {/if} + {/loop}