开具部分订单;总计不会更新

时间:2011-04-18 09:05:48

标签: php magento

在我们的订单处理中,可以发送部分订单的发票。因此,当运送几个订单行时,也必须发送发票。

为了实现这一目标,我使用以下代码:

 $invoice = Mage::getModel('sales/service_order', $order)->prepareInvoice($items);

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

        $invoice->setRequestedCaptureCase(Mage_Sales_Model_Order_Invoice::CAPTURE_ONLINE);
        $invoice->register();
        $transactionSave = Mage::getModel('core/resource_transaction')
                        ->addObject($invoice)
                        ->addObject($invoice->getOrder());

        $transactionSave->save();

        $invoice->sendEmail();
        $invoice->setEmailSent(true);
        $invoice->save();

$items变量是包含订单ID和要开票的产品数量的数组。

创建的发票显示要开票的正确产品,但不知何时总数未更新。总计仍然是完整订单的总计,而不是部分发票。

我可能需要更新或重新计算总数,但无法找到正确的代码来强制更新。

身边有谁可以让我朝着正确的方向前进?

3 个答案:

答案 0 :(得分:2)

好吧,似乎我发现了这个问题。如上所述的功能在管理员界面中手动执行它。上面的代码我只能通过更改Magento的核心文件来工作。

如果您将Mage_Sales_Model_Service_Order的第103行从continue;更改为$qty = 0;,则该功能可以正常运作。

简而言之,就是这样。如果继续,第二行项目不会添加到发票中的发票中,发票认为当前项目是整个订单的最后一项,因此需要为完整的未付金额开具发票。在我的情况下,我确实要发票的发票和我不想发票的行。

我已将其作为问题提交给Magento问题列表。

答案 1 :(得分:0)

今天我遇到了这个问题,但是我找到了一种更优雅的解决方法而无需编辑核心。解决方案是传递我们不想发票的产品,数量为0。 通过这种方式,您在核心中更改的代码将与您的解决方案完全相同:)

例如,如果我的订单中有2个产品:

array(
    1234 => 1,
    1235 => 2
)

传递此数组:

$qtys = array(
    1234 => 1,
    1235 => 0
)

将强制执行此代码:

            // Mage_Sales_Model_Service_Order: lines 97-103
            if (isset($qtys[$orderItem->getId()])) { // here's the magic
                $qty = (float) $qtys[$orderItem->getId()];
            } elseif (!count($qtys)) {
                $qty = $orderItem->getQtyToInvoice();
            } else {
                continue; // the line to edit according to previous solution
            }

与您的解决方案完全相同,因此您无需编辑核心代码。

希望有所帮助:)

答案 2 :(得分:0)

好的 - 带我一点,但现在我看到了如何正确创建数组。

foreach ($items as $itemId => $item) {
    $itemQtyToShip = $item->getQtyToShip()*1;
    if ($itemQtyToShip>0) {
       $itemQtyOnHand = $stockItem->getQty()*1;
       if ($itemQtyOnHand>0) {
          //use the order item id as key 
          //set the amount to invoice for as the value
          $toShip[$item->getId()] = $itemQtyToShip;             
       } else {
          //if not shipping the item set the qty to 0
          $toShip[$item->getId()] = 0;
    }
}

$invoice = Mage::getModel('sales/service_order', $order)->prepareInvoice($toShip);

这会创建一个合适的发票。