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 namespace Magento\Payment\Model;
7 
14 class Cart
15 {
19  const AMOUNT_TAX = 'tax';
20 
21  const AMOUNT_SHIPPING = 'shipping';
22 
23  const AMOUNT_DISCOUNT = 'discount';
24 
25  const AMOUNT_SUBTOTAL = 'subtotal';
29  protected $_salesModel;
30 
36  protected $_eventManager;
37 
43  protected $_amounts;
44 
50  protected $_customItems = [];
51 
57  protected $_salesModelItems = [];
58 
64  protected $_transferFlags = [];
65 
71  protected $_itemsCollectingRequired = true;
72 
78  public function __construct(
79  \Magento\Payment\Model\Cart\SalesModel\Factory $salesModelFactory,
80  \Magento\Framework\Event\ManagerInterface $eventManager,
81  $salesModel
82  ) {
83  $this->_eventManager = $eventManager;
84  $this->_salesModel = $salesModelFactory->create($salesModel);
85  $this->_resetAmounts();
86  }
87 
94  public function getSalesModel()
95  {
96  return $this->_salesModel;
97  }
98 
106  public function addTax($taxAmount)
107  {
108  $this->_addAmount(self::AMOUNT_TAX, $taxAmount);
109  }
110 
118  public function setTax($taxAmount)
119  {
120  $this->_setAmount(self::AMOUNT_TAX, $taxAmount);
121  }
122 
129  public function getTax()
130  {
131  return $this->_getAmount(self::AMOUNT_TAX);
132  }
133 
141  public function addDiscount($discountAmount)
142  {
143  $this->_addAmount(self::AMOUNT_DISCOUNT, $discountAmount);
144  }
145 
153  public function setDiscount($discountAmount)
154  {
155  $this->_setAmount(self::AMOUNT_DISCOUNT, $discountAmount);
156  }
157 
164  public function getDiscount()
165  {
166  return $this->_getAmount(self::AMOUNT_DISCOUNT);
167  }
168 
176  public function addShipping($shippingAmount)
177  {
178  $this->_addAmount(self::AMOUNT_SHIPPING, $shippingAmount);
179  }
180 
188  public function setShipping($shippingAmount)
189  {
190  $this->_setAmount(self::AMOUNT_SHIPPING, $shippingAmount);
191  }
192 
199  public function getShipping()
200  {
201  return $this->_getAmount(self::AMOUNT_SHIPPING);
202  }
203 
211  public function addSubtotal($subtotalAmount)
212  {
213  $this->_addAmount(self::AMOUNT_SUBTOTAL, $subtotalAmount);
214  }
215 
222  public function getSubtotal()
223  {
224  return $this->_getAmount(self::AMOUNT_SUBTOTAL);
225  }
226 
237  public function addCustomItem($name, $qty, $amount, $identifier = null)
238  {
239  $this->_customItems[] = $this->_createItemFromData($name, $qty, $amount, $identifier);
240  }
241 
248  public function getAllItems()
249  {
250  $this->_collectItemsAndAmounts();
251  return array_merge($this->_salesModelItems, $this->_customItems);
252  }
253 
260  public function getAmounts()
261  {
262  $this->_collectItemsAndAmounts();
263 
264  return $this->_amounts;
265  }
266 
273  public function setTransferShippingAsItem()
274  {
275  $this->_setTransferFlag(self::AMOUNT_SHIPPING, true);
276  }
277 
284  public function setTransferDiscountAsItem()
285  {
286  $this->_setTransferFlag(self::AMOUNT_DISCOUNT, true);
287  }
288 
294  protected function _collectItemsAndAmounts()
295  {
296  if (!$this->_itemsCollectingRequired) {
297  return;
298  }
299 
300  $this->_itemsCollectingRequired = false;
301 
302  $this->_salesModelItems = [];
303  $this->_customItems = [];
304 
305  $this->_resetAmounts();
306 
307  $this->_eventManager->dispatch('payment_cart_collect_items_and_amounts', ['cart' => $this]);
308 
311  }
312 
318  protected function _importItemsFromSalesModel()
319  {
320  $this->_salesModelItems = [];
321 
322  foreach ($this->_salesModel->getAllItems() as $item) {
323  if ($item->getParentItem()) {
324  continue;
325  }
326 
327  $this->_salesModelItems[] = $this->_createItemFromData(
328  $item->getName(),
329  $item->getQty(),
330  $item->getPrice(),
331  $item->getOriginalItem()->getId()
332  );
333  }
334 
335  $this->addSubtotal($this->_salesModel->getBaseSubtotal());
336  $this->addTax($this->_salesModel->getBaseTaxAmount());
337  $this->addShipping($this->_salesModel->getBaseShippingAmount());
338  $this->addDiscount(abs($this->_salesModel->getBaseDiscountAmount()));
339  }
340 
346  protected function _calculateCustomItemsSubtotal()
347  {
348  if (!empty($this->_transferFlags[self::AMOUNT_DISCOUNT]) && $this->getDiscount()) {
349  $this->addCustomItem(__('Discount'), 1, -1.00 * $this->getDiscount());
350  $this->setDiscount(0);
351  }
352 
353  if (!empty($this->_transferFlags[self::AMOUNT_SHIPPING]) && $this->getShipping()) {
354  $this->addCustomItem(__('Shipping'), 1, $this->getShipping());
355  $this->setShipping(0);
356  }
357 
358  foreach ($this->_customItems as $item) {
359  $this->_amounts[self::AMOUNT_SUBTOTAL] += $item->getAmount();
360  }
361  }
362 
368  protected function _setTransferFlag($flagType, $value)
369  {
370  $this->_transferFlags[$flagType] = (bool)$value;
371  $this->_itemsCollectingRequired = true;
372  }
373 
379  protected function _setAmount($amountType, $amount)
380  {
381  $this->_amounts[$amountType] = (double)$amount;
382  }
383 
389  protected function _addAmount($amountType, $amount)
390  {
391  $this->_amounts[$amountType] += (double)$amount;
392  }
393 
400  protected function _getAmount($amountType)
401  {
402  return $this->_amounts[$amountType];
403  }
404 
414  protected function _createItemFromData($name, $qty, $amount, $identifier = null)
415  {
416  $item = new \Magento\Framework\DataObject(['name' => $name, 'qty' => $qty, 'amount' => (double)$amount]);
417 
418  if ($identifier) {
419  $item->setData('id', $identifier);
420  }
421 
422  return $item;
423  }
424 
430  protected function _resetAmounts()
431  {
432  $this->_amounts = [
433  self::AMOUNT_DISCOUNT => 0,
434  self::AMOUNT_SHIPPING => 0,
435  self::AMOUNT_SUBTOTAL => 0,
436  self::AMOUNT_TAX => 0,
437  ];
438  }
439 }
__construct(\Magento\Payment\Model\Cart\SalesModel\Factory $salesModelFactory, \Magento\Framework\Event\ManagerInterface $eventManager, $salesModel)
Definition: Cart.php:78
_setAmount($amountType, $amount)
Definition: Cart.php:379
_getAmount($amountType)
Definition: Cart.php:400
addShipping($shippingAmount)
Definition: Cart.php:176
__()
Definition: __.php:13
_setTransferFlag($flagType, $value)
Definition: Cart.php:368
$amount
Definition: order.php:14
_createItemFromData($name, $qty, $amount, $identifier=null)
Definition: Cart.php:414
$value
Definition: gender.phtml:16
addDiscount($discountAmount)
Definition: Cart.php:141
addCustomItem($name, $qty, $amount, $identifier=null)
Definition: Cart.php:237
setTax($taxAmount)
Definition: Cart.php:118
addTax($taxAmount)
Definition: Cart.php:106
addSubtotal($subtotalAmount)
Definition: Cart.php:211
_addAmount($amountType, $amount)
Definition: Cart.php:389
setDiscount($discountAmount)
Definition: Cart.php:153
setShipping($shippingAmount)
Definition: Cart.php:188
if(!isset($_GET['name'])) $name
Definition: log.php:14