app/Customize/Controller/CartControllerCustomizer.php line 79

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;
  13. use Eccube\Entity\BaseInfo;
  14. use Eccube\Entity\ProductClass;
  15. use Eccube\Event\EccubeEvents;
  16. use Eccube\Event\EventArgs;
  17. use Eccube\Repository\BaseInfoRepository;
  18. use Eccube\Repository\ProductClassRepository;
  19. use Eccube\Repository\OrderRepository;
  20. use Eccube\Repository\ProductRepository;
  21. use Eccube\Service\CartService;
  22. use Eccube\Service\OrderHelper;
  23. use Eccube\Service\PurchaseFlow\PurchaseContext;
  24. use Eccube\Service\PurchaseFlow\PurchaseFlow;
  25. use Eccube\Service\PurchaseFlow\PurchaseFlowResult;
  26. use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
  27. use Symfony\Component\HttpFoundation\Request;
  28. use Symfony\Component\Routing\Annotation\Route;
  29. use Eccube\Controller\CartController;
  30. class CartControllerCustomizer extends CartController
  31. {
  32.     /**
  33.      * @var OrderRepository
  34.      */
  35.     protected $orderRepository;
  36.     /**
  37.      * @var ProductRepository
  38.      */
  39.     protected $productRepository;
  40.     /**
  41.      * CartController constructor.
  42.      *
  43.      * @param ProductClassRepository $productClassRepository
  44.      * @param CartService $cartService
  45.      * @param PurchaseFlow $cartPurchaseFlow
  46.      * @param BaseInfoRepository $baseInfoRepository
  47.      * @param OrderRepository $orderRepository
  48.      */
  49.     public function __construct(
  50.         ProductClassRepository $productClassRepository,
  51.         CartService $cartService,
  52.         PurchaseFlow $cartPurchaseFlow,
  53.         BaseInfoRepository $baseInfoRepository,
  54.         OrderRepository $orderRepository,
  55.         ProductRepository $productRepository
  56.     ) {
  57.         parent::__construct(
  58.           $productClassRepository,
  59.           $cartService,
  60.           $cartPurchaseFlow,
  61.           $baseInfoRepository,
  62.         );
  63.         
  64.         $this->orderRepository $orderRepository;
  65.         $this->productRepository $productRepository;
  66.     }
  67.     /**
  68.      * カート画面.
  69.      *
  70.      * @Route("/cart", name="cart", methods={"GET"})
  71.      * @Template("Cart/index.twig")
  72.      */
  73.     public function index(Request $request)
  74.     {
  75.         // カートを取得して明細の正規化を実行
  76.         $Carts $this->cartService->getCarts();
  77.         $this->execPurchaseFlow($Carts);
  78.         // TODO itemHolderから取得できるように
  79.         $least = [];
  80.         $quantity = [];
  81.         $isDeliveryFree = [];
  82.         $totalPrice 0;
  83.         $totalQuantity 0;
  84.         // ▼追加処理ここから
  85.         $arrReserved = [];
  86.         $arrValied = [];
  87.         $arrOrder $this->orderRepository->findAll();
  88.         // ▲追加処理ここまで
  89.         foreach ($Carts as $Cart) {
  90.             $quantity[$Cart->getCartKey()] = 0;
  91.             $isDeliveryFree[$Cart->getCartKey()] = false;
  92.             if ($this->baseInfo->getDeliveryFreeQuantity()) {
  93.                 if ($this->baseInfo->getDeliveryFreeQuantity() > $Cart->getQuantity()) {
  94.                     $quantity[$Cart->getCartKey()] = $this->baseInfo->getDeliveryFreeQuantity() - $Cart->getQuantity();
  95.                 } else {
  96.                     $isDeliveryFree[$Cart->getCartKey()] = true;
  97.                 }
  98.             }
  99.             if ($this->baseInfo->getDeliveryFreeAmount()) {
  100.                 if (!$isDeliveryFree[$Cart->getCartKey()] && $this->baseInfo->getDeliveryFreeAmount() <= $Cart->getTotalPrice()) {
  101.                     $isDeliveryFree[$Cart->getCartKey()] = true;
  102.                 } else {
  103.                     $least[$Cart->getCartKey()] = $this->baseInfo->getDeliveryFreeAmount() - $Cart->getTotalPrice();
  104.                 }
  105.             }
  106.             $totalPrice += $Cart->getTotalPrice();
  107.             $totalQuantity += $Cart->getQuantity();
  108.             // ▼追加処理ここから
  109.             $is_valied true;
  110.             $currentperiod '';
  111.             foreach ($Cart->getItems() as $item) {
  112.               $arrRental = [];
  113.               $period $item->getPeriod();
  114.               if ($item->getProductClass()->getClassCategory1()) {
  115.                 if (!$period) {
  116.                   $is_valied false;
  117.                 }
  118.                 else {
  119.                   $item->updateReallyPeriod();
  120.                   if (!$currentperiod) {
  121.                     $currentperiod $period;
  122.                   }
  123.                   if ($period != $currentperiod) {
  124.                     $is_valied false;
  125.                   }
  126.                   // レンタル期間が重複している注文がないかチェック
  127.                   $product_id $item->getProductClass()->getProduct()->getId();
  128.                   foreach ($arrOrder as $order) {
  129.                     if ($order->getOrderStatus() != '購入処理中' && $order->getOrderStatus() != '注文取消し') {
  130.                       foreach ($order->getItems() as $item) {
  131.                         $class $item->getProductClass();
  132.                         if ($class) {
  133.                           if ($class->getProduct()->getId() == $product_id) {
  134.                             $val $item->getPeriod();
  135.                             if ($val) {
  136.                               $vals explode('|'$val);
  137.                               $arrRental[] = $vals[0];
  138.                             }
  139.                           }
  140.                         }
  141.                       }
  142.                     }
  143.                   }
  144.                   // 商品情報から、貸出不可期間を取得
  145.                   $invalidity_period $this->productRepository->find($product_id)->getInvalidityPeriod();
  146.                   if ($invalidity_period) {
  147.                     $arrRental[] = $invalidity_period;
  148.                   }
  149.                 }
  150.               }
  151.               $arrReserved[] = implode(';'$arrRental);
  152.             }
  153.             $arrValied[] = $is_valied;
  154.             // ▲追加処理ここまで
  155.         }
  156.         // カートが分割された時のセッション情報を削除
  157.         $request->getSession()->remove(OrderHelper::SESSION_CART_DIVIDE_FLAG);
  158.         return [
  159.             'totalPrice' => $totalPrice,
  160.             'totalQuantity' => $totalQuantity,
  161.             // 空のカートを削除し取得し直す
  162.             'Carts' => $this->cartService->getCarts(true),
  163.             'least' => $least,
  164.             'quantity' => $quantity,
  165.             'is_delivery_free' => $isDeliveryFree,
  166.             // ▼ここから追加
  167.             'reserved' => implode('|'$arrReserved),
  168.             'valied' => implode('|'$arrValied),
  169.             'rental_setting' => $_SERVER['RENTAL_SETTING'],
  170.         ];
  171.     }
  172.     /**
  173.      * カート明細の加算/減算/削除を行う. →こちらをベースにレンタル期間を変更する
  174.      *
  175.      * - 加算
  176.      *      - 明細の個数を1増やす
  177.      * - 減算
  178.      *      - 明細の個数を1減らす
  179.      *      - 個数が0になる場合は、明細を削除する
  180.      * - 削除
  181.      *      - 明細を削除する
  182.      *
  183.      * @Route(
  184.      *     path="/cart/{operation}/{productClassId}",
  185.      *     name="cart_handle_item",
  186.      *     methods={"PUT"},
  187.      *     requirements={
  188.      *          "operation": "up|down|remove",
  189.      *          "productClassId": "\d+"
  190.      *     }
  191.      * )
  192.      */
  193.     public function handleCartItem($operation$productClassId)
  194.     {
  195.         log_info('カート明細操作開始', ['operation' => $operation'product_class_id' => $productClassId]);
  196.         $this->isTokenValid();
  197.         /** @var ProductClass $ProductClass */
  198.         $ProductClass $this->productClassRepository->find($productClassId);
  199.         if (is_null($ProductClass)) {
  200.             log_info('商品が存在しないため、カート画面へredirect', ['operation' => $operation'product_class_id' => $productClassId]);
  201.             return $this->redirectToRoute('cart');
  202.         }
  203.         // 明細の増減・削除
  204.         switch ($operation) {
  205.             case 'up':
  206.                 $this->cartService->addProduct($ProductClass1);
  207.                 break;
  208.             case 'down':
  209.                 $this->cartService->addProduct($ProductClass, -1);
  210.                 break;
  211.             case 'remove':
  212.                 $this->cartService->removeProduct($ProductClass);
  213.                 break;
  214.         }
  215.         // カートを取得して明細の正規化を実行
  216.         $Carts $this->cartService->getCarts();
  217.         $this->execPurchaseFlow($Carts);
  218.         log_info('カート演算処理終了', ['operation' => $operation'product_class_id' => $productClassId]);
  219.         return $this->redirectToRoute('cart');
  220.     }
  221.     /**
  222.      * カート明細のレンタル期間を変更する
  223.      *
  224.      * @Route(
  225.      *     path="/cart/{cartItemId}/{period}",
  226.      *     name="cart_item_update_period",
  227.      *     methods={"PUT"},
  228.      *     requirements={
  229.      *          "cartItemId": "\d+"
  230.      *     }
  231.      * )
  232.      */
  233.     public function updateCartItemPeriod($cartItemId$period)
  234.     {
  235.         log_info('カート明細期間操作開始', ['period' => $period'cart_item_id' => $cartItemId]);
  236.         $this->isTokenValid();
  237.         $period str_replace(',''~'$period);
  238.         $period str_replace('-''/'$period);
  239.         $this->cartService->changeCartItemPeriod($cartItemId$period);
  240.         // カートを取得して明細の正規化を実行
  241.         $Carts $this->cartService->getCarts();
  242.         $this->execPurchaseFlow($Carts);
  243.         log_info('カート明細期間処理終了', ['period' => $period'cart_item_id' => $cartItemId]);
  244.         return $this->redirectToRoute('cart');
  245.     }
  246. }