バージョン選択

フォーラム

メニュー

オンライン状況

35 人のユーザが現在オンラインです。 (26 人のユーザが フォーラム を参照しています。)
登録ユーザ: 1
ゲスト: 34
PRIA もっと...

サイト内検索

質問 > フロント機能 > 購入金額ごとに送料値引きを配送方法別に設定したい

フロント機能

新規スレッドを追加する

フラット表示 前のトピック | 次のトピック
投稿者 スレッド
akiakihi
投稿日時: 2019/12/31 16:50
対応状況: −−−
一人前
登録日: 2014/7/17
居住地: 兵庫県
投稿: 91
購入金額ごとに送料値引きを配送方法別に設定したい
[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になっているため)、参考に出来るコードがなく書き方が分かりません。。
年末年始でお忙しいところを恐縮ですが、ご教授いただけますと幸いです。
宜しくお願いいたします。

フラット表示 前のトピック | 次のトピック


題名 投稿者 日時
 » 購入金額ごとに送料値引きを配送方法別に設定したい akiakihi 2019/12/31 16:50
     Re: 購入金額ごとに送料値引きを配送方法別に設定したい umebius 2020/1/1 0:30
       Re: 購入金額ごとに送料値引きを配送方法別に設定したい akiakihi 2020/1/2 16:50

 



ログイン


EC-CUBE公式 Amazon Payプラグイン

統計情報

総メンバー数は88,668名です
総投稿数は109,924件です

投稿数ランキング

1
seasoft
7367
2
468
3217
3
AMUAMU
2712
4
nanasess
2311
5
umebius
2085
6
yuh
1819
7
h_tanaka
1637
8
red
1569
9
mcontact
1276
10
tsuji
958
11
fukap
907
12
shutta
835
13
tao_s
799
14 ramrun 789
15 karin 689
16 sumida 641
17
homan
633
18 DELIGHT 572
19
patapata
502
20
flealog
485


ネットショップの壺

EC-CUBEインテグレートパートナー

Copyright© EC-CUBE CO.,LTD. All Rights Reserved.