cancel
Showing results for 
Search instead for 
Did you mean: 

around plugin for getSavePercent method for TierPrices

SOLVED
   Did you know you can see the translated content as per your choice?

Translation is in progress. Please check again after few minutes.

around plugin for getSavePercent method for TierPrices

I have following code in di.xml

<type name="Magento\Catalog\Pricing\Price\TierPrice">
      <plugin name="tierPriceSavePercentPlugin" type="Mycomp\Common\Plugin\TierPricePlugin" sortOrder="5"/>
  </type>

and the code in plugin file as following

 

<?php

namespace Mycomp\Common\Plugin;

use Magento\Catalog\Model\Product;
use Magento\Customer\Api\GroupManagementInterface;
use Magento\Customer\Model\Session;
use Magento\Framework\Pricing\Adjustment\CalculatorInterface;
use Magento\Framework\Pricing\Amount\AmountInterface;

class TierPricePlugin
{
    protected $scopeConfig;
    
    /**
     * @param Product $saleableItem 
     */
    public function __construct(
        Product $saleableItem,
        \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig
       
    ) {
             $this->scopeConfig = $scopeConfig;
             $this->priceInfo = $saleableItem->getPriceInfo();
    }    
    
    /**
     * Adding precision value from config setting
     * @param AmountInterface $amount
     * @return float
     */
    public function aroundGetSavePercent(\Magento\Catalog\Pricing\Price\TierPrice $subject, \Closure $proceed, $amount)
    {
        /* System config value set for the Tier Price Display */
         $precision = $this->scopeConfig->getValue('mycomp_common/tier_prices/precision', \Magento\Store\Model\ScopeInterface::SCOPE_STORE);    
         $returnValue = $proceed($amount);       
        
         echo $this->priceInfo->getPrice(\Magento\Catalog\Pricing\Price\FinalPrice::PRICE_CODE)->getValue();

     exit; 

    }
}

 

Following code line is always returning zero

 

echo $this->priceInfo->getPrice(\Magento\Catalog\Pricing\Price\FinalPrice::PRICE_CODE)
->getValue();

Ideally the above mentioned code line should return the Final price of the product.

What is wrong with my code?

---
Problem Solved Click Accept as Solution!:Magento Community India Forum
1 ACCEPTED SOLUTION

Accepted Solutions

Re: around plugin for getSavePercent method for TierPrices

You are currently trying to use Magento\Framework\Pricing\SaleableInterface for which there is no preference set so the ObjectManager is unable to find a concrete class that fulfils this interface. This leads to the error you are seeing when your TierPrice plugin class is being constructed.

 

Looking at Magento\Framework\Pricing\Price\AbstractPrice I believe you do not need SaleableInterface at all as you can get it from the TierPrice $subject.

So you would end up with:

 

public function __construct(
    \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig
) {
    $this->scopeConfig = $scopeConfig;
}

public function aroundGetSavePercent(\Magento\Catalog\Pricing\Price\TierPrice $subject, \Closure $proceed, $amount)
{
    $precision = $this->scopeConfig->getValue('mymodule_common/tier_prices/precision', \Magento\Store\Model\ScopeInterface::SCOPE_STORE);

    return round(
        100 - ((100 / $subject->getProduct()->getPriceInfo()->getPrice(FinalPrice::PRICE_CODE)->getValue())
            * $amount->getBaseAmount()),$precision
    );
}

 

View solution in original post

1 REPLY 1

Re: around plugin for getSavePercent method for TierPrices

You are currently trying to use Magento\Framework\Pricing\SaleableInterface for which there is no preference set so the ObjectManager is unable to find a concrete class that fulfils this interface. This leads to the error you are seeing when your TierPrice plugin class is being constructed.

 

Looking at Magento\Framework\Pricing\Price\AbstractPrice I believe you do not need SaleableInterface at all as you can get it from the TierPrice $subject.

So you would end up with:

 

public function __construct(
    \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig
) {
    $this->scopeConfig = $scopeConfig;
}

public function aroundGetSavePercent(\Magento\Catalog\Pricing\Price\TierPrice $subject, \Closure $proceed, $amount)
{
    $precision = $this->scopeConfig->getValue('mymodule_common/tier_prices/precision', \Magento\Store\Model\ScopeInterface::SCOPE_STORE);

    return round(
        100 - ((100 / $subject->getProduct()->getPriceInfo()->getPrice(FinalPrice::PRICE_CODE)->getValue())
            * $amount->getBaseAmount()),$precision
    );
}