Spamworldpro Mini Shell
Spamworldpro


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/Ecombricks/InventoryCustomerSourceSelection/Wrapper/Model/Quote/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Current File : /home/corals/old/app/code/Ecombricks/InventoryCustomerSourceSelection/Wrapper/Model/Quote/Quote.php
<?php
/**
 * Copyright © eComBricks. All rights reserved.
 * See LICENSE.txt for license details.
 */
declare(strict_types=1);

namespace Ecombricks\InventoryCustomerSourceSelection\Wrapper\Model\Quote;

/**
 * Quote item wrapper
 */
class Quote extends \Ecombricks\Common\DataObject\Wrapper
{
    /**
     * Quote address wrapper factory
     * 
     * @var \Ecombricks\InventoryCustomerSourceSelection\Wrapper\Model\Quote\Quote\AddressFactory
     */
    private $quoteAddressWrapperFactory;
    
    /**
     * Quote item wrapper factory
     * 
     * @var \Ecombricks\InventoryCustomerSourceSelection\Wrapper\Model\Quote\Quote\ItemFactory
     */
    private $quoteItemWrapperFactory;
    
    /**
     * Constructor
     * 
     * @param \Ecombricks\Common\DataObject\ReflectionFactory $objectReflectionFactory
     * @param \Ecombricks\InventoryCustomerSourceSelection\Wrapper\Model\Quote\Quote\AddressFactory $quoteAddressWrapperFactory
     * @param \Ecombricks\InventoryCustomerSourceSelection\Wrapper\Model\Quote\Quote\ItemFactory $quoteItemWrapperFactory
     * @return void
     */
    public function __construct(
        \Ecombricks\Common\DataObject\ReflectionFactory $objectReflectionFactory,
        \Ecombricks\InventoryCustomerSourceSelection\Wrapper\Model\Quote\Quote\AddressFactory $quoteAddressWrapperFactory,
        \Ecombricks\InventoryCustomerSourceSelection\Wrapper\Model\Quote\Quote\ItemFactory $quoteItemWrapperFactory
    )
    {
        parent::__construct($objectReflectionFactory);
        $this->quoteAddressWrapperFactory = $quoteAddressWrapperFactory;
        $this->quoteItemWrapperFactory = $quoteItemWrapperFactory;
    }

    /**
     * Get source codes
     * 
     * @return array
     */
    public function getSourceCodes()
    {
        $sourceCodes = [];
        $quote = $this->getObject();
        foreach ($quote->getAllItems() as $item) {
            $sourceCode = $this->quoteItemWrapperFactory->create($item)->getSourceCode();
            if (empty($sourceCode)) {
                continue;
            }
            if (in_array($sourceCode, $sourceCodes)) {
                continue;
            }
            $sourceCodes[] = $sourceCode;
        }
        return $sourceCodes;
    }

    /**
     * Set source code
     * 
     * @param string $sourceCode
     * @return void
     */
    public function setSourceCode(string $sourceCode): void
    {
        $quote = $this->getObject();
        $quote->getExtensionAttributes()->setSourceCode($sourceCode);
        $this->filterSourceItems();
        $this->filterSourceAddresses();
        $quote->setTotalsCollectedFlag(false);
        $quote->collectTotals();
    }

    /**
     * Set source code
     * 
     * @return string|null
     */
    public function getSourceCode(): ?string
    {
        return $this->getObject()->getExtensionAttributes()->getSourceCode();
    }

    /**
     * Create source clone
     * 
     * @param string $sourceCode
     * @return \Magento\Quote\Api\Data\CartInterface
     */
    public function createSourceClone(string $sourceCode): \Magento\Quote\Api\Data\CartInterface
    {
        $quote = $this->getObject();
        $sourceQuote = clone $quote;
        $sourceQuote->setExtensionAttributes(clone $quote->getExtensionAttributes());
        $sourceQuote->setId($quote->getId());
        $this->setObject($sourceQuote);
        $this->setSourceCode($sourceCode);
        $this->setObject($quote);
        return $sourceQuote;
    }

    /**
     * Create item source clone
     * 
     * @param \Magento\Quote\Api\Data\CartItemInterface $item
     * @return \Magento\Quote\Api\Data\CartItemInterface
     */
    private function createItemSourceClone(\Magento\Quote\Api\Data\CartItemInterface $item): \Magento\Quote\Api\Data\CartItemInterface
    {
        $sourceItem = clone $item;
        $sourceItem->setExtensionAttributes(clone $item->getExtensionAttributes());
        $sourceItem->setId($item->getId());
        $sourceItem->setQuote($this->getObject());
        return $sourceItem;
    }
    
    /**
     * Filter source items
     * 
     * @return void
     */
    private function filterSourceItems(): void
    {
        $sourceCode = $this->getSourceCode();
        if (empty($sourceCode)) {
            return;
        }
        $quote = $this->getObject();
        $itemsCollection = $quote->getItemsCollection();
        $sourceItemsCollection = clone $itemsCollection;
        foreach ($itemsCollection as $itemKey => $item) {
            $sourceItemsCollection->removeItemByKey($itemKey);
        }
        foreach ($itemsCollection as $item) {
            if ($this->quoteItemWrapperFactory->create($item)->getSourceCode() != $sourceCode || $item->getParentItem()) {
                continue;
            }
            $sourceItem = $this->createItemSourceClone($item);
            foreach ($item->getChildren() as $childItem) {
                if ($this->quoteItemWrapperFactory->create($childItem)->getSourceCode() != $sourceCode) {
                    continue;
                }
                $sourceChildItem = $this->createItemSourceClone($childItem);
                $sourceChildItem->setParentItem($sourceItem);
                $sourceItemsCollection->addItem($sourceChildItem);
            }
            $sourceItemsCollection->addItem($sourceItem);
        }
        $sourceItemsCollection->setQuote($quote);
        $quote->unsetData(
            [
                'items_collection',
                'all_items_qty',
                'virtual_items_qty',
            ]
        );
        $this->setPropertyValue('shippingAddressesItems', null);
        $this->setPropertyValue('_items', $sourceItemsCollection);
    }

    /**
     * Create address source clone
     * 
     * @param \Magento\Quote\Api\Data\AddressInterface $address
     * @return \Magento\Quote\Api\Data\AddressInterface
     */
    private function createAddressSourceClone(\Magento\Quote\Api\Data\AddressInterface $address): \Magento\Quote\Api\Data\AddressInterface
    {
        $sourceAddress = clone $address;
        $sourceAddress->setExtensionAttributes(clone $address->getExtensionAttributes());
        $sourceAddress->setId($address->getId());
        $sourceAddress->setQuote($this->getObject());
        return $sourceAddress;
    }
    
    /**
     * Filter source addresses
     * 
     * @return void
     */
    private function filterSourceAddresses(): void
    {
        $sourceCode = $this->getSourceCode();
        if (empty($sourceCode)) {
            return;
        }
        $quote = $this->getObject();
        $quote->getBillingAddress();
        $quote->getShippingAddress();
        $addressesCollection = $quote->getAddressesCollection();
        $sourceAddressesCollection = clone $addressesCollection;
        foreach ($addressesCollection as $addressKey => $address) {
            $sourceAddressesCollection->removeItemByKey($addressKey);
            $sourceAddress = $this->createAddressSourceClone($address);
            $this->quoteAddressWrapperFactory->create($sourceAddress)->setSourceCode($sourceCode);
            $sourceAddressesCollection->addItem($sourceAddress);
        }
        $this->setPropertyValue('_addresses', $sourceAddressesCollection);
    }
}

Spamworldpro Mini