vendor/thelia/core/lib/Thelia/Action/Currency.php line 72

Open in your IDE?
  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 Symfony\Component\EventDispatcher\EventDispatcherInterface;
  13. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  14. use Thelia\Core\Event\Currency\CurrencyCreateEvent;
  15. use Thelia\Core\Event\Currency\CurrencyDeleteEvent;
  16. use Thelia\Core\Event\Currency\CurrencyUpdateEvent;
  17. use Thelia\Core\Event\Currency\CurrencyUpdateRateEvent;
  18. use Thelia\Core\Event\TheliaEvents;
  19. use Thelia\Core\Event\UpdatePositionEvent;
  20. use Thelia\Core\Translation\Translator;
  21. use Thelia\CurrencyConverter\CurrencyConverter;
  22. use Thelia\CurrencyConverter\Exception\CurrencyNotFoundException;
  23. use Thelia\Log\Tlog;
  24. use Thelia\Math\Number;
  25. use Thelia\Model\Currency as CurrencyModel;
  26. use Thelia\Model\CurrencyQuery;
  27. class Currency extends BaseAction implements EventSubscriberInterface
  28. {
  29.     /** @var CurrencyConverter */
  30.     protected $currencyConverter;
  31.     public function __construct(CurrencyConverter $currencyConverter)
  32.     {
  33.         $this->currencyConverter $currencyConverter;
  34.     }
  35.     /**
  36.      * Create a new currencyuration entry.
  37.      *
  38.      * @param $eventName
  39.      */
  40.     public function create(CurrencyCreateEvent $event$eventNameEventDispatcherInterface $dispatcher): void
  41.     {
  42.         $currency = new CurrencyModel();
  43.         $isDefault CurrencyQuery::create()->count() === 0;
  44.         $currency
  45.             ->setLocale($event->getLocale())
  46.             ->setName($event->getCurrencyName())
  47.             ->setSymbol($event->getSymbol())
  48.             ->setFormat($event->getFormat())
  49.             ->setRate($event->getRate())
  50.             ->setCode(strtoupper($event->getCode()))
  51.             ->setByDefault($isDefault)
  52.             ->save()
  53.         ;
  54.         $event->setCurrency($currency);
  55.     }
  56.     /**
  57.      * Change a currency.
  58.      *
  59.      * @param $eventName
  60.      */
  61.     public function update(CurrencyUpdateEvent $event$eventNameEventDispatcherInterface $dispatcher): void
  62.     {
  63.         if (null !== $currency CurrencyQuery::create()->findPk($event->getCurrencyId())) {
  64.             $currency
  65.                 ->setLocale($event->getLocale())
  66.                 ->setName($event->getCurrencyName())
  67.                 ->setSymbol($event->getSymbol())
  68.                 ->setFormat($event->getFormat())
  69.                 ->setRate($event->getRate())
  70.                 ->setCode(strtoupper($event->getCode()))
  71.                 ->save();
  72.             $event->setCurrency($currency);
  73.         }
  74.     }
  75.     /**
  76.      * Set the default currency.
  77.      *
  78.      * @param $eventName
  79.      */
  80.     public function setDefault(CurrencyUpdateEvent $event$eventNameEventDispatcherInterface $dispatcher): void
  81.     {
  82.         if (null !== $currency CurrencyQuery::create()->findPk($event->getCurrencyId())) {
  83.             // Reset default status
  84.             CurrencyQuery::create()->filterByByDefault(true)->update(['ByDefault' => false]);
  85.             $currency
  86.                 ->setVisible($event->getVisible())
  87.                 ->setByDefault($event->getIsDefault())
  88.                 ->save()
  89.             ;
  90.             // Update rates when setting a new default currency
  91.             if ($event->getIsDefault()) {
  92.                 $updateRateEvent = new CurrencyUpdateRateEvent();
  93.                 $dispatcher->dispatch($updateRateEventTheliaEvents::CURRENCY_UPDATE_RATES);
  94.             }
  95.             $event->setCurrency($currency);
  96.         }
  97.     }
  98.     public function setVisible(CurrencyUpdateEvent $event): void
  99.     {
  100.         if (null !== $currency CurrencyQuery::create()->findPk($event->getCurrencyId())) {
  101.             if (!$currency->getByDefault()) {
  102.                 $currency->setVisible($event->getVisible())->save();
  103.             }
  104.         }
  105.     }
  106.     /**
  107.      * Delete a currencyuration entry.
  108.      *
  109.      * @param $eventName
  110.      */
  111.     public function delete(CurrencyDeleteEvent $event$eventNameEventDispatcherInterface $dispatcher): void
  112.     {
  113.         if (null !== ($currency CurrencyQuery::create()->findPk($event->getCurrencyId()))) {
  114.             if ($currency->getByDefault()) {
  115.                 throw new \RuntimeException(
  116.                     Translator::getInstance()->trans('It is not allowed to delete the default currency')
  117.                 );
  118.             }
  119.             $currency
  120.                 ->delete()
  121.             ;
  122.             $event->setCurrency($currency);
  123.         }
  124.     }
  125.     public function updateRates(CurrencyUpdateRateEvent $event): void
  126.     {
  127.         if (null === $defaultCurrency CurrencyQuery::create()->findOneByByDefault(true)) {
  128.             throw new \RuntimeException('Unable to find a default currency, please define a default currency.');
  129.         }
  130.         $defaultCurrency->setRate(1)->save();
  131.         $currencies CurrencyQuery::create()->filterByByDefault(false);
  132.         $baseValue = new Number('1');
  133.         /** @var \Thelia\Model\Currency $currency */
  134.         foreach ($currencies as $currency) {
  135.             try {
  136.                 $rate $this->currencyConverter
  137.                     ->from($defaultCurrency->getCode())
  138.                     ->to($currency->getCode())
  139.                     ->convert($baseValue);
  140.                 $currency->setRate($rate->getNumber(-1))->save();
  141.             } catch (CurrencyNotFoundException $ex) {
  142.                 Tlog::getInstance()->addError(
  143.                     sprintf('Unable to find exchange rate for currency %s, ID %d'$currency->getCode(), $currency->getId())
  144.                 );
  145.                 $event->addUndefinedRate($currency->getId());
  146.             }
  147.         }
  148.     }
  149.     /**
  150.      * Changes position, selecting absolute ou relative change.
  151.      */
  152.     public function updatePosition(UpdatePositionEvent $eventstring $eventNameEventDispatcherInterface $dispatcher): void
  153.     {
  154.         $this->genericUpdatePosition(CurrencyQuery::create(), $event$dispatcher);
  155.     }
  156.     /**
  157.      * {@inheritDoc}
  158.      */
  159.     public static function getSubscribedEvents()
  160.     {
  161.         return [
  162.             TheliaEvents::CURRENCY_CREATE => ['create'128],
  163.             TheliaEvents::CURRENCY_UPDATE => ['update'128],
  164.             TheliaEvents::CURRENCY_DELETE => ['delete'128],
  165.             TheliaEvents::CURRENCY_SET_DEFAULT => ['setDefault'128],
  166.             TheliaEvents::CURRENCY_SET_VISIBLE => ['setVisible'128],
  167.             TheliaEvents::CURRENCY_UPDATE_RATES => ['updateRates'128],
  168.             TheliaEvents::CURRENCY_UPDATE_POSITION => ['updatePosition'128],
  169.         ];
  170.     }
  171. }