在我们的订单处理中,可以发送部分订单的发票。因此,当运送几个订单行时,也必须发送发票。
为了实现这一目标,我使用以下代码:
$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和要开票的产品数量的数组。
创建的发票显示要开票的正确产品,但不知何时总数未更新。总计仍然是完整订单的总计,而不是部分发票。
我可能需要更新或重新计算总数,但无法找到正确的代码来强制更新。
身边有谁可以让我朝着正确的方向前进?
答案 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);
这会创建一个合适的发票。