![]() 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/ |
<?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; } }