会員グループ価格管理アドオンとまとめ買い価格設定プラグインを併用して商品ごとの会員グループ価格にまとめ買い割引率を設定する方法

会員グループ価格管理アドオンまとめ買い価格設定プラグイン を併用して商品ごとの会員グループ価格にまとめ買い割引率を設定する方法です。

はじめに

会員グループ価格管理アドオンとまとめ買い価格設定プラグインを併用することで、商品ごとの会員グループ価格にまとめ買い値引きを設定することができます。

まとめ買い値引きは割引率をご利用ください。会員グループごとにまとめ買い割引単価を設定をすることはできません。

また、会員グループに設定されている割引率や掛け率に対してまとめ買い値引きをすることは今回考慮しておりません。

両プラグインを併用した場合の問題

会員グループ価格管理アドオンとまとめ買い価格設定プラグインを併用した場合以下の問題が発生します。

  • ショッピングカートページでまとめ買い値引きされる数量を設定したあと数量を1に戻すと会員グループ価格に戻らない
  • ショッピングカートページとご注文手続きページでまとめ買い値引価格が正常に表示されない

上記の問題は以下のコードで解消できます。

ショッピングカートページでまとめ買い値引きされる数量を設定したあと数量を1に戻すと会員グループ価格に戻らない問題を解消する方法

app/Customize/Service/PurchaseFlow/QuantityDiscountPreprocessor.phpを作成して以下のコードを追記してください。

<?php

namespace Customize\Service\PurchaseFlow;

use Eccube\Annotation\CartFlow;
use Eccube\Entity\ItemInterface;
use Eccube\Service\PurchaseFlow\PurchaseContext;

/**
 * @CartFlow()
 */
class QuantityDiscountPreprocessor extends \Plugin\QuantityDiscount\Service\PurchaseFlow\Processor\QuantityDiscountPreprocessor
{
    public function process(ItemInterface $item, PurchaseContext $context)
    {
        $discountPrice = $this->quantityDiscountService->getProductClassPriceIncTax($item);
        if ($discountPrice < 0) {
            $realPrice = $item->getProductClass()->getPrice02IncTax();
            $item->setPrice($realPrice);
        }
    }
}

ショッピングカートページとご注文手続きページでまとめ買い値引の価格が正常に表示されない問題を解消する方法

app/Customize/Twig/Extension/QuantityDiscountExtension.phpを作成して以下のコードを追記してください。

<?php

namespace Customize\Twig\Extension;

use Doctrine\ORM\EntityManagerInterface;
use Eccube\Entity\Customer;
use Eccube\Entity\ItemInterface;
use Eccube\Service\TaxRuleService;
use Plugin\CustomerGroup\Entity\Config;
use Plugin\CustomerGroupPrice\Service\Pricing\PriceHelper;
use Plugin\CustomerGroupPrice\Utils\Pricing;
use Plugin\QuantityDiscount\Service\ConfigService;
use Plugin\QuantityDiscount\Service\QuantityDiscountService;
use Symfony\Component\Security\Core\Security;

class QuantityDiscountExtension extends \Plugin\QuantityDiscount\Twig\Extension\QuantityDiscountExtension
{
    use PriceHelper;

    /**
     * @var Security
     */
    protected $security;

    /**
     * @var EntityManagerInterface
     */
    protected $entityManager;

    /**
     * @var TaxRuleService
     */
    protected $taxRuleService;

    /**
     * @var Pricing
     */
    protected $pricing;

    public function __construct(
        QuantityDiscountService $quantityDiscountService,
        ConfigService           $configService,
        Security                $security,
        EntityManagerInterface  $entityManager,
        TaxRuleService          $taxRuleService,
        Pricing                 $pricing
    )
    {
        parent::__construct($quantityDiscountService, $configService);
        $this->security = $security;
        $this->entityManager = $entityManager;
        $this->taxRuleService = $taxRuleService;
        $this->pricing = $pricing;
    }

    public function getDiscountOneIncTax(ItemInterface $cartItem, $numberFormat = true)
    {
        if ($this->security->getUser() instanceof Customer) {
            /** @var Config $config */
            $config = $this->entityManager->find(Config::class, 1);

            $price = $this->pricing->getPrice($this->security->getToken(), $cartItem->getProductClass());
            $price = $this->roundByRoundingType($price, $config->getRoundingType());

            $cartItem->getProductClass()->setPrice02($price);
        }

        return parent::getDiscountOneIncTax($cartItem, $numberFormat);
    }

    public function getDiscountIncTax(ItemInterface $orderItem, $numberFormat = true)
    {
        if ($this->security->getUser() instanceof Customer) {
            /** @var Config $config */
            $config = $this->entityManager->find(Config::class, 1);

            $price = $this->pricing->getPrice($this->security->getToken(), $orderItem->getProductClass());
            $price = $this->roundByRoundingType($price, $config->getRoundingType());

            $orderItem->getProductClass()->setPrice02($price);
        }

        return parent::getDiscountIncTax($orderItem, $numberFormat);
    }
}

以上で完成です。

お気軽にコメントをどうぞ