2012-01-18 22 views
7

Sto tentando di contrassegnare un ordine di "Elaborazione" come Completato quando ottengo una risposta certa da un servizio di terze parti. Ho tutto pronto per questo, ma l'unico problema è che gli ordini rimangono nello stato di elaborazione.Contrassegna un ordine Magento come completo a livello di programmazione

sto generando una fattura (non credo che ho bisogno di questo, però, come ogni elemento è contrassegnato come "fatturato" nel backend Magento) e una spedizione in questo 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(); 

Questo doesn sembra che lo stiano facendo - non ottengo alcun errore da questo codice, ma l'ordine rimane come elaborazione. Nel backend posso ancora vedere il pulsante "Spedisci" all'inizio dell'ordine e ogni articolo è nello stato "fatturato".

Qualsiasi consiglio sarebbe molto apprezzato.

risposta

5

Si può dare un'occhiata al this article (in russo).

ecco il codice dall'articolo:

$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

Grazie, il codice nell'articolo ha fatto il trucco dopo che ho cambiato a una spedizione anziché a una fattura. – gregdev

+0

Sfortunatamente, il link è ora rotto. – Mike

+0

Sarebbe davvero bello avere un collegamento aggiornato. archive.org ha ancora una versione del link nel caso in cui qualcuno fosse interessato. 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. Utilizza google chrome per ottenere una traduzione. – shaune

16

Prova

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

Questo metodo è in app/code/local/Mage/Sales/Model/Order.php (in v1.6.1)

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

Magento 1.7.0.0 questo metodo è stato rimosso. Prova a modificare:

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

Grazie per la risposta. Questo non sembra avere alcun effetto in Magento 1.4 – gregdev

+0

Errore di gettata, 'Chiamata a una funzione membro getMethodInstance() su un non-oggetto' in 1.7.0.2 – jfreak53

2

sto facendo questo in questo modo:

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

Grazie per la risposta. Questo ha portato l'errore "Lo stato dell'ordine" completo "non deve essere impostato manualmente." – gregdev

0

Magento automaticamente contrassegnare un ordine come completo se:

  • Il pagamento è stato effettuato.
  • Esiste una fattura.
  • Esiste una spedizione.

Se non riesci a farlo, prova a creare uno 'stato' personalizzato e impostalo. Nel frattempo, per impostare l'ordine di elaborazione, prova questo:

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

Dovrebbe funzionare senza errori. Testato su Magento 1.7.0.2

0

Nel mio caso, avevo bisogno che gli utenti finali vedessero completato nella griglia dell'ordine, ma lo stato dell'ordine non ha fatto alcuna differenza. Così ho fatto appena andato a

Sistema-> Ordine Creare un nuovo stato chiamato Completato (notare la D in modo che sia facile distinguere) Assegnare tale status al trattamento nazionale/sospeso, a prescindere.

Questo ha funzionato per il nostro cliente, ma non funzionerebbe se dipendesse fortemente dallo stato dell'ordine (diverso dallo stato dell'ordine).

1

Codice per l'elaborazione dell'ordine a livello di codice. può essere messo su evento successo 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(); 
Problemi correlati