app/Plugin/GmoPaymentGateway42/Controller/Admin/PaymentStatusController.php line 86

Open in your IDE?
  1. <?php
  2. /*
  3.  * Copyright(c) 2022 GMO Payment Gateway, Inc. All rights reserved.
  4.  * http://www.gmo-pg.com/
  5.  */
  6. namespace Plugin\GmoPaymentGateway42\Controller\Admin;
  7. use Eccube\Common\Constant;
  8. use Eccube\Controller\AbstractController;
  9. use Eccube\Entity\Master\OrderStatus;
  10. use Eccube\Entity\Order;
  11. use Eccube\Entity\Payment;
  12. use Eccube\Repository\Master\PageMaxRepository;
  13. use Eccube\Repository\OrderRepository;
  14. use Eccube\Util\FormUtil;
  15. use Knp\Component\Pager\PaginatorInterface;
  16. use Plugin\GmoPaymentGateway42\Entity\GmoOrderPayment;
  17. use Plugin\GmoPaymentGateway42\Entity\GmoPaymentMethod;
  18. use Plugin\GmoPaymentGateway42\Form\Type\Admin\SearchPaymentType;
  19. use Plugin\GmoPaymentGateway42\Service\PaymentHelperAdmin;
  20. use Plugin\GmoPaymentGateway42\Util\PaymentUtil;
  21. use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
  22. use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
  23. use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
  24. use Symfony\Component\HttpFoundation\Request;
  25. use Symfony\Component\HttpKernel\Exception\BadRequestHttpException;
  26. /**
  27.  * 決済状況管理
  28.  */
  29. class PaymentStatusController extends AbstractController
  30. {
  31.     /**
  32.      * @var PageMaxRepository
  33.      */
  34.     protected $pageMaxRepository;
  35.     /**
  36.      * @var OrderRepository
  37.      */
  38.     protected $orderRepository;
  39.     /**
  40.      * @var Plugin\GmoPaymentGateway42\Service\PaymentHelperAdmin
  41.      */
  42.     protected $PaymentHelperAdmin;
  43.     /**
  44.      * @var array
  45.      */
  46.     protected $bulkActions = [];
  47.     /**
  48.      * PaymentController constructor.
  49.      *
  50.      * @param OrderStatusRepository $orderStatusRepository
  51.      */
  52.     public function __construct(
  53.         PageMaxRepository $pageMaxRepository,
  54.         OrderRepository $orderRepository,
  55.         PaymentHelperAdmin $PaymentHelperAdmin
  56.     ) {
  57.         $this->pageMaxRepository $pageMaxRepository;
  58.         $this->orderRepository $orderRepository;
  59.         $this->PaymentHelperAdmin $PaymentHelperAdmin;
  60.         $this->bulkActions = [
  61.             ['id' => 1'name' => trans('gmo_payment_gateway.admin.' .
  62.                                         'payment_status.bulk_action_commit')],
  63.             ['id' => 2'name' => trans('gmo_payment_gateway.admin.' .
  64.                                         'payment_status.bulk_action_cancel')],
  65.             ['id' => 3'name' => trans('gmo_payment_gateway.admin.' .
  66.                                         'payment_status.bulk_action_reauth')],
  67.         ];
  68.     }
  69.     /**
  70.      * 決済状況一覧画面
  71.      *
  72.      * @Route("/%eccube_admin_route%/gmo_payment_gateway/payment_status", name="gmo_payment_gateway_admin_payment_status")
  73.      * @Route("/%eccube_admin_route%/gmo_payment_gateway/payment_status/{page_no}", requirements={"page_no" = "\d+"}, name="gmo_payment_gateway_admin_payment_status_pageno")
  74.      * @Template("@GmoPaymentGateway42/admin/payment_status.twig")
  75.      */
  76.     public function index
  77.         (Request $requestPaginatorInterface $paginator$page_no null)
  78.     {
  79.         $searchForm $this->createForm(SearchPaymentType::class);
  80.         // 決済状況の配列を取得
  81.         $paymentStatuses $this->PaymentHelperAdmin->getPaymentStatuses();
  82.         /**
  83.          * ページの表示件数は, 以下の順に優先される.
  84.          * - リクエストパラメータ
  85.          * - セッション
  86.          * - デフォルト値
  87.          * また, セッションに保存する際は mtb_page_maxと照合し,
  88.          * 一致した場合のみ保存する.
  89.          **/
  90.         $page_count $this->session->get
  91.             ('gmo_payment_gateway.admin.payment_status.search.page_count',
  92.              $this->eccubeConfig->get('eccube_default_page_count'));
  93.         $page_count_param = (int) $request->get('page_count');
  94.         $pageMaxis $this->pageMaxRepository->findAll();
  95.         if ($page_count_param) {
  96.             foreach ($pageMaxis as $pageMax) {
  97.                 if ($page_count_param == $pageMax->getName()) {
  98.                     $page_count $pageMax->getName();
  99.                     $this->session->set
  100.                         ('gmo_payment_gateway.admin.' .
  101.                          'payment_status.search.page_count'$page_count);
  102.                     break;
  103.                 }
  104.             }
  105.         }
  106.         if ('POST' === $request->getMethod()) {
  107.             $searchForm->handleRequest($request);
  108.             if ($searchForm->isSubmitted() && $searchForm->isValid()) {
  109.                 /**
  110.                  * 検索が実行された場合は, セッションに検索条件を保存する.
  111.                  * ページ番号は最初のページ番号に初期化する.
  112.                  */
  113.                 $page_no 1;
  114.                 $searchData $searchForm->getData();
  115.                 // 検索条件, ページ番号をセッションに保持.
  116.                 $this->session->set
  117.                     ('gmo_payment_gateway.admin.' .
  118.                      'payment_status.search',
  119.                      FormUtil::getViewData($searchForm));
  120.                 $this->session->set
  121.                     ('gmo_payment_gateway.admin.' .
  122.                      'payment_status.search.page_no'$page_no);
  123.             } else {
  124.                 // 検索エラーの際は, 詳細検索枠を開いてエラー表示する.
  125.                 return [
  126.                     'searchForm' => $searchForm->createView(),
  127.                     'pagination' => [],
  128.                     'pageMaxis' => $pageMaxis,
  129.                     'page_no' => $page_no,
  130.                     'page_count' => $page_count,
  131.                     'has_errors' => true,
  132.                     'paymentStatuses' => $paymentStatuses,
  133.                 ];
  134.             }
  135.         } else {
  136.             if (null !== $page_no || $request->get('resume')) {
  137.                 /*
  138.                  * ページ送りの場合または、他画面から戻ってきた場合は,
  139.                  * セッションから検索条件を復旧する.
  140.                  */
  141.                 if ($page_no) {
  142.                     // ページ送りで遷移した場合.
  143.                     $this->session->set
  144.                         ('gmo_payment_gateway.admin.' .
  145.                          'payment_status.search.page_no', (int) $page_no);
  146.                 } else {
  147.                     // 他画面から遷移した場合.
  148.                     $page_no $this->session->get
  149.                         ('gmo_payment_gateway.admin.' .
  150.                          'payment_status.search.page_no'1);
  151.                 }
  152.                 $viewData $this->session->get
  153.                     ('gmo_payment_gateway.admin.payment_status.search', []);
  154.                 $searchData =
  155.                     FormUtil::submitAndGetData($searchForm$viewData);
  156.             } else {
  157.                 /**
  158.                  * 初期表示の場合.
  159.                  */
  160.                 $page_no 1;
  161.                 $searchData = [];
  162.                 // セッション中の検索条件, ページ番号を初期化.
  163.                 $this->session->set
  164.                     ('gmo_payment_gateway.admin.' .
  165.                      'payment_status.search'$searchData);
  166.                 $this->session->set
  167.                     ('gmo_payment_gateway.admin.' .
  168.                      'payment_status.search.page_no'$page_no);
  169.             }
  170.         }
  171.         $qb $this->createQueryBuilder($searchData);
  172.         $pagination $paginator->paginate(
  173.             $qb,
  174.             $page_no,
  175.             $page_count
  176.         );
  177.         return [
  178.             'searchForm' => $searchForm->createView(),
  179.             'pagination' => $pagination,
  180.             'pageMaxis' => $pageMaxis,
  181.             'page_no' => $page_no,
  182.             'page_count' => $page_count,
  183.             'has_errors' => false,
  184.             'bulkActions' => $this->bulkActions,
  185.             'paymentStatuses' => $paymentStatuses,
  186.         ];
  187.     }
  188.     /**
  189.      * アクションの検査
  190.      *
  191.      * @param integer $id アクションID
  192.      * @return boolean true: ok, false: ng
  193.      */
  194.     private function checkAction($id)
  195.     {
  196.         foreach ($this->bulkActions as $action) {
  197.             if ($action['id'] == $id) {
  198.                 return true;
  199.             }
  200.         }
  201.         return false;
  202.     }
  203.     /**
  204.      * 一括処理.
  205.      *
  206.      * @Route("/%eccube_admin_route%/gmo_payment_gateway/payment_status/bulk_action/{id}", requirements={"id" = "\d+"}, name="gmo_payment_gateway_admin_payment_status_bulk_action", methods={"POST"})
  207.      */
  208.     public function bulkAction(Request $request$id)
  209.     {
  210.         PaymentUtil::logInfo("PaymentStatusController::bulkAction start.");
  211.         if (!$this->checkAction($id)) {
  212.             PaymentUtil::logError("action id = " $id);
  213.             PaymentUtil::logError($this->bulkActions);
  214.             throw new BadRequestHttpException();
  215.         }
  216.         $this->isTokenValid();
  217.         PaymentUtil::logInfo($request->get('ids'));
  218.         /** @var Order[] $Orders */
  219.         $Orders $this->orderRepository
  220.             ->findBy(['id' => $request->get('ids')]);
  221.         $count 0;
  222.         $prefix 'gmo_payment_gateway.admin.payment_status.';
  223.         foreach ($Orders as $Order) {
  224.             $r true;
  225.             $myname "";
  226.             // 注文に GMO-PG 情報を付加する
  227.             $Order $this->PaymentHelperAdmin->prepareGmoInfoForOrder($Order);
  228.             switch ($id) {
  229.             // 一括売上
  230.             case 1:
  231.                 $myname trans($prefix 'bulk_action_commit');
  232.                 PaymentUtil::logInfo($myname " start");
  233.                 $r $this->PaymentHelperAdmin->doCommitOrder($Order);
  234.                 break;
  235.             // 一括取消
  236.             case 2:
  237.                 $myname trans($prefix 'bulk_action_cancel');
  238.                 PaymentUtil::logInfo($myname " start");
  239.                 $r $this->PaymentHelperAdmin->doCancelOrder($Order);
  240.                 break;
  241.             // 一括再オーソリ
  242.             case 3:
  243.                 $myname trans($prefix 'bulk_action_reauth');
  244.                 PaymentUtil::logInfo($myname " start");
  245.                 $r $this->PaymentHelperAdmin->doReauthOrder($Order);
  246.                 break;
  247.             }
  248.             $this->setCompleteMessage($myname$r$Order->getId());
  249.             PaymentUtil::logInfo($myname " end");
  250.             $this->entityManager->flush();
  251.             if ($r) {
  252.                 $count++;
  253.             }
  254.         }
  255.         $message trans('gmo_payment_gateway.admin.' .
  256.                          'payment_status.bulk_action.success',
  257.                          ['%count%' => $count]);
  258.         $this->addSuccess($message'admin');
  259.         PaymentUtil::logInfo($message);
  260.         PaymentUtil::logInfo("PaymentStatusController::bulkAction end.");
  261.         return $this->redirectToRoute
  262.             ('gmo_payment_gateway_admin_payment_status_pageno',
  263.              ['resume' => Constant::ENABLED]);
  264.     }
  265.     private function createQueryBuilder(array $searchData)
  266.     {
  267.         $qb $this->entityManager->createQueryBuilder();
  268.         $qb->select('o')
  269.             ->from(Order::class, 'o')
  270.             ->innerJoin('o.Payment''p')
  271.             ->innerJoin(GmoPaymentMethod::class, 'm',
  272.                         'WITH''p.id = m.payment_id')
  273.             ->innerJoin(GmoOrderPayment::class, 'g',
  274.                         'WITH''o.id = g.order_id')
  275.             ->where($qb->expr()->andx(
  276.                 $qb->expr()->notIn('o.OrderStatus', [OrderStatus::PENDING,
  277.                                                      OrderStatus::PROCESSING])
  278.             ))
  279.             ->orderBy('o.order_date''DESC')
  280.             ->addOrderBy('o.id''DESC');
  281.         if (!empty($searchData['Payments']) &&
  282.             count($searchData['Payments']) > 0) {
  283.             $qb->andWhere($qb->expr()->in('o.Payment'':Payments'))
  284.                 ->setParameter('Payments'$searchData['Payments']);
  285.         }
  286.         if (!empty($searchData['OrderStatuses']) &&
  287.             count($searchData['OrderStatuses']) > 0) {
  288.             $qb->andWhere($qb->expr()->in('o.OrderStatus'':OrderStatuses'))
  289.                 ->setParameter('OrderStatuses'$searchData['OrderStatuses']);
  290.         }
  291.         if (!empty($searchData['PaymentStatuses']) &&
  292.             count($searchData['PaymentStatuses']) > 0) {
  293.             $qb->andWhere
  294.                 ($qb->expr()->in
  295.                  ('g.memo04'':PaymentStatuses'))
  296.                 ->setParameter('PaymentStatuses',
  297.                                $searchData['PaymentStatuses']);
  298.         }
  299.         return $qb;
  300.     }
  301.     /**
  302.      * 処理結果からメッセージを作成する
  303.      *
  304.      * @param string $myname 処理名称
  305.      * @param boolean $result 処理結果
  306.      * @param integer $order_id 注文番号
  307.      */
  308.     private function setCompleteMessage($myname$result$order_id)
  309.     {
  310.         $orderTitle trans('gmo_payment_gateway.admin.' .
  311.                             'payment_status.col_order_no');
  312.         $prefix 'gmo_payment_gateway.admin.order_edit.';
  313.         if (!$result) {
  314.             $errors $this->PaymentHelperAdmin->getError();
  315.             if (empty($errors)) {
  316.                 $message trans($prefix 'action_error');
  317.                 $message $myname " [" $orderTitle ": " .
  318.                     $order_id "] " $message;
  319.                 $this->addDanger($message'admin');
  320.                 PaymentUtil::logError($message);
  321.             } else {
  322.                 foreach ($errors as $errMess) {
  323.                     $errMess $myname " [" $orderTitle ": " .
  324.                         $order_id "] " $errMess;
  325.                     $this->addDanger($errMess'admin');
  326.                     PaymentUtil::logError($errMess);
  327.                 }
  328.             }
  329.             $this->PaymentHelperAdmin->resetError();
  330.             return;
  331.         }
  332.         $message trans($prefix 'action_msg');
  333.         $message $myname " [" $orderTitle ": " .
  334.             $order_id "] " $message;
  335.         PaymentUtil::logInfo($message);
  336.     }
  337. }