I'm developing a Multivendor marketplace module. I need to split orders based on seller id's which assigned to the product. I tried using this free module. Link But this is not working with attributes. So I tried to split with SKU. Where I modified the code as below.
<?php
namespace Magestat\SplitOrder\Plugin;
use Magento\Quote\Model\QuoteManagement;
use Magento\Framework\Exception\LocalizedException;
use Magento\Quote\Api\CartRepositoryInterface;
use Magento\Quote\Model\QuoteFactory;
use Magento\Framework\Event\ManagerInterface;
use Magestat\SplitOrder\Api\QuoteHandlerInterface;
/**
* Class SplitQuote
* Interceptor to \Magento\Quote\Model\QuoteManagement
*/
class SplitQuote
{
/**
* @var CartRepositoryInterface
*/
private $quoteRepository;
/**
* @var QuoteFactory
*/
private $quoteFactory;
/**
* @var ManagerInterface
*/
private $eventManager;
/**
* @var QuoteHandlerInterface
*/
private $quoteHandler;
/**
* @param CartRepositoryInterface $quoteRepository
* @param QuoteFactory $quoteFactory
* @param ManagerInterface $eventManager
* @param QuoteHandlerInterface $quoteHandler
*/
public function __construct(
CartRepositoryInterface $quoteRepository,
QuoteFactory $quoteFactory,
ManagerInterface $eventManager,
QuoteHandlerInterface $quoteHandler
) {
$this->quoteRepository = $quoteRepository;
$this->quoteFactory = $quoteFactory;
$this->eventManager = $eventManager;
$this->quoteHandler = $quoteHandler;
}
/**
* Places an order for a specified cart.
*
* @param QuoteManagement $subject
* @param callable $proceed
* @param int $cartId
* @param string $payment
* @return mixed
* @throws LocalizedException
* @SuppressWarnings(PHPMD.UnusedFormalParameter)
* @see \Magento\Quote\Api\CartManagementInterface
*/
public function aroundPlaceOrder(QuoteManagement $subject, callable $proceed, $cartId, $payment = null)
{
$currentQuote = $this->quoteRepository->getActive($cartId);
// Separate all items in quote into new quotes.
$quote = $this->quoteRepository->getActive($cartId);
$quotes = [];
foreach ($quote->getAllVisibleItems() as $item) {
$quotes[$item->getProduct()->getSku()][] = $item;
} //Here where I modified to split with skus
// Collect list of data addresses.
$addresses = $this->quoteHandler->collectAddressesData($currentQuote);
/** @var \Magento\Sales\Api\Data\OrderInterface[] $orders */
$orders = [];
$orderIds = [];
foreach ($quotes as $items) {
/** @var \Magento\Quote\Model\Quote $split */
$split = $this->quoteFactory->create();
// Set all customer definition data.
$this->quoteHandler->setCustomerData($currentQuote, $split);
$this->toSaveQuote($split);
// Map quote items.
foreach ($items as $item) {
// Add item by item.
$item->setId(null);
$split->addItem($item);
}
$this->quoteHandler->populateQuote($quotes, $split, $items, $addresses, $payment);
// Dispatch event as Magento standard once per each quote split.
$this->eventManager->dispatch(
'checkout_submit_before',
['quote' => $split]
);
$this->toSaveQuote($split);
$order = $subject->submit($split);
$orders[] = $order;
$orderIds[$order->getId()] = $order->getIncrementId();
if (null == $order) {
throw new LocalizedException(__('Please try to place the order again.'));
}
}
$currentQuote->setIsActive(false);
$this->toSaveQuote($currentQuote);
$this->quoteHandler->defineSessions($split, $order, $orderIds);
$this->eventManager->dispatch(
'checkout_submit_all_after',
['orders' => $orders, 'quote' => $currentQuote]
);
return $this->getOrderKeys($orderIds);
}
/**
* Save quote
*
* @param \Magento\Quote\Api\Data\CartInterface $quote
* @return \Magestat\SplitOrder\Plugin\SplitQuote
*/
private function toSaveQuote($quote)
{
$this->quoteRepository->save($quote);
return $this;
}
/**
* @param array $orderIds
* @return array
*/
private function getOrderKeys($orderIds)
{
$orderValues = [];
foreach (array_keys($orderIds) as $orderKey) {
$orderValues[] = (string) $orderKey;
}
return array_values($orderValues);
}
}
but it returns the below error in the console
Failed to load resource: the server responded with a status of 500 (Internal Server Error)
/master/bike/rest/bike/V1/carts/mine/payment-information:1
<message>
The consumer isn't authorized to access %resources.
</message>
It shows that customer is not authenticated. The rest api throws error in onepage. I need a experts help. Thanks in advanced.
aroundSubmit
. Then split orders based on these quote items after the checkout usingcheckout_submit_all_after
event. Also one more important point, just splitting the quote will not work. You will have to create new orders using order entity object.