2012-01-18 3 views
7

Estoy tratando de marcar una orden de "Procesamiento" como Completa cuando recibo una respuesta determinada de un servicio externo. Tengo todo configurado para esto, pero el único problema es que las órdenes se mantienen en el estado de procesamiento.Marcar una orden de Magento como completa programáticamente

estoy generando una factura (no creo que necesito esto, sin embargo, ya que cada elemento está marcado como "factura" en el backend de Magento) y un envío de este modo:

$order = Mage::getModel('sales/order')... (etc) 
$shipment = $order->prepareShipment($quantities); 
$shipment->register(); 
$shipment->setOrder($order); 
$shipment->save(); 

$invoice = $order->prepareInvoice($quantities); 
$invoice->register(); 
$invoice->setOrder($order); 
$invoice->save(); 

Esto no tiene Sin embargo, parece que lo está haciendo; no recibo ningún error de este código, pero el orden permanece como procesamiento. En el backend todavía puedo ver el botón "Enviar" en la parte superior del pedido, y cada elemento está en el estado "facturado".

Cualquier consejo sería muy apreciado.

Respuesta

5

Usted puede echar un vistazo a this article (en ruso).

Este es el código del artículo:

$order = $observer->getEvent()->getOrder(); 

if (!$order->getId()) { 
    return false; 
} 

if (!$order->canInvoice()) { 
    return false; 
} 

$savedQtys = array(); 
$invoice = Mage::getModel('sales/service_order', $order)->prepareInvoice($savedQtys); 
if (!$invoice->getTotalQty()) { 
    return false; 
} 
$invoice->setRequestedCaptureCase(Mage_Sales_Model_Order_Invoice::CAPTURE_OFFLINE); 
$invoice->register(); 

$invoice->getOrder()->setCustomerNoteNotify(false); 
$invoice->getOrder()->setIsInProcess(true); 

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

$transactionSave->save(); 
+0

Gracias, el código en el artículo hizo el truco después de que cambié a a un envío en lugar de una factura. – gregdev

+0

Desafortunadamente, el enlace ahora está roto. – Mike

+0

Sería realmente bueno tener un enlace actualizado. archive.org todavía tiene una versión del enlace en caso de que alguien esté interesado. http://web.archive.org/web/20110414102634/http://snowcore.net/magento-%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0 % BC% D0% BC% D0% BD% D0% B0% D1% 8F-% D0% B0% D0% BA% D1% 82% D0% B8% D0% B2% D0% B0% D1% 86% D0% B8% D1% 8F-% D0% B7% D0% B0% D0% BA% D0% B0% D0% B7% D0% B0. Usa google chrome para obtener una traducción. – shaune

16

Trate

$order->setStateUnprotected('complete', 
    'complete', 
    'Order marked as complete automatically', 
    false); 

Este método es en app/code/local/Mage/Sales/Model/Order.php (en v1.6.1)

938: public function setStateUnprotected($state, $status = false, $comment = '', $isCustomerNotified = null) 

En Magento 1.7.0.0 se ha eliminado este método. Tal vez puedas probar:

$order->setData('state', "complete"); 
    $order->setStatus("complete"); 
    $history = $order->addStatusHistoryComment('Order marked as complete automatically.', false); 
    $history->setIsCustomerNotified(false); 
    $order->save(); 
+0

Gracias por la respuesta. Esto no pareció tener ningún efecto en Magento 1.4 – gregdev

+0

Error de lanzamiento, 'Llamada a una función miembro getMethodInstance() en un objeto no en 1.7.0.2 – jfreak53

2

que estoy haciendo esto de esa manera:

$order->setState('complete', true, $this->__('Your Order History Message Here.')) 
     ->save(); 
+3

Gracias por la respuesta. Esto hizo que apareciera el error "El estado de pedido" completo "no debe establecerse manualmente". – gregdev

0

Magento marcará automáticamente una orden completa si:

  • El pago ha sido completado.
  • Existe una factura.
  • Existe un envío.

Si no puede hacer eso, intente crear un 'estado' personalizado y configurarlo. Mientras tanto, para establecer el orden de procesamiento, intente esto:

$order = Mage::getModel('sales/order')->load($id); 
$order->setState(Mage_Sales_Model_Order::STATE_PROCESSING, true)->save(); 

Debería funcionar sin errores. Probado en Magento 1.7.0.2

0

En mi caso, necesitaba que los usuarios finales vieran completados en la cuadrícula de pedidos, pero el estado del pedido realmente no cambiaba nada. Así que lo hice fui a

Sistema-> Estado del pedido Crear un nuevo estado llamado Completado (nota de la d por lo que es fácil diferenciar) asignar ese estado al estado de procesamiento/pendiente, lo que sea.

Esto funcionó para nuestro cliente, pero no funcionaría si dependes en gran medida del estado de la orden (diferente al estado de la orden).

1

Código para procesar la orden mediante programación. se puede poner en caso de éxito o cron

$order = Mage::getModel('sales/order')->loadByIncrementId($orderIncrementId); 

$order->setData('state', Mage_Sales_Model_Order::STATE_COMPLETE); 
$order->setStatus(Mage_Sales_Model_Order::STATE_COMPLETE); 

$history = $order->addStatusHistoryComment('Order is complete', false); 
$history->setIsCustomerNotified(false); 

$order->save(); 
Cuestiones relacionadas