It is doable quite easily with a rewrite of the checkout/type_onepage model.
In that class override the saveOrder() method as follows:
public function saveOrder() { $quote = $this->getQuote(); //First build an array with the items split by vendor $sortedItems = array(); foreach ($quote->getAllItems() as $item) { $vendor = $item->getProduct()->getVendor(); //<- whatever you need if(!isset($sortedItems[$vendor])) { $sortedItems[$vendor] = $item; } } foreach($sortedItems as $vendor => $item) { //Empty quote foreach($quote->getAllItems() as $item) { $quote->getItemsCollection()->removeItemByKey($item->getId()); } foreach($items as $item) { $quote->addItem($item); } //Update totals for vendor $quote->setTotalsCollectionFlag(false)->collectionTotals(); //Delegate to parent method to place an order for each vendor parent::saveOrder(); } return $this; }
But be aware that in Magento a payment is associated with an invoice, and each invoice is associated with an order.