src/WellCommerce/Bundle/NotificationBundle/EventListener/SmsApiSubscriber.php line 47

Open in your IDE?
  1. <?php
  2. declare(strict_types=0);
  3. /*
  4.  * WellCommerce Foundation
  5.  *
  6.  * This file is part of the WellCommerce package.
  7.  *
  8.  * (c) Adam Piotrowski <adam@wellcommerce.org>, Adrian Potepa <adrian@wellcommerce.org>
  9.  *
  10.  * For the full copyright and license information,
  11.  * please view the LICENSE file that was distributed with this source code.
  12.  */
  13. namespace WellCommerce\Bundle\NotificationBundle\EventListener;
  14. use Behat\Transliterator\Transliterator;
  15. use Smsapi\Client\Feature\Sms\Bag\SendSmsBag;
  16. use Smsapi\Client\SmsapiHttpClient;
  17. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  18. use WellCommerce\Bundle\AppBundle\Entity\Shop;
  19. use WellCommerce\Bundle\CoreBundle\DependencyInjection\AbstractServiceSubscriber;
  20. use WellCommerce\Bundle\CoreBundle\Doctrine\Event\EntityEvent;
  21. use WellCommerce\Bundle\OrderBundle\Entity\OrderStatus;
  22. use WellCommerce\Bundle\OrderBundle\Entity\OrderStatusHistory;
  23. use WellCommerce\Component\Form\Conditions\Equals;
  24. use WellCommerce\Component\Form\Event\FormEvent;
  25. /**
  26.  * Class SmsApiSubscriber
  27.  *
  28.  * @author  Adam Piotrowski <adam@wellcommerce.org>
  29.  */
  30. class SmsApiSubscriber extends AbstractServiceSubscriber implements EventSubscriberInterface
  31. {
  32.     public static function getSubscribedEvents()
  33.     {
  34.         return [
  35.             'admin.shop.pre_form_init'                 => ['onShopFormAdminInit'],
  36.             'admin.order_status.pre_form_init'         => ['onOrderStatusFormAdminInit'],
  37.             'admin.order_status_history.pre_form_init' => ['onOrderStatusHistoryFormAdminInit'],
  38.             'order_status_history.post_create'         => ['onOrderStatusHistoryCreated'0],
  39.         ];
  40.     }
  41.     public function onOrderStatusHistoryFormAdminInit(FormEvent $event)
  42.     {
  43.         $resource $event->getResource();
  44.         if ($resource instanceof OrderStatusHistory) {
  45.             $form     $event->getForm();
  46.             $builder  $event->getFormBuilder();
  47.             $fieldset $form->getChildren()->get('status_data');
  48.             $order    $resource->getOrder();
  49.             $shop     $order->getShop();
  50.             if ($shop->getSmsApiToken() !== '') {
  51.                 $notify $fieldset->addChild($builder->getElement('checkbox', [
  52.                     'name'  => 'smsApiNotify',
  53.                     'label' => 'sms_api.label.notify',
  54.                 ]));
  55.                 $fieldset->addChild($builder->getElement('text_area', [
  56.                     'name'         => 'smsApiComment',
  57.                     'rows'         => 3,
  58.                     'label'        => 'sms_api.label.comment',
  59.                     'dependencies' => [
  60.                         $builder->getDependency('show', [
  61.                             'form'      => $form,
  62.                             'field'     => $notify,
  63.                             'condition' => new Equals(1),
  64.                         ]),
  65.                     ],
  66.                 ]));
  67.             }
  68.         }
  69.     }
  70.     public function onOrderStatusFormAdminInit(FormEvent $event)
  71.     {
  72.         $resource $event->getResource();
  73.         if ($resource instanceof OrderStatus) {
  74.             $form    $event->getForm();
  75.             $builder $event->getFormBuilder();
  76.             $shop    $this->getShopStorage()->getCurrentShop();
  77.             if ($shop->getSmsApiToken() !== '') {
  78.                 $smsApiData $form->addChild($builder->getElement('nested_fieldset', [
  79.                     'name'  => 'sms_api_data',
  80.                     'label' => 'sms_api.fieldset.settings',
  81.                 ]));
  82.                 $smsApiData->addChild($builder->getElement('tip', [
  83.                     'name' => 'smsApiCommentTip',
  84.                     'tip'  => 'Możesz używać dodatkowych znaczników w treści SMS.
  85.                                 <ul>
  86.                                     <li><strong>[[ FIRST_NAME ]]</strong> - imię klienta</li>
  87.                                     <li><strong>[[ ORDER_NUMBER ]]</strong> - numer zamówienia</li>
  88.                                     <li><strong>[[ TRACKING_LINK ]]</strong> - link do śledzenia przesyłki</li>
  89.                                 </ul>
  90.                     ',
  91.                 ]));
  92.                 $smsApiData->addChild($builder->getElement('text_area', [
  93.                     'name'  => 'smsApiComment',
  94.                     'label' => 'sms_api.label.comment',
  95.                 ]));
  96.             }
  97.         }
  98.     }
  99.     public function onShopFormAdminInit(FormEvent $event)
  100.     {
  101.         $resource $event->getResource();
  102.         if ($resource instanceof Shop) {
  103.             $form    $event->getForm();
  104.             $builder $event->getFormBuilder();
  105.             $smsApiData $form->addChild($builder->getElement('nested_fieldset', [
  106.                 'name'  => 'sms_api_data',
  107.                 'label' => 'sms_api.fieldset.settings',
  108.             ]));
  109.             $smsApiData->addChild($builder->getElement('text_field', [
  110.                 'name'  => 'smsApiToken',
  111.                 'label' => 'API Token',
  112.             ]));
  113.             $smsApiData->addChild($builder->getElement('text_field', [
  114.                 'name'  => 'smsApiSender',
  115.                 'label' => 'Nadawca SMS',
  116.             ]));
  117.         }
  118.     }
  119.     public function onOrderStatusHistoryCreated(EntityEvent $event)
  120.     {
  121.         $history $event->getEntity();
  122.         if ($history instanceof OrderStatusHistory) {
  123.             $order $history->getOrder();
  124.             if (true === (bool) $history->isSmsApiNotify()) {
  125.                 try {
  126.                     $shop        $order->getShop();
  127.                     $phoneNumber $order->getContactDetails()->getPhone();
  128.                     $message     $this->getSmsMessage($history);
  129.                     $apiToken    $shop->getSmsApiToken();
  130.                     $sms       SendSmsBag::withMessage($phoneNumber$message);
  131.                     $sms->from $shop->getSmsApiSender();
  132.                     $service   = (new SmsapiHttpClient())->smsapiPlService($apiToken);
  133.                     $response  $service->smsFeature()->sendSms($sms);
  134.                 } catch (\Exception $e) {
  135.                 }
  136.             }
  137.         }
  138.     }
  139.     private function getSmsMessage(OrderStatusHistory $history): string
  140.     {
  141.         if (strlen($history->getSmsApiComment())) {
  142.             $message $history->getSmsApiComment();
  143.         } else {
  144.             $message sprintf(
  145.                 'Status zamowienia %s to %s',
  146.                 $history->getOrder()->getNumber(),
  147.                 $history->getOrderStatus()->translate()->getName()
  148.             );
  149.         }
  150.         return Transliterator::unaccent($message);
  151.     }
  152. }