cancel
Showing results for 
Search instead for 
Did you mean: 

Markup price rule

Markup price rule

 
I want to markup prices but Magento2 provide only discounted option (i don't know how it is possible!). I'm trying to modify the expression in Magento\CatalogRule\Model\Indexer\ ProductPriceCalculator

from

case 'by_percent': $productPrice = $productPrice * (1 - $ruleData['action_amount'] / 100);

to

case 'by_percent': $productPrice = $productPrice * (1 + $ruleData['action_amount'] / 100);

it should work because the math formula is correct but when i apply the rule in the frontend it show only the regular price. I suppose there is something other that limit the price to be not over the regular price but i'm not able to find and manage it.

The full code is

/**
 * Product price calculation according rules settings.
 */
class ProductPriceCalculator
{
    /**
     * @var \Magento\Framework\Pricing\PriceCurrencyInterface
     */
    private $priceCurrency;

    /**
     * @param \Magento\Framework\Pricing\PriceCurrencyInterface $priceCurrency
     */
    public function __construct(\Magento\Framework\Pricing\PriceCurrencyInterface $priceCurrency)
    {
        $this->priceCurrency = $priceCurrency;
    }

    /**
     * Calculates product price.
     *
     * @param array $ruleData
     * @param null $productData
     * @return float
     */
    public function calculate($ruleData, $productData = null)
    {
        if ($productData !== null && isset($productData['rule_price'])) {
            $productPrice = $productData['rule_price'];
        } else {
            $productPrice = $ruleData['default_price'];
        }

        switch ($ruleData['action_operator']) {
            case 'to_fixed':
                $productPrice = min($ruleData['action_amount'], $productPrice);
                break;
            case 'to_percent':
                $productPrice = $productPrice * $ruleData['action_amount'] / 100;
                break;
            case 'by_fixed':
                $productPrice = max(0, $productPrice - $ruleData['action_amount']);
                break;
            case 'by_percent':
                $productPrice = $productPrice * (1 + $ruleData['action_amount'] / 100);
                break;
            default:
                $productPrice = 0;
        }

        return $this->priceCurrency->round($productPrice);
    }
}