Magento 2 Documentation  2.3
Documentation for Magento 2 CMS v2.3 (December 2018)
CartFixed.php
Go to the documentation of this file.
1 <?php
7 
12 
17 {
24 
28  private $deltaPriceRound;
29 
33  private static $discountType = 'CartFixed';
34 
41  public function __construct(
43  DataFactory $discountDataFactory,
45  DeltaPriceRound $deltaPriceRound
46  ) {
47  $this->deltaPriceRound = $deltaPriceRound;
48 
49  parent::__construct($validator, $discountDataFactory, $priceCurrency);
50  }
51 
58  public function calculate($rule, $item, $qty)
59  {
61  $discountData = $this->discountFactory->create();
62 
63  $ruleTotals = $this->validator->getRuleItemTotalsInfo($rule->getId());
64 
65  $quote = $item->getQuote();
66  $address = $item->getAddress();
67 
68  $itemPrice = $this->validator->getItemPrice($item);
69  $baseItemPrice = $this->validator->getItemBasePrice($item);
70  $itemOriginalPrice = $this->validator->getItemOriginalPrice($item);
71  $baseItemOriginalPrice = $this->validator->getItemBaseOriginalPrice($item);
72 
76  if ($quote->getIsMultiShipping()) {
77  $usedForAddressId = $this->getCartFixedRuleUsedForAddress($rule->getId());
78  if ($usedForAddressId && $usedForAddressId != $address->getId()) {
79  return $discountData;
80  } else {
81  $this->setCartFixedRuleUsedForAddress($rule->getId(), $address->getId());
82  }
83  }
84  $cartRules = $address->getCartFixedRules();
85  if (!isset($cartRules[$rule->getId()])) {
86  $cartRules[$rule->getId()] = $rule->getDiscountAmount();
87  }
88 
89  $availableDiscountAmount = (float)$cartRules[$rule->getId()];
90  $discountType = self::$discountType . $rule->getId();
91 
92  if ($availableDiscountAmount > 0) {
93  $store = $quote->getStore();
94  if ($ruleTotals['items_count'] <= 1) {
95  $quoteAmount = $this->priceCurrency->convert($availableDiscountAmount, $store);
96  $baseDiscountAmount = min($baseItemPrice * $qty, $availableDiscountAmount);
97  $this->deltaPriceRound->reset($discountType);
98  } else {
99  $ratio = $baseItemPrice * $qty / $ruleTotals['base_items_price'];
100  $maximumItemDiscount = $this->deltaPriceRound->round(
101  $rule->getDiscountAmount() * $ratio,
102  $discountType
103  );
104 
105  $quoteAmount = $this->priceCurrency->convert($maximumItemDiscount, $store);
106 
107  $baseDiscountAmount = min($baseItemPrice * $qty, $maximumItemDiscount);
108  $this->validator->decrementRuleItemTotalsCount($rule->getId());
109  }
110 
111  $baseDiscountAmount = $this->priceCurrency->round($baseDiscountAmount);
112 
113  $availableDiscountAmount -= $baseDiscountAmount;
114  $cartRules[$rule->getId()] = $availableDiscountAmount;
115  if ($availableDiscountAmount <= 0) {
116  $this->deltaPriceRound->reset($discountType);
117  }
118 
119  $discountData->setAmount($this->priceCurrency->round(min($itemPrice * $qty, $quoteAmount)));
120  $discountData->setBaseAmount($baseDiscountAmount);
121  $discountData->setOriginalAmount(min($itemOriginalPrice * $qty, $quoteAmount));
122  $discountData->setBaseOriginalAmount($this->priceCurrency->round($baseItemOriginalPrice));
123  }
124  $address->setCartFixedRules($cartRules);
125 
126  return $discountData;
127  }
128 
136  protected function setCartFixedRuleUsedForAddress($ruleId, $itemId)
137  {
138  $this->_cartFixedRuleUsedForAddress[$ruleId] = $itemId;
139  }
140 
148  {
149  if (isset($this->_cartFixedRuleUsedForAddress[$ruleId])) {
150  return $this->_cartFixedRuleUsedForAddress[$ruleId];
151  }
152  return null;
153  }
154 }
$quote
$address
Definition: customer.php:38
__construct(Validator $validator, DataFactory $discountDataFactory, PriceCurrencyInterface $priceCurrency, DeltaPriceRound $deltaPriceRound)
Definition: CartFixed.php:41