在magento 2中应用两次自定义折扣

时间:2016-11-22 11:34:45

标签: magento2

我已使用this在magento 2.1中应用自定义折扣。一切都在本地系统上工作但是当我在服务器上部署更改时,折扣从总数中减去两倍。 任何人都可以对此有所了解吗?

Sales.xml

<?xml version="1.0"?><config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Sales:etc/sales.xsd">
<section name="quote">
    <group name="totals">
        <item name="test_discount" instance="Namespace\Modulename\Model\Quote\Discount" sort_order="500"/>
    </group>
</section>

3 个答案:

答案 0 :(得分:6)

要删除摘要中应用两次的自定义折扣,请添加以下行

$items = $shippingAssignment->getItems();
            if (!count($items)) {
                return $this;
            }
在collect方法中

。完成后,它将如下所示。

public function collect(
    \Magento\Quote\Model\Quote $quote,
    \Magento\Quote\Api\Data\ShippingAssignmentInterface $shippingAssignment,
    \Magento\Quote\Model\Quote\Address\Total $total
) {
    $items = $shippingAssignment->getItems();
    if (!count($items)) {
        return $this;
    }
    parent::collect($quote, $shippingAssignment, $total);

答案 1 :(得分:1)

这可能是因为多件装 Magento收集每个地址的总数。在默认方案中,报价有两个地址:帐单邮寄地址和送货地址。 我没有尝试过您链接的示例,但afaiks费用将被应用两次。出于某种原因,这并没有显示在前端,但我也遇到过两次收费的问题,但不知何故仍然在前端正确显示。

我假设在有多个送货单时,仍然只有一个帐单邮寄地址。因此,以下代码段应解决两次应用自定义费用/折扣的问题:

$address = $shippingAssignment->getShipping()->getAddress();
if($address->getAddressType() != 'billing'){
    return $this;
}

或者,如果您只想对带有物品的货件收取费用:

$allBaseTotals = $total->getAllBaseTotalAmounts();
if(!isset($allBaseTotals['subtotal']) || $allBaseTotals['subtotal'] <= 0){
    return $this;
}

这意味着您链接的教程中的示例文件将如下所示: app/code/Magestore/Webpos/Model/Total/Quote/Custom.php

   /**
    * @param \Magento\Quote\Model\Quote $quote
    * @param \Magento\Quote\Api\Data\ShippingAssignmentInterface $shippingAssignment
    * @param \Magento\Quote\Model\Quote\Address\Total $total
    * @return $this|bool
    */
   public function collect(
       \Magento\Quote\Model\Quote $quote,
       \Magento\Quote\Api\Data\ShippingAssignmentInterface $shippingAssignment,
       \Magento\Quote\Model\Quote\Address\Total $total
   )
   {
        parent::collect($quote, $shippingAssignment, $total);
        $address = $shippingAssignment->getShipping()->getAddress();
        if($address->getAddressType() != 'billing'){
            return $this;
        }

        $baseDiscount = 10;
        $discount =  $this->_priceCurrency->convert($baseDiscount);
        $total->addTotalAmount('customdiscount', -$discount);
        $total->addBaseTotalAmount('customdiscount', -$baseDiscount);
        $total->setBaseGrandTotal($total->getBaseGrandTotal() - $baseDiscount);
        $quote->setCustomDiscount(-$discount);
        return $this;
    }

编辑: 似乎if($address->getAddressType() != 'billing'){不能像我想象的那样起作用。 我现在正在使用if($address->getAddressType() == 'billing'){,因为我没有使用多重传输。

答案 2 :(得分:0)

折扣是根据报价中的地址计算的,因为有两个地址billingshipping为何要计算两次。

您可以在billingshipping上设置仅计算送货地址或帐单地址的条件。

这里只是在开始时使用这个简单的if语句(来自nbjohan答案)。

$address = $shippingAssignment->getShipping()->getAddress();
if($address->getAddressType() != 'billing'){
    return $this;
}

现在它将只计算一次。