app/Plugin/Paid4/EventSubscriber/ShoppingEventSubscriber.php line 124

Open in your IDE?
  1. <?php
  2. /*
  3.  * Copyright(c) 2020 RACCOON HOLDINGS, Inc. All rights reserved.
  4.  * https://paid.jp/
  5.  */
  6. namespace Plugin\Paid4\EventSubscriber;
  7. use Doctrine\Common\Collections\ArrayCollection;
  8. use Doctrine\ORM\EntityManagerInterface;
  9. use Eccube\Common\EccubeConfig;
  10. use Eccube\Entity\Customer;
  11. use Eccube\Entity\Master\OrderStatus;
  12. use Eccube\Entity\Order;
  13. use Eccube\Entity\Shipping;
  14. use Eccube\Event\EccubeEvents;
  15. use Eccube\Event\EventArgs;
  16. use Eccube\Event\TemplateEvent;
  17. use Eccube\Repository\Master\OrderStatusRepository;
  18. use Eccube\Service\OrderStateMachine;
  19. use Plugin\Paid4\Entity\PaidCustomer;
  20. use Plugin\Paid4\Entity\PaidOrder;
  21. use Plugin\Paid4\Service\CancelMailService;
  22. use Plugin\Paid4\Service\PaidApi\PaidHelperOrder;
  23. use Plugin\Paid4\Service\Payment\Method\PaidMethod;
  24. use Plugin\Paid4\Util\PaidUtil;
  25. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  26. use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
  27. class ShoppingEventSubscriber implements EventSubscriberInterface
  28. {
  29.     /**
  30.      * @var EccubeConfig
  31.      */
  32.     protected $eccubeConfig;
  33.     /**
  34.      * @var EntityManagerInterface
  35.      */
  36.     protected $entityManager;
  37.     /**
  38.      * @var CancelMailService
  39.      */
  40.     protected $cancelMailService;
  41.     /**
  42.      * @var OrderStatusRepository
  43.      */
  44.     protected $orderStatusRepository;
  45.     /**
  46.      * @var OrderStateMachine
  47.      */
  48.     protected $orderStateMachine;
  49.     /**
  50.      * @var PaidHelperOrder
  51.      */
  52.     private $paidHelperOrder;
  53.     /**
  54.      * @var TokenStorageInterface
  55.      */
  56.     private $tokenStorage;
  57.     /**
  58.      * @var mixed
  59.      */
  60.     private $unregistered;
  61.     /**
  62.      * @var mixed
  63.      */
  64.     private $notAvailable;
  65.     /**
  66.      * OrderEditIndexCompleteListener constructor.
  67.      *
  68.      * @param EccubeConfig $eccubeConfig
  69.      * @param EntityManagerInterface $entityManager
  70.      * @param CancelMailService $cancelMailService
  71.      * @param OrderStatusRepository $orderStatusRepository
  72.      * @param OrderStateMachine $orderStateMachine
  73.      * @param PaidHelperOrder $paidHelperOrder
  74.      * @param TokenStorageInterface $tokenStorage
  75.      */
  76.     public function __construct(
  77.         EccubeConfig $eccubeConfig,
  78.         EntityManagerInterface $entityManager,
  79.         CancelMailService $cancelMailService,
  80.         OrderStatusRepository $orderStatusRepository,
  81.         OrderStateMachine $orderStateMachine,
  82.         PaidHelperOrder $paidHelperOrder,
  83.         TokenStorageInterface $tokenStorage
  84.     )
  85.     {
  86.         $this->tokenStorage $tokenStorage;
  87.         $this->eccubeConfig $eccubeConfig;
  88.         $this->entityManager $entityManager;
  89.         $this->cancelMailService $cancelMailService;
  90.         $this->orderStatusRepository $orderStatusRepository;
  91.         $this->orderStateMachine $orderStateMachine;
  92.         $this->paidHelperOrder $paidHelperOrder;
  93.         $this->unregistered $eccubeConfig['paid4.register.unregistered'];
  94.         $this->notAvailable $eccubeConfig['paid4.use.not_available'];
  95.     }
  96.     /**
  97.      * @return array
  98.      */
  99.     public static function getSubscribedEvents(): array
  100.     {
  101.         return [
  102.             'Shopping/index.twig' => 'onDefaultShoppingTwig',
  103.             EccubeEvents::FRONT_SHOPPING_COMPLETE_INITIALIZE => 'onFrontShoppingCompleteInitialize',
  104.         ];
  105.     }
  106.     /**
  107.      * フロント -> ご注文手続き
  108.      */
  109.     public function onDefaultShoppingTwig(TemplateEvent $event)
  110.     {
  111.         $PaidUse true;
  112.         $token $this->tokenStorage->getToken();
  113.         if ($token && $token->getUser() !== "anon.") {
  114.             if ($token->getProviderKey() === "customer") {
  115.                 /** @var Customer $Customer */
  116.                 $Customer $token->getUser();
  117.                 /** @var PaidCustomer $PaidCustomer */
  118.                 $PaidCustomer $Customer->getPaidCustomer();
  119.                 // Paid未登録
  120.                 if (empty($PaidCustomer)
  121.                     || $PaidCustomer->getPaidRegister() == $this->unregistered
  122.                     || is_null($PaidCustomer->getPaidRegister())) {
  123.                     $PaidUse false;
  124.                 }
  125.                 // Paid利用不可の場合はラベルを出さない
  126.                 if (!empty($PaidCustomer) &&
  127.                     $PaidCustomer->getPaidUse() == $this->notAvailable) {
  128.                     $PaidUse true;
  129.                 }
  130.             }
  131.             // ゲスト購入
  132.         } else {
  133.             $PaidUse false;
  134.         }
  135.         $event->setParameter('isNotPaidCustomer'$PaidUse);
  136.         $event->addSnippet('@Paid4/default/Shopping/PaidLabel.twig');
  137.     }
  138.     /**
  139.      * @param EventArgs $event
  140.      * @throws \Exception
  141.      */
  142.     public function onFrontShoppingCompleteInitialize(EventArgs $event)
  143.     {
  144.         $request $event->getRequest();
  145.         /** @var Order $Order */
  146.         $Order $event->getArgument("Order");
  147.         $Payment $Order->getPayment();
  148.         if ($Payment->getMethodClass() == PaidMethod::class) {
  149.             $this->serLogMessage('FRONT_SHOPPING_COMPLETE_INITIALIZE - Paid受注情報のステータス更新開始');
  150.             $now = new \DateTime("now");
  151.             $PaidOrder = new PaidOrder();
  152.             $PaidOrder->setOrder($Order)
  153.                 ->setPaymentTotal($Order->getPaymentTotal())
  154.                 ->setPaidSettlementStatus($this->eccubeConfig['paid4.settlement.unsettled'])
  155.                 ->setSettlementDate($now)
  156.                 ->setCreateDate($now)
  157.                 ->setUpdateDate($now);
  158.             $this->entityManager->persist($PaidOrder);
  159.             $this->entityManager->flush();
  160.             $this->serLogMessage('FRONT_SHOPPING_COMPLETE_INITIALIZE - Paid受注情報のステータス更新終了');
  161.             $this->serLogMessage('FRONT_SHOPPING_COMPLETE_INITIALIZE - 受注登録API開始');
  162.             $result $this->paidHelperOrder->registerOrder($Order);
  163.             $this->serLogMessage('FRONT_SHOPPING_COMPLETE_INITIALIZE - 受注登録API終了');
  164.             $now = new \DateTime("now");
  165.             if (!$result) {
  166.                 // 決済キャンセル
  167.                 $PaidOrder
  168.                     ->setPaidSettlementStatus($this->eccubeConfig['paid4.settlement.cancel'])
  169.                     ->setSettlementDate($now);
  170.                 // 受注情報のステータスをキャンセルに変更する
  171.                 $this->serLogMessage('FRONT_SHOPPING_COMPLETE_INITIALIZE - 受注情報のステータスをキャンセルに変更開始');
  172.                 $this->changeOrderStatus($Order);
  173.                 $this->serLogMessage('FRONT_SHOPPING_COMPLETE_INITIALIZE - 受注情報のステータスをキャンセルに変更終了');
  174.                 // キャンセルメール送信
  175.                 $this->cancelMailService->sendOrderCancelMail($Order);
  176.                 $this->serLogMessage('FRONT_SHOPPING_COMPLETE_INITIALIZE - Paid受注情報のステータス更新開始');
  177.                 $this->entityManager->persist($PaidOrder);
  178.                 $this->entityManager->flush();
  179.                 $this->serLogMessage('FRONT_SHOPPING_COMPLETE_INITIALIZE - Paid受注情報のステータス更新終了');
  180.             }
  181.         }
  182.     }
  183.     /**
  184.      * @param Order $Order
  185.      */
  186.     public function changeOrderStatus(Order $Order)
  187.     {
  188.         // 編集前の受注情報を保持
  189.         $OriginOrder = clone $Order;
  190.         $OriginItems = new ArrayCollection();
  191.         foreach ($Order->getOrderItems() as $Item) {
  192.             $OriginItems->add($Item);
  193.         }
  194.         // 受注ステータスを注文取消しに変更
  195.         $OrderStatus =
  196.             $this->orderStatusRepository->find(OrderStatus::CANCEL);
  197.         $Order->setOrderStatus($OrderStatus);
  198.         $OldStatus $OriginOrder->getOrderStatus();
  199.         $NewStatus $Order->getOrderStatus();
  200.         // ステータスが変更されている場合はステートマシンを実行.
  201.         if ($Order->getId() && $OldStatus->getId() != $NewStatus->getId()) {
  202.             // 発送済に変更された場合は, 発送日をセットする.
  203.             if ($NewStatus->getId() == OrderStatus::DELIVERED) {
  204.                 $Order->getShippings()->map(function (Shipping $Shipping) {
  205.                     if (!$Shipping->isShipped()) {
  206.                         $Shipping->setShippingDate(new \DateTime());
  207.                     }
  208.                 });
  209.             }
  210.             // ステートマシンでステータスは更新されるので, 古いステータスに戻す.
  211.             $Order->setOrderStatus($OldStatus);
  212.             // FormTypeでステータスの遷移チェックは行っているのでapplyのみ実行.
  213.             $this->orderStateMachine->apply($Order$NewStatus);
  214.         }
  215.         $this->entityManager->persist($Order);
  216.         $this->entityManager->flush();
  217.     }
  218.     /**
  219.      * @param string $Message
  220.      */
  221.     private function serLogMessage($Message '')
  222.     {
  223.         PaidUtil::logInfo(__NAMESPACE__ get_class($this) .' - '$Message);
  224.     }
  225. }