バージョン選択

フォーラム

メニュー

オンライン状況

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

サイト内検索

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

フロント機能

新規スレッドを追加する

フラット表示 前のトピック | 次のトピック
投稿者 スレッド
VAAAANG
投稿日時: 2021/2/2 15:14
対応状況: 開発中
半人前
登録日: 2020/5/25
居住地:
投稿: 16
送料を商品の個数に応じて加算するようにしたい
[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);
}
}
}


どうかご教授くださいませ。
フラット表示 前のトピック | 次のトピック


題名 投稿者 日時
 » 送料を商品の個数に応じて加算するようにしたい VAAAANG 2021/2/2 15:14
     Re: 送料を商品の個数に応じて加算するようにしたい devbell 2021/2/2 20:47

 



ログイン


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

統計情報

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

投稿数ランキング

1
seasoft
7365
2
468
3217
3
AMUAMU
2712
4
nanasess
2303
5
umebius
2085
6
yuh
1818
7
h_tanaka
1610
8
red
1567
9
mcontact
1240
10
tsuji
958
11
fukap
907
12
shutta
835
13
tao_s
796
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.