1

出荷される注文商品を 1 行ずつ読み取るインポート ファイルから Magento で出荷を作成していますが、出荷を作成して最初の商品を追加した後、問題が発生しています。私はこのような出荷を作成しています:

$itemsData = array(
    'qtys' => array(
        $orderItem->getId() => $importData['qty placed'],
    )
);
$shipment = Mage::getModel('sales/service_order', $order)
    ->prepareShipment($itemsData['qtys']);
$shipment->addComment("Shipment created from shipment importer", false);
$shipment->register();
$shipment->getOrder()
    ->setIsInProcess(true);
$shipment->setShippingCost($shipCost);
if (isset($trackingNumber)) {
    $this->addTrack($shipment, $importData); //this function adds the tracking data
}
if ($order->getCustomerEmail()) {
    $shipment->setEmailSent(true);
    $shipment->sendEmail(true, '');
}
$transactionSave = Mage::getModel('core/resource_transaction')
    ->addObject($shipment)
    ->addObject($shipment->getOrder());
$transactionSave->save();
$shipment->save();

これは最初のアイテムにはうまく機能しますが、複数のアイテムを含む出荷の場合、次のアイテムを出荷に追加できません. 次のようなアイテムを追加しようとしています:

//I first load the existing shipment
$shipItem = Mage::getModel('sales/order_shipment_item');
$shipItem->setShipment($shipment);
$shipItem->setOrderItem($orderItem);
$shipItem->setQty($qtyShipped);
$shipItem->register();

$shipment->addItem($shipItem);
$transactionSave = Mage::getModel('core/resource_transaction')
    ->addObject($shipment)
    ->addObject($shipment->getOrder());
$transactionSave->save();
$shipment->save();

管理画面の注文ビュー / 情報ページで、2 番目の項目に「出荷済み」ではなく「請求済み」と表示されたままです。[出荷] タブをクリックすると、合計数量が 2 ではなく「1」と表示されますが、それをクリックすると、詳細を表示するには、両方のアイテムがリストされています。だから、それはちょっと働いているように見えますが、実際にはそうではありません

すべてのアイテムが発送されるわけではないため、注文をロードしてすべてを発送済みとしてマークすることはできません。これをどのように機能させることができるかについてのアイデアはありますか? 前もって感謝します ;)

4

2 に答える 2

0

同じ問題が発生しています。stackoverflowとMagentoフォーラムを読んだ後、出荷APIが単一アイテムの出荷をサポートする必要があることがわかりました。ただし、コードがこれをサポートしていないようです。

たぶん、Magentoの出荷APIを使ってみるのが一番いいでしょうか? http://www.magentocommerce.com/wiki/doc/webservices-api/api/sales_order_shipment

于 2013-01-10T11:53:19.560 に答える
0

注文から既存の出荷モデルを取得する

        $mageShipColl = $mageOrder->getShipmentsCollection();
        $mageShipment = $mageShipColl->getFirstItem();
        $mageShipment->setOrder($mageOrder)
            ->setStoreId($mageOrder->getStoreId())
            ->setCustomerId($mageOrder->getCustomerId())
            ->setBillingAddressId($mageOrder->getBillingAddressId())
            ->setShippingAddressId($mageOrder->getShippingAddressId());
        Mage::helper('core')->copyFieldset('sales_convert_order', 'to_shipment', $mageOrder, $mageShipment);

今これを行います:

$mageShipmentItem = $convertor->itemToShipmentItem($mageOrderItem);
$mageShipmentItem->setQty($qty_you_shipped);
//register shipment item for existing shipment only
if($mageShipment->getId()) {
  $mageShipmentItem->register();
}
$mageShipment->addItem($mageShipmentItem);

        $mageTrack = Mage::getModel('sales/order_shipment_track');
        try {
            $mageTrack->setData('carrier_code', $carrier)
                ->setData('number', $trackNo)
                ->setData('title', $carrierTitle);

            $comment = "Shipped via $carrier with tracking# $trackNo. Emailed confirmation to $shipToEmail.";

            $mageShipment->addTrack($mageTrack);
            //Do not register an existing shipment
            if(!$mageShipment->getId()) {
                $mageShipment->register();
            }
            $mageShipment->addComment($comment, $shouldNotifyCust);

            //this may or may not be needed
            $mageShipment->getOrder()->setIsInProcess(true);

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

            //email customer only if order is complete
            if($mageOrder->getStatus() == "complete") {
                $mageShipment->sendEmail(true, (($this->includeCommentInCustomerEmail) ? $comment : ''));
                $mageShipment->setEmailSent(true);
            }

            $mageShipment->save();


        } catch(Exception $e) {
            $errMsg = "Error saving shipment: " . $e->getMessage();
            Mage::log($errMsg, null, $logPath);
        }
于 2013-06-26T18:03:58.433 に答える