119 \
Magento\Catalog\Helper\Data $catalogData,
129 $this->_collectionFactory = $collectionFactory;
130 $this->_catalogData = $catalogData;
131 $this->validatorUtility = $utility;
165 $key = $this->getWebsiteId() .
'_' 166 . $this->getCustomerGroupId() .
'_' 167 . $this->getCouponCode() .
'_' 169 if (!isset($this->_rules[$key])) {
170 $this->_rules[$key] = $this->_collectionFactory->create()
171 ->setValidationFilter(
172 $this->getWebsiteId(),
173 $this->getCustomerGroupId(),
174 $this->getCouponCode(),
178 ->addFieldToFilter(
'is_active', 1)
181 return $this->_rules[$key];
193 if (!
$address->hasData(
'address_sales_rule_id')) {
194 if (
$address->hasData(
'address_id')) {
195 $address->setData(
'address_sales_rule_id',
$address->getData(
'address_id'));
198 $tempId =
$type . $this->counter++;
199 $address->setData(
'address_sales_rule_id', $tempId);
202 return $address->getData(
'address_sales_rule_id');
213 $this->_skipActionsValidation = $flag;
243 $this->validatorUtility->resetRoundingDeltas();
244 if ($this->_isFirstTimeResetRun) {
246 $address->getQuote()->setAppliedRuleIds(
'');
247 $this->_isFirstTimeResetRun =
false;
261 $item->setDiscountAmount(0);
262 $item->setBaseDiscountAmount(0);
263 $item->setDiscountPercent(0);
266 if ($itemPrice < 0) {
270 $appliedRuleIds = $this->rulesApplier->applyRules(
273 $this->_skipActionsValidation,
274 $this->getCouponCode()
276 $this->rulesApplier->setAppliedRuleIds(
$item, $appliedRuleIds);
292 $baseShippingAmount =
$address->getBaseShippingAmountForDiscount();
295 $baseShippingAmount =
$address->getBaseShippingAmount();
298 $appliedRuleIds = [];
301 if (!
$rule->getApplyToShipping() || !$this->validatorUtility->canProcessRule(
$rule,
$address)) {
306 $baseDiscountAmount = 0;
307 $rulePercent = min(100,
$rule->getDiscountAmount());
308 switch (
$rule->getSimpleAction()) {
309 case \Magento\SalesRule\Model\Rule::TO_PERCENT_ACTION:
310 $rulePercent = max(0, 100 -
$rule->getDiscountAmount());
312 case \Magento\SalesRule\Model\Rule::BY_PERCENT_ACTION:
314 $baseDiscountAmount = ($baseShippingAmount -
315 $address->getBaseShippingDiscountAmount()) * $rulePercent / 100;
316 $discountPercent = min(100,
$address->getShippingDiscountPercent() + $rulePercent);
317 $address->setShippingDiscountPercent($discountPercent);
319 case \Magento\SalesRule\Model\Rule::TO_FIXED_ACTION:
320 $quoteAmount = $this->priceCurrency->convert(
$rule->getDiscountAmount(),
$quote->getStore());
322 $baseDiscountAmount = $baseShippingAmount -
$rule->getDiscountAmount();
324 case \Magento\SalesRule\Model\Rule::BY_FIXED_ACTION:
325 $quoteAmount = $this->priceCurrency->convert(
$rule->getDiscountAmount(),
$quote->getStore());
326 $discountAmount = $quoteAmount;
327 $baseDiscountAmount =
$rule->getDiscountAmount();
329 case \Magento\SalesRule\Model\Rule::CART_FIXED_ACTION:
330 $cartRules =
$address->getCartFixedRules();
331 if (!isset($cartRules[
$rule->getId()])) {
332 $cartRules[
$rule->getId()] =
$rule->getDiscountAmount();
334 if ($cartRules[
$rule->getId()] > 0) {
335 $quoteAmount = $this->priceCurrency->convert($cartRules[
$rule->getId()],
$quote->getStore());
337 $baseDiscountAmount = min(
338 $baseShippingAmount -
$address->getBaseShippingDiscountAmount(),
339 $cartRules[
$rule->getId()]
341 $cartRules[
$rule->getId()] -= $baseDiscountAmount;
344 $address->setCartFixedRules($cartRules);
349 $baseDiscountAmount = min(
350 $address->getBaseShippingDiscountAmount() + $baseDiscountAmount,
353 $address->setShippingDiscountAmount($discountAmount);
354 $address->setBaseShippingDiscountAmount($baseDiscountAmount);
355 $appliedRuleIds[
$rule->getRuleId()] =
$rule->getRuleId();
357 $this->rulesApplier->maintainAddressCouponCode(
$address,
$rule, $this->getCouponCode());
358 $this->rulesApplier->addDiscountDescription(
$address,
$rule);
359 if (
$rule->getStopRulesProcessing()) {
364 $address->setAppliedRuleIds($this->validatorUtility->mergeIds(
$address->getAppliedRuleIds(), $appliedRuleIds));
365 $quote->setAppliedRuleIds($this->validatorUtility->mergeIds(
$quote->getAppliedRuleIds(), $appliedRuleIds));
390 $ruleTotalItemsPrice = 0;
391 $ruleTotalBaseItemsPrice = 0;
392 $validItemsCount = 0;
396 if (
$item->getParentItemId()) {
402 if (!$this->canApplyDiscount(
$item)) {
405 $qty = $this->validatorUtility->getItemQty(
$item,
$rule);
406 $ruleTotalItemsPrice += $this->
getItemPrice($item) * $qty;
411 $this->_rulesItemTotals[
$rule->getId()] = [
412 'items_price' => $ruleTotalItemsPrice,
413 'base_items_price' => $ruleTotalBaseItemsPrice,
414 'items_count' => $validItemsCount,
431 $calcPrice =
$item->getCalculationPrice();
443 return $this->_catalogData->getTaxPrice(
$item,
$item->getOriginalPrice(),
true);
455 return $price !==
null ?
$item->getBaseDiscountCalculationPrice() :
$item->getBaseCalculationPrice();
466 return $this->_catalogData->getTaxPrice(
$item,
$item->getBaseOriginalPrice(),
true);
478 $descriptionArray =
$address->getDiscountDescriptionArray();
479 if (!$descriptionArray &&
$address->getQuote()->getItemVirtualQty() > 0) {
480 $descriptionArray =
$address->getQuote()->getBillingAddress()->getDiscountDescriptionArray();
487 array_unique($descriptionArray)
506 foreach (
$items as $itemKey => $itemValue) {
507 if (
$rule->getActions()->validate($itemValue)) {
509 $itemsSorted[] = $itemValue;
514 if (!empty($itemsSorted)) {
528 if (empty($this->_rulesItemTotals[$key])) {
529 throw new \Magento\Framework\Exception\LocalizedException(
__(
'Item totals are not set for the rule.'));
532 return $this->_rulesItemTotals[$key];
541 $this->_rulesItemTotals[$key][
'items_count']--;
556 foreach ($this->validators->getValidators(
'discount') as $validator) {
decrementRuleItemTotalsCount($key)
getAddressId(Address $address)
canApplyRules(AbstractItem $item)
getItemOriginalPrice($item)
prepareDescription($address, $separator=', ')
processShippingAmount(Address $address)
init($websiteId, $customerGroupId, $couponCode)
getRuleItemTotalsInfo($key)
_getRules(Address $address=null)
setSkipActionsValidation($flag)
getItemBaseOriginalPrice($item)
__construct(\Magento\Framework\Model\Context $context, \Magento\Framework\Registry $registry, \Magento\SalesRule\Model\ResourceModel\Rule\CollectionFactory $collectionFactory, \Magento\Catalog\Helper\Data $catalogData, \Magento\SalesRule\Model\Utility $utility, \Magento\SalesRule\Model\RulesApplier $rulesApplier, \Magento\Framework\Pricing\PriceCurrencyInterface $priceCurrency, \Magento\SalesRule\Model\Validator\Pool $validators, \Magento\Framework\Message\ManagerInterface $messageManager, \Magento\Framework\Model\ResourceModel\AbstractResource $resource=null, \Magento\Framework\Data\Collection\AbstractDb $resourceCollection=null, array $data=[])
process(AbstractItem $item)