app/Plugin/OrderStatusEx/EventSubscriber/OrderStatusEventSubscriber.php line 181

Open in your IDE?
  1. <?php
  2. /**
  3.  * Copyright(c) 2022 SYSTEM_KD
  4.  * Date: 2022/09/03
  5.  */
  6. namespace Plugin\OrderStatusEx\EventSubscriber;
  7. use Doctrine\ORM\EntityManagerInterface;
  8. use Eccube\Entity\Master\OrderStatus;
  9. use Eccube\Entity\Order;
  10. use Eccube\Entity\Shipping;
  11. use Eccube\Event\TemplateEvent;
  12. use Eccube\Form\Type\Admin\OrderStatusSettingType;
  13. use Eccube\Repository\Master\OrderStatusRepository;
  14. use Eccube\Service\OrderStateMachineContext;
  15. use Eccube\Service\SystemService;
  16. use Eccube\Util\CacheUtil;
  17. use Plugin\OrderStatusEx\Controller\Admin\Seggin\Shop\OrderStatusExController;
  18. use Plugin\OrderStatusEx\Entity\OrderOrderStatus;
  19. use Plugin\OrderStatusEx\Entity\OrderStatusEvent;
  20. use Plugin\OrderStatusEx\Entity\OrderStatusEx;
  21. use Plugin\OrderStatusEx\Service\OrderStatusExConfigService;
  22. use Plugin\OrderStatusEx\Service\OrderStatusExService;
  23. use Plugin\OrderStatusEx\Service\TwigRenderService\EventSubscriber\TwigRenderTrait;
  24. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  25. use Symfony\Component\Form\FormFactoryInterface;
  26. use Symfony\Component\HttpFoundation\Request;
  27. use Symfony\Component\HttpFoundation\RequestStack;
  28. use Symfony\Component\HttpFoundation\Session\SessionInterface;
  29. use Symfony\Component\HttpKernel\Event\ControllerEvent;
  30. use Symfony\Component\HttpKernel\KernelEvents;
  31. use Symfony\Component\Routing\RouterInterface;
  32. use Symfony\Component\Workflow\Event\Event;
  33. use Symfony\Component\Workflow\Event\TransitionEvent;
  34. class OrderStatusEventSubscriber implements EventSubscriberInterface
  35. {
  36.     use TwigRenderTrait;
  37.     /** @var RouterInterface */
  38.     protected $router;
  39.     /** @var FormFactoryInterface */
  40.     protected $formFactory;
  41.     /** @var EntityManagerInterface */
  42.     protected $entityManager;
  43.     /** @var OrderStatusExService */
  44.     protected $orderStatusExService;
  45.     /** @var OrderStatusExController */
  46.     protected $orderStatusExController;
  47.     /** @var CacheUtil */
  48.     protected $cachUtil;
  49.     /** @var SessionInterface */
  50.     protected $session;
  51.     /** @var SystemService */
  52.     protected $systemService;
  53.     /** @var OrderStatusExConfigService */
  54.     protected $orderStatusExConfigService;
  55.     /** @var RequestStack */
  56.     private RequestStack $requestStack;
  57.     public function __construct(
  58.         RouterInterface            $router,
  59.         FormFactoryInterface       $formFactory,
  60.         EntityManagerInterface     $entityManager,
  61.         OrderStatusExService       $orderStatusExService,
  62.         OrderStatusExController    $orderStatusExController,
  63.         CacheUtil                  $cacheUtil,
  64.         SystemService              $systemService,
  65.         OrderStatusExConfigService $orderStatusExConfigService,
  66.         RequestStack               $requestStack
  67.     )
  68.     {
  69.         $this->router $router;
  70.         $this->formFactory $formFactory;
  71.         $this->entityManager $entityManager;
  72.         $this->orderStatusExService $orderStatusExService;
  73.         $this->orderStatusExController $orderStatusExController;
  74.         $this->cachUtil $cacheUtil;
  75.         $this->systemService $systemService;
  76.         $this->orderStatusExConfigService $orderStatusExConfigService;
  77.         $this->requestStack $requestStack;
  78.     }
  79.     /**
  80.      * 受注対応状況設定テンプレート
  81.      *
  82.      * @param TemplateEvent $event
  83.      * @return void
  84.      */
  85.     public function onSettingShopOrderStatusTwig(TemplateEvent $event)
  86.     {
  87.         // リダイレクトしない場合はキャッシュクリア用フラグOFF
  88.         $session $this->requestStack->getSession();
  89.         $session->set(OrderStatusExService::CACHE_CLEAR_KEYfalse);
  90.         /** @var Request $request */
  91.         $request $this->requestStack->getMainRequest();
  92.         // 新規登録エラー用
  93.         $builder $this->formFactory->createBuilder(OrderStatusSettingType::class, null);
  94.         $form $builder->getForm();
  95.         $form->get('color')->setData('#a3a3a3');
  96.         if ('POST' === $request->getMethod()) {
  97.             $form->handleRequest($request);
  98.             if ($form->isSubmitted()) {
  99.                 $form->isValid();
  100.             }
  101.         }
  102.         $event->setParameter('createForm'$form->createView());
  103.         $this->initRenderService($event);
  104.         // 新規登録ブロック追加
  105.         $this->createInsertBuilder()
  106.             ->find(".c-contentsArea__primaryCol")
  107.             ->setTargetId('order_status_ex_block')
  108.             ->setInsertModePrepend();
  109.         // テーブル追加
  110.         $this->createInsertBuilder()
  111.             ->find('table > thead > tr')
  112.             ->setTargetId('order_status_ex_table_head')
  113.             ->setInsertModeAppend();
  114.         // 削除ボタン
  115.         $child $this->twigRenderService
  116.             ->eachChildBuilder()
  117.             ->findThis()
  118.             ->targetFindAndIndexKey("#orderStatusExIndex_""orderStatusExIndex")
  119.             ->setInsertModeAppend();
  120.         $this->twigRenderService
  121.             ->eachBuilder()
  122.             ->find("table > tbody > tr")
  123.             ->setEachIndexKey("orderStatusExIndex")
  124.             ->each($child->build());
  125.         // 削除用モーダル
  126.         $this->createInsertBuilder()
  127.             ->find("#form")
  128.             ->setTargetId("OrderStatusDeleteModal")
  129.             ->setInsertModeAfter();
  130.         $child $this->twigRenderService
  131.             ->eachChildBuilder()
  132.             ->findThis()
  133.             ->find('td')
  134.             ->eq(2)
  135.             ->targetFindAndIndexKey("#orderStatusExIndex2_""orderStatusExIndex2")
  136.             ->setInsertModeAppend();
  137.         $this->twigRenderService
  138.             ->eachBuilder()
  139.             ->find("table > tbody > tr")
  140.             ->setEachIndexKey("orderStatusExIndex2")
  141.             ->each($child->build());
  142.         $this->addTwigRenderSnippet(
  143.             '@OrderStatusEx/admin/Setting/Shop/order_status_add.twig',
  144.             '@OrderStatusEx/admin/Setting/Shop/order_status_add_js.twig'
  145.         );
  146.     }
  147.     public function onKernelController(ControllerEvent $event)
  148.     {
  149.         $request $event->getRequest();
  150.         $route $request->attributes->get('_route');
  151.         if ('admin_setting_shop_order_status' === $route) {
  152.             $session $this->requestStack->getSession();
  153.             if ($session->get(OrderStatusExService::CACHE_CLEAR_KEYfalse)) {
  154.                 $this->systemService->switchMaintenance(true);
  155.                 // Cache Clear
  156.                 $session->set(OrderStatusExService::CACHE_CLEAR_KEYfalse);
  157.                 $this->cachUtil->clearCache();
  158.                 $this->systemService->disableMaintenance();
  159.             }
  160.             // 新規登録Form
  161.             $builder $this->formFactory->createBuilder(OrderStatusSettingType::class, null);
  162.             $form $builder->getForm();
  163.             $form->handleRequest($request);
  164.             // 新規登録分の登録処理
  165.             if ($form->isSubmitted()) {
  166.                 if ($form->isValid()) {
  167.                     // 登録処理実施
  168.                     /** @var OrderStatus $orderStatus */
  169.                     $orderStatus $form->getData();
  170.                     // 受注状態追加
  171.                     $masterResult $this->orderStatusExService->getMasterNextId(OrderStatus::class);
  172.                     $orderStatus
  173.                         ->setId($masterResult->nextId)
  174.                         ->setSortNo($masterResult->nextSortNo);
  175.                     $this->entityManager->persist($orderStatus);
  176.                     $this->entityManager->flush();
  177.                     // 色登録
  178.                     $color $form->get('color')->getData();
  179.                     $this->orderStatusExService->registerOrderStatusColor($orderStatus$color);
  180.                     // マイページ用名称登録
  181.                     $customerOrderStatusName $form->get('customer_order_status_name')->getData();
  182.                     $this->orderStatusExService->registerCustomerOrderStatus($orderStatus$customerOrderStatusName);
  183.                     // 移動先・イベント種別情報登録
  184.                     // 移動先取得
  185.                     $orderStatuses $form->get('OrderStatuses')->getData();
  186.                     // 選択イベント取得
  187.                     $activeEvent $form->get('ActiveEvent')->getData();
  188.                     // 他の受注状況拡張情報取得
  189.                     $orderStatusExs $this->entityManager->getRepository(OrderStatusEx::class)->findAll();
  190.                     $orderStatusEventRepository $this->entityManager->getRepository(OrderStatusEvent::class);
  191.                     $selectEvents = [];
  192.                     /** @var OrderStatusEx $orderStatusEx */
  193.                     foreach ($orderStatusExs as $orderStatusEx) {
  194.                         /** @var OrderStatusEvent $selectEventGroup */
  195.                         $selectEventGroup $orderStatusEventRepository->find($orderStatusEx->getMoveOrderStatusId());
  196.                         if ($selectEventGroup) {
  197.                             $selectEvents[$orderStatusEx->getMoveOrderStatusId()] = $selectEventGroup->getSelectEventGroup();
  198.                         } else {
  199.                             $selectEvents[$orderStatusEx->getMoveOrderStatusId()] = OrderStatusEvent::EVENT_GROUP_NONE;
  200.                         }
  201.                     }
  202.                     // 新規追加分のイベント設定
  203.                     $selectEvents[$orderStatus->getId()] = $activeEvent;
  204.                     $this->orderStatusExService->updateOrderStatusEx($orderStatus$orderStatuses$selectEvents);
  205.                     $this->entityManager->flush();
  206.                     // リダイレクト
  207.                     $event->setController([$this->orderStatusExController'success']);
  208.                 }
  209.             } else if ($request->getMethod() == 'POST') {
  210.                 // Cache Clear ON
  211.                 $session->set(OrderStatusExService::CACHE_CLEAR_KEYtrue);
  212.             }
  213.         }
  214.     }
  215.     /**
  216.      * 受注状況の発送済み相当変更時
  217.      *
  218.      * @param TransitionEvent $event
  219.      * @return void
  220.      */
  221.     public function onShip(TransitionEvent $event)
  222.     {
  223.         $tos $event->getTransition()->getTos();
  224.         if (in_array(OrderStatus::DELIVERED$tos)) {
  225.             return;
  226.         }
  227.         /** @var Order $order */
  228.         $order $event->getSubject()->getOrder();
  229.         $order->getShippings()->map(function (Shipping $shipping) {
  230.             if (!$shipping->isShipped()) {
  231.                 $shipping->setShippingDate(new \DateTime());
  232.             }
  233.         });
  234.     }
  235.     public function onCompleted(Event $event)
  236.     {
  237.         /** @var $context OrderStateMachineContext */
  238.         $context $event->getSubject();
  239.         $order $context->getOrder();
  240.         /** @var OrderStatus $newOrderStatus */
  241.         $newOrderStatusId $context->getStatus();
  242.         /** @var OrderStatusRepository $orderStatusRepository */
  243.         $orderStatusRepository $this->entityManager->getRepository(OrderStatus::class);
  244.         $newOrderStatus $orderStatusRepository->find($newOrderStatusId);
  245.         // 拡張情報へ選択したステータスを保持し表示ステータスに標準をセットする
  246.         $orderOrderStatus $order->getOrderOrderStatus();
  247.         if (!$orderOrderStatus) {
  248.             $orderOrderStatus = new OrderOrderStatus();
  249.             $orderOrderStatus->setOrder($order);
  250.         }
  251.         $orderOrderStatus->setOrderStatus($newOrderStatus);
  252.         $this->entityManager->persist($orderOrderStatus);
  253.         // 集約保持モード
  254.         if (!$this->orderStatusExConfigService->isStrictMode()) {
  255.             $convertOrderStatus $this->orderStatusExService->getConvertStatusByEvent($newOrderStatus);
  256.             $order->setOrderStatus($convertOrderStatus);
  257.         }
  258.     }
  259.     public static function getSubscribedEvents()
  260.     {
  261.         return [
  262.             KernelEvents::CONTROLLER => 'onKernelController',
  263.             '@admin/Setting/Shop/order_status.twig' => 'onSettingShopOrderStatusTwig',
  264.             'workflow.order.transition.ship' => 'onShip',
  265.             'workflow.order.completed' => ['onCompleted', -300],
  266.         ];
  267.     }
  268. }