<?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 UniSport\Bundle\AppBundle\EventListener;
use Doctrine\Common\Collections\Criteria;
use Psr\Container\ContainerInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\Messenger\Stamp\DelayStamp;
use Symfony\Component\Security\Http\Event\InteractiveLoginEvent;
use UniSport\Bundle\AppBundle\Entity\PolkaOrderStatus;
use UniSport\Bundle\AppBundle\Service\Messenger\ClearCacheMessage;
use UniSport\Bundle\AppBundle\Service\Messenger\ClientMessage;
use UniSport\Bundle\AppBundle\Service\Messenger\OrderStatusHistoryMessage;
use UniSport\Bundle\AppBundle\Service\Messenger\PolkaClientMessage;
use UniSport\Bundle\AppBundle\Service\PolkaSql\ApiClient;
use WellCommerce\Bundle\AppBundle\DataSet\Admin\LayoutPageDataSet;
use WellCommerce\Bundle\AppBundle\DataSet\Admin\ShopDataSet;
use WellCommerce\Bundle\AppBundle\Entity\Client;
use WellCommerce\Bundle\AppBundle\Entity\LayoutBox;
use WellCommerce\Bundle\AppBundle\Entity\LayoutPage;
use WellCommerce\Bundle\AppBundle\Entity\Pos;
use WellCommerce\Bundle\AppBundle\Entity\Shop;
use WellCommerce\Bundle\AppBundle\Event\ClearCacheEvent;
use WellCommerce\Bundle\CmsBundle\Service\Layout\Configurator\BannerBoxConfigurator;
use WellCommerce\Bundle\CoreBundle\DependencyInjection\AbstractServiceSubscriber;
use WellCommerce\Bundle\CoreBundle\Doctrine\Event\EntityEvent;
use WellCommerce\Bundle\OrderBundle\Entity\Coupon;
use WellCommerce\Bundle\OrderBundle\Entity\OrderStatusHistory;
use WellCommerce\Bundle\OrderBundle\Entity\PaymentMethod;
use WellCommerce\Component\DataSet\Column\Column;
use WellCommerce\Component\DataSet\Event\DataSetEvent;
use WellCommerce\Component\Form\Elements\Fieldset\FieldsetInterface;
use WellCommerce\Component\Form\Event\FormEvent;
/**
* Class ClientSubscriber
*
* @author Adam Piotrowski <adam@wellcommerce.org>
*/
class UniSportSubscriber extends AbstractServiceSubscriber implements EventSubscriberInterface
{
protected ApiClient $apiClient;
protected LayoutPageDataSet $layoutPageDataSet;
protected ShopDataSet $shopDataSet;
public function __construct(
ContainerInterface $locator,
ApiClient $apiClient,
LayoutPageDataSet $layoutPageDataSet,
ShopDataSet $shopDataSet
) {
parent::__construct($locator);
$this->apiClient = $apiClient;
$this->layoutPageDataSet = $layoutPageDataSet;
$this->shopDataSet = $shopDataSet;
}
public static function getSubscribedEvents()
{
return [
'admin.client.dataset.post_init' => ['onClientDataSetInit'],
'admin.client.pre_form_init' => ['onClientFormAdminInit', 0],
'admin.client_group.pre_form_init' => ['onClientGroupFormAdminInit', 0],
'admin.coupon.pre_form_init' => ['onCouponFormAdminInit', 0],
'admin.order_status.pre_form_init' => ['onOrderStatusFormAdminInit', 0],
'admin.feature.pre_form_init' => ['onFeatureFormAdminInit', 0],
'admin.feature_group.pre_form_init' => ['onFeatureGroupFormAdminInit', 0],
'admin.order.dataset.post_init' => ['onOrderDataSetInit'],
'admin.pos.pre_form_init' => ['onPosFormAdminInit', 0],
'admin.product.dataset.post_init' => ['onProductDataSetInit'],
'admin.product.pre_form_init' => ['onProductFormAdminInit', 0],
'admin.shop.pre_form_init' => ['onShopFormAdminInit'],
'admin.payment_method.pre_form_init' => ['onPaymentMethodFormAdminInit'],
'client.post_create' => ['onClientSave', 0],
'client.post_update' => ['onClientSave', 0],
'layout_box.post_update' => ['onEntitySave'],
'layout_page.post_update' => ['onEntitySave'],
//'page.post_update' => ['onEntitySave'],
//'shop.post_update' => ['onEntitySave'],
//'entity.post_remove' => ['onEntitySave'],
ClearCacheEvent::class => ['onEntitySave'],
'order_status_history.post_create' => ['onOrderStatusHistoryPostCreate', 0],
'security.interactive_login' => ['onSecurityInteractiveLogin', 0],
];
}
public function onShopFormAdminInit(FormEvent $event)
{
$resource = $event->getResource();
if ($resource instanceof Shop) {
$form = $event->getForm();
$builder = $event->getFormBuilder();
$gtmData = $form->getChildren()->get('gtm_data');
$gtmData->addChild(
$builder->getElement('text_field', [
'name' => 'googleTagManagerTarget',
'label' => 'googleTagManager.label.target',
])
);
/** @var FieldsetInterface $fieldset */
$fieldset = $form->getChildren()->get('required_data');
$fieldset->addChild(
$builder->getElement('checkbox', [
'name' => 'newsletterEnabled',
'label' => 'Newsletter włączony',
])
);
}
}
public function onPaymentMethodFormAdminInit(FormEvent $event)
{
$resource = $event->getResource();
if ($resource instanceof PaymentMethod) {
$form = $event->getForm();
$builder = $event->getFormBuilder();
/** @var FieldsetInterface $fieldset */
$fieldset = $form->getChildren()->get('required_data');
$fieldset->addChild(
$builder->getElement('text_field', [
'name' => 'polkaSymbol',
'label' => 'Symbol Polka SQL',
'rules' => [
$builder->getRule('required'),
],
])
);
}
}
public function onCouponFormAdminInit(FormEvent $event)
{
$resource = $event->getResource();
if ($resource instanceof Coupon) {
$form = $event->getForm();
$builder = $event->getFormBuilder();
$requiredData = $form->getChildren()->get('required_data');
$requiredData->addChild(
$builder->getElement('checkbox', [
'name' => 'appOnly',
'label' => 'Aplikacja mobilna',
'comment' => 'Ten kod będzie możliwy do użycia wyłącznie w aplikacji mobilnej',
])
);
}
}
public function onSecurityInteractiveLogin(InteractiveLoginEvent $event)
{
$client = $event->getAuthenticationToken()->getUser();
if ($client instanceof Client) {
$this->getMessageBus()->dispatch(new PolkaClientMessage($client->getId()));
$collection = $this->getEntityManager()->getRepository(Pos::class)->matching(new Criteria());
$collection = $collection->filter(function (Pos $pos) use ($client) {
return $pos->getShops()->contains($client->getShop());
});
if ($collection->count() === 1) {
$client->setPos($collection->first());
$this->getEntityManager()->flush();
}
}
}
public function onEntitySave()
{
$this->getMessageBus()->dispatch(new ClearCacheMessage(), [
new DelayStamp(100),
]);
}
public function onOrderStatusHistoryPostCreate(EntityEvent $entityEvent)
{
$entity = $entityEvent->getEntity();
if ($entity instanceof OrderStatusHistory) {
$this->getMessageBus()->dispatch(new OrderStatusHistoryMessage($entity->getId()), [
new DelayStamp(100),
]);
}
}
public function onClientFormAdminInit(FormEvent $event)
{
$form = $event->getForm();
$builder = $event->getFormBuilder();
/** @var FieldsetInterface $fieldset */
$fieldset = $form->getChildren()->get('required_data');
$fieldset->addChild(
$builder->getElement('text_field', [
'name' => 'polkaId',
'label' => 'ID w PolkaSQL',
])
);
}
public function onClientGroupFormAdminInit(FormEvent $event)
{
$form = $event->getForm();
$builder = $event->getFormBuilder();
/** @var FieldsetInterface $fieldset */
$fieldset = $form->getChildren()->get('required_data');
$fieldset->addChild(
$builder->getElement('text_field', [
'name' => 'polkaId',
'label' => 'ID w PolkaSQL',
])
);
}
public function onOrderStatusFormAdminInit(FormEvent $event)
{
$form = $event->getForm();
$builder = $event->getFormBuilder();
/** @var FieldsetInterface $fieldset */
$fieldset = $form->getChildren()->get('required_data');
$polkaStatuses = $this->getEntityManager()->getRepository(PolkaOrderStatus::class)->findAll();
$options = [0 => '--- wybierz ---'];
/** @var PolkaOrderStatus $polkaStatus */
foreach ($polkaStatuses as $polkaStatus) {
$options[$polkaStatus->getId()] = $polkaStatus->getPolkaName();
}
$fieldset->addChild(
$builder->getElement('select', [
'name' => 'polkaOrderStatus',
'label' => 'Status PolkaSQL',
'options' => $options,
'transformer' => $builder->getRepositoryTransformer('entity', PolkaOrderStatus::class),
])
);
}
public function onPosFormAdminInit(FormEvent $event)
{
$form = $event->getForm();
$builder = $event->getFormBuilder();
/** @var FieldsetInterface $fieldset */
$fieldset = $form->getChildren()->get('required_data');
$layoutBoxes = $this->getEntityManager()->getRepository(LayoutBox::class)->findBy(['boxType' => BannerBoxConfigurator::TYPE]);
$options = [0 => '--- wybierz ---'];
/** @var LayoutBox $layoutBoxes */
foreach ($layoutBoxes as $layoutBox) {
$options[$layoutBox->getId()] = $layoutBox->translate()->getName();
}
$fieldset->addChild(
$builder->getElement('select', [
'name' => 'promotionBox',
'label' => 'Boks promocyjny',
'options' => $options,
'transformer' => $builder->getRepositoryTransformer('entity', LayoutBox::class),
])
);
$fieldset->addChild(
$builder->getElement('select', [
'name' => 'layoutPage',
'label' => 'common.label.layout_page',
'options' => $this->layoutPageDataSet->getResult('select', [], ['default_option' => '---']),
'transformer' => $builder->getRepositoryTransformer('entity', LayoutPage::class),
])
);
$fieldset->addChild(
$builder->getElement('multi_select', [
'name' => 'visibleShops',
'label' => 'Zakładka nasze sklepy',
'options' => $this->shopDataSet->getResult('select'),
'transformer' => $builder->getRepositoryTransformer('collection', Shop::class),
])
);
}
public function onFeatureFormAdminInit(FormEvent $event)
{
$form = $event->getForm();
$builder = $event->getFormBuilder();
/** @var FieldsetInterface $fieldset */
$fieldset = $form->getChildren()->get('required_data');
$fieldset->addChild(
$builder->getElement('simple_file', [
'name' => 'icon2',
'label' => 'Ikona (damska)',
'repeat_min' => 0,
'repeat_max' => 1,
'session_id' => $this->getRequestHelper()->getSessionId(),
'session_name' => $this->getRequestHelper()->getSessionName(),
'file_source' => 'public/upload/icons/feature/',
'file_preview' => '/upload/icons/feature/',
'file_types' => ['svg', 'jpg', 'png'],
])
);
}
public function onFeatureGroupFormAdminInit(FormEvent $event)
{
$form = $event->getForm();
$builder = $event->getFormBuilder();
/** @var FieldsetInterface $fieldset */
$fieldset = $form->getChildren()->get('required_data');
$fieldset->addChild(
$builder->getElement('checkbox', [
'name' => 'activity',
'label' => 'Aktywność',
])
);
$fieldset->addChild(
$builder->getElement('checkbox', [
'name' => 'activity',
'label' => 'Cecha typu "Aktywność"',
])
);
$fieldset->addChild(
$builder->getElement('checkbox', [
'name' => 'cutting',
'label' => 'Cecha typu "Krój"',
])
);
$fieldset->addChild(
$builder->getElement('checkbox', [
'name' => 'profile',
'label' => 'Cecha typu "Profil"',
])
);
$fieldset->addChild(
$builder->getElement('checkbox', [
'name' => 'conservation',
'label' => 'Cecha typu "Pielęgnacja"',
])
);
$fieldset->addChild(
$builder->getElement('checkbox', [
'name' => 'technology',
'label' => 'Cecha typu "Technologia"',
])
);
$fieldset->addChild(
$builder->getElement('checkbox', [
'name' => 'important',
'label' => 'Cecha typu "Najważniesze cechy"',
])
);
}
public function onProductFormAdminInit(FormEvent $event)
{
$form = $event->getForm();
$builder = $event->getFormBuilder();
/** @var FieldsetInterface $fieldset */
$fieldset = $form->getChildren()->get('main_data');
$fieldset->addChild(
$builder->getElement('text_field', [
'name' => 'video',
'label' => 'Film Youtube (identyfikator)',
])
);
$mainData = $form->addChild(
$builder->getElement('nested_fieldset', [
'name' => '3d_data',
'label' => 'Zdjęcia 3D',
])
);
$mainData->addChild(
$builder->getElement('local_file', [
'name' => 'usdz',
'label' => 'Plik iOS (.usdz)',
'repeat_min' => 0,
'repeat_max' => 1,
'max_upload_size' => 100,
'session_id' => $this->getRequestHelper()->getSessionId(),
'session_name' => $this->getRequestHelper()->getSessionName(),
'file_source' => 'public/upload/3d/ios/',
'file_types' => ['usdz'],
])
);
$mainData->addChild(
$builder->getElement('local_file', [
'name' => 'glb',
'label' => 'Plik Android (.glb)',
'repeat_min' => 0,
'repeat_max' => 1,
'max_upload_size' => 100,
'session_id' => $this->getRequestHelper()->getSessionId(),
'session_name' => $this->getRequestHelper()->getSessionName(),
'file_source' => 'public/upload/3d/android/',
'file_types' => ['glb'],
])
);
}
public function onClientSave(EntityEvent $event)
{
$client = $event->getEntity();
if ($client instanceof Client) {
$this->getMessageBus()->dispatch(new ClientMessage($client->getId()), [
new DelayStamp($this->getKernel()->getContainer()->getParameter('messenger_unisport_client_delay')),
]);
}
}
public function onClientDataSetInit(DataSetEvent $event)
{
$dataset = $event->getDataSet();
$columns = $dataset->getColumns();
$columns->add(
new Column([
'alias' => 'polkaId',
'source' => 'client.polkaId',
])
);
}
public function onOrderDataSetInit(DataSetEvent $event)
{
$dataset = $event->getDataSet();
$columns = $dataset->getColumns();
$columns->add(
new Column([
'alias' => 'polkaId',
'source' => 'orders.polkaId',
])
);
}
public function onProductDataSetInit(DataSetEvent $event)
{
$dataset = $event->getDataSet();
$columns = $dataset->getColumns();
$columns->add(
new Column([
'alias' => 'updated',
'source' => 'product.updated',
])
);
}
}