質問 > フロント機能 > 送料を商品の個数に応じて加算するようにしたい |
フロント機能
フラット表示 | 前のトピック | 次のトピック |
投稿者 | スレッド |
---|---|
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 |