5

我们有一些 API 集成,将定期为订单创建发货。

我想做的是创建一个观察者,以便在创建此货件时创建适当的发票并获取付款。我有这个绑定到sales_order_shipment_save_after

public function autoInvoice($observer){

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

    $items = $shipment->getItemsCollection();

    $qty = array();

    foreach($items as $item)
        $qty[$item['order_item_id']] = $item['qty'];

    $invoice = Mage::getModel('sales/order_invoice_api');

    $invoiceId = $invoice->create($order->getIncrementId(), $qty);

    $invoice->capture($invoiceId);

}

(实际捕获的代码有点幼稚,但请耐心等待。)

奇怪的是,这个代码工作得很好——货件已创建,发票已创建并标记为“已付款”。但是,订单本身仍处于不确定状态并保持“待处理”状态。

进一步研究,订单上的商品本身具有正确的已订购和已装运数量,但没有发票数量列表。我认为这是导致状态挂断的原因。就好像qty_invoicedsales_order_item 表上的 正在以某种方式恢复。

同样,发票显示了正确的项目,所以我在这里很困惑。

有任何想法吗?

4

2 回答 2

2

这确实是一个非常有趣的@bahoo。

也许尝试:

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

$qty = array();

$invoice = Mage::getModel('sales/order_invoice_api');
$invoiceId = $invoice->create($order->getIncrementId(), $qty);

$invoice->capture($invoiceId);
于 2011-06-17T21:41:02.343 回答
2

在使用 API 进行大量测试后,我发现如果我先创建发票,然后是发货,Magento Enterprise 1.13.01。将正确地将订单状态设置为完成。尝试先装运,然后开具发票,即使所有物品都已开具发票并发货,也会导致待定订单状态保持不变。

下面的桥接系统代码使用有关在 Magento 中下达的订单的信息,通过 checkout_submit_all_after 上的 Observer 路由到桥接系统,通过 Web 服务发送到 NetSuite,并在 NetSuite 中完成。桥接系统通过 Web 服务从 NetSuite 获取销售订单履行情况,并保存发货、包裹和跟踪信息,以在下面的代码中使用。代码显示创建发票,然后发货和跟踪。

请注意,在测试时,我刚刚看到 Magento 错误地为订单中的所有三个项目创建了发票,即使它传递了一个仅包含两个项目的数组。Magento 确实为这两个项目正确地创建了发货记录。令人费解的是,发票 API 和发货 API 在传递相同的项目和数量数组时具有如此不同的行为。还有人看到这个吗?

        $proxy = new SoapClient($proxyUrl); /* V2 version */
        $sessionId = $proxy->login($apiUser, $apiKey); 

        try 
        {   /* try to create invoice in Magento */
            $invoiceIncrementId = $proxy->salesOrderInvoiceCreate($sessionId, $orderIncrementId, $shipItemsQty, 'invoice created', false, false); 
        } 
        catch( SoapFault $fault ) 
        {
            $error = $fault->getMessage(); /* will return 'Cannot do invoice for order' if invoice already exists for these items */        
        }

        if (!stristr($error,'Cannot do invoice') and !empty($error))
        {  /* some other invoicing problem, log what returned, on to next order */
            $ins = "insert into order_error_log values(NULL, ".$orderId.", '".date("Y-m-d H:i:s")."', '".$program."', '".$error."')";
            $result = $mysqli->query($ins); 
            $upd = "update orders set orderStatusId = ".ERROR_ADDING_MAGENTO_INVOICE.",
                dateStatusUpdated = '".date("Y-m-d H:i:s")."'
                where id = ".$orderId;
            $result = $mysqli->query($upd);
            continue;   
        }

        if ((stristr($error,'Cannot do invoice') or empty($error)) and $complete)
        {   /*  if all fulfilled, may change status */
            $upd = "update orders set orderStatusId = ".STORE_INVOICE_CREATED.",
                        dateStatusUpdated = '".date("Y-m-d H:i:s")."'
                        where id = ".$orderId;
            $result = $mysqli->query($upd);
        }

        /* send Magento salesOrderShipmentCreate and get returned shipment Id, re-using proxy login and session */
        $comment = 'Fulfillment(s) shipped on: '.$netsuiteShipDate;

        try 
        {   /* returns value such as string(9) "100002515" */
            $shipmentIncrementId = $proxy->salesOrderShipmentCreate($sessionId, $orderIncrementId, $shipItemsQty, $comment);
        }
        catch( SoapFault $fault ) 
        {
            $error = $fault->getMessage().': SOAP error received when trying to add shipment to Magento for morocco order id '.$orderId.
                ' store order id '.$orderIncrementId.' with items qty array of: '.var_dump($itemsQty);
            $ins = "insert into order_error_log values(NULL, ".$orderId.", '".date("Y-m-d H:i:s")."', '".$program."', '".$error."')";
            $result = $mysqli->query($ins);
            $upd = "update orders set orderStatusId = ".MAGENTO_SOAP_EXCEPTION.",
                dateStatusUpdated = '".date("Y-m-d H:i:s")."'
                where id = ".$orderId;
            $result = $mysqli->query($upd);
            continue;  /* on to next order */
        }

        /*  Using that shipmentId, send info re each package shipped for these fulfillments to Magento via salesOrderShipmentAddTrack. */   
        foreach ($packageIds as $packageId => $package)
        {
            try 
            {
                $trackingNumberId = $proxy->salesOrderShipmentAddTrack($sessionId, $shipmentIncrementId, 
                    $package['carrier'], 'tracking number', $package['trackNumber']);
            }
            catch( SoapFault $fault ) 
            {
                $error = $fault->getMessage().': SOAP error received when trying to add tracking number '.$package['trackNumber'].' to 
                    Magento for morocco order id '.$orderId.' store order id '.$orderIncrementId;;
                $ins = "insert into order_error_log values(NULL, ".$orderId.", '".date("Y-m-d H:i:s")."', '".$program."', '".$error."')";
                $result = $mysqli->query($ins);
                $upd = "update orders set orderStatusId = ".MAGENTO_SOAP_EXCEPTION.",
                    dateStatusUpdated = '".date("Y-m-d H:i:s")."'
                    where id = ".$orderId;
                $result = $mysqli->query($upd);
                continue;
            }
        }
于 2013-07-02T17:17:04.710 回答