2012-11-13 134 views
1

如何删除意外创建的货件?我知道无法通过管理员执行此操作,但我正试图弄清楚我需要做什么才能将订单恢复到“处理”状态以及所有旧的货件信息,以便它可以发货晚些时候。我希望这可以通过PHP编程,甚至直接在MySQL中完成。如何从Magento中删除意外创建的货件?

仅供参考,我正在使用Magento 1.1.8版。

+0

这与编程有什么关系? – Pier

+1

因为我正在寻找一种使用PHP或直接通过MySQL以编程方式执行此操作的方法。 –

回答

0
$shipment = Mage::getModel('sales/order_shipment')->load($shippingOrderId); 
$shipment->delete(); 

我认为这是有效的。我没有尝试过。

+0

不幸的是,需要发生一些其他事情,否则订单将无法再次发货,商品仍被标记为已发货,订单仍标记为已完成。但是,我发现一个很好的扩展。我会把它作为答案发布。不过谢谢! –

+0

PHP致命错误:未收到的异常'Mage_Core_Exception'带消息'无法从非管理区域完成此操作。' – Theodores

+1

@Theodores - 在代码上方添加'Mage :: app('admin');'以解决该异常。 – Axel

12

尝试

require_once 'app/Mage.php'; 

Varien_Profiler::enable(); 
Mage::setIsDeveloperMode(true); 
ini_set('display_errors', 1); 
umask(0); 
Mage::app('default'); 
Mage::register('isSecureArea', 1); 


//Update Order id 
$orderId = xyz; 


$order = Mage::getModel('sales/order')->load($orderId); 

// check if has shipments 
if(!$order->hasShipments()){ 
    die('No Shipments'); 
} 

//delete shipment 
$shipments = $order->getShipmentsCollection(); 
foreach ($shipments as $shipment){ 
    $shipment->delete(); 
} 

// Reset item shipment qty 
// see Mage_Sales_Model_Order_Item::getSimpleQtyToShip() 
$items = $order->getAllVisibleItems(); 
foreach($items as $i){ 
    $i->setQtyShipped(0); 
    $i->save(); 
} 

//Reset order state 
$order->setState(Mage_Sales_Model_Order::STATE_PROCESSING, true, 'Undo Shipment'); 
$order->save(); 

echo 'Done'; 
+0

谢谢,正是我所需要的。 – mniess

+0

工程像魔术。 (CE Magento 1.9.1) –

+0

伟大的帮助。只是一个改变。在我的情况下,装运已创建,但发票未完成,因此我将 Mage_Sales_Model_Order :: STATE_PROCESSING更改为Mage_Sales_Model_Order :: STATE_NEW –

0

说你全部发运的订单,并没有故意的。只需删除INVOICE。它将删除发票和任何发货...... SHIPMENTS复数!

所以你必须小心,如果你有其他货物,你需要重新创建它们。然后再次发票。然后就像你从未发货一样,然后你可以运送任何你最初需要的数量。

+0

此答案需要澄清。默认情况下,Magento的管理面板没有发票的“删除”选项。您是否指示OP以编程方式删除发票? – Eric