<?php
declare(strict_types=0);
/*
* WellCommerce Foundation
*
* This file is part of the WellCommerce package.
*
* (c) Adam Piotrowski <adam@wellcommerce.org>, Adrian Potepa <adrian@wellcommerce.org>
*
* For the full copyright and license information,
* please view the LICENSE file that was distributed with this source code.
*/
namespace WellCommerce\Bundle\NotificationBundle\EventListener;
use Behat\Transliterator\Transliterator;
use Smsapi\Client\Feature\Sms\Bag\SendSmsBag;
use Smsapi\Client\SmsapiHttpClient;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use WellCommerce\Bundle\AppBundle\Entity\Shop;
use WellCommerce\Bundle\CoreBundle\DependencyInjection\AbstractServiceSubscriber;
use WellCommerce\Bundle\CoreBundle\Doctrine\Event\EntityEvent;
use WellCommerce\Bundle\OrderBundle\Entity\OrderStatus;
use WellCommerce\Bundle\OrderBundle\Entity\OrderStatusHistory;
use WellCommerce\Component\Form\Conditions\Equals;
use WellCommerce\Component\Form\Event\FormEvent;
/**
* Class SmsApiSubscriber
*
* @author Adam Piotrowski <adam@wellcommerce.org>
*/
class SmsApiSubscriber extends AbstractServiceSubscriber implements EventSubscriberInterface
{
public static function getSubscribedEvents()
{
return [
'admin.shop.pre_form_init' => ['onShopFormAdminInit'],
'admin.order_status.pre_form_init' => ['onOrderStatusFormAdminInit'],
'admin.order_status_history.pre_form_init' => ['onOrderStatusHistoryFormAdminInit'],
'order_status_history.post_create' => ['onOrderStatusHistoryCreated', 0],
];
}
public function onOrderStatusHistoryFormAdminInit(FormEvent $event)
{
$resource = $event->getResource();
if ($resource instanceof OrderStatusHistory) {
$form = $event->getForm();
$builder = $event->getFormBuilder();
$fieldset = $form->getChildren()->get('status_data');
$order = $resource->getOrder();
$shop = $order->getShop();
if ($shop->getSmsApiToken() !== '') {
$notify = $fieldset->addChild($builder->getElement('checkbox', [
'name' => 'smsApiNotify',
'label' => 'sms_api.label.notify',
]));
$fieldset->addChild($builder->getElement('text_area', [
'name' => 'smsApiComment',
'rows' => 3,
'label' => 'sms_api.label.comment',
'dependencies' => [
$builder->getDependency('show', [
'form' => $form,
'field' => $notify,
'condition' => new Equals(1),
]),
],
]));
}
}
}
public function onOrderStatusFormAdminInit(FormEvent $event)
{
$resource = $event->getResource();
if ($resource instanceof OrderStatus) {
$form = $event->getForm();
$builder = $event->getFormBuilder();
$shop = $this->getShopStorage()->getCurrentShop();
if ($shop->getSmsApiToken() !== '') {
$smsApiData = $form->addChild($builder->getElement('nested_fieldset', [
'name' => 'sms_api_data',
'label' => 'sms_api.fieldset.settings',
]));
$smsApiData->addChild($builder->getElement('tip', [
'name' => 'smsApiCommentTip',
'tip' => 'Możesz używać dodatkowych znaczników w treści SMS.
<ul>
<li><strong>[[ FIRST_NAME ]]</strong> - imię klienta</li>
<li><strong>[[ ORDER_NUMBER ]]</strong> - numer zamówienia</li>
<li><strong>[[ TRACKING_LINK ]]</strong> - link do śledzenia przesyłki</li>
</ul>
',
]));
$smsApiData->addChild($builder->getElement('text_area', [
'name' => 'smsApiComment',
'label' => 'sms_api.label.comment',
]));
}
}
}
public function onShopFormAdminInit(FormEvent $event)
{
$resource = $event->getResource();
if ($resource instanceof Shop) {
$form = $event->getForm();
$builder = $event->getFormBuilder();
$smsApiData = $form->addChild($builder->getElement('nested_fieldset', [
'name' => 'sms_api_data',
'label' => 'sms_api.fieldset.settings',
]));
$smsApiData->addChild($builder->getElement('text_field', [
'name' => 'smsApiToken',
'label' => 'API Token',
]));
$smsApiData->addChild($builder->getElement('text_field', [
'name' => 'smsApiSender',
'label' => 'Nadawca SMS',
]));
}
}
public function onOrderStatusHistoryCreated(EntityEvent $event)
{
$history = $event->getEntity();
if ($history instanceof OrderStatusHistory) {
$order = $history->getOrder();
if (true === (bool) $history->isSmsApiNotify()) {
try {
$shop = $order->getShop();
$phoneNumber = $order->getContactDetails()->getPhone();
$message = $this->getSmsMessage($history);
$apiToken = $shop->getSmsApiToken();
$sms = SendSmsBag::withMessage($phoneNumber, $message);
$sms->from = $shop->getSmsApiSender();
$service = (new SmsapiHttpClient())->smsapiPlService($apiToken);
$response = $service->smsFeature()->sendSms($sms);
} catch (\Exception $e) {
}
}
}
}
private function getSmsMessage(OrderStatusHistory $history): string
{
if (strlen($history->getSmsApiComment())) {
$message = $history->getSmsApiComment();
} else {
$message = sprintf(
'Status zamowienia %s to %s',
$history->getOrder()->getNumber(),
$history->getOrderStatus()->translate()->getName()
);
}
return Transliterator::unaccent($message);
}
}