28 private $deltaPriceRound;
33 private static $discountType =
'CartFixed';
43 DataFactory $discountDataFactory,
47 $this->deltaPriceRound = $deltaPriceRound;
61 $discountData = $this->discountFactory->create();
63 $ruleTotals = $this->validator->getRuleItemTotalsInfo(
$rule->getId());
68 $itemPrice = $this->validator->getItemPrice(
$item);
69 $baseItemPrice = $this->validator->getItemBasePrice(
$item);
70 $itemOriginalPrice = $this->validator->getItemOriginalPrice(
$item);
71 $baseItemOriginalPrice = $this->validator->getItemBaseOriginalPrice(
$item);
76 if (
$quote->getIsMultiShipping()) {
78 if ($usedForAddressId && $usedForAddressId !=
$address->getId()) {
84 $cartRules =
$address->getCartFixedRules();
85 if (!isset($cartRules[
$rule->getId()])) {
86 $cartRules[
$rule->getId()] =
$rule->getDiscountAmount();
89 $availableDiscountAmount = (float)$cartRules[
$rule->getId()];
90 $discountType = self::$discountType .
$rule->getId();
92 if ($availableDiscountAmount > 0) {
94 if ($ruleTotals[
'items_count'] <= 1) {
95 $quoteAmount = $this->priceCurrency->convert($availableDiscountAmount,
$store);
96 $baseDiscountAmount = min($baseItemPrice * $qty, $availableDiscountAmount);
97 $this->deltaPriceRound->reset($discountType);
99 $ratio = $baseItemPrice * $qty / $ruleTotals[
'base_items_price'];
100 $maximumItemDiscount = $this->deltaPriceRound->round(
101 $rule->getDiscountAmount() * $ratio,
105 $quoteAmount = $this->priceCurrency->convert($maximumItemDiscount,
$store);
107 $baseDiscountAmount = min($baseItemPrice * $qty, $maximumItemDiscount);
108 $this->validator->decrementRuleItemTotalsCount(
$rule->getId());
111 $baseDiscountAmount = $this->priceCurrency->round($baseDiscountAmount);
113 $availableDiscountAmount -= $baseDiscountAmount;
114 $cartRules[
$rule->getId()] = $availableDiscountAmount;
115 if ($availableDiscountAmount <= 0) {
116 $this->deltaPriceRound->reset($discountType);
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));
124 $address->setCartFixedRules($cartRules);
126 return $discountData;
138 $this->_cartFixedRuleUsedForAddress[
$ruleId] = $itemId;
149 if (isset($this->_cartFixedRuleUsedForAddress[
$ruleId])) {
150 return $this->_cartFixedRuleUsedForAddress[
$ruleId];
calculate($rule, $item, $qty)
getCartFixedRuleUsedForAddress($ruleId)
$_cartFixedRuleUsedForAddress
__construct(Validator $validator, DataFactory $discountDataFactory, PriceCurrencyInterface $priceCurrency, DeltaPriceRound $deltaPriceRound)
setCartFixedRuleUsedForAddress($ruleId, $itemId)