Ich muss meine Bestellungen für jeden Artikel aufteilen (da ich für jeden einzelnen Artikel in meinem Warenkorb einen Bestellstatus und einen Lieferschein benötige).
Ich habe versucht, dies anhand der folgenden Ressourcen zu tun:
Magento2 Split Order basierend auf dem Anbieter
So teilen Sie die Reihenfolge in Magento 2
Magento Mehrfachbestellung an einer Kasse oder Auftragsaufteilung
Aber ich kann es nicht zum Laufen bringen, die erste Bestellung wird erstellt und die zweite stürzt ab. (Onepage-Checkout aktiviert)
Was mache ich falsch?
Magento / Quote / Model / QuoteManagement.php
public function placeOrder($cartId, PaymentInterface $paymentMethod = null)
{
$quote = $this->quoteRepository->getActive($cartId);
if ($paymentMethod) {
$paymentMethod->setChecks([
\Magento\Payment\Model\Method\AbstractMethod::CHECK_USE_CHECKOUT,
\Magento\Payment\Model\Method\AbstractMethod::CHECK_USE_FOR_COUNTRY,
\Magento\Payment\Model\Method\AbstractMethod::CHECK_USE_FOR_CURRENCY,
\Magento\Payment\Model\Method\AbstractMethod::CHECK_ORDER_TOTAL_MIN_MAX,
\Magento\Payment\Model\Method\AbstractMethod::CHECK_ZERO_TOTAL,
]);
$quote->getPayment()->setQuote($quote);
$data = $paymentMethod->getData();
$quote->getPayment()->importData($data);
}
if ($quote->getCheckoutMethod() === self::METHOD_GUEST) {
$quote->setCustomerId(null);
$quote->setCustomerEmail($quote->getBillingAddress()->getEmail());
$quote->setCustomerIsGuest(true);
$quote->setCustomerGroupId(\Magento\Customer\Api\Data\GroupInterface::NOT_LOGGED_IN_ID);
}
$this->eventManager->dispatch('checkout_submit_before', ['quote' => $quote]);
$tempQuote = $quote;
foreach($tempQuote->getAllItems() as $tempItem) {
foreach($quote->getAllItems() as $item) {
$quote->getItemsCollection()->removeItemByKey($item->getId());
}
$quote->getItemsCollection()->addItem($tempItem);
$quote->setTotalsCollectedFlag(false)->collectTotals();
$order = $this->submit($quote);
$orders[] = $order;
$quote = $tempQuote;
if (null == $order) {
throw new LocalizedException(
__('An error occurred on the server. Please try to place the order again.')
);
}
$this->checkoutSession->setLastQuoteId($quote->getId());
$this->checkoutSession->setLastSuccessQuoteId($quote->getId());
$this->checkoutSession->setLastOrderId($order->getId());
$this->checkoutSession->setLastRealOrderId($order->getIncrementId());
$this->checkoutSession->setLastOrderStatus($order->getStatus());
}
$this->eventManager->dispatch('checkout_submit_all_after', ['orders' => $orders, 'quote' => $quote]);
return $orders;
}
Ich habe die Kerndateien nur zum Testen bearbeitet. Ich werde ein Plugin oder ein Überschreiben für die placeOrder-Methode erstellen, sobald es funktioniert.