2011-07-29 14 views
14

Estoy usando estos dos métodos para crear órdenes programáticamente en Magento.Crear orden programáticamente en Magento

El primero crea un Presupuesto:

public function prepareCustomerOrder($customerId, array $shoppingCart, array $shippingAddress, array $billingAddress, 
     $shippingMethod, $couponCode = null) 
    { 
     $customerObj = Mage::getModel('customer/customer')->load($customerId); 
     $storeId = $customerObj->getStoreId(); 
     $quoteObj = Mage::getModel('sales/quote')->assignCustomer($customerObj); 
     $storeObj = $quoteObj->getStore()->load($storeId); 
     $quoteObj->setStore($storeObj); 

     // add products to quote 
     foreach($shoppingCart as $part) { 
      $productModel = Mage::getModel('catalog/product'); 
      $productObj = $productModel->setStore($storeId)->setStoreId($storeId)->load($part['PartId']); 

      $productObj->setSkipCheckRequiredOption(true); 

      try{ 
       $quoteItem = $quoteObj->addProduct($productObj); 
       $quoteItem->setPrice(20); 
       $quoteItem->setQty(3); 
       $quoteItem->setQuote($quoteObj);          
       $quoteObj->addItem($quoteItem); 

      } catch (exception $e) { 
      return false; 
      } 

      $productObj->unsSkipCheckRequiredOption(); 
      $quoteItem->checkData(); 
     } 

     // addresses 
     $quoteShippingAddress = new Mage_Sales_Model_Quote_Address(); 
     $quoteShippingAddress->setData($shippingAddress); 
     $quoteBillingAddress = new Mage_Sales_Model_Quote_Address(); 
     $quoteBillingAddress->setData($billingAddress); 
     $quoteObj->setShippingAddress($quoteShippingAddress); 
     $quoteObj->setBillingAddress($quoteBillingAddress); 

     // coupon code 
     if(!empty($couponCode)) $quoteObj->setCouponCode($couponCode); 


     // shipping method an collect 
     $quoteObj->getShippingAddress()->setShippingMethod($shippingMethod); 
     $quoteObj->getShippingAddress()->setCollectShippingRates(true); 
     $quoteObj->getShippingAddress()->collectShippingRates(); 
     $quoteObj->collectTotals(); // calls $address->collectTotals(); 
     $quoteObj->setIsActive(0); 
     $quoteObj->save(); 

     return $quoteObj->getId(); 

    } 

Y el segundo utiliza esa cita para crear orden:

public function createOrder($quoteId, $paymentMethod, $paymentData) 
    { 
     $quoteObj = Mage::getModel('sales/quote')->load($quoteId); // Mage_Sales_Model_Quote 
     $items = $quoteObj->getAllItems();     

     $quoteObj->reserveOrderId(); 

      // set payment method 
     $quotePaymentObj = $quoteObj->getPayment(); // Mage_Sales_Model_Quote_Payment 
     $quotePaymentObj->setMethod($paymentMethod); 
     $quoteObj->setPayment($quotePaymentObj); 

     // convert quote to order 
     $convertQuoteObj = Mage::getSingleton('sales/convert_quote'); 
     $orderObj = $convertQuoteObj->addressToOrder($quoteObj->getShippingAddress()); 
     $orderPaymentObj = $convertQuoteObj->paymentToOrderPayment($quotePaymentObj); 

     // convert quote addresses 
     $orderObj->setBillingAddress($convertQuoteObj->addressToOrderAddress($quoteObj->getBillingAddress())); 
     $orderObj->setShippingAddress($convertQuoteObj->addressToOrderAddress($quoteObj->getShippingAddress())); 

     // set payment options 
     $orderObj->setPayment($convertQuoteObj->paymentToOrderPayment($quoteObj->getPayment())); 
     if ($paymentData) { 
     $orderObj->getPayment()->setCcNumber($paymentData->ccNumber); 
     $orderObj->getPayment()->setCcType($paymentData->ccType); 
     $orderObj->getPayment()->setCcExpMonth($paymentData->ccExpMonth); 
     $orderObj->getPayment()->setCcExpYear($paymentData->ccExpYear); 
     $orderObj->getPayment()->setCcLast4(substr($paymentData->ccNumber,-4)); 
     } 
     // convert quote items 
     foreach ($items as $item) { 
      // @var $item Mage_Sales_Model_Quote_Item 
      $orderItem = $convertQuoteObj->itemToOrderItem($item); 

      $options = array(); 
     if ($productOptions = $item->getProduct()->getTypeInstance(true)->getOrderOptions($item->getProduct())) { 

      $options = $productOptions; 
     } 
     if ($addOptions = $item->getOptionByCode('additional_options')) { 
      $options['additional_options'] = unserialize($addOptions->getValue()); 
     } 
     if ($options) { 
      $orderItem->setProductOptions($options); 
     } 
      if ($item->getParentItem()) { 
       $orderItem->setParentItem($orderObj->getItemByQuoteItemId($item->getParentItem()->getId())); 
      } 
      $orderObj->addItem($orderItem); 
     } 

     $orderObj->setCanShipPartiallyItem(false); 

     try { 
      $orderObj->place(); 
     } catch (Exception $e){  
      Mage::log($e->getMessage()); 
      Mage::log($e->getTraceAsString()); 
     } 

     $orderObj->save(); 
     //$orderObj->sendNewOrderEmail(); 
     return $orderObj->getId(); 

    } 

El proceso funciona bien, sin errores, y se crea el pedido. Pero el total es 0 y no hay productos en él, no importa lo que ponga.

Lo he rastreado y puedo confirmar que las filas se agregan a las tablas sales_flat_quote y sales_flat_quote_item, así que está bien. Sin embargo, cuando se ejecuta el createOrder y llamando

 $items = $quoteObj->getAllItems(); 

una matriz vacía siempre se devuelve, y no tengo ni idea de por qué. Tengo productos configurables y simples en mi tienda. Esto sucede cuando agrego simple, cuando agrego configurable aparece el error como el método

$quoteItem = $quoteObj->addProduct($productObj); 

devuelve nulo.

+0

tengo un problema similar has encontrado una solución – rosh3000

+0

Qué ID de cliente usaría una salida de invitados? – swl1020

Respuesta

9

Me parece que no cargó la colección de productos, por lo tanto, el carro siempre devuelve vacío. Pruebe este enlace, le dará una ayuda más clara.

// this is get only one product, you can refactor the code 
$this->_product = Mage::getModel('catalog/product')->getCollection() 
    ->addAttributeToFilter('sku', 'Some value here...') 
    ->addAttributeToSelect('*') 
    ->getFirstItem(); 

// load product data 
$this->_product->load($this->_product->getId()); 
2

Este código funcionó para mí,

public function createorder(array $orderdata) 
{ 
    $quoteId = $orderdata['quoteId']; 
    $paymentMethod = $orderdata['paymentMethod']; 
    $paymentData = $orderdata['paymentData'];  
    $quoteObj = Mage::getModel('sales/quote')->load($quoteId); 
    $items = $quoteObj->getAllItems();   
    $quoteObj->reserveOrderId(); 

    $quotePaymentObj = $quoteObj->getPayment(); 
    $quotePaymentObj->setMethod($paymentMethod); 
    $quoteObj->setPayment($quotePaymentObj); 

    $convertQuoteObj = Mage::getSingleton('sales/convert_quote'); 
    $orderObj = $convertQuoteObj->addressToOrder($quoteObj->getShippingAddress()); 
    $orderPaymentObj = $convertQuoteObj->paymentToOrderPayment($quotePaymentObj); 

    $orderObj->setBillingAddress($convertQuoteObj->addressToOrderAddress($quoteObj->getBillingAddress())); 
    $orderObj->setShippingAddress($convertQuoteObj->addressToOrderAddress($quoteObj->getShippingAddress())); 
    $orderObj->setPayment($convertQuoteObj->paymentToOrderPayment($quoteObj->getPayment())); 

    foreach ($items as $item) 
    { 
     $orderItem = $convertQuoteObj->itemToOrderItem($item);   
     $options = array(); 
     if ($productOptions = $item->getProduct()->getTypeInstance(true)->getOrderOptions($item->getProduct())) 
     { 
     $options = $productOptions; 
     } 
     if ($addOptions = $item->getOptionByCode('additional_options')) 
     { 
     $options['additional_options'] = unserialize($addOptions->getValue()); 
     } 
     if ($options) 
     { 
      $orderItem->setProductOptions($options); 
     } 
     if ($item->getParentItem()) 
     { 
      $orderItem->setParentItem($orderObj->getItemByQuoteItemId($item->getParentItem()->getId())); 
     } 
     $orderObj->addItem($orderItem); 
    } 
    $quoteObj->collectTotals(); 
    $service = Mage::getModel('sales/service_quote', $quoteObj); 
    $service->submitAll(); 
    $orderObj->setCanShipPartiallyItem(false);   
    try 
    { 

     $last_order_increment_id = Mage::getModel("sales/order")->getCollection()->getLastItem()->getIncrementId(); 
     return $last_order_increment_id;    
    } 
    catch (Exception $e) 
    {  
     Mage::log($e->getMessage()); 
     Mage::log($e->getTraceAsString()); 
     return "Exception:".$e; 
    } } 
+0

¿Funciona también para productos configurables? –

0

que tenían el mismo problema y profundizado en el API para encontrar una solución. He cambiado la forma en que he cargado un producto mediante el uso de:

$productEntityId = '123456'; 
$store_code = 'my_store_code'; 

$product = Mage::helper('catalog/product')->getProduct($productEntityId,Mage::app()->getStore($store_code)->getId()); 

me encontré con este tutorial para ser muy útil también:

http://www.classyllama.com/content/unravelling-magentos-collecttotals

Si usted está buscando un script en creación de orden este es un muy buen comienzo:

http://pastebin.com/8cft4d8v

la esperanza de que esto ayude a alguien;)

Cuestiones relacionadas