96 $coupon = $this->couponFactory->create();
107 $couponUsage = $this->objectFactory->create();
108 $this->usageFactory->create()->loadByCustomerCoupon(
113 if ($couponUsage->getCouponId() &&
114 $couponUsage->getTimesUsed() >=
$coupon->getUsagePerCustomer()
131 $ruleCustomer = $this->customerFactory->create();
133 if ($ruleCustomer->getId()) {
134 if ($ruleCustomer->getTimesUsed() >=
$rule->getUsesPerCustomer()) {
169 $itemDiscountAmount =
$item->getDiscountAmount();
170 $itemBaseDiscountAmount =
$item->getBaseDiscountAmount();
172 $discountAmount = min($itemDiscountAmount + $discountData->getAmount(), $itemPrice * $qty);
173 $baseDiscountAmount = min($itemBaseDiscountAmount + $discountData->getBaseAmount(), $baseItemPrice * $qty);
175 $discountData->setAmount($discountAmount);
176 $discountData->setBaseAmount($baseDiscountAmount);
190 $discountAmount = $discountData->getAmount();
191 $baseDiscountAmount = $discountData->getBaseAmount();
192 $rowTotalInclTax =
$item->getRowTotalInclTax();
193 $baseRowTotalInclTax =
$item->getBaseRowTotalInclTax();
197 $percentKey =
$item->getDiscountPercent();
199 $delta = isset($this->_roundingDeltas[$percentKey]) ? $this->_roundingDeltas[$percentKey] : 0;
200 $baseDelta = isset($this->_baseRoundingDeltas[$percentKey]) ? $this->_baseRoundingDeltas[$percentKey] : 0;
202 $discountAmount += $delta;
203 $baseDiscountAmount += $baseDelta;
205 $this->_roundingDeltas[$percentKey] = $discountAmount - $this->priceCurrency->round($discountAmount);
206 $this->_baseRoundingDeltas[$percentKey] = $baseDiscountAmount
207 - $this->priceCurrency->round($baseDiscountAmount);
214 if ($percentKey == 100) {
215 $discountDelta = $rowTotalInclTax - $discountAmount;
216 $baseDiscountDelta = $baseRowTotalInclTax - $baseDiscountAmount;
218 if ($discountDelta < 0) {
219 $discountAmount += $discountDelta;
222 if ($baseDiscountDelta < 0) {
223 $baseDiscountAmount += $baseDiscountDelta;
227 $discountData->setAmount($this->priceCurrency->round($discountAmount));
228 $discountData->setBaseAmount($this->priceCurrency->round($baseDiscountAmount));
242 $calcPrice =
$item->getCalculationPrice();
255 return $price !==
null ?
$item->getBaseDiscountCalculationPrice() :
$item->getBaseCalculationPrice();
267 $qty =
$item->getTotalQty();
268 $discountQty =
$rule->getDiscountQty();
269 return $discountQty ? min($qty, $discountQty) : $qty;
280 public function mergeIds($a1, $a2, $asString =
true)
282 if (!is_array($a1)) {
283 $a1 = empty($a1) ? [] : explode(
',', $a1);
285 if (!is_array($a2)) {
286 $a2 = empty($a2) ? [] : explode(
',', $a2);
288 $a = array_unique(array_merge($a1, $a2));
290 $a = implode(
',', $a);
300 $this->_roundingDeltas = [];
301 $this->_baseRoundingDeltas = [];
const COUPON_TYPE_NO_COUPON
__construct(\Magento\SalesRule\Model\ResourceModel\Coupon\UsageFactory $usageFactory, \Magento\SalesRule\Model\CouponFactory $couponFactory, \Magento\SalesRule\Model\Rule\CustomerFactory $customerFactory, \Magento\Framework\DataObjectFactory $objectFactory, PriceCurrencyInterface $priceCurrency)
deltaRoundingFix(\Magento\SalesRule\Model\Rule\Action\Discount\Data $discountData, \Magento\Quote\Model\Quote\Item\AbstractItem $item)
mergeIds($a1, $a2, $asString=true)
minFix(\Magento\SalesRule\Model\Rule\Action\Discount\Data $discountData, \Magento\Quote\Model\Quote\Item\AbstractItem $item, $qty)