2011-06-17 31 views
4

我们已经有一些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); 

} 

(用于实际拍摄中的代码是有点幼稚,但我承担。)

什么奇怪的是,这个代码工作得很好 - 创建装运,发票将被创建并标记为“已付”。但是,订单本身保持不变,并保持“待定”状态。

进一步看,订单上的商品本身的订单和发货数量都是正确的,但没有列出发票数量。我认为这是导致状态挂断的原因。就好像sales_order_item表上的qty_invoiced以某种方式得到恢复。

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

任何想法?

+0

我放弃了!我已经看了两天这个问题,并决定采取不同的方法。 我的代码似乎很好;我认为这可能是导致这种错误的操作顺序。因此,我只是取代了使用观察员的产品创建API,以包含一些用于自动开票的代码。 munyah的代码如下。如果任何人都可以通过观察者找到一种更简洁的方式来实现这一点,我很乐意听到它。感谢大家! – bahoo 2011-06-18 00:14:34

回答

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); 
+0

我不得不用不同的方法来使用它,但这最终是让我到达想要的地方的代码。谢谢! – bahoo 2011-06-18 00:14:17

2

经过大量的测试使用API​​,我发现,如果我创建的发票,然后再发货,Magento企业01年1月13日。将正确设置订单状态为完成。试着先发货,然后发票,即使所有物品都已开具发票并发货,仍会导致挂单状态不变。

下面的桥接系统代码使用关于Magento中订单的信息,通过checkout_submit_all_after上的Observer发送到桥接系统,通过Web服务发送到NetSuite,并在NetSuite中完成。桥接系统通过网络服务从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; 
      } 
     }