app/Plugin/Paid4/EventSubscriber/AdminOrderStateEventSubscriber.php line 102

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\ORM\EntityManagerInterface;
  8. use Eccube\Common\EccubeConfig;
  9. use Eccube\Entity\Order;
  10. use \Exception;
  11. use Plugin\Paid4\Entity\PaidOrder;
  12. use Plugin\Paid4\Service\PaidApi\PaidHelperOrder;
  13. use Plugin\Paid4\Service\Payment\Method\PaidMethod;
  14. use Plugin\Paid4\Util\PaidUtil;
  15. use Symfony\Component\DependencyInjection\ContainerInterface;
  16. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  17. use Symfony\Component\Workflow\Event\Event;
  18. class AdminOrderStateEventSubscriber implements EventSubscriberInterface
  19. {
  20.     /**
  21.      * 未決済ステータス
  22.      * @var mixed
  23.      */
  24.     protected $unsettled;
  25.     /**
  26.      * 決済完了ステータス
  27.      * @var mixed
  28.      */
  29.     protected $complete;
  30.     /**
  31.      * キャンセルステータス
  32.      * @var mixed
  33.      */
  34.     protected $cancel;
  35.     /**
  36.      * @var EntityManagerInterface
  37.      */
  38.     protected $entityManager;
  39.     /**
  40.      * @var PaidHelperOrder
  41.      */
  42.     protected $paidHelperOrder;
  43.     /**
  44.      * @var mixed
  45.      */
  46.     protected $routeName;
  47.     /**
  48.      * 管理画面->受注管理->出荷CSV登録のルート名
  49.      */
  50.     const ADMIN_SHIPPING_CSV_IMPORT_ROUTE_NAME 'admin_shipping_csv_import';
  51.     /**
  52.      * 管理画面->受注管理->受注一覧のルート名
  53.      */
  54.     const ADMIN_SHIPPING_UPDATE_ORDER_STATUS_ROUTE_NAME 'admin_shipping_update_order_status';
  55.     /**
  56.      * 管理画面->受注管理->PAID決済出荷CSV登録のルート名
  57.      */
  58.     const ADMIN_SHIPPING_PAID_CSV_IMPORT_ROUTE_NAME 'admin_shipping_paid_csv_import';
  59.     /**
  60.      * フロント->購入完了のルート名
  61.      */
  62.     const FRONT_SHOPPING_COMPLETE_ROUTE_NAME 'shopping_complete';
  63.     /**
  64.      * AdminOrderStateEventSubscriber constructor.
  65.      * @param EccubeConfig $eccubeConfig
  66.      * @param ContainerInterface $container
  67.      * @param EntityManagerInterface $entityManager
  68.      * @param PaidHelperOrder $paidHelperOrder
  69.      */
  70.     public function __construct(
  71.         EccubeConfig $eccubeConfig,
  72.         ContainerInterface $container,
  73.         EntityManagerInterface $entityManager,
  74.         PaidHelperOrder $paidHelperOrder
  75.     )
  76.     {
  77.         // 未決済
  78.         $this->unsettled $eccubeConfig['paid4.settlement.unsettled'];
  79.         // 決済完了
  80.         $this->complete $eccubeConfig['paid4.settlement.complete'];
  81.         // キャンセル
  82.         $this->cancel $eccubeConfig['paid4.settlement.cancel'];
  83.         $this->entityManager $entityManager;
  84.         $request $container->get('request_stack')->getCurrentRequest();
  85.         $this->routeName $request->attributes->get('_route');
  86.         $this->paidHelperOrder $paidHelperOrder;
  87.     }
  88.     /**
  89.      * @inheritDoc
  90.      */
  91.     public static function getSubscribedEvents()
  92.     {
  93.         return [
  94.             'workflow.order.transition.pay' => ['onChangeOrder'],
  95.             'workflow.order.transition.packing' => ['onChangeOrder'],
  96.             'workflow.order.transition.ship' => ['onOrderShip'],
  97.             'workflow.order.transition.cancel' => ['onOrderCancel'],
  98.         ];
  99.     }
  100.     /**
  101.      * @param Event $event
  102.      * @throws \Exception
  103.      */
  104.     public function onChangeOrder(Event $event)
  105.     {
  106.         /** @var Order $Order */
  107.         $Order $event->getSubject()->getOrder();
  108.         $this->changeOrder($Order);
  109.     }
  110.     /**
  111.      * @param Event $event
  112.      * @throws \Exception
  113.      */
  114.     public function onOrderShip(Event $event)
  115.     {
  116.         /** @var Order $Order */
  117.         $Order $event->getSubject()->getOrder();
  118.         $this->changeOrder($Order);
  119.         $this->statusValidate($Order$this->complete);
  120.     }
  121.     /**
  122.      * @param Event $event
  123.      * @throws \Exception
  124.      */
  125.     public function onOrderCancel(Event $event)
  126.     {
  127.         if ($this->routeName === self::FRONT_SHOPPING_COMPLETE_ROUTE_NAME) {
  128.             return;
  129.         }
  130.         // 既存出荷CSV登録処理は弾く
  131.         /** @var Order $Order */
  132.         $Order $event->getSubject()->getOrder();
  133.         $this->changeOrder($Order);
  134.         $this->statusValidate($Order$this->cancel);
  135.     }
  136.     /**
  137.      * @param Order $Order
  138.      * @param string $nextStatus
  139.      * @throws \Exception
  140.      */
  141.     protected function changeOrder($Order)
  142.     {
  143.         // 既存の出荷CSV登録処理は弾く
  144.         if ($this->routeName === self::ADMIN_SHIPPING_CSV_IMPORT_ROUTE_NAME) {
  145.             return;
  146.         }
  147.         // 決済方法がPaid決済か確認
  148.         $Payment $Order->getPayment();
  149.         if ($Payment->getMethodClass() !== PaidMethod::class) {
  150.             return;
  151.         }
  152.         $PaidOrder $Order->getPaidOrder();
  153.         if (!is_null($PaidOrder)
  154.             && $PaidOrder->getPaidSettlementStatus() === strval($this->unsettled)
  155.             && $Order->getPaymentTotal() != $PaidOrder->getPaymentTotal()) {
  156.             $this->serLogMessage('workflow.order.transition - paid注文内容変更API開始');
  157.             $error $this->paidHelperOrder->changeOrder($Order);
  158.             // 受注のステータスを戻すために強制終了
  159.             if (!$error) {
  160.                 $this->serLogMessage('workflow.order.transition - paid注文内容変更API失敗');
  161.                 if ($this->routeName === self::ADMIN_SHIPPING_PAID_CSV_IMPORT_ROUTE_NAME) {
  162.                     // paidCSVインポート処理の場合はreturn
  163.                     return;
  164.                 }
  165.                 throw new \Exception();
  166.             }
  167.             if ($error) {
  168.                 $this->serLogMessage('workflow.order.transition - paid注文内容変更API完了');
  169.                 $PaidOrder->setPaymentTotal($Order->getPaymentTotal());
  170.                 $Order->setPaidOrder($PaidOrder);
  171.             }
  172.         }
  173.     }
  174.     /**
  175.      * @param Order $Order
  176.      * @param string $nextStatus
  177.      * @throws \Exception
  178.      */
  179.     protected function statusValidate($Order$nextStatus)
  180.     {
  181.         // 既存の出荷CSV登録処理は弾く
  182.         if ($this->routeName === self::ADMIN_SHIPPING_CSV_IMPORT_ROUTE_NAME) {
  183.             return;
  184.         }
  185.         // 決済方法がPaid決済か確認
  186.         $Payment $Order->getPayment();
  187.         if ($Payment->getMethodClass() !== PaidMethod::class) {
  188.             return;
  189.         }
  190.         /** @var PaidOrder $PaidOrder */
  191.         $PaidOrder $Order->getPaidOrder();
  192.         // ステータスが未決済のみ処理
  193.         if (!is_null($PaidOrder) &&
  194.             $PaidOrder->getPaidSettlementStatus() === strval($this->unsettled)) {
  195.             $result false;
  196.             try {
  197.                 if ($nextStatus == $this->complete) {
  198.                     $this->serLogMessage('workflow.order.transition.ship - paid決済完了API開始');
  199.                     $result $this->paidHelperOrder->fixOrder($Order);
  200.                     $this->serLogMessage('workflow.order.transition.ship - paid決済完了API終了');
  201.                 } elseif ($nextStatus == $this->cancel) {
  202.                     $this->serLogMessage('workflow.order.transition.cancel - paid決済キャンセルAPI開始');
  203.                     $result $this->paidHelperOrder->cancelOrder($Order);
  204.                     $this->serLogMessage('workflow.order.transition.cancel - paid決済キャンセルAPI終了');
  205.                 }
  206.                 // Paid受注のステータス変更
  207.             } catch (Exception $e) {
  208.                 // ログ出力
  209.                 $this->serLogMessage('workflow.order.transition - PaidAPI失敗');
  210.                 $result false;
  211.             }
  212.             // 受注のステータスを戻すために強制終了
  213.             if (!$result) {
  214.                 if ($this->routeName === self::ADMIN_SHIPPING_PAID_CSV_IMPORT_ROUTE_NAME) {
  215.                     // paidCSVインポート処理の場合はreturn
  216.                     return;
  217.                 }
  218.                 throw new \Exception();
  219.             }
  220.             if ($result) {
  221.                 $this->serLogMessage('workflow.order.transition - paid受注ステータス更新開始');
  222.                 $PaidOrder->setPaidSettlementStatus($nextStatus);
  223.                 $PaidOrder->setSettlementDate(new \DateTime("now"));
  224.                 $Order->setPaidOrder($PaidOrder);
  225.                 if ($this->routeName === self::ADMIN_SHIPPING_UPDATE_ORDER_STATUS_ROUTE_NAME) {
  226.                     $this->entityManager->flush($PaidOrder);
  227.                 }
  228.                 $this->serLogMessage('workflow.order.transition - paid受注ステータス更新終了');
  229.             }
  230.         }
  231.     }
  232.     /**
  233.      * @param string $Message
  234.      */
  235.     private function serLogMessage($Message '')
  236.     {
  237.         PaidUtil::logInfo(__NAMESPACE__ get_class($this) .' - '$Message);
  238.     }
  239. }