2016-11-22 40 views
0

我已經在magento 2.1中使用this應用了自定義折扣。一切都在本地系統上工作,但是當我在服務器上部署更改時,折扣會從總數中減去兩次。 任何人可以有任何想法嗎?在magento 2中應用兩次自定義折扣

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> 

回答

0

這可能是因爲multishipping的。
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'){,因爲我沒有使用多剪貼簿。

+1

嗨,我也面臨同樣的問題..你有這個問題的任何解決方案? –

3

要刪除在摘要運用兩次定製的折扣。只是在收集方法中添加以下行

$items = $shippingAssignment->getItems(); 
      if (!count($items)) { 
       return $this; 
      } 

。完成後,它將如下所示。

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);