您的位置:首页 > 其它

magento在程序中创建订单(create order by code)

2012-12-03 10:31 459 查看
在magento的电子商务流程中,按照正常的支付流程就能够创建订单,但有的时候我们需要在程序中自己创建订单,比如当我们的产品不需要支付(比如软件),甚至不需要登录就能下载时,我们就需要在程序中创建这样一个订单,并且为订单开发票

下面就是只需要产品Id信息就能够创建订单的代码

protected function _createOrder($productId) {
$post['product_id'][0]=$productId;
$post['product_qty'][0]=1;

$shoppingCart = array();
for ($i = 0; $i<count($post['product_id']); $i++) {
$productId = $post['product_id'][$i];
$productQty = $post['product_qty'][$i];
$product = Mage::getModel('catalog/product')->load($productId);
$shoppingCart[] = array('product'=>$product, 'productQty'=>$productQty);
}
//$customer = Mage::getModel('customer/customer')->load($post['customer_id']);
$customer=null;
$params=array('customer'=>$customer, 'shoppingCart'=>$shoppingCart,);

$quote = $this->_prepareOrder($params);
$order = $this->_confirmOrder($quote);

/*$order->addStatusToHistory(
$order->getStatus(),
Mage::helper('alipay')->__('Customer successfully returned from Alipay')
);

$order->save();
$this->saveInvoice($order);*/
$invoice=$this->_invoiceOrder($order);
}

protected function _prepareOrder($params) {
foreach($params as $k=>$v) { $$k=$v; }
$storeId = Mage::app()->getStore()->getId();

$quote = Mage::getModel('sales/quote'); //sets ship/bill address
//$quote->getBillingAddress()->setShouldIgnoreValidation(true);
//$quote->getShippingAddress()->setShouldIgnoreValidation(true);

$store = $quote->getStore()->load($storeId);
$quote->setStore($store);

foreach($shoppingCart as $shoppingItem) {
foreach($shoppingItem as $k=>$v) { $$k=$v; }
$quoteItem=Mage::getModel('sales/quote_item')->setProduct($product);
$quoteItem->setQuote($quote);
$quoteItem->setQty($productQty);
$quote->addItem($quoteItem);
}

$shippingAddress = $quote->getShippingAddress();
$shippingAddress->setShippingMethod('freeshipping');
$rate = new Mage_Sales_Model_Quote_Address_Rate();
$rate->setCode('freeshipping');
$shippingAddress->addShippingRate($rate);
$shippingAddress->setCollectShippingRates(true);

$quote->getPayment()->setMethod('purchaseorder');
$quote->collectTotals()->save();

return $quote;
}
protected function _confirmOrder($quote) {
$service = Mage::getModel('onepagecheckout/service_quote', $quote);
$service->submitAll();
Mage::getSingleton('checkout/session')->setLastQuoteId($quote->getId())
->setLastSuccessQuoteId($quote->getId())
->clearHelperData();
return $service->getOrder();
}

protected function saveInvoice(Mage_Sales_Model_Order $order)
{
if ($order->canInvoice())
{
$convertor = Mage::getModel('sales/convert_order');
$invoice = $convertor->toInvoice($order);
foreach ($order->getAllItems() as $orderItem)
{
if (!$orderItem->getQtyToInvoice())
{
continue ;
}
$item = $convertor->itemToInvoiceItem($orderItem);
$item->setQty($orderItem->getQtyToInvoice());
$invoice->addItem($item);
}
$invoice->collectTotals();
$invoice->register()->capture();
Mage::getModel('core/resource_transaction')
->addObject($invoice)
->addObject($invoice->getOrder())
->save();
return true;
}

return false;
}

protected function _invoiceOrder($order) {
$convertOrder=Mage::getSingleton('sales/convert_order');
$invoice=$convertOrder->toInvoice($order);

foreach ($order->getAllItems() as $item) {
$invoiceItem = $convertOrder->itemToInvoiceItem($item);
if ($item->getParentItem()) {
$invoiceItem->setParentItem($invoice->getItemById($item->getParentItem()->getId()));
}
$invoiceItem->setQty($item->getQtyToInvoice());
$invoice->addItem($invoiceItem);
}

$invoice->collectTotals();
$invoice->register();

$orderPayment=$order->getPayment();
$orderPayment->pay($invoice);

// workaround for magento 1.4
$invoice->getOrder()->setActionFlag(Mage_Sales_Model_Order::ACTION_FLAG_SHIP, false);
$order = $invoice->getOrder();
$order->setData('state', Mage_Sales_Model_Order::STATE_COMPLETE);
$status = $order->getConfig()->getStateDefaultStatus(Mage_Sales_Model_Order::STATE_COMPLETE);
$order->addStatusToHistory($status);

$transaction = Mage::getModel('core/resource_transaction');
$transaction->addObject($invoice);
$transaction->addObject($invoice->getOrder());
$transaction->save();

$invoice->save();

return $invoice;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: