src/Eccube/Service/PurchaseFlow/ItemCollection.php line 22

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 Eccube\Service\PurchaseFlow;
  13. use Doctrine\Common\Collections\ArrayCollection;
  14. use Doctrine\Common\Collections\Collection;
  15. use Eccube\Entity\ItemInterface;
  16. use Eccube\Entity\Master\OrderItemType;
  17. use Eccube\Entity\Order;
  18. class ItemCollection extends ArrayCollection
  19. {
  20.     protected $type;
  21.     public function __construct($Items$type null)
  22.     {
  23.         $this->type is_null($type) ? Order::class : $type;
  24.         if ($Items instanceof Collection) {
  25.             $Items $Items->toArray();
  26.         }
  27.         parent::__construct($Items);
  28.     }
  29.     public function reduce(\Closure $func$initial null)
  30.     {
  31.         return array_reduce($this->toArray(), $func$initial);
  32.     }
  33.     // 明細種別ごとに返すメソッド作る
  34.     public function getProductClasses()
  35.     {
  36.         return $this->filter(
  37.             function (ItemInterface $OrderItem) {
  38.                 return $OrderItem->isProduct();
  39.             });
  40.     }
  41.     public function getDeliveryFees()
  42.     {
  43.         return $this->filter(
  44.             function (ItemInterface $OrderItem) {
  45.                 return $OrderItem->isDeliveryFee();
  46.             });
  47.     }
  48.     public function getCharges()
  49.     {
  50.         return $this->filter(
  51.             function (ItemInterface $OrderItem) {
  52.                 return $OrderItem->isCharge();
  53.             });
  54.     }
  55.     public function getDiscounts()
  56.     {
  57.         return $this->filter(
  58.             function (ItemInterface $OrderItem) {
  59.                 return $OrderItem->isDiscount() || $OrderItem->isPoint();
  60.             });
  61.     }
  62.     /**
  63.      * 同名の明細が存在するかどうか.
  64.      *
  65.      * TODO 暫定対応. 本来は明細種別でチェックする.
  66.      */
  67.     public function hasProductByName($productName)
  68.     {
  69.         $OrderItems $this->filter(
  70.             function (ItemInterface $OrderItem) use ($productName) {
  71.                 /* @var OrderItem $OrderItem */
  72.                 return $OrderItem->getProductName() == $productName;
  73.             });
  74.         return !$OrderItems->isEmpty();
  75.     }
  76.     /**
  77.      * 指定した受注明細区分の明細が存在するかどうか.
  78.      *
  79.      * @param OrderItemType $OrderItemType 受注区分
  80.      *
  81.      * @return bool
  82.      */
  83.     public function hasItemByOrderItemType($OrderItemType)
  84.     {
  85.         $filteredItems $this->filter(function (ItemInterface $OrderItem) use ($OrderItemType) {
  86.             /* @var OrderItem $OrderItem */
  87.             return $OrderItem->getOrderItemType() && $OrderItem->getOrderItemType()->getId() == $OrderItemType->getId();
  88.         });
  89.         return !$filteredItems->isEmpty();
  90.     }
  91.     public function getType()
  92.     {
  93.         return $this->type;
  94.     }
  95.     public function sort()
  96.     {
  97.         $Items $this->toArray();
  98.         usort($Items, function (ItemInterface $aItemInterface $b) {
  99.             if ($a->getOrderItemType() === $b->getOrderItemType()) {
  100.                 return ($a->getId() < $b->getId()) ? -1;
  101.             } elseif ($a->isProduct()) {
  102.                 return -1;
  103.             } elseif ($a->isDeliveryFee()) {
  104.                 if ($b->isProduct()) {
  105.                     return 1;
  106.                 }
  107.                 return -1;
  108.             } elseif ($a->isCharge()) {
  109.                 if ($b->isDeliveryFee() || $b->isProduct()) {
  110.                     return 1;
  111.                 }
  112.                 return -1;
  113.             } elseif ($a->isDiscount() || $a->isPoint()) {
  114.                 if ($b->isDiscount()) {
  115.                     return -1;
  116.                 }
  117.                 if ($b->isPoint()) {
  118.                     return 1;
  119.                 }
  120.                 if (!$b->isTax()) {
  121.                     return 1;
  122.                 }
  123.                 return -1;
  124.             } elseif ($a->isTax()) {
  125.                 return 1;
  126.             }
  127.             return 0;
  128.         });
  129.         return new self($Items);
  130.     }
  131. }