src/WellCommerce/Bundle/OrderBundle/EventListener/OrderSubscriber.php line 167

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\OrderBundle\EventListener;
  14. use Doctrine\Common\Collections\Criteria;
  15. use Psr\Container\ContainerInterface;
  16. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  17. use Symfony\Component\Messenger\Stamp\DelayStamp;
  18. use WellCommerce\Bundle\AppBundle\Entity\Client;
  19. use WellCommerce\Bundle\AppBundle\Entity\NewsletterSubscriber;
  20. use WellCommerce\Bundle\AppBundle\Manager\NewsletterSubscriberManager;
  21. use WellCommerce\Bundle\CoreBundle\DependencyInjection\AbstractServiceSubscriber;
  22. use WellCommerce\Bundle\CoreBundle\Doctrine\Event\EntityEvent;
  23. use WellCommerce\Bundle\OrderBundle\Entity\Invoice;
  24. use WellCommerce\Bundle\OrderBundle\Entity\Order;
  25. use WellCommerce\Bundle\OrderBundle\Entity\OrderProduct;
  26. use WellCommerce\Bundle\OrderBundle\Manager\InvoiceManager;
  27. use WellCommerce\Bundle\OrderBundle\Manager\OrderManager;
  28. use WellCommerce\Bundle\OrderBundle\Service\Messenger\MissingCartMessage;
  29. use WellCommerce\Bundle\OrderBundle\Service\Messenger\OrderDuplicateMessage;
  30. use WellCommerce\Bundle\OrderBundle\Service\Order\Visitor\OrderVisitorTraverser;
  31. use WellCommerce\Component\Form\Elements\Fieldset\FieldsetInterface;
  32. use WellCommerce\Component\Form\Event\FormEvent;
  33. /**
  34.  * Class OrderSubscriber
  35.  *
  36.  * @author  Adam Piotrowski <adam@wellcommerce.org>
  37.  */
  38. class OrderSubscriber extends AbstractServiceSubscriber implements EventSubscriberInterface
  39. {
  40.     protected OrderManager                $manager;
  41.     protected InvoiceManager              $invoiceManager;
  42.     protected OrderVisitorTraverser       $orderVisitorTraverser;
  43.     protected NewsletterSubscriberManager $newsletterSubscriberManager;
  44.     public function __construct(
  45.         ContainerInterface $locator,
  46.         OrderManager $manager,
  47.         InvoiceManager $invoiceManager,
  48.         OrderVisitorTraverser $orderVisitorTraverser,
  49.         NewsletterSubscriberManager $newsletterSubscriberManager
  50.     ) {
  51.         parent::__construct($locator);
  52.         $this->manager                     $manager;
  53.         $this->invoiceManager              $invoiceManager;
  54.         $this->orderVisitorTraverser       $orderVisitorTraverser;
  55.         $this->newsletterSubscriberManager $newsletterSubscriberManager;
  56.     }
  57.     public static function getSubscribedEvents()
  58.     {
  59.         return [
  60.             'order.pre_create'           => ['onOrderChangedEvent'0],
  61.             'order.pre_update'           => ['onOrderChangedEvent'0],
  62.             'order.post_confirm'         => ['onOrderConfirmEvent'0],
  63.             'admin.client.pre_form_init' => ['onClientAdminFormInit'10],
  64.         ];
  65.     }
  66.     protected function queueMissingCart(Order $order)
  67.     {
  68.         if (false === $order->isMissingCartQueued() && false === $order->isConfirmed() && (int)$order->getId() > 0) {
  69.             $interval $order->getShop()->getMissingCartInterval() * 60 1000;
  70.             $email    $order->getContactDetails()->getEmail();
  71.             if ($this->getMailerHelper()->isEmailValid($email) && $interval 0) {
  72.                 $this->getMessageBus()->dispatch(new MissingCartMessage($order->getId()), [
  73.                     new DelayStamp($interval),
  74.                 ]);
  75.                 $order->setMissingCartQueued(true);
  76.             }
  77.         }
  78.     }
  79.     public function onOrderConfirmEvent(EntityEvent $event)
  80.     {
  81.         $order $event->getEntity();
  82.         if ($order instanceof Order) {
  83.             $configuration $this->getShopStorage()->getCurrentShop()->getMailerConfiguration();
  84.             $email         $order->getContactDetails()->getEmail();
  85.             $shop          $order->getShop();
  86.             $title         $this->getTranslatorHelper()->trans('order.email.title.order_created', [
  87.                 '%orderNumber%' => $order->getNumber(),
  88.             ]);
  89.             $this->getMailerHelper()->sendEmail([
  90.                 'recipient'     => [$order->getContactDetails()->getEmail(), $configuration->getTo()],
  91.                 'subject'       => $title,
  92.                 'template'      => 'WellCommerceOrderBundle:Email:order_created.html.twig',
  93.                 'parameters'    => [
  94.                     'order' => $order,
  95.                 ],
  96.                 'configuration' => $this->getShopStorage()->getCurrentShop()->getMailerConfiguration(),
  97.             ]);
  98.             $message $this->getCurrencyHelper()->convertAndFormat($order->getSummary()->getGrossAmount(), $order->getCurrency());
  99.             $this->getPusherHelper()->redirect(
  100.                 'Nowe zamówienie ' $order->getNumber(),
  101.                 'Klient: ' $order->getContactDetails()->getEmail() . ' o wartości ' $message,
  102.                 'admin.order.edit',
  103.                 ['id' => $order->getId()]
  104.             );
  105.             if ($order->getClientDetails()->isNewsletterAccepted()) {
  106.                 $subscriber $this->newsletterSubscriberManager->getRepository()->findOneBy([
  107.                     'email' => $email,
  108.                     'shop'  => $shop,
  109.                 ]);
  110.                 if (!$subscriber instanceof NewsletterSubscriber) {
  111.                     /** @var NewsletterSubscriber $subscriber */
  112.                     $subscriber $this->newsletterSubscriberManager->initResource();
  113.                     $subscriber->setEnabled($order->getClientDetails()->isNewsletterAccepted());
  114.                     $subscriber->setEmail($email);
  115.                     $subscriber->setConditionsAccepted($order->getClientDetails()->isNewsletterAccepted());
  116.                     $subscriber->setClient($order->getClient());
  117.                     $subscriber->setShop($shop);
  118.                     if (false === $subscriber->getShop()->getNewsletterSettings()->isSendConfirmationEmail()) {
  119.                         $subscriber->setEnabled(true);
  120.                     }
  121.                     $this->newsletterSubscriberManager->createResource($subscriber);
  122.                 }
  123.             }
  124.             $this->getMessageBus()->dispatch(new OrderDuplicateMessage($order->getId()), [
  125.                 new DelayStamp(500),
  126.             ]);
  127.         }
  128.     }
  129.     public function onOrderChangedEvent(EntityEvent $event)
  130.     {
  131.         $order $event->getEntity();
  132.         if ($order instanceof Order) {
  133.             if ('' === $order->getShippingAddress()->getCountry()) {
  134.                 $order->getShippingAddress()->setCountry($order->getShop()->getDefaultCountry());
  135.             }
  136.             if ('' === $order->getBillingAddress()->getCountry()) {
  137.                 $order->getBillingAddress()->setCountry($order->getShop()->getDefaultCountry());
  138.             }
  139.             $this->orderVisitorTraverser->traverse($order);
  140.             $this->queueMissingCart($order);
  141.         }
  142.     }
  143.     public function onClientAdminFormInit(FormEvent $event)
  144.     {
  145.         $resource $event->getResource();
  146.         if ($resource instanceof Client) {
  147.             $form    $event->getForm();
  148.             $builder $event->getFormBuilder();
  149.             /** @var FieldsetInterface $ordersFieldset */
  150.             $ordersFieldset $form->addChild(
  151.                 $builder->getElement('nested_fieldset', [
  152.                     'name'  => 'orders',
  153.                     'label' => 'Zamówienia',
  154.                 ])
  155.             );
  156.             /** @var FieldsetInterface $ordersFieldset */
  157.             $invoiceFieldset $form->addChild(
  158.                 $builder->getElement('nested_fieldset', [
  159.                     'name'  => 'invoices',
  160.                     'label' => 'Faktury',
  161.                 ])
  162.             );
  163.             /** @var FieldsetInterface $cartsFieldset */
  164.             $cartsFieldset $form->addChild(
  165.                 $builder->getElement('nested_fieldset', [
  166.                     'name'  => 'carts',
  167.                     'label' => 'Koszyk',
  168.                 ])
  169.             );
  170.             $invoices $resource->getInvoices();
  171.             $orders $resource->getOrders()->filter(function (Order $order) {
  172.                 return $order->isConfirmed();
  173.             });
  174.             $criteria = new Criteria();
  175.             $criteria->andWhere($criteria->expr()->eq('client'$resource));
  176.             $criteria->andWhere($criteria->expr()->eq('confirmed'false));
  177.             $carts $this->manager->getCollection($criteria);
  178.             if ($orders->count() === 0) {
  179.                 $ordersFieldset->addChild(
  180.                     $builder->getElement('tip', [
  181.                         'tip' => 'Klient nie złożył jeszcze żadnych zamówień.',
  182.                     ])
  183.                 );
  184.             } else {
  185.                 $html '<ul class="changes-detailed">';
  186.                 $orders->map(function (Order $order) use ($form$builder, &$html) {
  187.                     $orderUrl $this->getRouterHelper()->generateUrl('admin.order.edit', ['id' => $order->getId()]);
  188.                     $currency $order->getCurrency();
  189.                     $amount   $this->getCurrencyHelper()->format($order->getSummary()->getGrossAmount(), $currency$currency);
  190.                     $html .= '<li style="border-bottom: 1px solid #dfdfdf;list-style: none;margin-bottom: 15px;">';
  191.                     $html .= '    <p><a href="' $orderUrl '"><strong>#' $order->getNumber() . '</strong></a></p>';
  192.                     $html .= '    <p>Data: ' $order->getCreatedAt()->format('Y-m-d H:i:s') . '</p>';
  193.                     $html .= '    <p>Kwota zamówienia: ' $amount '</p>';
  194.                     $html .= '</li > ';
  195.                 });
  196.                 $html .= '</ul > ';
  197.                 $ordersFieldset->addChild(
  198.                     $builder->getElement('static_text', [
  199.                         'text' => $html,
  200.                     ])
  201.                 );
  202.             }
  203.             if ($invoices->count() === 0) {
  204.                 $invoiceFieldset->addChild(
  205.                     $builder->getElement('tip', [
  206.                         'tip' => 'Dla klienta nie zostały wystawione żadne faktury.',
  207.                     ])
  208.                 );
  209.             } else {
  210.                 $html '<ul class="changes-detailed">';
  211.                 $invoices->map(function (Invoice $invoice) use ($form$builder, &$html) {
  212.                     $invoiceUrl $this->getRouterHelper()->generateUrl('admin.invoice.edit', ['id' => $invoice->getId()]);
  213.                     $html .= '<li style="border-bottom: 1px solid #dfdfdf;list-style: none;margin-bottom: 15px;">';
  214.                     $html .= '    <p><a href="' $invoiceUrl '"><strong>#' $invoice->getNumber() . '</strong></a></p>';
  215.                     $html .= '    <p>Data: ' $invoice->getCreatedAt()->format('Y-m-d H:i:s') . '</p>';
  216.                     $html .= '</li > ';
  217.                 });
  218.                 $html .= '</ul > ';
  219.                 $invoiceFieldset->addChild(
  220.                     $builder->getElement('static_text', [
  221.                         'text' => $html,
  222.                     ])
  223.                 );
  224.             }
  225.             if ($carts->count() === 0) {
  226.                 $cartsFieldset->addChild(
  227.                     $builder->getElement('tip', [
  228.                         'tip' => 'Klient nie posiada żadnych koszyków',
  229.                     ])
  230.                 );
  231.             } else {
  232.                 /** @var Order $cart */
  233.                 $cart $carts->first();
  234.                 if ($cart instanceof Order) {
  235.                     $products $cart->getProducts();
  236.                     if ($products->count() === 0) {
  237.                         $cartsFieldset->addChild(
  238.                             $builder->getElement('tip', [
  239.                                 'tip' => 'Koszyk klienta jest pusty.',
  240.                             ])
  241.                         );
  242.                     } else {
  243.                         $html '<ul class="changes-detailed">';
  244.                         $products->map(function (OrderProduct $orderProduct) use ($form$builder, &$html) {
  245.                             $product    $orderProduct->getProduct();
  246.                             $productUrl $this->getRouterHelper()->generateUrl('admin.product.edit', ['id' => $product->getId()]);
  247.                             $photo      = (null !== $product->getPhoto()) ? $product->getPhoto()->getPath() : '';
  248.                             $image      $this->getImageHelper()->getImage($photo'small');
  249.                             $html .= '<li style="border-bottom: 1px solid #dfdfdf;list-style: none;margin-bottom: 15px;">';
  250.                             $html .= '    <p><img style="width: 100px;" src="' $image '" /></p>';
  251.                             $html .= '    <p><a href="' $productUrl '"><strong>' $orderProduct->getQuantity() . ' x ' sprintf(
  252.                                     '%s (%s)',
  253.                                     $product->translate()->getName(),
  254.                                     $product->getSku()
  255.                                 ) . '</strong></a></p>';
  256.                             $html .= '    <p>Dodany: ' $orderProduct->getCreatedAt()->format('Y-m-d H:i:s') . ' </p > ';
  257.                             $html .= '</li > ';
  258.                         });
  259.                         $html .= '</ul > ';
  260.                         $cartsFieldset->addChild(
  261.                             $builder->getElement('static_text', [
  262.                                 'text' => $html,
  263.                             ])
  264.                         );
  265.                     }
  266.                 } else {
  267.                     $cartsFieldset->addChild(
  268.                         $builder->getElement('tip', [
  269.                             'tip' => 'Klient nie posiada jeszcze koszyka.',
  270.                         ])
  271.                     );
  272.                 }
  273.             }
  274.         }
  275.     }
  276. }