<?php/* * This file is part of EC-CUBE * * Copyright(c) EC-CUBE CO.,LTD. All Rights Reserved. * * http://www.ec-cube.co.jp/ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */namespace Eccube\Service\PurchaseFlow;use Doctrine\Common\Collections\ArrayCollection;use Doctrine\Common\Collections\Collection;use Eccube\Entity\ItemInterface;use Eccube\Entity\Master\OrderItemType;use Eccube\Entity\Order;class ItemCollection extends ArrayCollection{ protected $type; public function __construct($Items, $type = null) { $this->type = is_null($type) ? Order::class : $type; if ($Items instanceof Collection) { $Items = $Items->toArray(); } parent::__construct($Items); } public function reduce(\Closure $func, $initial = null) { return array_reduce($this->toArray(), $func, $initial); } // 明細種別ごとに返すメソッド作る public function getProductClasses() { return $this->filter( function (ItemInterface $OrderItem) { return $OrderItem->isProduct(); }); } public function getDeliveryFees() { return $this->filter( function (ItemInterface $OrderItem) { return $OrderItem->isDeliveryFee(); }); } public function getCharges() { return $this->filter( function (ItemInterface $OrderItem) { return $OrderItem->isCharge(); }); } public function getDiscounts() { return $this->filter( function (ItemInterface $OrderItem) { return $OrderItem->isDiscount() || $OrderItem->isPoint(); }); } /** * 同名の明細が存在するかどうか. * * TODO 暫定対応. 本来は明細種別でチェックする. */ public function hasProductByName($productName) { $OrderItems = $this->filter( function (ItemInterface $OrderItem) use ($productName) { /* @var OrderItem $OrderItem */ return $OrderItem->getProductName() == $productName; }); return !$OrderItems->isEmpty(); } /** * 指定した受注明細区分の明細が存在するかどうか. * * @param OrderItemType $OrderItemType 受注区分 * * @return bool */ public function hasItemByOrderItemType($OrderItemType) { $filteredItems = $this->filter(function (ItemInterface $OrderItem) use ($OrderItemType) { /* @var OrderItem $OrderItem */ return $OrderItem->getOrderItemType() && $OrderItem->getOrderItemType()->getId() == $OrderItemType->getId(); }); return !$filteredItems->isEmpty(); } public function getType() { return $this->type; } public function sort() { $Items = $this->toArray(); usort($Items, function (ItemInterface $a, ItemInterface $b) { if ($a->getOrderItemType() === $b->getOrderItemType()) { return ($a->getId() < $b->getId()) ? -1 : 1; } elseif ($a->isProduct()) { return -1; } elseif ($a->isDeliveryFee()) { if ($b->isProduct()) { return 1; } return -1; } elseif ($a->isCharge()) { if ($b->isDeliveryFee() || $b->isProduct()) { return 1; } return -1; } elseif ($a->isDiscount() || $a->isPoint()) { if ($b->isDiscount()) { return -1; } if ($b->isPoint()) { return 1; } if (!$b->isTax()) { return 1; } return -1; } elseif ($a->isTax()) { return 1; } return 0; }); return new self($Items); }}