バージョン選択

フォーラム

メニュー

オンライン状況

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

サイト内検索

質問 > フロント機能 > 送料を商品の個数に応じて加算するようにしたい

フロント機能

新規スレッドを追加する

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
VAAAANG
投稿日時: 2021/2/2 15:14
対応状況: 開発中
半人前
登録日: 2020/5/25
居住地:
投稿: 15
送料を商品の個数に応じて加算するようにしたい
[EC-CUBE] 4.0.2
[レンタルサーバ] エックスサーバ
[PHP] 7.3.25

DeliveryFeePreprocessor.php
上記のファイルを修正して商品の個数に応じて送料が増えるように修正しました。

商品A(販売種別:サイズ100) 送料 860円(千葉に送る場合)
商品B(販売種別:サイズ120) 送料 960円(千葉に送る場合)

上記のように送料を設定し、試しに商品Aを1つのみ注文した場合は問題なく送料は860円になり、2つにした場合も1720円(860*2)となったため数に応じて送料が加算されていくようにできました。
ただ、例えば商品Aを1つ商品Bも1つ同時に購入する場合、それぞれの送料の合計金額(860+960=1820)になるはずなのですが、画面には2680円と表示されます。いろいろ検証したところ一番最初にカートに入れた送料が余分に加算されているようです。宜しければおかしな箇所をご指摘いただけないでしょうか。


こちらソースコードになります。

<?php

/*
* This file is part of EC-CUBE
*
* Copyright(c) LOCKON CO.,LTD. All Rights Reserved.
*
* http://www.lockon.co.jp/
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/

namespace Eccube\Service\PurchaseFlow\Processor;

use Doctrine\ORM\EntityManagerInterface;
use Eccube\Entity\BaseInfo;
use Eccube\Entity\DeliveryFee;
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\Entity\Shipping;
use Eccube\Repository\BaseInfoRepository;
use Eccube\Repository\DeliveryFeeRepository;
use Eccube\Repository\TaxRuleRepository;
use Eccube\Service\PurchaseFlow\ItemHolderPreprocessor;
use Eccube\Service\PurchaseFlow\PurchaseContext;

/**
* 送料明細追加.
*/
class DeliveryFeePreprocessor implements ItemHolderPreprocessor
{
/** @var BaseInfo */
protected $BaseInfo;

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

/**
* @var TaxRuleRepository
*/
protected $taxRuleRepository;

/**
* @var DeliveryFeeRepository
*/
protected $deliveryFeeRepository;

/**
* DeliveryFeePreprocessor constructor.
*
* @param BaseInfoRepository $baseInfoRepository
* @param EntityManagerInterface $entityManager
* @param TaxRuleRepository $taxRuleRepository
* @param DeliveryFeeRepository $deliveryFeeRepository
*/
public function __construct(
BaseInfoRepository $baseInfoRepository,
EntityManagerInterface $entityManager,
TaxRuleRepository $taxRuleRepository,
DeliveryFeeRepository $deliveryFeeRepository
) {
$this->BaseInfo = $baseInfoRepository->get();
$this->entityManager = $entityManager;
$this->taxRuleRepository = $taxRuleRepository;
$this->deliveryFeeRepository = $deliveryFeeRepository;
}

/**
* @param ItemHolderInterface $itemHolder
* @param PurchaseContext $context
*
* @throws \Doctrine\ORM\NoResultException
*/
public function process(ItemHolderInterface $itemHolder, PurchaseContext $context)
{
$this->removeDeliveryFeeItem($itemHolder);
$this->saveDeliveryFeeItem($itemHolder);
}

private function removeDeliveryFeeItem(ItemHolderInterface $itemHolder)
{
foreach ($itemHolder->getShippings() as $Shipping) {
foreach ($Shipping->getOrderItems() as $item) {
if ($item->getProcessorName() == DeliveryFeePreprocessor::class) {
$Shipping->removeOrderItem($item);
$itemHolder->removeOrderItem($item);
$this->entityManager->remove($item);
}
}
}
}

/**
* @param ItemHolderInterface $itemHolder
*
* @throws \Doctrine\ORM\NoResultException
*/
private function saveDeliveryFeeItem(ItemHolderInterface $itemHolder)
{
$DeliveryFeeType = $this->entityManager
->find(OrderItemType::class, OrderItemType::DELIVERY_FEE);
$TaxInclude = $this->entityManager
->find(TaxDisplayType::class, TaxDisplayType::INCLUDED);
$Taxation = $this->entityManager
->find(TaxType::class, TaxType::TAXATION);

/** @var Order $Order */
$Order = $itemHolder;
/* @var Shipping $Shipping */
foreach ($Order->getShippings() as $Shipping) {
// 送料の計算
$deliveryFeeProduct = 0;
if ($this->BaseInfo->isOptionProductDeliveryFee()) {
/** @var OrderItem $item */
foreach ($Shipping->getOrderItems() as $item) {
if (!$item->isProduct()) {
continue;
}
$deliveryFeeProduct += $item->getProductClass()->getDeliveryFee() * $item->getQuantity();
}
}

/** @var DeliveryFee $DeliveryFee */
$DeliveryFee = $this->deliveryFeeRepository->findOneBy([
'Delivery' => $Shipping->getDelivery(),
'Pref' => $Shipping->getPref(),
]);

// 都道府県送料 * 個数
foreach ($Shipping->getOrderItems() as $item) {
$DeliveryFeeTotal += ($DeliveryFee->getFee() * $item->getQuantity());
}

$OrderItem = new OrderItem();
$OrderItem->setProductName($DeliveryFeeType->getName())
->setPrice($DeliveryFee->getFee() + $deliveryFeeProduct)
->setPrice($DeliveryFeeTotal + $deliveryFeeProduct)
->setQuantity(1)
->setOrderItemType($DeliveryFeeType)
->setShipping($Shipping)
->setOrder($itemHolder)
->setTaxDisplayType($TaxInclude)
->setTaxType($Taxation)
->setProcessorName(DeliveryFeePreprocessor::class);

$itemHolder->addItem($OrderItem);
$Shipping->addOrderItem($OrderItem);
}
}
}


どうかご教授くださいませ。
devbell
投稿日時: 2021/2/2 20:47
対応状況: −−−
半人前
登録日: 2020/4/10
居住地:
投稿: 19
Re: 送料を商品の個数に応じて加算するようにしたい

// 都道府県送料 * 個数

ここで「$Shipping->getOrderItems()」されてますが、商品Aと商品Bの明細と、手数料の明細が戻ってくるので、860*1が余分に計算されると思います。

Shippingには商品の明細だけ取得するgetProductOrderItems()があるので、「$Shipping->getProductOrderItems()」に変更してみてはどうでしょうか?

細かい設定など分からないので、予想する部分も多いですが、送料をカスタムするなら

購入フローのカスタマイズで行うのが良いと思います。
https://doc4.ec-cube.net/customize_service

スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ


 



ログイン


EC-CUBEペイメント

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

統計情報

総メンバー数は71,659名です
総投稿数は101,392件です

投稿数ランキング

1
seasoft
7333
2
468
2999
3
AMUAMU
2712
4
nanasess
2147
5
umebius
2006
6
yuh
1612
7
red
1450
8
h_tanaka
1080
9
tsuji
936
10
fukap
907
11
shutta
835
12
tao_s
793
13 ramrun 789
14 karin 689
15 sumida 641
16
homan
633
17 DELIGHT 572
18
patapata
502
19
flealog
485
20 tonton 437


ネットショップの壺

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

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