![]() Server : Apache System : Linux server2.corals.io 4.18.0-348.2.1.el8_5.x86_64 #1 SMP Mon Nov 15 09:17:08 EST 2021 x86_64 User : corals ( 1002) PHP Version : 7.4.33 Disable Function : exec,passthru,shell_exec,system Directory : /home/corals/old/app/code/Cnc/Checkout/Model/ |
<?php /** * Copyright (c) 2021 Kaliop Digital Commerce (https://digitalcommerce.kaliop.com) All Rights Reserved. * https://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0) * Cnc * Krzysztof Majkowski <[email protected]> <[email protected]> */ namespace Cnc\Checkout\Model; use Cnc\Checkout\Helper\Cart; use Magento\Framework\Serialize\SerializerInterface; use Magento\Quote\Model\Quote; class RecalculateCart { /** * @var Quote */ private $quote; /** * @var Cart */ private $cartHelper; /** * @var SerializerInterface */ private $serializer; /** * RecalculateCart constructor. * @param Cart $cartHelper */ public function __construct( Cart $cartHelper, SerializerInterface $serializer ) { $this->cartHelper = $cartHelper; $this->serializer = $serializer; } /** * Set quote. * * @param $quote * @return $this */ public function setQuote($quote): RecalculateCart { $this->quote = $quote; return $this; } /** * Recalculate quote data. * * @param $data * @return mixed */ public function recalculate($data) { $converted = []; foreach ($data as $itemId => $itemData) { $sku = $this->getSkuByItemId($itemId); if ($sku) { if (!isset($converted[$sku])) { $converted[$sku] = []; } $converted[$sku] []= $itemData; } } foreach ($converted as $sku => $itemDatas) { $this->recalculateDatas($sku, $itemDatas, $data); } return $data; } /** * Calculate correct quantities. * * @param $sku * @param $itemDatas * @param $data * @throws \Magento\Framework\Exception\LocalizedException */ private function recalculateDatas($sku, $itemDatas, &$data) { $desiredQty = 0; foreach ($itemDatas as $itemData) { $desiredQty += $itemData['qty']; } $sourceData = $this->cartHelper->getSourceDataForProduct($sku); if ($desiredQty > $sourceData['max']) { $desiredQty = $sourceData['max']; } $sources = $this->cartHelper->getSourcePriority(); $currentSources = $sourceData['sources']; $previousSourceCode = null; foreach ($sources as $sourceCode) { if (isset($currentSources[$sourceCode]) && $currentSources[$sourceCode] > 0) { $add = min($desiredQty, $currentSources[$sourceCode]); $desiredQty -= $add; $itemId = $this->getItemIdBySkuAndSource($sku, $sourceCode); if (!$itemId) { $previousItem = $this->getItemBySkuAndSource($sku, $previousSourceCode); $newItem = clone $previousItem; $newItem->setItemId(null); $options = $newItem->getOptions(); foreach ($options as $option) { if ($option->getCode() == 'source') { $option->setValue($sourceCode); } elseif ($option->getCode() == 'info_buyRequest') { $buyRequest = $this->serializer->unserialize($option->getValue()); $buyRequest['source'] = $sourceCode; $option->setValue($this->serializer->serialize($buyRequest)); } } $newItem->setOptions($options); $newItem->setQty($add); $newItem->setSourceCode($sourceCode); $this->quote->addItem($newItem)->save(); } $itemId = $this->getItemIdBySkuAndSource($sku, $sourceCode); if ($itemId) { $data[$itemId]['qty'] = $add; $data[$itemId]['before_suggest_qty'] = $add; } if ($desiredQty < 0) { $desiredQty = 0; } $previousSourceCode = $sourceCode; } } } /** * @param $itemId * @return false|mixed|string|null */ private function getSkuByItemId($itemId) { $item = $this->quote->getItemById($itemId); if (!$item) { return false; } return $item->getSku(); } /** * @param $sku * @param $source * @return false|int|mixed|null */ private function getItemIdBySkuAndSource($sku, $source) { /** @var Quote\Item $item */ foreach ($this->quote->getAllItems() as $item) { if ($item->getSku() == $sku && $item->getOptionByCode('source')->getValue() == $source) { return $item->getItemId(); } } return false; } /** * @param $sku * @param null $source * @return false|Quote\Item */ private function getItemBySkuAndSource($sku, $source = null) { /** @var Quote\Item $item */ foreach ($this->quote->getAllItems() as $item) { if ($item->getSku() == $sku && ($source == null || $item->getOptionByCode('source')->getValue() == $source)) { return $item; } } return false; } }