создать заказ программно - модель извлекает ошибку вместо объекта


Я пытаюсь программно создать заказ. Я создал модель со следующей структурой:

<?php
class Pricebinc_App_Model_OrderCreate extends Mage_Core_Model_Abstract
{
    const CUSTOMER_RANDOM = null;
    protected $_shippingMethod = 'freeshipping_freeshipping';
    protected $_paymentMethod = 'cashondelivery';
    protected $_customer = self::CUSTOMER_RANDOM;
    protected $_subTotal = 0;
    protected $_order;
    protected $_storeId;

    public function setShippingMethod($methodName)
    {
        $this->_shippingMethod = $methodName;
    }

    public function setPaymentMethod($methodName)
    {
        $this->_paymentMethod = $methodName;
    }

    public function setCustomer($customer)
    {
        if ($customer instanceof Mage_Customer_Model_Customer) {
            $this->_customer = $customer;
        }
        if (is_numeric($customer)) {
            $this->_customer = Mage::getModel('customer/customer')->load($customer);
        } else if ($customer === self::CUSTOMER_RANDOM) {
            $customers = Mage::getResourceModel('customer/customer_collection');

            $customers
                ->getSelect()
                ->limit(1)
                ->order('RAND()');

            $id = $customers->getFirstItem()->getId();

            $this->_customer = Mage::getModel('customer/customer')->load($id);
        }
    }

    public function createOrder($products)
    {
        if (!($this->_customer instanceof Mage_Customer_Model_Customer)) {
            $this->setCustomer(self::CUSTOMER_RANDOM);
        }

        $transaction = Mage::getModel('core/resource_transaction');
        $this->_storeId = Mage::app()->getStore()->setId(Mage_Core_Model_App::ADMIN_STORE_ID);
        $reservedOrderId = Mage::getSingleton('eav/config')
            ->getEntityType('order')
            ->fetchNewIncrementId($this->_storeId);

        $currencyCode = Mage::app()->getBaseCurrencyCode();
        $this->_order = Mage::getModel('sales/order')
            ->setIncrementId($reservedOrderId)
            ->setStoreId($this->_storeId)
            ->setQuoteId(0)
            ->setGlobalCurrencyCode($currencyCode)
            ->setBaseCurrencyCode($currencyCode)
            ->setStoreCurrencyCode($currencyCode)
            ->setOrderCurrencyCode($currencyCode);


        $this->_order->setCustomerEmail($this->_customer->getEmail())
            ->setCustomerFirstname($this->_customer->getFirstname())
            ->setCustomerLastname($this->_customer->getLastname())
            ->setCustomerGroupId($this->_customer->getGroupId())
            ->setCustomerIsGuest(0)
            ->setCustomer($this->_customer);


        $billing = $this->_customer->getDefaultBillingAddress();
        $billingAddress = Mage::getModel('sales/order_address')
            ->setStoreId($this->_storeId)
            ->setAddressType(Mage_Sales_Model_Quote_Address::TYPE_BILLING)
            ->setCustomerId($this->_customer->getId())
            ->setCustomerAddressId($this->_customer->getDefaultBilling())
            ->setCustomerAddress_id($billing->getEntityId())
            ->setPrefix($billing->getPrefix())
            ->setFirstname($billing->getFirstname())
            ->setMiddlename($billing->getMiddlename())
            ->setLastname($billing->getLastname())
            ->setSuffix($billing->getSuffix())
            ->setCompany($billing->getCompany())
            ->setStreet($billing->getStreet())
            ->setCity($billing->getCity())
            ->setCountry_id($billing->getCountryId())
            ->setRegion($billing->getRegion())
            ->setRegion_id($billing->getRegionId())
            ->setPostcode($billing->getPostcode())
            ->setTelephone($billing->getTelephone())
            ->setFax($billing->getFax());
        $this->_order->setBillingAddress($billingAddress);

        $shipping = $this->_customer->getDefaultShippingAddress();
        $shippingAddress = Mage::getModel('sales/order_address')
            ->setStoreId($this->_storeId)
            ->setAddressType(Mage_Sales_Model_Quote_Address::TYPE_SHIPPING)
            ->setCustomerId($this->_customer->getId())
            ->setCustomerAddressId($this->_customer->getDefaultShipping())
            ->setCustomer_address_id($shipping->getEntityId())
            ->setPrefix($shipping->getPrefix())
            ->setFirstname($shipping->getFirstname())
            ->setMiddlename($shipping->getMiddlename())
            ->setLastname($shipping->getLastname())
            ->setSuffix($shipping->getSuffix())
            ->setCompany($shipping->getCompany())
            ->setStreet($shipping->getStreet())
            ->setCity($shipping->getCity())
            ->setCountry_id($shipping->getCountryId())
            ->setRegion($shipping->getRegion())
            ->setRegion_id($shipping->getRegionId())
            ->setPostcode($shipping->getPostcode())
            ->setTelephone($shipping->getTelephone())
            ->setFax($shipping->getFax());

        $this->_order->setShippingAddress($shippingAddress)
            ->setShippingMethod($this->_shippingMethod);

        $orderPayment = Mage::getModel('sales/order_payment')
            ->setStoreId($this->_storeId)
            ->setCustomerPaymentId(0)
            ->setMethod($this->_paymentMethod)
            ->setPoNumber(' – ');

        $this->_order->setPayment($orderPayment);

        $this->_addProducts($products);

        $this->_order->setSubtotal($this->_subTotal)
            ->setBaseSubtotal($this->_subTotal)
            ->setGrandTotal($this->_subTotal)
            ->setBaseGrandTotal($this->_subTotal);

        $transaction->addObject($this->_order);
        $transaction->addCommitCallback(array($this->_order, 'place'));
        $transaction->addCommitCallback(array($this->_order, 'save'));
        $transaction->save();
    }

    protected function _addProducts($products)
    {
        $this->_subTotal = 0;

        foreach ($products as $productRequest) {
            if ($productRequest['product'] == 'rand') {

                $productsCollection = Mage::getResourceModel('catalog/product_collection');

                $productsCollection->addFieldToFilter('type_id', 'simple');
                Mage::getSingleton('cataloginventory/stock')->addInStockFilterToCollection($productsCollection);

                $productsCollection->getSelect()
                    ->order('RAND()')
                    ->limit(rand($productRequest['min'], $productRequest['max']));

                foreach ($productsCollection as $product) {
                    $this->_addProduct(array(
                        'product' => $product->getId(),
                        'qty' => rand(1, 2)
                    ));
                }
            } else {
                $this->_addProduct($productRequest);
            }
        }
    }

    protected function _addProduct($requestData)
    {
        $request = new Varien_Object();
        $request->setData($requestData);

        $product = Mage::getModel('catalog/product')->load($request['product']);

        $cartCandidates = $product->getTypeInstance(true)
            ->prepareForCartAdvanced($request, $product);

        if (is_string($cartCandidates)) {
            throw new Exception($cartCandidates);
        }

        if (!is_array($cartCandidates)) {
            $cartCandidates = array($cartCandidates);
        }

        $parentItem = null;
        $errors = array();
        $items = array();
        foreach ($cartCandidates as $candidate) {
            $item = $this->_productToOrderItem($candidate, $candidate->getCartQty());

            $items[] = $item;

            /**
             * As parent item we should always use the item of first added product
             */
            if (!$parentItem) {
                $parentItem = $item;
            }
            if ($parentItem && $candidate->getParentProductId()) {
                $item->setParentItem($parentItem);
            }
            /**
             * We specify qty after we know about parent (for stock)
             */
            $item->setQty($item->getQty() + $candidate->getCartQty());

            // collect errors instead of throwing first one
            if ($item->getHasError()) {
                $message = $item->getMessage();
                if (!in_array($message, $errors)) { // filter duplicate messages
                    $errors[] = $message;
                }
            }
        }
        if (!empty($errors)) {
            Mage::throwException(implode("\n", $errors));
        }

        foreach ($items as $item) {
            $this->_order->addItem($item);
        }

        return $items;
    }

    function _productToOrderItem(Mage_Catalog_Model_Product $product, $qty = 1)
    {
        $rowTotal = $product->getFinalPrice() * $qty;

        $options = $product->getCustomOptions();

        $optionsByCode = array();

        foreach ($options as $option) {
            $quoteOption = Mage::getModel('sales/quote_item_option')->setData($option->getData())
                ->setProduct($option->getProduct());

            $optionsByCode[$quoteOption->getCode()] = $quoteOption;
        }

        $product->setCustomOptions($optionsByCode);

        $options = $product->getTypeInstance(true)->getOrderOptions($product);

        $orderItem = Mage::getModel('sales/order_item')
            ->setStoreId($this->_storeId)
            ->setQuoteItemId(0)
            ->setQuoteParentItemId(NULL)
            ->setProductId($product->getId())
            ->setProductType($product->getTypeId())
            ->setQtyBackordered(NULL)
            ->setTotalQtyOrdered($product['rqty'])
            ->setQtyOrdered($product['qty'])
            ->setName($product->getName())
            ->setSku($product->getSku())
            ->setPrice($product->getFinalPrice())
            ->setBasePrice($product->getFinalPrice())
            ->setOriginalPrice($product->getFinalPrice())
            ->setRowTotal($rowTotal)
            ->setBaseRowTotal($rowTotal)
            ->setWeeeTaxApplied(serialize(array()))
            ->setBaseWeeeTaxDisposition(0)
            ->setWeeeTaxDisposition(0)
            ->setBaseWeeeTaxRowDisposition(0)
            ->setWeeeTaxRowDisposition(0)
            ->setBaseWeeeTaxAppliedAmount(0)
            ->setBaseWeeeTaxAppliedRowAmount(0)
            ->setWeeeTaxAppliedAmount(0)
            ->setWeeeTaxAppliedRowAmount(0)
            ->setProductOptions($options);

        $this->_subTotal += $rowTotal;

        return $orderItem;
    }
}

Then I include the following statement in the controller:

        $orderGenerator = Mage::getModel('app/ordercreate');

        $orderGenerator->createOrder(array(
            array(
                'product' => 24, //product id
                'qty' => 1
            )
        ));

Но я постоянно получаю ошибку 500.

Я взял этот код у амасты https://blog.amasty.com/creating-magento-order-programmatically/


ОБНОВЛЕНИЕ:

Наконец, это код, если вам нужно создать заказ программно в magento 1.9.

<?php
class NameApp_App_Model_OrderCreate extends Mage_Core_Model_Abstract
{
    const CUSTOMER_RANDOM = null;
    protected $_shippingMethod = 'freeshipping_freeshipping';
    protected $_paymentMethod = 'cashondelivery';
    protected $_subTotal = 0;
    protected $_order;
    protected $_storeId = '0';

    public function _construct()
    {
        parent::_construct();
        $this->_init('app/ordercreate');
    }

    public function setShippingMethod($methodName)
    {
        $this->_shippingMethod = $methodName;
    }
    public function setPaymentMethod($methodName)
    {
        $this->_paymentMethod = $methodName;
    }

    public function createOrder($products)
    {
        $transaction = Mage::getModel('core/resource_transaction');
        $this->_storeId = Mage::app()->getStore()->setId(Mage_Core_Model_App::ADMIN_STORE_ID);
        $this->_customer = Mage::getSingleton('customer/session')->getCustomer();
        $reservedOrderId = Mage::getSingleton('eav/config')
            ->getEntityType('order')
            ->fetchNewIncrementId($this->_storeId);

        $currencyCode = Mage::app()->getBaseCurrencyCode();
        $this->_order = Mage::getModel('sales/order')
            ->setIncrementId($reservedOrderId)
            ->setStoreId($this->_storeId)
            ->setQuoteId(0)
            ->setGlobalCurrencyCode($currencyCode)
            ->setBaseCurrencyCode($currencyCode)
            ->setStoreCurrencyCode($currencyCode)
            ->setOrderCurrencyCode($currencyCode);


        $this->_order->setCustomerEmail($this->_customer->getEmail())
            ->setCustomerFirstname($this->_customer->getFirstname())
            ->setCustomerLastname($this->_customer->getLastname())
            ->setCustomerGroupId($this->_customer->getGroupId())
            ->setCustomerIsGuest(0)
            ->setCustomer($this->_customer);


        $billing = $this->_customer->getDefaultBillingAddress();
        $billingAddress = Mage::getModel('sales/order_address')
            ->setStoreId($this->_storeId)
            ->setAddressType(Mage_Sales_Model_Quote_Address::TYPE_BILLING)
            ->setCustomerId($this->_customer->getId())
            ->setCustomerAddressId($this->_customer->getDefaultBilling())
            ->setCustomerAddress_id($billing->getEntityId())
            ->setPrefix($billing->getPrefix())
            ->setFirstname($billing->getFirstname())
            ->setMiddlename($billing->getMiddlename())
            ->setLastname($billing->getLastname())
            ->setSuffix($billing->getSuffix())
            ->setCompany($billing->getCompany())
            ->setStreet($billing->getStreet())
            ->setCity($billing->getCity())
            ->setCountry_id($billing->getCountryId())
            ->setRegion($billing->getRegion())
            ->setRegion_id($billing->getRegionId())
            ->setPostcode($billing->getPostcode())
            ->setTelephone($billing->getTelephone())
            ->setFax($billing->getFax());
        $this->_order->setBillingAddress($billingAddress);

        $shipping = $this->_customer->getDefaultShippingAddress();
        $shippingAddress = Mage::getModel('sales/order_address')
            ->setStoreId($this->_storeId)
            ->setAddressType(Mage_Sales_Model_Quote_Address::TYPE_SHIPPING)
            ->setCustomerId($this->_customer->getId())
            ->setCustomerAddressId($this->_customer->getDefaultShipping())
            ->setCustomer_address_id($shipping->getEntityId())
            ->setPrefix($shipping->getPrefix())
            ->setFirstname($shipping->getFirstname())
            ->setMiddlename($shipping->getMiddlename())
            ->setLastname($shipping->getLastname())
            ->setSuffix($shipping->getSuffix())
            ->setCompany($shipping->getCompany())
            ->setStreet($shipping->getStreet())
            ->setCity($shipping->getCity())
            ->setCountry_id($shipping->getCountryId())
            ->setRegion($shipping->getRegion())
            ->setRegion_id($shipping->getRegionId())
            ->setPostcode($shipping->getPostcode())
            ->setTelephone($shipping->getTelephone())
            ->setFax($shipping->getFax());

        $this->_order->setShippingAddress($shippingAddress)
            ->setShippingMethod($this->_shippingMethod);

        $orderPayment = Mage::getModel('sales/order_payment')
            ->setStoreId($this->_storeId)
            ->setCustomerPaymentId(0)
            ->setMethod($this->_paymentMethod)
            ->setPoNumber(' – ');

        $this->_order->setPayment($orderPayment);

        $this->_addProducts($products);

        $this->_order->setSubtotal($this->_subTotal)
            ->setBaseSubtotal($this->_subTotal)
            ->setGrandTotal($this->_subTotal)
            ->setBaseGrandTotal($this->_subTotal);

        $transaction->addObject($this->_order);
        $transaction->addCommitCallback(array($this->_order, 'place'));
        $transaction->addCommitCallback(array($this->_order, 'save'));
        $transaction->save();
    }

    protected function _addProducts($products)
    {
        $this->_subTotal = 0;

        foreach ($products as $productRequest) {
            if ($productRequest['product'] == 'rand') {

                $productsCollection = Mage::getResourceModel('catalog/product_collection');

                $productsCollection->addFieldToFilter('type_id', 'simple');
                Mage::getSingleton('cataloginventory/stock')->addInStockFilterToCollection($productsCollection);

                $productsCollection->getSelect()
                    ->order('RAND()')
                    ->limit(rand($productRequest['min'], $productRequest['max']));

                foreach ($productsCollection as $product) {
                    $this->_addProduct(array(
                        'product' => $product->getId(),
                        'qty' => rand(1, 2)
                    ));
                }
            } else {
                $this->_addProduct($productRequest);
            }
        }
    }

    protected function _addProduct($requestData)
    {
        $request = new Varien_Object();
        $request->setData($requestData);

        $product = Mage::getModel('catalog/product')->load($request['product']);

        $cartCandidates = $product->getTypeInstance(true)
            ->prepareForCartAdvanced($request, $product);

        if (is_string($cartCandidates)) {
            throw new Exception($cartCandidates);
        }

        if (!is_array($cartCandidates)) {
            $cartCandidates = array($cartCandidates);
        }

        $parentItem = null;
        $errors = array();
        $items = array();
        foreach ($cartCandidates as $candidate) {
            $item = $this->_productToOrderItem($candidate, $candidate->getCartQty());

            $items[] = $item;

            /**
             * As parent item we should always use the item of first added product
             */
            if (!$parentItem) {
                $parentItem = $item;
            }
            if ($parentItem && $candidate->getParentProductId()) {
                $item->setParentItem($parentItem);
            }
            /**
             * We specify qty after we know about parent (for stock)
             */
            $item->setQty($item->getQty() + $candidate->getCartQty());

            // collect errors instead of throwing first one
            if ($item->getHasError()) {
                $message = $item->getMessage();
                if (!in_array($message, $errors)) { // filter duplicate messages
                    $errors[] = $message;
                }
            }
        }
        if (!empty($errors)) {
            Mage::throwException(implode("\n", $errors));
        }

        foreach ($items as $item) {
            $this->_order->addItem($item);
        }

        return $items;
    }

    function _productToOrderItem(Mage_Catalog_Model_Product $product, $qty = 1)
    {
        $rowTotal = $product->getFinalPrice() * $qty;

        $options = $product->getCustomOptions();

        $optionsByCode = array();

        foreach ($options as $option) {
            $quoteOption = Mage::getModel('sales/quote_item_option')->setData($option->getData())
                ->setProduct($option->getProduct());

            $optionsByCode[$quoteOption->getCode()] = $quoteOption;
        }

        $product->setCustomOptions($optionsByCode);

        $options = $product->getTypeInstance(true)->getOrderOptions($product);

        $orderItem = Mage::getModel('sales/order_item')
            ->setStoreId($this->_storeId)
            ->setQuoteItemId(0)
            ->setQuoteParentItemId(NULL)
            ->setProductId($product->getId())
            ->setProductType($product->getTypeId())
            ->setQtyBackordered(NULL)
            ->setTotalQtyOrdered($product['rqty'])
            ->setQtyOrdered($product['qty'])
            ->setName($product->getName())
            ->setSku($product->getSku())
            ->setPrice($product->getFinalPrice())
            ->setBasePrice($product->getFinalPrice())
            ->setOriginalPrice($product->getFinalPrice())
            ->setRowTotal($rowTotal)
            ->setBaseRowTotal($rowTotal)
            ->setWeeeTaxApplied(serialize(array()))
            ->setBaseWeeeTaxDisposition(0)
            ->setWeeeTaxDisposition(0)
            ->setBaseWeeeTaxRowDisposition(0)
            ->setWeeeTaxRowDisposition(0)
            ->setBaseWeeeTaxAppliedAmount(0)
            ->setBaseWeeeTaxAppliedRowAmount(0)
            ->setWeeeTaxAppliedAmount(0)
            ->setWeeeTaxAppliedRowAmount(0)
            ->setProductOptions($options);

        $this->_subTotal += $rowTotal;

        return $orderItem;
    }
}

Затем вы можете вызвать его из контроллер:

    $orderGenerator = Mage::getModel('app/ordercreate');

    $orderGenerator->createOrder(array(
        array(
            'product' => 41, //product id
            'qty' => 1
        )
    ));

Вот и все. вы можете сделать product => 41 динамическим вместо статического. это твой выбор.

Author: s_h, 2015-07-15

1 answers

Вы вызываете функцию CreateOrder() при инициализации модели (для которой требуются аргументы). Таким образом, $ordergenerator =Mage::getModel('приложение/создание заказа')->CreateOrder(); выдаст ошибку.

Попробуйте:

$orderGenerator = Mage::getModel('app/ordercreate'); // removed ->createOrder()

$orderGenerator->createOrder(array(
        array(
            'product' => 24, //product id
            'qty' => 1
        )
    ));

Продолжение вашего нового редактирования (с ошибкой клиента). Есть ли у вас клиенты в вашем магазине? Если нет, сначала создайте клиента, иначе скрипт не сможет привлечь случайного клиента для прикрепления заказа.


Итак, как вы отчасти сами выяснили, функция загрузки клиентов не работала. Хотя почему все равно было бы интересным вопросом. Вот рабочий код, хотя он все еще может использовать некоторые улучшения (или посмотрите на это онлайн-различие):

<?php
 class NameApp_App_Model_OrderCreate extends Mage_Core_Model_Abstract
{
const CUSTOMER_RANDOM = null;
protected $_shippingMethod = 'freeshipping_freeshipping';
protected $_paymentMethod = 'cashondelivery';
protected $_subTotal = 0;
protected $_order;
protected $_storeId = '0';

public function _construct()
{
    parent::_construct();
    $this->_init('app/ordercreate');
}

public function setShippingMethod($methodName)
{
    $this->_shippingMethod = $methodName;
}
public function setPaymentMethod($methodName)
{
    $this->_paymentMethod = $methodName;
}

public function createOrder($products)
{
    $transaction = Mage::getModel('core/resource_transaction');
    $this->_storeId = Mage::app()->getStore()->setId(Mage_Core_Model_App::ADMIN_STORE_ID);
    $this->_customer = Mage::getSingleton('customer/session')->getCustomer();
    $reservedOrderId = Mage::getSingleton('eav/config')
        ->getEntityType('order')
        ->fetchNewIncrementId($this->_storeId);

    $currencyCode = Mage::app()->getBaseCurrencyCode();
    $this->_order = Mage::getModel('sales/order')
        ->setIncrementId($reservedOrderId)
        ->setStoreId($this->_storeId)
        ->setQuoteId(0)
        ->setGlobalCurrencyCode($currencyCode)
        ->setBaseCurrencyCode($currencyCode)
        ->setStoreCurrencyCode($currencyCode)
        ->setOrderCurrencyCode($currencyCode);


    $this->_order->setCustomerEmail($this->_customer->getEmail())
        ->setCustomerFirstname($this->_customer->getFirstname())
        ->setCustomerLastname($this->_customer->getLastname())
        ->setCustomerGroupId($this->_customer->getGroupId())
        ->setCustomerIsGuest(0)
        ->setCustomer($this->_customer);


    $billing = $this->_customer->getDefaultBillingAddress();
    $billingAddress = Mage::getModel('sales/order_address')
        ->setStoreId($this->_storeId)
        ->setAddressType(Mage_Sales_Model_Quote_Address::TYPE_BILLING)
        ->setCustomerId($this->_customer->getId())
        ->setCustomerAddressId($this->_customer->getDefaultBilling())
        ->setCustomerAddress_id($billing->getEntityId())
        ->setPrefix($billing->getPrefix())
        ->setFirstname($billing->getFirstname())
        ->setMiddlename($billing->getMiddlename())
        ->setLastname($billing->getLastname())
        ->setSuffix($billing->getSuffix())
        ->setCompany($billing->getCompany())
        ->setStreet($billing->getStreet())
        ->setCity($billing->getCity())
        ->setCountry_id($billing->getCountryId())
        ->setRegion($billing->getRegion())
        ->setRegion_id($billing->getRegionId())
        ->setPostcode($billing->getPostcode())
        ->setTelephone($billing->getTelephone())
        ->setFax($billing->getFax());
    $this->_order->setBillingAddress($billingAddress);

    $shipping = $this->_customer->getDefaultShippingAddress();
    $shippingAddress = Mage::getModel('sales/order_address')
        ->setStoreId($this->_storeId)
        ->setAddressType(Mage_Sales_Model_Quote_Address::TYPE_SHIPPING)
        ->setCustomerId($this->_customer->getId())
        ->setCustomerAddressId($this->_customer->getDefaultShipping())
        ->setCustomer_address_id($shipping->getEntityId())
        ->setPrefix($shipping->getPrefix())
        ->setFirstname($shipping->getFirstname())
        ->setMiddlename($shipping->getMiddlename())
        ->setLastname($shipping->getLastname())
        ->setSuffix($shipping->getSuffix())
        ->setCompany($shipping->getCompany())
        ->setStreet($shipping->getStreet())
        ->setCity($shipping->getCity())
        ->setCountry_id($shipping->getCountryId())
        ->setRegion($shipping->getRegion())
        ->setRegion_id($shipping->getRegionId())
        ->setPostcode($shipping->getPostcode())
        ->setTelephone($shipping->getTelephone())
        ->setFax($shipping->getFax());

    $this->_order->setShippingAddress($shippingAddress)
        ->setShippingMethod($this->_shippingMethod);

    $orderPayment = Mage::getModel('sales/order_payment')
        ->setStoreId($this->_storeId)
        ->setCustomerPaymentId(0)
        ->setMethod($this->_paymentMethod)
        ->setPoNumber(' – ');

    $this->_order->setPayment($orderPayment);

    $this->_addProducts($products);

    $this->_order->setSubtotal($this->_subTotal)
        ->setBaseSubtotal($this->_subTotal)
        ->setGrandTotal($this->_subTotal)
        ->setBaseGrandTotal($this->_subTotal);

    $transaction->addObject($this->_order);
    $transaction->addCommitCallback(array($this->_order, 'place'));
    $transaction->addCommitCallback(array($this->_order, 'save'));
    $transaction->save();
}

protected function _addProducts($products)
{
    $this->_subTotal = 0;

    foreach ($products as $productRequest) {
        if ($productRequest['product'] == 'rand') {

            $productsCollection = Mage::getResourceModel('catalog/product_collection');

            $productsCollection->addFieldToFilter('type_id', 'simple');
            Mage::getSingleton('cataloginventory/stock')->addInStockFilterToCollection($productsCollection);

            $productsCollection->getSelect()
                ->order('RAND()')
                ->limit(rand($productRequest['min'], $productRequest['max']));

            foreach ($productsCollection as $product) {
                $this->_addProduct(array(
                    'product' => $product->getId(),
                    'qty' => rand(1, 2)
                ));
            }
        } else {
            $this->_addProduct($productRequest);
        }
    }
}

protected function _addProduct($requestData)
{
    $request = new Varien_Object();
    $request->setData($requestData);

    $product = Mage::getModel('catalog/product')->load($request['product']);

    $cartCandidates = $product->getTypeInstance(true)
        ->prepareForCartAdvanced($request, $product);

    if (is_string($cartCandidates)) {
        throw new Exception($cartCandidates);
    }

    if (!is_array($cartCandidates)) {
        $cartCandidates = array($cartCandidates);
    }

    $parentItem = null;
    $errors = array();
    $items = array();
    foreach ($cartCandidates as $candidate) {
        $item = $this->_productToOrderItem($candidate, $candidate->getCartQty());

        $items[] = $item;

        /**
         * As parent item we should always use the item of first added product
         */
        if (!$parentItem) {
            $parentItem = $item;
        }
        if ($parentItem && $candidate->getParentProductId()) {
            $item->setParentItem($parentItem);
        }
        /**
         * We specify qty after we know about parent (for stock)
         */
        $item->setQty($item->getQty() + $candidate->getCartQty());

        // collect errors instead of throwing first one
        if ($item->getHasError()) {
            $message = $item->getMessage();
            if (!in_array($message, $errors)) { // filter duplicate messages
                $errors[] = $message;
            }
        }
    }
    if (!empty($errors)) {
        Mage::throwException(implode("\n", $errors));
    }

    foreach ($items as $item) {
        $this->_order->addItem($item);
    }

    return $items;
}

function _productToOrderItem(Mage_Catalog_Model_Product $product, $qty = 1)
{
    $rowTotal = $product->getFinalPrice() * $qty;

    $options = $product->getCustomOptions();

    $optionsByCode = array();

    foreach ($options as $option) {
        $quoteOption = Mage::getModel('sales/quote_item_option')->setData($option->getData())
            ->setProduct($option->getProduct());

        $optionsByCode[$quoteOption->getCode()] = $quoteOption;
    }

    $product->setCustomOptions($optionsByCode);

    $options = $product->getTypeInstance(true)->getOrderOptions($product);

    $orderItem = Mage::getModel('sales/order_item')
        ->setStoreId($this->_storeId)
        ->setQuoteItemId(0)
        ->setQuoteParentItemId(NULL)
        ->setProductId($product->getId())
        ->setProductType($product->getTypeId())
        ->setQtyBackordered(NULL)
        ->setTotalQtyOrdered($product['rqty'])
        ->setQtyOrdered($product['qty'])
        ->setName($product->getName())
        ->setSku($product->getSku())
        ->setPrice($product->getFinalPrice())
        ->setBasePrice($product->getFinalPrice())
        ->setOriginalPrice($product->getFinalPrice())
        ->setRowTotal($rowTotal)
        ->setBaseRowTotal($rowTotal)
        ->setWeeeTaxApplied(serialize(array()))
        ->setBaseWeeeTaxDisposition(0)
        ->setWeeeTaxDisposition(0)
        ->setBaseWeeeTaxRowDisposition(0)
        ->setWeeeTaxRowDisposition(0)
        ->setBaseWeeeTaxAppliedAmount(0)
        ->setBaseWeeeTaxAppliedRowAmount(0)
        ->setWeeeTaxAppliedAmount(0)
        ->setWeeeTaxAppliedRowAmount(0)
        ->setProductOptions($options);

    $this->_subTotal += $rowTotal;

    return $orderItem;
}

}

 2
Author: willem wigman, 2015-07-19 12:33:15