custom/plugins/CioOrderConfirmation/src/Subscriber/OrderSubscriber.php line 63

Open in your IDE?
  1. <?php
  2. namespace CioOrderConfirmation\Subscriber;
  3. use CioMasterdata\Definition\Masterdata\MasterdataEntity;
  4. use CioMasterdata\Service\MasterdataService;
  5. use CioOrderConfirmation\CioOrderConfirmation;
  6. use CioOrderConfirmation\Event\AuthorizedReleaserBeforeSendMailEvent;
  7. use CioOrderConfirmation\Event\CheckoutOrderReleaseProcessEvent;
  8. use CioOrderConfirmation\Event\CheckoutOrderReleaseProcessOrderCustomerEvent;
  9. use Shopware\Core\Checkout\Cart\Event\CheckoutOrderPlacedEvent;
  10. use Shopware\Core\Checkout\Order\OrderDefinition;
  11. use Shopware\Core\Content\Mail\Service\AbstractMailService;
  12. use Shopware\Core\Framework\Context;
  13. use Shopware\Core\Framework\DataAbstractionLayer\EntityRepositoryInterface;
  14. use Shopware\Core\Framework\DataAbstractionLayer\Search\EntitySearchResult;
  15. use Shopware\Core\Framework\Event\BusinessEventCollectorEvent;
  16. use Shopware\Core\Framework\Event\BusinessEventDefinition;
  17. use Shopware\Core\Framework\Event\EventData\MailRecipientStruct;
  18. use Shopware\Core\System\SalesChannel\Context\AbstractSalesChannelContextFactory;
  19. use Shopware\Core\System\SalesChannel\Context\SalesChannelContextService;
  20. use Shopware\Core\System\StateMachine\StateMachineRegistry;
  21. use Shopware\Core\System\StateMachine\Transition;
  22. use Shopware\Core\System\SystemConfig\SystemConfigService;
  23. use Symfony\Component\DependencyInjection\ContainerInterface;
  24. use Symfony\Component\EventDispatcher\EventDispatcherInterface;
  25. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  26. use Symfony\Component\HttpFoundation\ParameterBag;
  27. use Symfony\Component\Routing\Router;
  28. use Twig\Environment;
  29. class OrderSubscriber implements EventSubscriberInterface
  30. {
  31.     private ContainerInterface $container;
  32.     private Environment $twig;
  33.     private EventDispatcherInterface $eventDispatcher;
  34.     private SystemConfigService $systemConfigService;
  35.     private AbstractMailService $mailService;
  36.     private StateMachineRegistry $stateMachineRegistry;
  37.     private AbstractSalesChannelContextFactory $salesChannelContextFactory;
  38.     private MasterdataService $masterdataService;
  39.     public function __construct(ContainerInterface $containerEnvironment $twigEventDispatcherInterface $eventDispatcherSystemConfigService $systemConfigServiceAbstractMailService $mailServiceStateMachineRegistry $stateMachineRegistryAbstractSalesChannelContextFactory $salesChannelContextFactoryMasterdataService $masterdataService)
  40.     {
  41.         $this->container $container;
  42.         $this->twig $twig;
  43.         $this->eventDispatcher $eventDispatcher;
  44.         $this->systemConfigService $systemConfigService;
  45.         $this->mailService $mailService;
  46.         $this->stateMachineRegistry $stateMachineRegistry;
  47.         $this->salesChannelContextFactory $salesChannelContextFactory;
  48.         $this->masterdataService $masterdataService;
  49.     }
  50.     public static function getSubscribedEvents()
  51.     {
  52.         return [
  53.             CheckoutOrderPlacedEvent::class => 'onCheckoutOrderPlacedEvent',
  54.             'collect.business-events' => 'onBusinessEvent'
  55.         ];
  56.     }
  57.     public function onBusinessEvent(BusinessEventCollectorEvent $event)
  58.     {
  59.         $businessEventsCollection $event->getCollection();
  60.         $businessEventsCollection->add(new BusinessEventDefinition(
  61.             CheckoutOrderReleaseProcessEvent::EVENT_NAME,
  62.             CheckoutOrderReleaseProcessEvent::class,
  63.             true,
  64.             false,
  65.             false,
  66.             []
  67.         ));
  68.         $businessEventsCollection->add(new BusinessEventDefinition(
  69.             CheckoutOrderReleaseProcessOrderCustomerEvent::EVENT_NAME,
  70.             CheckoutOrderReleaseProcessOrderCustomerEvent::class,
  71.             true,
  72.             false,
  73.             false,
  74.             []
  75.         ));
  76.     }
  77.     public function onCheckoutOrderPlacedEvent(CheckoutOrderPlacedEvent $event)
  78.     {
  79.         $order $event->getOrder();
  80.         $customer $order->getOrderCustomer()->getCustomer();
  81.         /** @var EntityRepositoryInterface $orderRepository */
  82.         $orderRepository $this->container->get('order.repository');
  83.         $customerCustomFields = [];
  84.         if ($customer && is_array($customer->getCustomFields())) {
  85.             $customerCustomFields $customer->getCustomFields();
  86.         }
  87.         $orderCustomFields = [];
  88.         if (is_array($order->getCustomFields())) {
  89.             $orderCustomFields $order->getCustomFields();
  90.         }
  91.         // The recipient email is normally stored in the customer's CustomFields, the event allows to override this recipients mail address in other plugins. The plugin must ensure that an account exists for this email.
  92.         $event = new AuthorizedReleaserBeforeSendMailEvent($order$customer, @$customerCustomFields['custom_customers_authorized_releaser'] ?: '');
  93.         $this->eventDispatcher->dispatch($event);
  94.         if ($releaseMailRecipientEmail $event->getAuthorizedReleaserEmail()) {
  95.             $salesChannelContext $this->salesChannelContextFactory->create(''$order->getSalesChannelId(), [SalesChannelContextService::LANGUAGE_ID => $order->getLanguageId()]);
  96.             $this->stateMachineRegistry->transition(
  97.                 new Transition(
  98.                     OrderDefinition::ENTITY_NAME,
  99.                     $order->getId(),
  100.                     CioOrderConfirmation::WAITING_FOR_RELEASE_STATE_TRANSITION_NAME,
  101.                     'stateId'
  102.                 ), $salesChannelContext->getContext()
  103.             );
  104.             // Order is not released yet and save email of the account that is authorized for release on the order entity.
  105.             $orderCustomFields['custom_orders_release_state'] = false;
  106.             $orderCustomFields['custom_orders_authorized_releaser'] = $releaseMailRecipientEmail;
  107.             $orderCustomFields['noOrderConfirmation'] = false;
  108.             $orderRepository->update([[
  109.                 'id' => $order->getId(),
  110.                 'customFields' => $orderCustomFields
  111.             ]], Context::createDefaultContext());
  112.             $url $this->container->get('router')->generate('order.cio.release.form', [
  113.                 'id' => $order->getOrderNumber()
  114.             ], Router::ABSOLUTE_URL);
  115.             // send release mail with url
  116.             $masterDatas $this->masterdataService->getMasterdatasForCustomer($customer);
  117.             $customerMasterdata false;
  118.             if ($masterDatas instanceof EntitySearchResult) {
  119.                 /** @var MasterdataEntity $customerMasterdata */
  120.                 $customerMasterdata $this->masterdataService->getMasterdatasForCustomer($customer)->first();
  121.             }
  122.             $customerVpNumber = ($customerMasterdata) ? $customerMasterdata->getVpNummer() : '';
  123.             $releaseProcessEvent = new CheckoutOrderReleaseProcessEvent($order$customer$releaseMailRecipientEmail ?: ''$url$customerVpNumber);
  124.             $releaseProcessEvent->setMailStruct(new MailRecipientStruct([
  125.                 $releaseMailRecipientEmail => $releaseMailRecipientEmail,
  126.                 'Fachhandel@ewe.de' => 'Fachhandel@ewe.de'
  127.             ]));
  128.             $this->eventDispatcher->dispatch($releaseProcessEvent);
  129.             // send notification for customer that the order is in checking process
  130.             $releaseProcessEvent = new CheckoutOrderReleaseProcessOrderCustomerEvent($order$customer$releaseMailRecipientEmail ?: '');
  131.             $releaseProcessEvent->setMailStruct(new MailRecipientStruct([$customer->getEmail() => $customer->getEmail()]));
  132.             $this->eventDispatcher->dispatch($releaseProcessEvent);
  133.             $mailData = new ParameterBag();
  134.             $mailData->set('recipients', [
  135.                 $releaseMailRecipientEmail => $releaseMailRecipientEmail
  136.             ]);
  137.             $mailData->set('senderName'$this->getConfigValue('releaseMailSender') ?: $order->getOrderCustomer()->getEmail());
  138.             $mailData->set('salesChannelId'$this->getConfigValue('releaseMailSalesChannelId') ?: $order->getSalesChannelId());
  139.             $mailData->set('subject'sprintf('Freigabe der Bestellung %s'$order->getOrderNumber()));
  140.             $plainMailContentTemplate $this->twig->createTemplate($this->getConfigValue('releaseMailPlainTextContent') ?: 'The Plan-Text-Content should be set in the CioOrderConfirmation-Plugin');
  141.             $htmlMailContentTemplate $this->twig->createTemplate($this->getConfigValue('releaseMailHtmlContent') ?: 'The HTML-Content should be set in the CioOrderConfirmation-Plugin');
  142.             $plainMailContent $plainMailContentTemplate->render(['order' => $order'url' => $url]);
  143.             $htmlMailContent $htmlMailContentTemplate->render(['order' => $order'url' => $url]);
  144.             $mailData->set('contentPlain'$plainMailContent);
  145.             $mailData->set('contentHtml'$htmlMailContent);
  146.             /*$this->mailService->send(
  147.                 $mailData->all(), Context::createDefaultContext()
  148.             );*/
  149.         } else {
  150.             // Without an authorized releaser, the order does not have to be released first.
  151.             $orderRepository->update([[
  152.                 'id' => $order->getId(),
  153.                 'customFields' => $orderCustomFields
  154.             ]], Context::createDefaultContext());
  155.         }
  156.     }
  157.     protected function getConfigValue(string $key)
  158.     {
  159.         return $this->systemConfigService->get('CioOrderConfirmation.config.' $key);
  160.     }
  161. }