123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439 |
- <?php
- /**
- * Copyright © Magento, Inc. All rights reserved.
- * See COPYING.txt for license details.
- */
- namespace Magento\Payment\Model;
- /**
- * Provide methods for collecting cart items information of specific sales model entity
- *
- * @api
- * @since 100.0.2
- */
- class Cart
- {
- /**#@+
- * Amounts
- */
- const AMOUNT_TAX = 'tax';
- const AMOUNT_SHIPPING = 'shipping';
- const AMOUNT_DISCOUNT = 'discount';
- const AMOUNT_SUBTOTAL = 'subtotal';
- /**#@-*/
- /**#@-*/
- protected $_salesModel;
- /**
- * Core event manager proxy
- *
- * @var \Magento\Framework\Event\ManagerInterface
- */
- protected $_eventManager;
- /**
- * Amounts
- *
- * @var array
- */
- protected $_amounts;
- /**
- * Custom items list
- *
- * @var array
- */
- protected $_customItems = [];
- /**
- * Items imported from sales model
- *
- * @var array
- */
- protected $_salesModelItems = [];
- /**
- * Flags that indicates whether discount, shopping and taxes should be transferred as cart item
- *
- * @var array
- */
- protected $_transferFlags = [];
- /**
- * Flags which indicates whether items data is outdated and has to be recollected
- *
- * @var bool
- */
- protected $_itemsCollectingRequired = true;
- /**
- * @param \Magento\Payment\Model\Cart\SalesModel\Factory $salesModelFactory
- * @param \Magento\Framework\Event\ManagerInterface $eventManager
- * @param \Magento\Quote\Api\Data\CartInterface $salesModel
- */
- public function __construct(
- \Magento\Payment\Model\Cart\SalesModel\Factory $salesModelFactory,
- \Magento\Framework\Event\ManagerInterface $eventManager,
- $salesModel
- ) {
- $this->_eventManager = $eventManager;
- $this->_salesModel = $salesModelFactory->create($salesModel);
- $this->_resetAmounts();
- }
- /**
- * Return payment cart sales model
- *
- * @return \Magento\Payment\Model\Cart\SalesModel\SalesModelInterface
- * @api
- */
- public function getSalesModel()
- {
- return $this->_salesModel;
- }
- /**
- * Add amount to existing tax amount
- *
- * @param float $taxAmount
- * @return void
- * @api
- */
- public function addTax($taxAmount)
- {
- $this->_addAmount(self::AMOUNT_TAX, $taxAmount);
- }
- /**
- * Set tax. Old value will be overwritten
- *
- * @param float $taxAmount
- * @return void
- * @api
- */
- public function setTax($taxAmount)
- {
- $this->_setAmount(self::AMOUNT_TAX, $taxAmount);
- }
- /**
- * Get tax amount
- *
- * @return float
- * @api
- */
- public function getTax()
- {
- return $this->_getAmount(self::AMOUNT_TAX);
- }
- /**
- * Add amount to existing discount amount
- *
- * @param float $discountAmount
- * @return void
- * @api
- */
- public function addDiscount($discountAmount)
- {
- $this->_addAmount(self::AMOUNT_DISCOUNT, $discountAmount);
- }
- /**
- * Set discount. Old value will be overwritten
- *
- * @param float $discountAmount
- * @return void
- * @api
- */
- public function setDiscount($discountAmount)
- {
- $this->_setAmount(self::AMOUNT_DISCOUNT, $discountAmount);
- }
- /**
- * Get discount amount
- *
- * @return float
- * @api
- */
- public function getDiscount()
- {
- return $this->_getAmount(self::AMOUNT_DISCOUNT);
- }
- /**
- * Add amount to existing shipping amount
- *
- * @param float $shippingAmount
- * @return void
- * @api
- */
- public function addShipping($shippingAmount)
- {
- $this->_addAmount(self::AMOUNT_SHIPPING, $shippingAmount);
- }
- /**
- * Set shipping. Old value will be overwritten
- *
- * @param float $shippingAmount
- * @return void
- * @api
- */
- public function setShipping($shippingAmount)
- {
- $this->_setAmount(self::AMOUNT_SHIPPING, $shippingAmount);
- }
- /**
- * Get shipping amount
- *
- * @return float
- * @api
- */
- public function getShipping()
- {
- return $this->_getAmount(self::AMOUNT_SHIPPING);
- }
- /**
- * Add amount to existing subtotal amount
- *
- * @param float $subtotalAmount
- * @return void
- * @api
- */
- public function addSubtotal($subtotalAmount)
- {
- $this->_addAmount(self::AMOUNT_SUBTOTAL, $subtotalAmount);
- }
- /**
- * Get subtotal amount
- *
- * @return float
- * @api
- */
- public function getSubtotal()
- {
- return $this->_getAmount(self::AMOUNT_SUBTOTAL);
- }
- /**
- * Add custom item (such as discount as line item, shipping as line item, etc)
- *
- * @param string $name
- * @param int $qty
- * @param float $amount
- * @param string|null $identifier
- * @return void
- * @api
- */
- public function addCustomItem($name, $qty, $amount, $identifier = null)
- {
- $this->_customItems[] = $this->_createItemFromData($name, $qty, $amount, $identifier);
- }
- /**
- * Get all cart items
- *
- * @return array
- * @api
- */
- public function getAllItems()
- {
- $this->_collectItemsAndAmounts();
- return array_merge($this->_salesModelItems, $this->_customItems);
- }
- /**
- * Get shipping, tax, subtotal and discount amounts all together
- *
- * @return array
- * @api
- */
- public function getAmounts()
- {
- $this->_collectItemsAndAmounts();
- return $this->_amounts;
- }
- /**
- * Specify that shipping should be transferred as cart item
- *
- * @return void
- * @api
- */
- public function setTransferShippingAsItem()
- {
- $this->_setTransferFlag(self::AMOUNT_SHIPPING, true);
- }
- /**
- * Specify that discount should be transferred as cart item
- *
- * @return void
- * @api
- */
- public function setTransferDiscountAsItem()
- {
- $this->_setTransferFlag(self::AMOUNT_DISCOUNT, true);
- }
- /**
- * Collect all items, discounts, taxes, shipping to cart
- *
- * @return void
- */
- protected function _collectItemsAndAmounts()
- {
- if (!$this->_itemsCollectingRequired) {
- return;
- }
- $this->_itemsCollectingRequired = false;
- $this->_salesModelItems = [];
- $this->_customItems = [];
- $this->_resetAmounts();
- $this->_eventManager->dispatch('payment_cart_collect_items_and_amounts', ['cart' => $this]);
- $this->_importItemsFromSalesModel();
- $this->_calculateCustomItemsSubtotal();
- }
- /**
- * Import items from sales model
- *
- * @return void
- */
- protected function _importItemsFromSalesModel()
- {
- $this->_salesModelItems = [];
- foreach ($this->_salesModel->getAllItems() as $item) {
- if ($item->getParentItem()) {
- continue;
- }
- $this->_salesModelItems[] = $this->_createItemFromData(
- $item->getName(),
- $item->getQty(),
- $item->getPrice(),
- $item->getOriginalItem()->getId()
- );
- }
- $this->addSubtotal($this->_salesModel->getBaseSubtotal());
- $this->addTax($this->_salesModel->getBaseTaxAmount());
- $this->addShipping($this->_salesModel->getBaseShippingAmount());
- $this->addDiscount(abs($this->_salesModel->getBaseDiscountAmount()));
- }
- /**
- * Calculate subtotal from custom items
- *
- * @return void
- */
- protected function _calculateCustomItemsSubtotal()
- {
- if (!empty($this->_transferFlags[self::AMOUNT_DISCOUNT]) && $this->getDiscount()) {
- $this->addCustomItem(__('Discount'), 1, -1.00 * $this->getDiscount());
- $this->setDiscount(0);
- }
- if (!empty($this->_transferFlags[self::AMOUNT_SHIPPING]) && $this->getShipping()) {
- $this->addCustomItem(__('Shipping'), 1, $this->getShipping());
- $this->setShipping(0);
- }
- foreach ($this->_customItems as $item) {
- $this->_amounts[self::AMOUNT_SUBTOTAL] += $item->getAmount();
- }
- }
- /**
- * @param string $flagType
- * @param bool $value
- * @return void
- */
- protected function _setTransferFlag($flagType, $value)
- {
- $this->_transferFlags[$flagType] = (bool)$value;
- $this->_itemsCollectingRequired = true;
- }
- /**
- * @param string $amountType
- * @param float $amount
- * @return void
- */
- protected function _setAmount($amountType, $amount)
- {
- $this->_amounts[$amountType] = (double)$amount;
- }
- /**
- * @param string $amountType
- * @param float $amount
- * @return void
- */
- protected function _addAmount($amountType, $amount)
- {
- $this->_amounts[$amountType] += (double)$amount;
- }
- /**
- * Get amount of specified type
- *
- * @param string $amountType
- * @return float
- */
- protected function _getAmount($amountType)
- {
- return $this->_amounts[$amountType];
- }
- /**
- * Create item object from item data
- *
- * @param string $name
- * @param int $qty
- * @param float $amount
- * @param null|string $identifier
- * @return \Magento\Framework\DataObject
- */
- protected function _createItemFromData($name, $qty, $amount, $identifier = null)
- {
- $item = new \Magento\Framework\DataObject(['name' => $name, 'qty' => $qty, 'amount' => (double)$amount]);
- if ($identifier) {
- $item->setData('id', $identifier);
- }
- return $item;
- }
- /**
- * Set all amount types to zero
- *
- * @return void
- */
- protected function _resetAmounts()
- {
- $this->_amounts = [
- self::AMOUNT_DISCOUNT => 0,
- self::AMOUNT_SHIPPING => 0,
- self::AMOUNT_SUBTOTAL => 0,
- self::AMOUNT_TAX => 0,
- ];
- }
- }
|