core/lib/Thelia/Action/TaxRule.php line 56

  1. <?php
  2. /*
  3.  * This file is part of the Thelia package.
  4.  * http://www.thelia.net
  5.  *
  6.  * (c) OpenStudio <info@thelia.net>
  7.  *
  8.  * For the full copyright and license information, please view the LICENSE
  9.  * file that was distributed with this source code.
  10.  */
  11. namespace Thelia\Action;
  12. use Propel\Runtime\ActiveQuery\Criteria;
  13. use Symfony\Component\EventDispatcher\EventDispatcherInterface;
  14. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  15. use Thelia\Core\Event\Tax\TaxRuleEvent;
  16. use Thelia\Core\Event\TheliaEvents;
  17. use Thelia\Model\TaxRule as TaxRuleModel;
  18. use Thelia\Model\TaxRuleCountry;
  19. use Thelia\Model\TaxRuleCountryQuery;
  20. use Thelia\Model\TaxRuleQuery;
  21. class TaxRule extends BaseAction implements EventSubscriberInterface
  22. {
  23.     public function create(TaxRuleEvent $event$eventNameEventDispatcherInterface $dispatcher): void
  24.     {
  25.         $taxRule = new TaxRuleModel();
  26.         $taxRule
  27.             ->setLocale($event->getLocale())
  28.             ->setTitle($event->getTitle())
  29.             ->setDescription($event->getDescription())
  30.         ;
  31.         $taxRule->save();
  32.         $event->setTaxRule($taxRule)->setId($taxRule->getId());
  33.     }
  34.     public function update(TaxRuleEvent $event$eventNameEventDispatcherInterface $dispatcher): void
  35.     {
  36.         if (null !== $taxRule TaxRuleQuery::create()->findPk($event->getId())) {
  37.             $taxRule
  38.                 ->setLocale($event->getLocale())
  39.                 ->setTitle($event->getTitle())
  40.                 ->setDescription($event->getDescription())
  41.                 ->save()
  42.             ;
  43.             $event->setTaxRule($taxRule);
  44.         }
  45.     }
  46.     public function updateTaxes(TaxRuleEvent $event): void
  47.     {
  48.         if (null !== $taxRule TaxRuleQuery::create()->findPk($event->getId())) {
  49.             $taxList $this->getArrayFromJson($event->getTaxList());
  50.             $countryList $this->getArrayFromJson22Compat($event->getCountryList());
  51.             $countryDeletedList $this->getArrayFromJson22Compat($event->getCountryDeletedList());
  52.             /* clean the current tax rule for the countries/states */
  53.             $deletes array_merge($countryList$countryDeletedList);
  54.             foreach ($deletes as $item) {
  55.                 TaxRuleCountryQuery::create()
  56.                     ->filterByTaxRule($taxRule)
  57.                     ->filterByCountryId((int) $item[0], Criteria::EQUAL)
  58.                     ->filterByStateId((int) $item[1] !== $item[1] : nullCriteria::EQUAL)
  59.                     ->delete();
  60.             }
  61.             /* for each country */
  62.             foreach ($countryList as $item) {
  63.                 $position 1;
  64.                 $countryId = (int) $item[0];
  65.                 $stateId = (int) $item[1];
  66.                 /* on applique les nouvelles regles */
  67.                 foreach ($taxList as $tax) {
  68.                     if (\is_array($tax)) {
  69.                         foreach ($tax as $samePositionTax) {
  70.                             $taxModel = new TaxRuleCountry();
  71.                             $taxModel->setTaxRule($taxRule)
  72.                                 ->setCountryId($countryId)
  73.                                 ->setStateId($stateId ?: null)
  74.                                 ->setTaxId($samePositionTax)
  75.                                 ->setPosition($position);
  76.                             $taxModel->save();
  77.                         }
  78.                     } else {
  79.                         $taxModel = new TaxRuleCountry();
  80.                         $taxModel->setTaxRule($taxRule)
  81.                             ->setCountryId($countryId)
  82.                             ->setStateId($stateId ?: null)
  83.                             ->setTaxId($tax)
  84.                             ->setPosition($position);
  85.                         $taxModel->save();
  86.                     }
  87.                     ++$position;
  88.                 }
  89.             }
  90.             $event->setTaxRule($taxRule);
  91.         }
  92.     }
  93.     protected function getArrayFromJson($obj)
  94.     {
  95.         if (null === $obj) {
  96.             $obj = [];
  97.         } else {
  98.             $obj \is_array($obj)
  99.                 ? $obj
  100.                 json_decode($objtrue);
  101.         }
  102.         return $obj;
  103.     }
  104.     /**
  105.      * This method ensures compatibility with the 2.2.x country arrays passed throught the TaxRuleEvent.
  106.      *
  107.      * In 2.2.x, the TaxRuleEvent::getXXXCountryList() methods returned an array of country IDs. [ country ID, country ID ...].
  108.      * From 2.3.0-alpha1, these functions are expected to return an array of arrays, each one containing a country ID and
  109.      * a state ID. [ [ country ID, state ID], [ country ID, state ID], ...].
  110.      *
  111.      * This method checks the $obj parameter, and create a 2.3.0-alpha1 compatible return value if $obj is expressed using
  112.      * the 2.2.x form.
  113.      *
  114.      * @param array $obj
  115.      *
  116.      * @return array
  117.      */
  118.     protected function getArrayFromJson22Compat($obj)
  119.     {
  120.         $obj $this->getArrayFromJson($obj);
  121.         if (isset($obj[0]) && !\is_array($obj[0])) {
  122.             $objEx = [];
  123.             foreach ($obj as $item) {
  124.                 $objEx[] = [$item0];
  125.             }
  126.             return $objEx;
  127.         }
  128.         return $obj;
  129.     }
  130.     public function delete(TaxRuleEvent $event): void
  131.     {
  132.         if (null !== $taxRule TaxRuleQuery::create()->findPk($event->getId())) {
  133.             $taxRule
  134.                 ->delete()
  135.             ;
  136.             $event->setTaxRule($taxRule);
  137.         }
  138.     }
  139.     public function setDefault(TaxRuleEvent $event): void
  140.     {
  141.         if (null !== $taxRule TaxRuleQuery::create()->findPk($event->getId())) {
  142.             TaxRuleQuery::create()->update([
  143.                 'IsDefault' => 0,
  144.             ]);
  145.             $taxRule->setIsDefault(1)->save();
  146.             $event->setTaxRule($taxRule);
  147.         }
  148.     }
  149.     /**
  150.      * {@inheritDoc}
  151.      */
  152.     public static function getSubscribedEvents()
  153.     {
  154.         return [
  155.             TheliaEvents::TAX_RULE_CREATE => ['create'128],
  156.             TheliaEvents::TAX_RULE_UPDATE => ['update'128],
  157.             TheliaEvents::TAX_RULE_TAXES_UPDATE => ['updateTaxes'128],
  158.             TheliaEvents::TAX_RULE_DELETE => ['delete'128],
  159.             TheliaEvents::TAX_RULE_SET_DEFAULT => ['setDefault'128],
  160.         ];
  161.     }
  162. }