バージョン選択

フォーラム

メニュー

オンライン状況

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

サイト内検索

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

フロント機能

新規スレッドを追加する

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

umebius
投稿日時: 2020/1/1 0:30
対応状況: −−−
登録日: 2016/7/22
居住地: 東京日本橋
投稿: 1588
Re: 購入金額ごとに送料値引きを配送方法別に設定したい
ShoppingFlow、OrderFlowでは$itemHolderはOrderクラスのオブジェクトになります。

ですので、$itemHolderを3系のコードの$Orderに見立てて書くことは可能です。

ただ、すみません、方針は上でいいと思いますが動作確認等はしていないので
$Shipping = $itemHolder->getShippings()->first()が常にNULLになることはないか、
$Shipping->getDelivery()が常にNULLになることがないかといったことはわからないです。


----------------
EC-CUBE3系4系 カスタマイズ ECのプロがシステム特急案件承ります。
公式インテグレートパートナー リモートで働くエンジニア募集中

akiakihi
投稿日時: 2020/1/2 16:50
対応状況: −−−
一人前
登録日: 2014/7/17
居住地: 兵庫県
投稿: 83
Re: 購入金額ごとに送料値引きを配送方法別に設定したい
ありがとうございます!!

$deliv_id = $itemHolder->getShippings()->first()->getDelivery()->getId();

とすることで無事に配送方法idを取得、

if($deliv_id == 1) {

で、idごとの値引きを設定することができました^^
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ


 



ログイン


EC-CUBEペイメント

公式ストアEC-CUBE4系デザインテンプレート続々リリース中

統計情報

総メンバー数は61,587名です
総投稿数は95,564件です

投稿数ランキング

1
seasoft
7332
2
AMUAMU
2712
3
468
2057
4
nanasess
2039
5
yuh
1612
6
umebius
1588
7
red
1399
8
h_tanaka
1005
9
fukap
907
10
tsuji
863
11
shutta
835
12 ramrun 789
13
tao_s
783
14 karin 656
15 sumida 641
16
homan
633
17 DELIGHT 571
18
patapata
502
19
flealog
485
20 tonton 437


ネットショップの壺

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

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