app/Customize/Controller/Mypage/MyPageController.php line 201

Open in your IDE?
  1. <?php
  2. /*
  3.  * This file is part of EC-CUBE
  4.  *
  5.  * Copyright(c) EC-CUBE CO.,LTD. All Rights Reserved.
  6.  *
  7.  * http://www.ec-cube.co.jp/
  8.  *
  9.  * For the full copyright and license information, please view the LICENSE
  10.  * file that was distributed with this source code.
  11.  */
  12. namespace Customize\Controller\Mypage;
  13. use Eccube\Controller\AbstractController;
  14. use Eccube\Entity\BaseInfo;
  15. use Eccube\Entity\Customer;
  16. use Eccube\Entity\Order;
  17. use Eccube\Entity\Product;
  18. use Eccube\Event\EccubeEvents;
  19. use Eccube\Event\EventArgs;
  20. use Eccube\Exception\CartException;
  21. use Eccube\Form\Type\Front\CustomerLoginType;
  22. use Eccube\Repository\BaseInfoRepository;
  23. use Eccube\Repository\CustomerFavoriteProductRepository;
  24. use Eccube\Repository\OrderRepository;
  25. use Eccube\Repository\ProductRepository;
  26. use Customize\Repository\SchoolRepository;
  27. use Customize\Repository\DeliveryPeriodRepository;
  28. use Customize\Service\CartService;
  29. use Eccube\Service\PurchaseFlow\PurchaseContext;
  30. use Eccube\Service\PurchaseFlow\PurchaseFlow;
  31. use Knp\Component\Pager\PaginatorInterface;
  32. use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
  33. use Symfony\Component\HttpFoundation\Request;
  34. use Symfony\Component\HttpKernel\Exception\BadRequestHttpException;
  35. use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
  36. use Symfony\Component\Routing\Annotation\Route;
  37. use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
  38. use Customize\Repository\ProductStoreRepository;
  39. use Customize\Repository\OrderItemRepository;
  40. use Eccube\Repository\Master\OrderStatusRepository;
  41. use Eccube\Repository\ProductClassRepository;
  42. use Eccube\Repository\DeliveryFeeRepository;
  43. use Eccube\Repository\Master\CustomerOrderStatusRepository;
  44. class MyPageController extends AbstractController
  45. {
  46.     /**
  47.      * @var ProductRepository
  48.      */
  49.     protected $productRepository;
  50.     /**
  51.      * @var CustomerFavoriteProductRepository
  52.      */
  53.     protected $customerFavoriteProductRepository;
  54.     /**
  55.      * @var BaseInfo
  56.      */
  57.     protected $BaseInfo;
  58.     /**
  59.      * @var CartService
  60.      */
  61.     protected $cartService;
  62.     /**
  63.      * @var OrderRepository
  64.      */
  65.     protected $orderRepository;
  66.     /**
  67.      * @var SchoolRepository
  68.      */
  69.     protected $schoolRepository;
  70.     /**
  71.      * @var DeliveryPeriodRepository
  72.      */
  73.     protected $deliveryPeriodRepository;
  74.     /**
  75.      * @var PurchaseFlow
  76.      */
  77.     protected $purchaseFlow;
  78.     /**
  79.      * @var productStoreRepository
  80.      */
  81.     protected $productStoreRepository;
  82.     /**
  83.      * @var orderStatusRepository
  84.      */
  85.     protected $orderStatusRepository;
  86.     /**
  87.      * @var customerOrderStatusRepository
  88.      */
  89.     protected $customerOrderStatusRepository;
  90.     /**
  91.      * @var ProductClassRepository
  92.      */
  93.     protected $productClassRepository;
  94.     /**
  95.      * @var OrderItemRepository
  96.      */
  97.     protected $orderItemRepository;
  98.     /**
  99.      * @var DeliveryFeeRepository
  100.      */
  101.     protected $deliveryFeeRepository;
  102.     /**
  103.      * MypageController constructor.
  104.      *
  105.      * @param OrderRepository $orderRepository
  106.      * @param CustomerFavoriteProductRepository $customerFavoriteProductRepository
  107.      * @param CartService $cartService
  108.      * @param BaseInfoRepository $baseInfoRepository
  109.      * @param PurchaseFlow $purchaseFlow
  110.      * @param SchoolRepository $schoolRepository
  111.      * @param DeliveryPeriodRepository $deliveryPeriodRepository
  112.      * @param ProductStoreRepository $productStoreRepository
  113.      * @param OrderStatusRepository $orderStatusRepository
  114.      */
  115.     public function __construct(
  116.         OrderRepository $orderRepository,
  117.         CustomerFavoriteProductRepository $customerFavoriteProductRepository,
  118.         CartService $cartService,
  119.         BaseInfoRepository $baseInfoRepository,
  120.         PurchaseFlow $purchaseFlow,
  121.         SchoolRepository $schoolRepository,
  122.         DeliveryPeriodRepository $deliveryPeriodRepository,
  123.         ProductStoreRepository $productStoreRepository,
  124.         OrderStatusRepository $orderStatusRepository,
  125.         CustomerOrderStatusRepository $customerOrderStatusRepository,
  126.         ProductRepository $productRepository,
  127.         ProductClassRepository $productClassRepository,
  128.         OrderItemRepository $orderItemRepository,
  129.         DeliveryFeeRepository $deliveryFeeRepository
  130.     ) {
  131.         $this->orderRepository $orderRepository;
  132.         $this->customerFavoriteProductRepository $customerFavoriteProductRepository;
  133.         $this->BaseInfo $baseInfoRepository->get();
  134.         $this->cartService $cartService;
  135.         $this->purchaseFlow $purchaseFlow;
  136.         $this->schoolRepository $schoolRepository;
  137.         $this->deliveryPeriodRepository $deliveryPeriodRepository;
  138.         $this->productStoreRepository $productStoreRepository;
  139.         $this->orderStatusRepository $orderStatusRepository;
  140.         $this->productRepository $productRepository;
  141.         $this->productClassRepository $productClassRepository;
  142.         $this->orderItemRepository $orderItemRepository;
  143.         $this->deliveryFeeRepository $deliveryFeeRepository;
  144.         $this->customerOrderStatusRepository $customerOrderStatusRepository;
  145.     }
  146.     /**
  147.      * ログイン画面.
  148.      *
  149.      * @Route("/mypage/login", name="mypage_login", methods={"GET", "POST"})
  150.      * @Template("Mypage/login.twig")
  151.      */
  152.     public function login(Request $requestAuthenticationUtils $utils)
  153.     {
  154.         if ($this->isGranted('IS_AUTHENTICATED_FULLY')) {
  155.             log_info('認証済のためログイン処理をスキップ');
  156.             return $this->redirectToRoute('mypage');
  157.         }
  158.         /* @var $form \Symfony\Component\Form\FormInterface */
  159.         $builder $this->formFactory
  160.             ->createNamedBuilder(''CustomerLoginType::class);
  161.         $builder->get('login_memory')->setData((bool) $request->getSession()->get('_security.login_memory'));
  162.         if ($this->isGranted('IS_AUTHENTICATED_REMEMBERED')) {
  163.             $Customer $this->getUser();
  164.             if ($Customer instanceof Customer) {
  165.                 $builder->get('login_email')
  166.                     ->setData($Customer->getEmail());
  167.             }
  168.         }
  169.         $event = new EventArgs(
  170.             [
  171.                 'builder' => $builder,
  172.             ],
  173.             $request
  174.         );
  175.         $this->eventDispatcher->dispatch($eventEccubeEvents::FRONT_MYPAGE_MYPAGE_LOGIN_INITIALIZE);
  176.         $form $builder->getForm();
  177.         return [
  178.             'error' => $utils->getLastAuthenticationError(),
  179.             'form' => $form->createView(),
  180.             'store_id' => $request->get('store_id'null),
  181.             'school_id' => $request->get('school_id'null)
  182.         ];
  183.     }
  184.     /**
  185.      * マイページ.
  186.      *
  187.      * @Route("/mypage/", name="mypage", methods={"GET"})
  188.      * @Template("Mypage/index.twig")
  189.      */
  190.     public function index(Request $requestPaginatorInterface $paginator)
  191.     {
  192.         $Customer $this->getUser();
  193.         // 購入処理中/決済処理中ステータスの受注を非表示にする.
  194.         $this->entityManager
  195.             ->getFilters()
  196.             ->enable('incomplete_order_status_hidden');
  197.         // paginator
  198.         $qb $this->orderRepository->getQueryBuilderByCustomer($Customer);
  199.         $event = new EventArgs(
  200.             [
  201.                 'qb' => $qb,
  202.                 'Customer' => $Customer,
  203.             ],
  204.             $request
  205.         );
  206.         // $this->eventDispatcher->dispatch($event, EccubeEvents::FRONT_MYPAGE_MYPAGE_INDEX_SEARCH);
  207.         $pagination $paginator->paginate(
  208.             $qb,
  209.             $request->get('pageno'1),
  210.             $this->eccubeConfig['eccube_search_pmax']
  211.         );
  212.         return [
  213.             'pagination' => $pagination,
  214.             'order_temporary' => $this->eccubeConfig['order_temporary']
  215.         ];
  216.     }
  217.     /**
  218.      * 購入履歴詳細を表示する.
  219.      *
  220.      * @Route("/mypage/history/{order_no}", name="mypage_history", methods={"GET"})
  221.      * @Template("Mypage/history.twig")
  222.      */
  223.     public function history(Request $request$order_no)
  224.     {
  225.         if (!$this->session->get('is_from_history'false)) {
  226.             $this->entityManager->getFilters()
  227.                 ->enable('incomplete_order_status_hidden');
  228.         }
  229.         $this->session->set('is_temporary_order'false);
  230.         $this->session->set('temporary_order_id'null);
  231.         $Order $this->orderRepository->findOneBy(
  232.             [
  233.                 'id' => $order_no,
  234.                 'Customer' => $this->getUser(),
  235.             ]
  236.         );
  237.         $event = new EventArgs(
  238.             [
  239.                 'Order' => $Order,
  240.             ],
  241.             $request
  242.         );
  243.         $this->eventDispatcher->dispatch($eventEccubeEvents::FRONT_MYPAGE_MYPAGE_HISTORY_INITIALIZE);
  244.         /** @var Order $Order */
  245.         $Order $event->getArgument('Order');
  246.         if (!$Order) {
  247.             throw new NotFoundHttpException();
  248.         }
  249.         if ($this->session->get('is_from_history'false)) {
  250.             $OrderStatus $this->orderStatusRepository->find($this->eccubeConfig['order_temporary']);
  251.             $Order->setOrderStatus($OrderStatus);
  252.             $Order->setCustomerOrderStatus($this->customerOrderStatusRepository->find($this->eccubeConfig['order_temporary']));
  253.             $this->entityManager->persist($Order);
  254.             $this->entityManager->flush($Order);
  255.             foreach ($Order->getOrderItems() as $OrderDetail) {
  256.                 try {
  257.                     if (
  258.                         $OrderDetail->getProduct() &&
  259.                         $OrderDetail->getProductClass()
  260.                     ) {
  261.                         for ($i 0$i $OrderDetail->getQuantity(); $i++) {
  262.                             $this->cartService->removeProduct($OrderDetail->getProductClass()->getId(), $OrderDetail->getSetProductClass());
  263.                         }
  264.                         $Carts $this->cartService->getCarts();
  265.                         $this->execPurchaseFlow($Carts);
  266.                     }
  267.                 } catch (CartException $e) {
  268.                     log_info($e->getMessage());
  269.                     $this->addRequestError($e->getMessage());
  270.                 }
  271.             }
  272.         }
  273.         $DeliveryPeriodIdArr = [];
  274.         foreach ($Order['OrderItems'] as $OrderDetail) {
  275.             if ($OrderDetail->getDeliveryPeriod())
  276.                 $DeliveryPeriodIdArr[] = $OrderDetail->getDeliveryPeriod()->getDeliveryPeriodId();
  277.         }
  278.         $DeliveryPeriodIdArr array_unique($DeliveryPeriodIdArr);
  279.         // 手数料取得
  280.         $charge $Order->getCharge();
  281.         $shippings $Order->getShippings();
  282.         /** @var DeliveryFee|null $DeliveryFee */
  283.         $DeliveryFee $this->deliveryFeeRepository->findOneBy([
  284.             'Delivery' => $shippings[0]->getDelivery(),
  285.             'Pref' => $shippings[0]->getPref(),
  286.         ]);
  287.         $shipping is_object($DeliveryFee) ? $DeliveryFee->getFee() : 0;
  288.         $deliveryPriceTotal 0;
  289.         $deliveryAmountTotal 0;
  290.         $deliveryPriceTotalPer 0;
  291.         $deliveryAmountTotalPer 0;
  292.         $school $this->getUser()->getSchool();
  293.         $perDeliveryPeriodPrice = [];
  294.         foreach ($DeliveryPeriodIdArr as $DeliveryPeriodId) {
  295.             foreach ($Order['OrderItems'] as $OrderDetail) {
  296.                 if ($OrderDetail->getDeliveryPeriod() && $OrderDetail->getDeliveryPeriod()->getDeliveryPeriodId() ===  $DeliveryPeriodId) {
  297.                     $deliveryPriceTotal += $OrderDetail->getPrice() * $OrderDetail->getQuantity();
  298.                     $deliveryAmountTotal += $OrderDetail->getQuantity();
  299.                     $deliveryPriceTotalPer += $OrderDetail->getPrice() * $OrderDetail->getQuantity();
  300.                     $deliveryAmountTotalPer += $OrderDetail->getQuantity();
  301.                 }
  302.             }
  303.             $DeliveryPeriod $this->deliveryPeriodRepository->find($DeliveryPeriodId);
  304.             if ($school['delivery_free_type'] === 2) {
  305.                 $DeliveryPeriod $this->deliveryPeriodRepository->find($DeliveryPeriodId);
  306.                 if ($DeliveryPeriod['delivery_free_amount'] <= $deliveryPriceTotalPer || $DeliveryPeriod['delivery_free_quantity'] <= $deliveryAmountTotalPer) {
  307.                     $perDeliveryPeriodPrice[] = array(
  308.                         'delivery_period_id' => $DeliveryPeriod['delivery_period_id'],
  309.                         'product_label_name' => $DeliveryPeriod['product_label_name'],
  310.                         'delivery_label_name' => $DeliveryPeriod['delivery_label_name'],
  311.                         'totalPrice' => intval($deliveryPriceTotalPer),
  312.                         'deliveryFeeTotal' => intval($charge),
  313.                         'sum_label_name' => $DeliveryPeriod['sum_label_name'],
  314.                     );
  315.                 } else {
  316.                     $perDeliveryPeriodPrice[] = array(
  317.                         'delivery_period_id' => $DeliveryPeriod['delivery_period_id'],
  318.                         'product_label_name' => $DeliveryPeriod['product_label_name'],
  319.                         'delivery_label_name' => $DeliveryPeriod['delivery_label_name'],
  320.                         'totalPrice' => intval($deliveryPriceTotalPer),
  321.                         'deliveryFeeTotal' =>  intval($shipping $charge),
  322.                         'sum_label_name' => $DeliveryPeriod['sum_label_name'],
  323.                     );
  324.                 }
  325.             } else if ($school['delivery_free_type'] === 1) {
  326.                 // 配送無料条件が決済ごと
  327.                 if ($school['delivery_free_amount'] <= $deliveryPriceTotal || $school['delivery_free_quantity'] <= $deliveryAmountTotal) {
  328.                     $perDeliveryPeriodPrice[] = array(
  329.                         'delivery_period_id' => $DeliveryPeriod['delivery_period_id'],
  330.                         'product_label_name' => $DeliveryPeriod['product_label_name'],
  331.                         'delivery_label_name' => $DeliveryPeriod['delivery_label_name'],
  332.                         'totalPrice' => intval($deliveryPriceTotalPer),
  333.                         intval($charge),
  334.                         'sum_label_name' => $DeliveryPeriod['sum_label_name'],
  335.                     );
  336.                 } else {
  337.                     $perDeliveryPeriodPrice[] = array(
  338.                         'delivery_period_id' => $DeliveryPeriod['delivery_period_id'],
  339.                         'product_label_name' => $DeliveryPeriod['product_label_name'],
  340.                         'delivery_label_name' => $DeliveryPeriod['delivery_label_name'],
  341.                         'totalPrice' => intval($deliveryPriceTotalPer),
  342.                         'deliveryFeeTotal' =>  intval($shipping $charge),
  343.                         'sum_label_name' => $DeliveryPeriod['sum_label_name'],
  344.                     );
  345.                 }
  346.             } else {
  347.                 $perDeliveryPeriodPrice[] = array(
  348.                     'delivery_period_id' => $DeliveryPeriod['delivery_period_id'],
  349.                     'product_label_name' => $DeliveryPeriod['product_label_name'],
  350.                     'delivery_label_name' => $DeliveryPeriod['delivery_label_name'],
  351.                     'totalPrice' => intval($deliveryPriceTotalPer),
  352.                     'deliveryFeeTotal' =>  intval($shipping $charge),
  353.                     'sum_label_name' => $DeliveryPeriod['sum_label_name'],
  354.                 );
  355.             }
  356.             $deliveryPriceTotalPer 0;
  357.             $deliveryAmountTotalPer 0;
  358.         }
  359.         $delivery_period $this->deliveryPeriodRepository->findAll();
  360.         $sort = array();
  361.         foreach ((array) $perDeliveryPeriodPrice as $key => $value) {
  362.             $sort[$key] = $value['delivery_period_id'];
  363.         }
  364.         array_multisort($sortSORT_ASC$perDeliveryPeriodPrice);
  365.         // $stockOrder = true;
  366.         // foreach ($Order->getOrderItems() as $orderItem) {
  367.         //     if ($orderItem->isProduct() && $orderItem->getQuantity() < 0) {
  368.         //         $stockOrder = false;
  369.         //         break;
  370.         //     }
  371.         // }
  372.         $order_items $Order->getOrderItems();
  373.         $setProductClassArr = [];
  374.         foreach ($order_items as $OrderDetail) {
  375.             if ($OrderDetail->getDeliveryPeriod())
  376.                 $DeliveryPeriodIdArr[] = $OrderDetail->getDeliveryPeriod()->getDeliveryPeriodId();
  377.             if (!empty($OrderDetail->getSetProductClass())) {
  378.                 $setProductClassArr[$OrderDetail->getId()] = $this->orderItemRepository->getSetProductClass($OrderDetail);
  379.             }
  380.         }
  381.         return [
  382.             'Order' => $Order,
  383.             // 'stockOrder' => $stockOrder,
  384.             'order_temporary' => $this->eccubeConfig['order_temporary'],
  385.             'delivery_period' => $delivery_period,
  386.             'perDeliveryPeriodPrice' => $perDeliveryPeriodPrice,
  387.             'OrderSetProductClass' => $setProductClassArr
  388.         ];
  389.     }
  390.     /**
  391.      * 再購入を行う.
  392.      *
  393.      * @Route("/mypage/order/{order_no}", name="mypage_order", methods={"PUT"})
  394.      */
  395.     public function order(Request $request$order_no)
  396.     {
  397.         $this->isTokenValid();
  398.         log_info('再注文開始', [$order_no]);
  399.         $Customer $this->getUser();
  400.         /* @var $Order \Eccube\Entity\Order */
  401.         $Order $this->orderRepository->findOneBy(
  402.             [
  403.                 'id' => $order_no,
  404.                 'Customer' => $Customer,
  405.             ]
  406.         );
  407.         // /* @var $Order \Eccube\Entity\Order */
  408.         // $Order = $this->orderRepository->findOneBy(
  409.         //     [
  410.         //         'order_no' => $order_no,
  411.         //         'Customer' => $Customer,
  412.         //     ]
  413.         // );
  414.         $event = new EventArgs(
  415.             [
  416.                 'Order' => $Order,
  417.                 'Customer' => $Customer,
  418.             ],
  419.             $request
  420.         );
  421.         $this->eventDispatcher->dispatch($eventEccubeEvents::FRONT_MYPAGE_MYPAGE_ORDER_INITIALIZE);
  422.         if (!$Order) {
  423.             log_info('対象の注文が見つかりません', [$order_no]);
  424.             throw new NotFoundHttpException();
  425.         }
  426.         // エラーメッセージの配列
  427.         $errorMessages = [];
  428.         foreach ($Order->getOrderItems() as $OrderItem) {
  429.             try {
  430.                 if ($OrderItem->getProduct() && $OrderItem->getProductClass()) {
  431.                     $this->cartService->addProduct($OrderItem->getProductClass(), $OrderItem->getQuantity(), $OrderItem->getSetProductClass(), null$OrderItem->getBrother());
  432.                     // 明細の正規化
  433.                     $Carts $this->cartService->getCarts();
  434.                     foreach ($Carts as $Cart) {
  435.                         $result $this->purchaseFlow->validate($Cart, new PurchaseContext($Cart$this->getUser()));
  436.                         // 復旧不可のエラーが発生した場合は追加した明細を削除.
  437.                         if ($result->hasError()) {
  438.                             $this->cartService->removeProduct($OrderItem->getProductClass());
  439.                             foreach ($result->getErrors() as $error) {
  440.                                 $errorMessages[] = $error->getMessage();
  441.                             }
  442.                         }
  443.                         foreach ($result->getWarning() as $warning) {
  444.                             $errorMessages[] = $warning->getMessage();
  445.                         }
  446.                     }
  447.                     $this->cartService->save();
  448.                 }
  449.             } catch (CartException $e) {
  450.                 log_info($e->getMessage(), [$order_no]);
  451.                 $this->addRequestError($e->getMessage());
  452.             }
  453.         }
  454.         foreach ($errorMessages as $errorMessage) {
  455.             $this->addRequestError($errorMessage);
  456.         }
  457.         $event = new EventArgs(
  458.             [
  459.                 'Order' => $Order,
  460.                 'Customer' => $Customer,
  461.             ],
  462.             $request
  463.         );
  464.         $this->eventDispatcher->dispatch($eventEccubeEvents::FRONT_MYPAGE_MYPAGE_ORDER_COMPLETE);
  465.         if ($event->getResponse() !== null) {
  466.             return $event->getResponse();
  467.         }
  468.         log_info('再注文完了', [$order_no]);
  469.         if ($request->get('temporary')) {
  470.             $Order $this->orderRepository->find($order_no);
  471.             $OrderStatus $this->orderStatusRepository->find($this->eccubeConfig['order_processing']);
  472.             $Order->setOrderStatus($OrderStatus);
  473.             $this->entityManager->persist($Order);
  474.             $this->entityManager->flush($Order);
  475.         }
  476.         return $this->redirect($this->generateUrl('cart'));
  477.     }
  478.     /**
  479.      * @param $Carts
  480.      *
  481.      * @return \Symfony\Component\HttpFoundation\RedirectResponse|null
  482.      */
  483.     protected function execPurchaseFlow($Carts)
  484.     {
  485.         /** @var PurchaseFlowResult[] $flowResults */
  486.         $flowResults array_map(function ($Cart) {
  487.             $purchaseContext = new PurchaseContext($Cart$this->getUser());
  488.             return $this->purchaseFlow->validate($Cart$purchaseContext);
  489.         }, $Carts);
  490.         // 復旧不可のエラーが発生した場合はカートをクリアして再描画
  491.         $hasError false;
  492.         foreach ($flowResults as $result) {
  493.             if ($result->hasError()) {
  494.                 $hasError true;
  495.                 foreach ($result->getErrors() as $error) {
  496.                     $this->addRequestError($error->getMessage());
  497.                 }
  498.             }
  499.         }
  500.         if ($hasError) {
  501.             $this->cartService->clear();
  502.             return $this->redirectToRoute('cart');
  503.         }
  504.         $this->cartService->save();
  505.         foreach ($flowResults as $index => $result) {
  506.             foreach ($result->getWarning() as $warning) {
  507.                 if ($Carts[$index]->getItems()->count() > 0) {
  508.                     $cart_key $Carts[$index]->getCartKey();
  509.                     $this->addRequestError($warning->getMessage(), "front.cart.${cart_key}");
  510.                 } else {
  511.                     // キーが存在しない場合はグローバルにエラーを表示する
  512.                     $this->addRequestError($warning->getMessage());
  513.                 }
  514.             }
  515.         }
  516.         return null;
  517.     }
  518.     /**
  519.      * お気に入り商品を表示する.
  520.      *
  521.      * @Route("/mypage/favorite", name="mypage_favorite", methods={"GET"})
  522.      * @Template("Mypage/favorite.twig")
  523.      */
  524.     public function favorite(Request $requestPaginatorInterface $paginator)
  525.     {
  526.         if (!$this->BaseInfo->isOptionFavoriteProduct()) {
  527.             throw new NotFoundHttpException();
  528.         }
  529.         $Customer $this->getUser();
  530.         // paginator
  531.         $qb $this->customerFavoriteProductRepository->getQueryBuilderByCustomer($Customer);
  532.         $event = new EventArgs(
  533.             [
  534.                 'qb' => $qb,
  535.                 'Customer' => $Customer,
  536.             ],
  537.             $request
  538.         );
  539.         $this->eventDispatcher->dispatch($eventEccubeEvents::FRONT_MYPAGE_MYPAGE_FAVORITE_SEARCH);
  540.         $pagination $paginator->paginate(
  541.             $qb,
  542.             $request->get('pageno'1),
  543.             $this->eccubeConfig['eccube_search_pmax'],
  544.             ['wrap-queries' => true]
  545.         );
  546.         return [
  547.             'pagination' => $pagination,
  548.         ];
  549.     }
  550.     /**
  551.      * お気に入り商品を削除する.
  552.      *
  553.      * @Route("/mypage/favorite/{id}/delete", name="mypage_favorite_delete", methods={"DELETE"}, requirements={"id" = "\d+"})
  554.      */
  555.     public function delete(Request $requestProduct $Product)
  556.     {
  557.         $this->isTokenValid();
  558.         $Customer $this->getUser();
  559.         log_info('お気に入り商品削除開始', [$Customer->getId(), $Product->getId()]);
  560.         $CustomerFavoriteProduct $this->customerFavoriteProductRepository->findOneBy(['Customer' => $Customer'Product' => $Product]);
  561.         if ($CustomerFavoriteProduct) {
  562.             $this->customerFavoriteProductRepository->delete($CustomerFavoriteProduct);
  563.         } else {
  564.             throw new BadRequestHttpException();
  565.         }
  566.         $event = new EventArgs(
  567.             [
  568.                 'Customer' => $Customer,
  569.                 'CustomerFavoriteProduct' => $CustomerFavoriteProduct,
  570.             ],
  571.             $request
  572.         );
  573.         $this->eventDispatcher->dispatch($eventEccubeEvents::FRONT_MYPAGE_MYPAGE_DELETE_COMPLETE);
  574.         log_info('お気に入り商品削除完了', [$Customer->getId(), $CustomerFavoriteProduct->getId()]);
  575.         return $this->redirect($this->generateUrl('mypage_favorite'));
  576.     }
  577.     /**
  578.      * 仮注文→購入手続きを進める
  579.      *
  580.      * @Route("/mypage/temporary_order/{id}", name="mypage_order_temporary", methods={"POST"}, requirements={"id" = "\d+"})
  581.      */
  582.     public function orderTemporary(Request $request$id)
  583.     {
  584.         $Customer $this->getUser();
  585.         $schoolId $Customer->getSchool()->getSchoolId();
  586.         $temporaryOrder false;
  587.         if ($schoolId !== null) {
  588.             $school $this->schoolRepository->find($schoolId);
  589.             $this->session->set('storeMeasuringFlag'$school->getStoreMeasuringFlag());
  590.             $this->session->set('schoolMeasuringFlag'$school->getSchoolMeasuringFlag());
  591.             $this->session->set('onlineFlag'$school->getOnlineFlag());
  592.             // if($school->getOnlineFlag() == 0){
  593.             //     $temporaryOrder = true;
  594.             // }
  595.             // else{
  596.             //     $temporaryOrder = false;
  597.             // }
  598.         }
  599.         $this->session->set('is_temporary_order'$temporaryOrder);
  600.         $this->isTokenValid();
  601.         log_info('購入手続きを進める開始', array($id));
  602.         $Customer $this->getUser();
  603.         /* @var $Order \Eccube\Entity\Order */
  604.         $Order $this->orderRepository->findOneBy(array(
  605.             'id' => $id,
  606.             'Customer' => $Customer,
  607.         ));
  608.         $event = new EventArgs(
  609.             array(
  610.                 'Order' => $Order,
  611.                 'Customer' => $Customer,
  612.             ),
  613.             $request
  614.         );
  615.         $this->eventDispatcher->dispatch($eventEccubeEvents::FRONT_MYPAGE_MYPAGE_ORDER_INITIALIZE);
  616.         if (!$Order) {
  617.             log_info('対象の注文が見つかりません', array($id));
  618.             throw new NotFoundHttpException();
  619.         }
  620.         $productId 0;
  621.         $is_product_deleted false;
  622.         foreach ($Order->getOrderItems() as $OrderDetail) {
  623.             try {
  624.                 if ($OrderDetail->isProduct()) {
  625.                     if ($OrderDetail->getProduct() && $OrderDetail->getProductClass()) {
  626.                         $productId $OrderDetail->getProduct()->getId();
  627.                         $this->cartService->addProduct($OrderDetail->getProductClass()->getId(), $OrderDetail->getQuantity(), $OrderDetail->getSetProductClass());
  628.                         $Carts $this->cartService->getCarts();
  629.                         /** @var PurchaseFlowResult[] $flowResults */
  630.                         $flowResults array_map(function ($Cart) {
  631.                             $purchaseContext = new PurchaseContext($Cart$this->getUser());
  632.                             return $this->purchaseFlow->validate($Cart$purchaseContext);
  633.                         }, $Carts);
  634.                         $this->cartService->save();
  635.                     } else {
  636.                         if (!$is_product_deleted)
  637.                             $this->addRequestError('cart.product.delete');
  638.                         $is_product_deleted true;
  639.                     }
  640.                 }
  641.             } catch (CartException $e) {
  642.                 log_info($e->getMessage(), array($id));
  643.                 $this->addRequestError($e->getMessage());
  644.             }
  645.         }
  646.         $event = new EventArgs(
  647.             array(
  648.                 'Order' => $Order,
  649.                 'Customer' => $Customer,
  650.             ),
  651.             $request
  652.         );
  653.         $this->eventDispatcher->dispatch($eventEccubeEvents::FRONT_MYPAGE_MYPAGE_ORDER_COMPLETE);
  654.         if ($event->getResponse() !== null) {
  655.             return $event->getResponse();
  656.         }
  657.         log_info('購入手続きを進める', array($id));
  658.         // FRONT_CART_BUYSTEP_INITIALIZE
  659.         $event = new EventArgs(
  660.             array(),
  661.             $request
  662.         );
  663.         $this->eventDispatcher->dispatch($eventEccubeEvents::FRONT_CART_BUYSTEP_INITIALIZE);
  664.         $this->cartService->save();
  665.         // FRONT_CART_BUYSTEP_COMPLETE
  666.         $event = new EventArgs(
  667.             array(),
  668.             $request
  669.         );
  670.         $this->eventDispatcher->dispatch($eventEccubeEvents::FRONT_CART_BUYSTEP_COMPLETE);
  671.         //「対応状況」を「新規受付」にする (本注文状態にする)
  672.         // $OrderStatus = $this->orderStatusRepository->find($this->eccubeConfig['order_processing']);
  673.         // $OrderData = $this->orderRepository->find($Order->getId());
  674.         // $OrderData->setOrderStatus($OrderStatus);
  675.         // $this->entityManager->persist($OrderData);
  676.         // $this->entityManager->flush($OrderData);
  677.         $this->session->set('temporary_order_id'$id);
  678.         //product_type_idを取得する
  679.         if ($productId 0) {
  680.             $productStore $this->productStoreRepository->findOneBy(array(
  681.                 'Product' => $this->productRepository->findOneBy(['id' => $productId])
  682.             ));
  683.             if ($productStore)
  684.                 $this->session->set('store_id_order'$productStore->getStore()->getStoreId());
  685.         }
  686.         $this->session->set('is_from_history'true);
  687.         if ($temporaryOrder) {
  688.             return $this->redirectToRoute('shopping_temporary');
  689.         } else {
  690.             return $this->redirectToRoute('shopping');
  691.         }
  692.     }
  693. }