题
给定一个已发票的订单(通过交货现金进行测试)并且正在处于“处理”状态,我该如何为给定的SKU和数量创建信用备忘录(以Magento路由以外的代码中; /test.php
)?
说我的订单有SKU "100-0055-BRO-S"
和数量 2
, ,我想退还其中的1。我当前的代码看起来像这样:
require 'app/Mage.php';
umask(0);
Mage::app()->setCurrentStore(Mage_Core_Model_App::ADMIN_STORE_ID);
setlocale(LC_MONETARY, 'en_US');
$order = Mage::getModel('sales/order')->loadByIncrementId(1117575);
$convertor = Mage::getModel('sales/convert_order');
$refundSku = '100-0055-BRO-S';
$refundQty = 1;
$refundOi = null;
//$refundInvoice = null;
foreach($order->getAllItems() as $oi) {
if($oi->getSku() == $refundSku) {
$refundOi = Mage::getModel('sales/order_item')->load($oi->getId());
break;
}
}
$mcm = $convertor->toCreditmemo($order);
$mcmi = $convertor->itemToCreditmemoItem($refundOi);
$mcmi->setQty($refundQty);
$mcmi->setDiscountAmount($refundOi->getDiscountAmount() * ($mcmi->getQty() / $mcmi->getOrderItem()->getQtyOrdered()));
$mcmi->setBaseDiscountAmount($refundOi->getBaseDiscountAmount() * ($mcmi->getQty() / $mcmi->getOrderItem()->getQtyOrdered()));
$mcmi->setTaxAmount($refundOi->getTaxAmount() * ($mcmi->getQty() / $mcmi->getOrderItem()->getQtyOrdered()));
$mcmi->setBaseTaxAmount($refundOi->getBaseTaxAmount() * ($mcmi->getQty() / $mcmi->getOrderItem()->getQtyOrdered()));
$mcmi->setHiddenTaxAmount($refundOi->getHiddenTaxAmount() * ($mcmi->getQty() / $mcmi->getOrderItem()->getQtyOrdered()));
$mcmi->setBaseHiddenTaxAmount($refundOi->getBaseHiddenTaxAmount() * ($mcmi->getQty() / $mcmi->getOrderItem()->getQtyOrdered()));
$mcm->addItem($mcmi);
$mcm->register();
Mage::getModel('core/resource_transaction')
->addObject($mcm)
->addObject($mcm->getOrder())
->save();
这导致在订单上创建信贷备忘录并显示在管理面板中。但是,该项目看起来像这样:
Price Qty Subtotal Tax Amount Discount Amount Row Total
$38.00 1 $0.00 $1.62 $19.00 -$17.39
我不明白为什么小计为0。也许它与不使用发票有关?但是我不确定该如何处理。似乎正在取折扣金额并从小计 +税额中减去。同样,所有信贷备忘录总计(小计,调整退款,调整费,税收,总计)为0.00美元。
我正在手动设置值的数学 $mcmi
(法师信贷备忘录)似乎是粗略的。我认为,鉴于我将其设置为数量,Magento会为我设置这些东西,但似乎并非如此,所以我必须自己做。如果有更好的方法来设置这些价值,我也很感谢那里的帮助。
解决方案
而不是直接使用转换器,最好使用订单服务模型:
Mage::app('admin');
$order = Mage::getModel('sales/order')->loadByIncrementId('1117575');
$orderItem = $order->getItemsCollection()->getItemByColumnValue('sku', '100-0055-BRO-S');
$service = Mage::getModel('sales/service_order', $order);
$data = array(
'qtys' => array(
$orderItem->getId() => 1
)
);
$creditMemo = $service->prepareCreditmemo($data)->register()->save();
至少到目前为止,这对我来说很好。
其他提示
如果您需要在线退款,则应以这种方式使用:
$order = Mage::getModel('sales/order')->loadByIncrementId('1117575');
$service = Mage::getModel('sales/service_order', $order);
$creditmemo = $service->prepareInvoiceCreditmemo($invoice);
$creditmemo->setRefundRequested(true)
->setOfflineRequested(false) // request to refund online
->register();
Mage::getModel('core/resource_transaction')
->addObject($creditmemo)
->addObject($creditmemo->getOrder())
->addObject($creditmemo->getInvoice())
->save();