2

個々の製品の請求書を作成するために Magento 管理者にリンクを作成しましたが、関数を呼び出すと、$order->prepareInvoice($qtys)1 つのアイテムしか渡していなくても、すべての製品が請求書に追加されます。

以下のコードを使用しています。

$order = Mage::getModel('sales/order')->load($this->getRequest()->getParam('order_id'));

$count = $order->getTotalItemCount();

$qtys = Array
    (
        [370] => 1
    );

$invoice = $order->prepareInvoice($qtys);
if (!$invoice->getTotalQty()) {
    Mage::throwException(Mage::helper('core')->__('Cannot create an invoice without products.'));
}

$amount = $invoice->getGrandTotal();
$invoice->register()->pay();
$invoice->getOrder()->setIsInProcess(true);
$history = $invoice->getOrder()->addStatusHistoryComment('Partial amount of $'. $amount .' captured automatically.', false);
$history->setIsCustomerNotified(true);
$order->save();
Mage::getModel('core/resource_transaction')
            ->addObject($invoice)
            ->addObject($invoice->getOrder())
            ->save();
$invoice->save();

ここに画像の説明を入力

なにか提案を ?

4

1 に答える 1

3

Mage_Sales_Model_Service_Order :: prepareInvoiceにあるロジックは、最終的に請求書を準備するために呼び出すメソッドであり、ここで何が機能しているかを明らかにします。次のループが使用され、内側のelse-ifブロックは、qtyの配列が渡されたときにqtyが設定される場所です。

foreach ($this->_order->getAllItems() as $orderItem) {
    if (!$this->_canInvoiceItem($orderItem, array())) {
        continue;
    }
    $item = $this->_convertor->itemToInvoiceItem($orderItem);
    if ($orderItem->isDummy()) {
        $qty = $orderItem->getQtyOrdered() ? $orderItem->getQtyOrdered() : 1;
    } else if (!empty($qtys)) {
        if (isset($qtys[$orderItem->getId()])) {
            $qty = (float) $qtys[$orderItem->getId()];
        }
    } else {
        $qty = $orderItem->getQtyToInvoice();
    }
    $totalQty += $qty;
    $item->setQty($qty);
    $invoice->addItem($item);
}

$qtys変数は、prepareInvoice呼び出しに渡す配列です。あなたの場合、請求書に追加したいアイテムのインデックスのみを渡します。ドキュメント(および上記のループ)によると、これは1つの小さな問題を除いて機能するはずです。上記のループは、ループの先頭にある$ qtyの値を0にリセットしません。これは、送信されるフォームには常に注文の各アイテムの値が含まれ、請求されるアイテムが1つだけの場合は、既存のフォームを介して管理者から作成されたときに請求書の初期化を処理するコアコード。他のすべては0qty値を保持するため、$qtyの値のリセットの失敗を回避します。

問題を解決するには、$qtys変数を次のように設定してみてください(370と371が2つの注文アイテムエンティティIDであると想定しています)。

$qtys = array(
    370 => 1,
    371 => 0,
);

私が提案するかもしれない別の方法は、「請求書の作成」リンクでフォームに適切な値を設定して個々のアイテムに請求し、フォームを直接送信することです。このように、あなたは重い物を持ち上げるために既知の動作しているコアコントローラーに頼ることになります。もちろん、これは、単一のアイテムの請求以外にかなりカスタマイズされたものを何もしていない場合にのみ機能します。:)

于 2013-01-04T14:48:21.603 に答える