2.在多个都道府县取消免运费条件时
在Customize/Service/PurchaseFlow/Processor目录下设置如下DeliveryFeeFreeByShippingPreprocessor.php。
<?php
namespace Customize\Service\PurchaseFlow\Processor;
use Eccube\Annotation\ShoppingFlow;
use Eccube\Entity\BaseInfo;
use Eccube\Entity\ItemHolderInterface;
use Eccube\Entity\Order;
use Eccube\Repository\BaseInfoRepository;
use Eccube\Repository\Master\PrefRepository;
use Eccube\Service\PurchaseFlow\ItemHolderPreprocessor;
use Eccube\Service\PurchaseFlow\Processor\DeliveryFeePreprocessor;
use Eccube\Service\PurchaseFlow\PurchaseContext;
/**
* @ShoppingFlow()
*
* Class DeliveryFeeFreeByShippingPreprocessor
* @package Customize\Service\PurchaseFlow\Processor
*/
class DeliveryFeeFreeByShippingPreprocessor implements ItemHolderPreprocessor
{
/**
* @var BaseInfo
*/
protected $BaseInfo;
/**
* @var PrefRepository
*/
private $prefRepository;
public function __construct(
BaseInfoRepository $baseInfoRepository,
PrefRepository $prefRepository
)
{
$this->BaseInfo = $baseInfoRepository->get();
$this->prefRepository = $prefRepository;
}
/**
* @param ItemHolderInterface $itemHolder
* @param PurchaseContext $context
*/
public function process(ItemHolderInterface $itemHolder, PurchaseContext $context)
{
if (!($this->BaseInfo->getDeliveryFreeAmount() || $this->BaseInfo->getDeliveryFreeQuantity())) {
return;
}
// Order
if ($itemHolder instanceof Order) {
/** @var Order $Order */
$Order = $itemHolder;
foreach ($Order->getShippings() as $Shipping) {
$isFree = false;
$total = 0;
$quantity = 0;
foreach ($Shipping->getProductOrderItems() as $Item) {
$total += $Item->getPriceIncTax() * $Item->getQuantity();
$quantity += $Item->getQuantity();
}
// 配送金额超
if ($this->BaseInfo->getDeliveryFreeAmount()) {
if ($total >= $this->BaseInfo->getDeliveryFreeAmount()) {
$isFree = true;
}
}
// 配送数量超
if ($this->BaseInfo->getDeliveryFreeQuantity()) {
if ($quantity >= $this->BaseInfo->getDeliveryFreeQuantity()) {
$isFree = true;
}
}
// 免费处理
if ($isFree) {
foreach ($Shipping->getOrderItems() as $Item) {
if ($Item->getProcessorName() == DeliveryFeePreprocessor::class) {
$Prefs = $this->prefRepository->findBy(['name' => ['沖縄県', '東京都']]);
foreach ($Prefs as $Pref) {
if ($Shipping->getPref() === $Pref) {
$Item->setQuantity(1);
break;
}
}
}
}
}
}
}
}
}