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/Ecombricks/InventoryMultishipping/Model/Checkout/Type/Multishipping/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Current File : //home/corals/Ecombricks/InventoryMultishipping/Model/Checkout/Type/Multishipping/SourceTrait.php
<?php
/**
 * Copyright © eComBricks. All rights reserved.
 * See LICENSE.txt for license details.
 */
namespace Ecombricks\InventoryMultishipping\Model\Checkout\Type\Multishipping;

/**
 * Multishipping checkout type model source trait
 */
trait SourceTrait
{
    
    /**
     * Get quote addresses
     * 
     * @return array
     */
    protected function getQuoteAddresses()
    {
        $quoteAddresses = [];
        $quote = $this->getQuote();
        foreach ($quote->getAllShippingAddresses() as $quoteAddress) {
            foreach ($quoteAddress->getSourceCodes() as $sourceCode) {
                $quoteAddresses[] = $quoteAddress->createSourceClone($sourceCode);
            }
        }
        if ($quote->hasVirtualItems()) {
            $quoteAddress = $quote->getBillingAddress();
            foreach ($quoteAddress->getSourceCodes() as $sourceCode) {
                $quoteAddresses[] = $quoteAddress->createSourceClone($sourceCode);
            }
        }
        return $quoteAddresses;
    }
    
    /**
     * Prepare orders
     * 
     * @param array $quoteAddresses
     * @return array
     */
    protected function prepareOrders($quoteAddresses)
    {
        $orders = [];
        $quote = $this->getQuote();
        foreach ($quoteAddresses as $quoteAddress) {
            $order = $this->_prepareOrder($quoteAddress);
            $orders[] = $order;
            $this->_eventManager->dispatch(
                'checkout_type_multishipping_create_orders_single',
                ['order' => $order, 'address' => $quoteAddress, 'quote' => $quote]
            );
        }
        return $orders;
    }
    
    /**
     * Logs exceptions
     *
     * @param array $exceptions
     * @return \Magento\Multishipping\Model\Checkout\Type\Multishipping
     */
    protected function logExceptions($exceptions)
    {
        foreach ($exceptions as $exception) {
            $this->inventoryLogger->critical($exception);
        }
        return $this;
    }
    
    /**
     * Get placed orders
     * 
     * @param array $orders
     * @param array $exceptions
     * @return array
     */
    protected function getPlacedOrders($orders, $exceptions)
    {
        $placedOrders = [];
        foreach ($orders as $order) {
            if (!isset($exceptions[$order->getIncrementId()])) {
                $placedOrders[] = $order;
            }
        }
        return $placedOrders;
    }
    
    /**
     * Get failed orders
     * 
     * @param array $orders
     * @param array $exceptions
     * @return array
     */
    protected function getFailedOrders($orders, $exceptions)
    {
        $failedOrders = [];
        foreach ($orders as $order) {
            if (isset($exceptions[$order->getIncrementId()])) {
                $failedOrders[] = $order;
            }
        }
        return $failedOrders;
    }
    
    /**
     * Send order emails
     * 
     * @param array $orders
     * @return \Magento\Multishipping\Model\Checkout\Type\Multishipping
     */
    protected function sendOrderEmails($orders)
    {
        foreach ($orders as $order) {
            if ($order->getCanSendNewEmailFlag()) {
                $this->orderSender->send($order);
            }
        }
        return $this;
    }
    
    /**
     * Get order increment IDs
     * 
     * @param array $orders
     * @return array
     */
    protected function getOrderIncrementIds($orders)
    {
        $orderIncrementIds = [];
        foreach ($orders as $order) {
            $orderIncrementIds[$order->getId()] = $order->getIncrementId();
        }
        return $orderIncrementIds;
    }
    
    /**
     * Get order quote item IDs
     * 
     * @param \Magento\Sales\Api\Data\OrderInterface $order
     * @return array
     */
    protected function getOrderQuoteItemIds(\Magento\Sales\Api\Data\OrderInterface $order)
    {
        $quoteItemIds = [];
        foreach ($order->getItems() as $orderItem) {
            $quoteItemIds[] = $orderItem->getQuoteItemId();
        }
        return $quoteItemIds;
    }
    
    /**
     * Get orders quote item IDs
     * 
     * @param array $orders
     * @return array
     */
    protected function getOrdersQuoteItemIds($orders)
    {
        $orderQuoteItemIds = [];
        foreach ($orders as $order) {
            $orderQuoteItemIds = array_merge($orderQuoteItemIds, $this->getOrderQuoteItemIds($order));
        }
        return $orderQuoteItemIds;
    }
    
    /**
     * Get order quote address ID
     * 
     * @param \Magento\Sales\Api\Data\OrderInterface $order
     * @return int
     * @throws \Magento\Framework\Exception\NotFoundException
     */
    protected function getOrderQuoteAddressId(\Magento\Sales\Api\Data\OrderInterface $order)
    {
        $orderItems = $order->getItems();
        $orderItem = array_pop($orderItems);
        foreach ($this->getQuote()->getAllAddresses() as $quoteAddress) {
            foreach ($quoteAddress->getAllItems() as $quoteAddressItem) {
                if ($quoteAddressItem->getId() != $orderItem->getQuoteItemId()) {
                    continue;
                }
                return (int) $quoteAddress->getId();
            }
        }
        throw new \Magento\Framework\Exception\NotFoundException(__('Quote address for failed order ID "%1" not found.', $order->getEntityId()));
    }
    
    /**
     * Decrease quote item qty
     *
     * @param int $quoteItemId
     * @param int $qty
     * @return \Magento\Multishipping\Model\Checkout\Type\Multishipping
     */
    protected function decreaseQuoteItemQty($quoteItemId, $qty)
    {
        $quote = $this->getQuote();
        $quoteItem = $quote->getItemById($quoteItemId);
        if (empty($quoteItem)) {
            return $this;
        }
        $decreasedQty = $quoteItem->getQty() - $qty;
        if ($decreasedQty > 0) {
            $quoteItem->setQty($decreasedQty);
        } else {
            $quote->removeItem($quoteItem->getId());
            $quote->setIsMultiShipping(1);
        }
        return $this;
    }
    
    /**
     * Remove quote items
     * 
     * @param array $quoteAdressItemIds
     * @return \Magento\Multishipping\Model\Checkout\Type\Multishipping
     */
    protected function removeQuoteItems($quoteAdressItemIds)
    {
        foreach ($this->getQuote()->getAllAddresses() as $quoteAddress) {
            foreach ($quoteAddress->getAllItems() as $quoteAddressItem) {
                if (in_array($quoteAddressItem->getId(), $quoteAdressItemIds)) {
                    continue;
                }
                if ($quoteAddressItem->getProduct()->getIsVirtual()) {
                    $quoteAddressItem->isDeleted(true);
                } else {
                    $quoteAddress->isDeleted(true);
                }
                $this->decreaseQuoteItemQty($quoteAddressItem->getQuoteItemId(), $quoteAddressItem->getQty());
            }
        }
        $this->save();
        return $this;
    }
    
    /**
     * Get quote address errors
     * 
     * @param array $orders
     * @param array $exceptions
     * @return array
     * @throws \Magento\Framework\Exception\NotFoundException
     */
    protected function getQuoteAddressErrors($orders, $exceptions)
    {
        $errors = [];
        foreach ($orders as $order) {
            if (!isset($exceptions[$order->getIncrementId()])) {
                throw new \Magento\Framework\Exception\NotFoundException(__('Exception for failed order not found.'));
            }
            $quoteAddressId = $this->getOrderQuoteAddressId($order);
            $errors[$quoteAddressId] = $exceptions[$order->getIncrementId()]->getMessage();
        }
        return $errors;
    }
    
    /**
     * Create orders
     *
     * @return \Magento\Multishipping\Model\Checkout\Type\Multishipping
     * @throws \Exception
     */
    public function inventoryCreateOrders()
    {
        $this->_validate();
        $quote = $this->getQuote();
        $orders = [];
        try {
            $orders = $this->prepareOrders($this->getQuoteAddresses());
            $exceptions = $this->inventoryPlaceOrderFactory->create($quote->getPayment()->getMethod())->place($orders);
            $this->logExceptions($exceptions);
            $placedOrders = $this->getPlacedOrders($orders, $exceptions);
            $this->sendOrderEmails($placedOrders);
            $addressErrors = [];
            $failedOrders = $this->getFailedOrders($orders, $exceptions);
            if (!empty($failedOrders)) {
                $this->removeQuoteItems($this->getOrdersQuoteItemIds($placedOrders));
                $addressErrors = $this->getQuoteAddressErrors($failedOrders, $exceptions);
            } else {
                $this->_checkoutSession->setLastQuoteId($quote->getId());
                $quote->setIsActive(false);
                $this->quoteRepository->save($quote);
            }
            $this->_session->setOrderIds($this->getOrderIncrementIds($placedOrders));
            $this->_session->setAddressErrors($addressErrors);
            $this->_eventManager->dispatch('checkout_submit_all_after', ['orders' => $orders, 'quote' => $quote]);
        } catch (\Exception $exception) {
            $this->_eventManager->dispatch('checkout_multishipping_refund_all', ['orders' => $orders]);
            throw $exception;
        }
        return $this;
    }
    
}

Spamworldpro Mini