Magento 2 Documentation  2.3
Documentation for Magento 2 CMS v2.3 (December 2018)
Cart.php
Go to the documentation of this file.
1 <?php
6 declare(strict_types=1);
7 
8 namespace Magento\Paypal\Model;
9 
15 {
19  protected $_areAmountsValid = false;
20 
26  public function getAmounts()
27  {
28  $this->_collectItemsAndAmounts();
29 
30  if (!$this->_areAmountsValid) {
31  $subtotal = $this->getSubtotal() + $this->getTax();
32 
33  if (empty($this->_transferFlags[self::AMOUNT_SHIPPING])) {
34  $subtotal += $this->getShipping();
35  }
36 
37  if (empty($this->_transferFlags[self::AMOUNT_DISCOUNT])) {
38  $subtotal -= $this->getDiscount();
39  }
40 
41  return [self::AMOUNT_SUBTOTAL => $subtotal];
42  }
43 
44  return $this->_amounts;
45  }
46 
52  protected function _calculateCustomItemsSubtotal()
53  {
54  parent::_calculateCustomItemsSubtotal();
55  $this->_applyDiscountTaxCompensationWorkaround($this->_salesModel);
56 
57  $this->_validate();
58  }
59 
65  protected function _validate()
66  {
67  $areItemsValid = false;
68  $this->_areAmountsValid = false;
69 
70  $referenceAmount = $this->_salesModel->getDataUsingMethod('base_grand_total');
71 
72  $itemsSubtotal = 0;
73  foreach ($this->getAllItems() as $i) {
74  $itemsSubtotal = $itemsSubtotal + $i->getQty() * $i->getAmount();
75  }
76 
77  $sum = $itemsSubtotal + $this->getTax();
78 
79  if (empty($this->_transferFlags[self::AMOUNT_SHIPPING])) {
80  $sum += $this->getShipping();
81  }
82 
83  if (empty($this->_transferFlags[self::AMOUNT_DISCOUNT])) {
84  $sum -= $this->getDiscount();
85  // PayPal requires to have discount less than items subtotal
86  $this->_areAmountsValid = round($this->getDiscount(), 4) < round($itemsSubtotal, 4);
87  } else {
88  $this->_areAmountsValid = $itemsSubtotal > 0.00001;
89  }
90 
95  // match sum of all the items and totals to the reference amount
96  if (sprintf('%.4F', $sum) == sprintf('%.4F', $referenceAmount)) {
97  $areItemsValid = true;
98  }
99 
100  $areItemsValid = $areItemsValid && $this->_areAmountsValid;
101 
102  if (!$areItemsValid) {
103  $this->_salesModelItems = [];
104  $this->_customItems = [];
105  }
106  }
107 
113  protected function _importItemsFromSalesModel()
114  {
115  $this->_salesModelItems = [];
116 
117  foreach ($this->_salesModel->getAllItems() as $item) {
118  if ($item->getParentItem()) {
119  continue;
120  }
121 
122  $amount = $item->getPrice();
123  $qty = $item->getQty();
124 
125  $subAggregatedLabel = '';
126 
127  // workaround in case if item subtotal precision is not compatible with PayPal (.2)
128  if ($amount - round($amount, 2)) {
129  $amount = $amount * $qty;
130  $subAggregatedLabel = ' x' . $qty;
131  $qty = 1;
132  }
133 
134  // aggregate item price if item qty * price does not match row total
135  $itemBaseRowTotal = $item->getOriginalItem()->getBaseRowTotal();
136  if ($amount * $qty != $itemBaseRowTotal) {
137  $amount = (double)$itemBaseRowTotal;
138  $subAggregatedLabel = ' x' . $qty;
139  $qty = 1;
140  }
141 
142  $this->_salesModelItems[] = $this->_createItemFromData(
143  $item->getName() . $subAggregatedLabel,
144  $qty,
145  $amount
146  );
147  }
148 
149  $this->addSubtotal($this->_salesModel->getBaseSubtotal());
150  $this->addTax($this->_salesModel->getBaseTaxAmount());
151  $this->addShipping($this->_salesModel->getBaseShippingAmount());
152  $this->addDiscount(abs($this->_salesModel->getBaseDiscountAmount()));
153  }
154 
178  \Magento\Payment\Model\Cart\SalesModel\SalesModelInterface $salesEntity
179  ) {
180  $dataContainer = $salesEntity->getTaxContainer();
181  $this->addTax((double)$dataContainer->getBaseDiscountTaxCompensationAmount());
182  $this->addTax((double)$dataContainer->getBaseShippingDiscountTaxCompensationAmount());
183  }
184 
190  public function hasNegativeItemAmount()
191  {
192  foreach ($this->_customItems as $item) {
193  if ($item->getAmount() < 0) {
194  return true;
195  }
196  }
197  return false;
198  }
199 }
addShipping($shippingAmount)
Definition: Cart.php:176
$amount
Definition: order.php:14
_createItemFromData($name, $qty, $amount, $identifier=null)
Definition: Cart.php:414
addDiscount($discountAmount)
Definition: Cart.php:141
addTax($taxAmount)
Definition: Cart.php:106
addSubtotal($subtotalAmount)
Definition: Cart.php:211
$i
Definition: gallery.phtml:31
_applyDiscountTaxCompensationWorkaround(\Magento\Payment\Model\Cart\SalesModel\SalesModelInterface $salesEntity)
Definition: Cart.php:177