public function testDeltaRoundignFix() { $discountAmount = 10.003; $baseDiscountAmount = 12.465; $percent = 15; $roundedDiscount = round($discountAmount, 2); $roundedBaseDiscount = round($baseDiscountAmount, 2); $delta = $discountAmount - $roundedDiscount; $baseDelta = $baseDiscountAmount - $roundedBaseDiscount; $secondRoundedDiscount = round($discountAmount + $delta); $secondRoundedBaseDiscount = round($baseDiscountAmount + $baseDelta); $this->item->expects($this->any())->method('getQuote')->will($this->returnValue($this->quote)); $store = $this->getMock('Magento\\Store\\Model\\Store', [], [], '', false); $this->priceCurrency->expects($this->any())->method('round')->will($this->returnValueMap([[$discountAmount, $roundedDiscount], [$baseDiscountAmount, $roundedBaseDiscount], [$discountAmount + $delta, $secondRoundedDiscount], [$baseDiscountAmount + $baseDelta, $secondRoundedBaseDiscount]])); $this->quote->expects($this->any())->method('getStore')->will($this->returnValue($store)); $this->item->setDiscountPercent($percent); $discountData = $this->getMock('Magento\\SalesRule\\Model\\Rule\\Action\\Discount\\Data', [], [], '', false); $discountData->expects($this->at(0))->method('getAmount')->will($this->returnValue($discountAmount)); $discountData->expects($this->at(1))->method('getBaseAmount')->will($this->returnValue($baseDiscountAmount)); $discountData->expects($this->at(2))->method('setAmount')->with($roundedDiscount); $discountData->expects($this->at(3))->method('setBaseAmount')->with($roundedBaseDiscount); $discountData->expects($this->at(4))->method('getAmount')->will($this->returnValue($discountAmount)); $discountData->expects($this->at(5))->method('getBaseAmount')->will($this->returnValue($baseDiscountAmount)); $discountData->expects($this->at(6))->method('setAmount')->with($secondRoundedDiscount); $discountData->expects($this->at(7))->method('setBaseAmount')->with($secondRoundedBaseDiscount); $this->assertEquals($this->utility, $this->utility->deltaRoundingFix($discountData, $this->item)); $this->assertEquals($this->utility, $this->utility->deltaRoundingFix($discountData, $this->item)); }
/** * @param \Magento\Quote\Model\Quote\Item\AbstractItem $item * @param \Magento\SalesRule\Model\Rule $rule * @return \Magento\SalesRule\Model\Rule\Action\Discount\Data */ protected function getDiscountData($item, $rule) { $qty = $this->validatorUtility->getItemQty($item, $rule); $discountCalculator = $this->calculatorFactory->create($rule->getSimpleAction()); $qty = $discountCalculator->fixQuantity($qty, $rule); $discountData = $discountCalculator->calculate($rule, $item, $qty); $this->eventFix($discountData, $item, $rule, $qty); $this->validatorUtility->deltaRoundingFix($discountData, $item); /** * We can't use row total here because row total not include tax * Discount can be applied on price included tax */ $this->validatorUtility->minFix($discountData, $item, $qty); return $discountData; }