[EC-CUBE] 4.0.3
[レンタルサーバ]さくらインターネット
[OS] Windows10
[PHP] PHP Version7.3.12
[データベース] MySQL 5.7.28
[ブラウザ] Chrome
いつもお世話になっております。
EC-CUBE3系では以下のようなコードで、ShoppingService.phpに値引きを実現していました。
引用:
/**
* @param Order $Order
*/
public function setDeliveryFreeAmount(Order $Order)
{
// 配送料無料条件(合計金額)
$Shipping = $Order->getShippings()->first();
$deliv_id = $Shipping->getDelivery()->getId();
$deliveryFreeAmount = $this->BaseInfo->getDeliveryFreeAmount();
if (!is_null($deliveryFreeAmount)) {
// 合計金額が設定金額以上であれば送料無料
if ($Order->getSubTotal() <= 3000) {
if($deliv_id==3 ) $Order->setDeliveryFeeTotal(188);
if($deliv_id==6 ) $Order->setDeliveryFeeTotal(210);
if($deliv_id==4 ) $Order->setDeliveryFeeTotal(520);
if($deliv_id==5 ) $Order->setDeliveryFeeTotal($Order->getDeliveryFeeTotal());
}else if ($Order->getSubTotal() <= 6999) {
if($deliv_id==3 ) $Order->setDeliveryFeeTotal(0);
if($deliv_id==6 ) $Order->setDeliveryFeeTotal(0);
if($deliv_id==4 ) $Order->setDeliveryFeeTotal(310);
if($deliv_id==5 ) $Order->setDeliveryFeeTotal($Order->getDeliveryFeeTotal() - 200);
}else if ($Order->getSubTotal() <= 15000) {
if($deliv_id==3 ) $Order->setDeliveryFeeTotal(0);
if($deliv_id==6 ) $Order->setDeliveryFeeTotal(0);
if($deliv_id==4 ) $Order->setDeliveryFeeTotal(0);
if($deliv_id==5 ) $Order->setDeliveryFeeTotal($Order->getDeliveryFeeTotal() - 520);
}else{
$Order->setDeliveryFeeTotal(0);
// お届け先情報の配送料も0にセット
$shippings = $Order->getShippings();
foreach ($shippings as $Shipping) {
$Shipping->setShippingDeliveryFee(0);
}
}
}
}
4系では
https://www.slideshare.net/chihiroadachi3/201927-eccubeugpurchaseflow-130874190?fbclid=IwAR1VAYGVyPoFh8tTsTKbLt-p7zIIRrh2YeoB0TtyztygFf13cVPmzpMgG4s こちらのスライドを参考に、以下のようなファイルを設置しました。
引用:
<?php
namespace Customize\Service\PurchaseFlow\Processor;
use Doctrine\ORM\EntityManagerInterface;
use Eccube\Annotation\ShoppingFlow;
use Eccube\Entity\ItemHolderInterface;
use Eccube\Entity\Master\OrderItemType;
use Eccube\Entity\Master\TaxDisplayType;
use Eccube\Entity\Master\TaxType;
use Eccube\Entity\Order;
use Eccube\Entity\OrderItem;
use Eccube\Service\PurchaseFlow\DiscountProcessor;
use Eccube\Service\PurchaseFlow\ItemHolderPreprocessor;
use Eccube\Service\PurchaseFlow\ProcessResult;
use Eccube\Service\PurchaseFlow\PurchaseContext;
use Eccube\Annotation\OrderFlow;
/**
* @ShoppingFlow
* @OrderFlow
*/
class NebikiProcessor implements DiscountProcessor
{
protected $entityManager;
public function __construct(EntityManagerInterface $entityManager)
{
$this->entityManager = $entityManager;
}
/**
* 値引き明細の削除処理を実装します.
*
* @param ItemHolderInterface $itemHolder
* @param PurchaseContext $context
*/
public function removeDiscountItem(ItemHolderInterface $itemHolder, PurchaseContext $context)
{
foreach ($itemHolder->getItems() as $item) {
if ($item->getProcessorName() == NebikiProcessor::class) {
$itemHolder->removeOrderItem($item);
$this->entityManager->remove($item);
}
}
}
/**
* 値引き明細の追加処理を実装します.
*
* かならず合計金額等のチェックを行い, 超える場合は利用できる金額まで丸めるか、もしくは明細の追加処理をスキップしてください.
* 正常に追加できない場合は, ProcessResult::warnを返却してください.
*
* @param ItemHolderInterface $itemHolder
* @param PurchaseContext $context
*
* @return ProcessResult|null
*/
public function addDiscountItem(ItemHolderInterface $itemHolder, PurchaseContext $context)
{
// 明細種別や税種別を設定
$DiscountType = $this->entityManager->find(OrderItemType::class, OrderItemType::DISCOUNT);
$TaxInclude = $this->entityManager->find(TaxDisplayType::class, TaxDisplayType::INCLUDED);
$Taxation = $this->entityManager->find(TaxType::class, TaxType::NON_TAXABLE);
// 3000~7000円の場合
if ($itemHolder->getSubTotal() >= 3000 && $itemHolder->getSubTotal() <= 6999) {
// 明細の追加
$OrderItem = new OrderItem();
$OrderItem->setProductName($DiscountType->getName())
->setPrice(-200)
->setQuantity(1)
->setTax(0)
->setTaxRate(0)
->setTaxRuleId(null)
->setRoundingType(null)
->setOrderItemType($DiscountType)
->setTaxDisplayType($TaxInclude)
->setTaxType($Taxation)
->setOrder($itemHolder)
->setProcessorName(NebikiProcessor::class);
$itemHolder->addItem($OrderItem);
}
// 7000円~15000の場合 (管理画面にて、15000円以上は送料無料)
else if ($itemHolder->getSubTotal() >= 7000 && $itemHolder->getSubTotal() <= 15000) {
// 明細の追加
$OrderItem = new OrderItem();
$OrderItem->setProductName($DiscountType->getName())
->setPrice(-520)
->setQuantity(1)
->setTax(0)
->setTaxRate(0)
->setTaxRuleId(null)
->setRoundingType(null)
->setOrderItemType($DiscountType)
->setTaxDisplayType($TaxInclude)
->setTaxType($Taxation)
->setOrder($itemHolder)
->setProcessorName(NebikiProcessor::class);
$itemHolder->addItem($OrderItem);
}
}
}
ですがこれだと、購入金額によっては送料以上に値引きがされてしまうことが出てきてしまいました。(デフォルトの配送料が200円のため)
配送方法は4種類あり、2つは送料200円、一つは520円、
一つはゆうパックにしています。
それぞれの配送料以上に値引きをしないようにしたいのですが、可能でしょうか?
3系のように、送料を設定しているDeliveryFeePreprocessor.phpに配送方法ごとの送料を設定したらいいのかもしれませんが、4系で配送方法のidを取得している記述がないため(DBでもdeliv_idという名前からidになっているため)、参考に出来るコードがなく書き方が分かりません。。
年末年始でお忙しいところを恐縮ですが、ご教授いただけますと幸いです。
宜しくお願いいたします。