Magento 2:以编程方式在购物车中添加自定义税额


10

我想以编程方式将自定义税额添加到结帐购物车。

这是例子。

Cart Old Tax = 4.21

Custom Tax = 2

New Tax = 4.21 + 2 = 6

查看下面的屏幕截图。

在此处输入图片说明

我需要以编程方式完成此操作。


custom amount来自哪里?
Toan Nguyen

我从会话中获取的@ToanNguyen,我的意思是如何将这一价值添加到税收中。
Dhiren Vasoya

@DhirenVasoya,当添加到购物车时,如何为产品添加自定义税价,这是我的问题,magento.stackexchange.com
贾法尔·派贾尔

@DhirenVasoya,在我尝试过的解决方案下方,这显示购物车但未计算..
贾法尔·平贾尔

@DhirenVasoya-您是否已解决此问题?
Manashvi Birla,

Answers:


4

您可以观察sales_quote_address_collect_totals_after并实现该事件。为此,您需要设置一个模块并配置一个事件。假设我们的模块是MStack_Exchange

档案: app\code\MStack\Exchange\etc\events.xml

<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Event/etc/events.xsd">
    <event name="sales_quote_address_collect_totals_after">
        <observer name="changeTaxTotal" instance="MStack\Exchange\Observer\ChangeTaxTotal"/>
    </event>
</config>

档案: app\code\MStack\Exchange\Observer\ChangeTaxTotal.php

<?php
namespace MStack\Exchange\Observer;

use \Magento\Framework\Event\ObserverInterface;
use \Magento\Framework\Event\Observer;

class ChangeTaxTotal implements ObserverInterface
{
    public $additionalTaxAmt = 2;

    public function execute(Observer $observer)
    {
        /** @var Magento\Quote\Model\Quote\Address\Total */
        $total = $observer->getData('total');

        //make sure tax value exist
        if (count($total->getAppliedTaxes()) > 0) {
            $total->addTotalAmount('tax', $this->additionalTaxAmt);
        }

        return $this;
    }
}

这里的重要电话是:$total->addTotalAmount('tax', $this->additionalTaxAmt);。这将2与现有税额相加,我认为这是您所需要的。因此,您需要做的是替换$this->additionalTaxAmt为您的税收缓冲值。

该事件sales_quote_address_collect_totals_after仅在进行了总计算之后才触发,因此成为进行游戏的理想场所。

如果您想知道这些总数在哪里进行,则需要研究Magento\Quote\Model\Quote\TotalsCollector::collect()Magento\Quote\Model\Quote\TotalsCollector::collectAddressTotals()方法。


让我检查一下。
Dhiren Vasoya '17

@Rajeev,添加到购物车后,我们可以为单个产品添加自定义税吗?这是我的问题,magento.stackexchange.com
贾法尔·平

感谢@Rajeev挽救我的一天
Soundararajan m

作品谢谢
snez

2

@Dhiren Vasoya

也使用这些行。

$total->addBaseTotalAmount('tax', $this->additionalTaxAmt);
$total->setGrandTotal((float)$total->getGrandTotal() + $this->additionalTaxAmt);
$total->setBaseGrandTotal((float)$total->getBaseGrandTotal() + $this->additionalTaxAmt);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.