app/Plugin/TeikiOrder42/Controller/Mypage/TeikiUserController.php line 92

Open in your IDE?
  1. <?php
  2. namespace Plugin\TeikiOrder42\Controller\Mypage;
  3. use Eccube\Controller\AbstractController;
  4. use Eccube\Entity\CustomerAddress;
  5. use Eccube\Entity\Shipping;
  6. use Eccube\Repository\OrderRepository;
  7. use Eccube\Repository\ShippingRepository;
  8. use Eccube\Service\CartService;
  9. use Eccube\Service\PurchaseFlow\PurchaseContext;
  10. use Eccube\Service\PurchaseFlow\PurchaseFlow;
  11. use Eccube\Form\Type\Front\ShoppingShippingType;
  12. use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
  13. use Symfony\Component\Form\FormError;
  14. use Symfony\Component\HttpFoundation\RedirectResponse;
  15. use Symfony\Component\HttpFoundation\Request;
  16. use Symfony\Component\Routing\Annotation\Route;
  17. use Symfony\Component\HttpKernel\Exception\BadRequestHttpException;
  18. use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
  19. use Knp\Component\Pager\PaginatorInterface;
  20. use Plugin\TeikiOrder42\Repository\TeikiOrderRepository;
  21. use Plugin\TeikiOrder42\Service\TeikiOrderMailService;
  22. use Plugin\TeikiOrder42\Form\Type\TeikiWithdrawalType;
  23. class TeikiUserController extends AbstractController
  24. {
  25.     /**
  26.      * @var TeikiOrderRepository
  27.      */
  28.     protected $teikiOrderRepository;
  29.     /**
  30.      * @var ShippingRepository
  31.      */
  32.     protected $shippingRepository;
  33.     /**
  34.      * @var TeikiOrderMailService
  35.      */
  36.     protected $teikiOrderMailService;
  37.     /**
  38.      * @var OrderRepository
  39.      */
  40.     protected $orderRepository;
  41.     /**
  42.      * @var CartService
  43.      */
  44.     protected $cartService;
  45.     /**
  46.      * @var PurchaseFlow
  47.      */
  48.     protected $purchaseFlow;
  49.     /**
  50.      * CouponShoppingController constructor.
  51.      *
  52.      * @param TeikiOrderRepository $teikiOrderRepository
  53.      * @param ShippingRepository $shippingRepository
  54.      * @param OrderRepository $orderRepository
  55.      * @param CartService $cartService
  56.      * @param PurchaseFlow $purchaseFlow
  57.      */
  58.     public function __construct(
  59.         TeikiOrderRepository $teikiOrderRepository,
  60.         ShippingRepository $shippingRepository,
  61.         TeikiOrderMailService $teikiOrderMailService,
  62.         OrderRepository $orderRepository,
  63.         CartService $cartService,
  64.         PurchaseFlow $purchaseFlow
  65.     ) {
  66.         $this->teikiOrderRepository $teikiOrderRepository;
  67.         $this->shippingRepository $shippingRepository;
  68.         $this->teikiOrderMailService $teikiOrderMailService;
  69.         $this->orderRepository $orderRepository;
  70.         $this->cartService $cartService;
  71.         $this->purchaseFlow $purchaseFlow;
  72.     }
  73.     /**
  74.      * 書籍読み放題ページページ.
  75.      *
  76.      * @Route("/mypage/teiki", name="mypage_teiki", methods={"GET"})
  77.      * @Template("Mypage/teiki.twig")
  78.      *
  79.      * @param Request $request
  80.      */
  81.     public function teiki(Request $requestPaginatorInterface $paginator)
  82.     {
  83.         //定期ユーザーかチェック
  84.         $Customer $this->getUser();
  85.         if ($Customer->getTeikiUserFlg() != 1) {
  86.             new NotFoundHttpException();
  87.         }
  88.         // 購入処理中/決済処理中ステータスの受注を非表示にする.
  89.         $this->entityManager
  90.             ->getFilters()
  91.             ->enable('incomplete_order_status_hidden');
  92.         // paginator
  93.         $qb $this->teikiOrderRepository->getQueryBuilderByCustomer($Customer);
  94.         $pagination $paginator->paginate(
  95.             $qb,
  96.             $request->get('pageno'1),
  97.             $this->eccubeConfig['eccube_search_pmax']
  98.         );
  99.         return [
  100.             'pagination' => $pagination,
  101.         ];
  102.     }
  103.     /**
  104.      * 書籍読み放題ページページ.
  105.      *
  106.      * @Route("/mypage/teiki/history/{order_no}", name="mypage_teiki_history", methods={"GET"}, requirements={"order_no" = "\d+"})
  107.      * @Template("Mypage/teiki_history.twig")
  108.      *
  109.      * @param Request $request
  110.      */
  111.     public function teikiHistory(Request $request$order_no)
  112.     {
  113.         $this->entityManager->getFilters()
  114.             ->enable('incomplete_order_status_hidden');
  115.         $TeikiOrder $this->teikiOrderRepository->findOneBy(
  116.             [
  117.                 'Order' => $order_no,
  118.             ]
  119.         );
  120.         if (!$TeikiOrder) {
  121.             throw new NotFoundHttpException();
  122.         }
  123.         if ($TeikiOrder->getOrder()->getCustomer() !== $this->getUser()) {
  124.             throw new NotFoundHttpException();
  125.         }
  126.         $Carts $this->cartService->getCarts();
  127.         $teiki_book_in_cart false;
  128.         foreach ($Carts as $Cart) {
  129.             foreach ($Cart->getCartItems() as $CartItem) {
  130.                 if ($CartItem->isProduct()) {
  131.                     if ($CartItem->getProductClass()->getSaleType()->getId() == 4) {
  132.                         $teiki_book_in_cart true;
  133.                         break;
  134.                     }
  135.                 }
  136.             }
  137.         }
  138.         return [
  139.             'TeikiOrder' => $TeikiOrder,
  140.             'teiki_book_in_cart' => $teiki_book_in_cart,
  141.         ];
  142.     }
  143.     /**
  144.      * 書籍読み放題ページページ.
  145.      *
  146.      * @Route("/mypage/teiki/change_delivery/{order_no}", name="mypage_teiki_change_delivery", methods={"GET", "POST"}, requirements={"order_no" = "\d+"})
  147.      * @Route("/mypage/teiki/change_delivery/{order_no}", name="mypage_teiki_change_delivery_confirm", methods={"GET", "POST"}, requirements={"order_no" = "\d+"})
  148.      * @Template("Mypage/teiki_change_delivery.twig")
  149.      *
  150.      * @param Request $request
  151.      */
  152.     public function teikiChange(Request $request$order_no)
  153.     {
  154.         $TeikiOrder $this->teikiOrderRepository->findOneBy(
  155.             [
  156.                 'Order' => $order_no,
  157.             ]
  158.         );
  159.         if ($TeikiOrder->getOrder()->getCustomer() !== $this->getUser()) {
  160.             throw new NotFoundHttpException();
  161.         }
  162.         $CustomerAddress = new CustomerAddress();
  163.         $builder $this->formFactory->createBuilder(ShoppingShippingType::class, $CustomerAddress);
  164.         $form $builder->getForm();
  165.         $form->handleRequest($request);
  166.         if ($form->isSubmitted() && $form->isValid()) {
  167.             log_info('[定期購読]お届け先変更確認画面', ['order_id' => $TeikiOrder->getOrder()->getId()]);
  168.             switch ($request->get('mode')) {
  169.                 case 'confirm':
  170.                     return $this->render('Mypage/teiki_change_delivery_confirm.twig', [
  171.                         'form' => $form->createView(),
  172.                         'TeikiOrder' => $TeikiOrder,
  173.                     ]);
  174.                 case 'complete':
  175.                     $data $form->getData();
  176.                     $Shipping $this->shippingRepository->findBy(['Order' => $TeikiOrder->getOrder()]);
  177.                     if (!$Shipping) {
  178.                         throw new NotFoundHttpException();
  179.                     }
  180.                     $Shipping[0]
  181.                         ->setName01($data['name01'])
  182.                         ->setName02($data['name02'])
  183.                         ->setKana01($data['kana01'])
  184.                         ->setKana02($data['kana02'])
  185.                         ->setCompanyName($data['company_name'])
  186.                         ->setPhoneNumber($data['phone_number'])
  187.                         ->setPostalCode($data['postal_code'])
  188.                         ->setPref($data['Pref'])
  189.                         ->setAddr01($data['addr01'])
  190.                         ->setAddr02($data['addr02']);
  191.                     $this->entityManager->persist($Shipping[0]);
  192.                     $this->entityManager->flush();
  193.                     $this->teikiOrderMailService->sendChangeDeliveryMail($TeikiOrder$data);
  194.                     //return $this->render('Mypage/teiki_change_delivery_complete.twig', [
  195.                     //    'form' => $form->createView(),
  196.                     //    'TeikiOrder' => $TeikiOrder,
  197.                     //]);
  198.                     return $this->redirect($this->generateUrl('mypage_teiki_change_delivery_complete'));
  199.             }
  200.         }
  201.         return [
  202.             'form' => $form->createView(),
  203.             'TeikiOrder' => $TeikiOrder,
  204.         ];
  205.     }
  206.     /**
  207.      * 定期購読完了画面.
  208.      *
  209.      * @Route("/mypage/teiki/change_delivery/complete", name="mypage_teiki_change_delivery_complete", methods={"GET"})
  210.      * @Template("Mypage/teiki_change_delivery_complete.twig")
  211.      */
  212.     public function complete()
  213.     {
  214.         return [];
  215.     }
  216.     /**
  217.      * 定期購読を解約する.
  218.      *
  219.      * @Route("/mypage/teiki/withdrawal/{order_no}", name="mypage_teiki_withdrawal", methods={"GET", "POST"}, requirements={"order_no" = "\d+"})
  220.      * @Route("/mypage/teiki/withdrawal/{order_no}", name="mypage_teiki_withdrawal_confirm", methods={"GET", "POST"}, requirements={"order_no" = "\d+"})
  221.      * @Template("Mypage/teiki_withdrawal.twig")
  222.      *
  223.      * @param Request $request
  224.      */
  225.     public function teikiWithdrawal(Request $request$order_no)
  226.     {
  227.         $TeikiOrder $this->teikiOrderRepository->findOneBy(
  228.             [
  229.                 'Order' => $order_no,
  230.             ]
  231.         );
  232.         if ($TeikiOrder->getOrder()->getCustomer() !== $this->getUser()) {
  233.             throw new NotFoundHttpException();
  234.         }
  235.         foreach ($TeikiOrder->getOrder()->getOrderItems() as $orderItem) {
  236.             if ($orderItem->isProduct()) {
  237.                 $TeikiOrderItem $orderItem;
  238.             }
  239.         }
  240.         if (!$TeikiOrderItem) {
  241.             throw new NotFoundHttpException();
  242.         }
  243.         $builder $this->formFactory->createBuilder(TeikiWithdrawalType::class);
  244.         $builder->setData(
  245.             [
  246.                 'TeikiOrder' => $TeikiOrder,
  247.             ]
  248.         );
  249.         $form $builder->getForm();
  250.         $form->handleRequest($request);
  251.         if ($form->isSubmitted() && $form->isValid()) {
  252.             log_info('[定期購読]解約申し込み', ['order_id' => $TeikiOrder->getOrder()->getId()]);
  253.             switch ($request->get('mode')) {
  254.                 case 'confirm':
  255.                     return $this->render('Mypage/teiki_withdrawal_confirm.twig', [
  256.                         'form' => $form->createView(),
  257.                         'TeikiOrder' => $TeikiOrder,
  258.                     ]);
  259.                 case 'complete':
  260.                     $data $form->getData();
  261.                     $this->teikiOrderMailService->sendWithdrawalMail($TeikiOrder$data);
  262.                     //return $this->render('Mypage/teiki_withdrawal_complete.twig', [
  263.                     //    'form' => $form->createView(),
  264.                     //    'TeikiOrder' => $TeikiOrder,
  265.                     //]);
  266.                     return $this->redirect($this->generateUrl('mypage_teiki_withdrawal_complete'));
  267.             }
  268.         }
  269.         return [
  270.             'form' => $form->createView(),
  271.             'TeikiOrder' => $TeikiOrder,
  272.         ];
  273.     }
  274.     /**
  275.      * 定期購読完了画面.
  276.      *
  277.      * @Route("/mypage/teiki/withdrawal/complete", name="mypage_teiki_withdrawal_complete", methods={"GET"})
  278.      * @Template("Mypage/teiki_withdrawal_complete.twig")
  279.      */
  280.     public function completeWithdrawal()
  281.     {
  282.         return [];
  283.     }
  284.     /**
  285.      * 再購入を行う.
  286.      *
  287.      * @Route("/mypage/teiki/order/{order_no}", name="mypage_teiki_order", methods={"PUT"})
  288.      */
  289.     public function order(Request $request$order_no)
  290.     {
  291.         $this->isTokenValid();
  292.         log_info('再注文開始', [$order_no]);
  293.         $Customer $this->getUser();
  294.         /* @var $Order \Eccube\Entity\Order */
  295.         $Order $this->orderRepository->findOneBy(
  296.             [
  297.                 'order_no' => $order_no,
  298.                 'Customer' => $Customer,
  299.             ]
  300.         );
  301.         if (!$Order) {
  302.             log_info('対象の注文が見つかりません', [$order_no]);
  303.             throw new NotFoundHttpException();
  304.         }
  305.         // エラーメッセージの配列
  306.         $errorMessages = [];
  307.         foreach ($Order->getOrderItems() as $OrderItem) {
  308.             try {
  309.                 if ($OrderItem->getProduct() && $OrderItem->getProductClass()) {
  310.                     $this->cartService->addProduct($OrderItem->getProductClass(), $OrderItem->getQuantity());
  311.                     // 明細の正規化
  312.                     $Carts $this->cartService->getCarts();
  313.                     foreach ($Carts as $Cart) {
  314.                         $result $this->purchaseFlow->validate($Cart, new PurchaseContext($Cart$this->getUser()));
  315.                         // 復旧不可のエラーが発生した場合は追加した明細を削除.
  316.                         if ($result->hasError()) {
  317.                             $this->cartService->removeProduct($OrderItem->getProductClass());
  318.                             foreach ($result->getErrors() as $error) {
  319.                                 $errorMessages[] = $error->getMessage();
  320.                             }
  321.                         }
  322.                         foreach ($result->getWarning() as $warning) {
  323.                             $errorMessages[] = $warning->getMessage();
  324.                         }
  325.                         $Cart->setOldTeikiOrderId($order_no);
  326.                     }
  327.                     $this->cartService->save();
  328.                 }
  329.             } catch (CartException $e) {
  330.                 log_info($e->getMessage(), [$order_no]);
  331.                 $this->addRequestError($e->getMessage());
  332.             }
  333.         }
  334.         foreach ($errorMessages as $errorMessage) {
  335.             $this->addRequestError($errorMessage);
  336.         }
  337.         log_info('再注文完了', [$order_no]);
  338.         return $this->redirect($this->generateUrl('cart'));
  339.     }
  340. }